Skip to content

Commit d82dd26

Browse files
committed
Merge branch 'cr/push-force-tag-update'
Regression fix to stop "git push" complaining "target ref already exists", when it is not the real reason the command rejected the request (e.g. non-fast-forward). * cr/push-force-tag-update: push: fix "refs/tags/ hierarchy cannot be updated without --force"
2 parents a29e711 + 256b9d7 commit d82dd26

File tree

3 files changed

+7
-58
lines changed

3 files changed

+7
-58
lines changed

cache.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1011,7 +1011,6 @@ struct ref {
10111011
requires_force:1,
10121012
merge:1,
10131013
nonfastforward:1,
1014-
not_forwardable:1,
10151014
update:1,
10161015
deletion:1;
10171016
enum {

remote.c

Lines changed: 7 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1279,26 +1279,6 @@ int match_push_refs(struct ref *src, struct ref **dst,
12791279
return 0;
12801280
}
12811281

1282-
static inline int is_forwardable(struct ref* ref)
1283-
{
1284-
struct object *o;
1285-
1286-
if (!prefixcmp(ref->name, "refs/tags/"))
1287-
return 0;
1288-
1289-
/* old object must be a commit */
1290-
o = parse_object(ref->old_sha1);
1291-
if (!o || o->type != OBJ_COMMIT)
1292-
return 0;
1293-
1294-
/* new object must be commit-ish */
1295-
o = deref_tag(parse_object(ref->new_sha1), NULL, 0);
1296-
if (!o || o->type != OBJ_COMMIT)
1297-
return 0;
1298-
1299-
return 1;
1300-
}
1301-
13021282
void set_ref_status_for_push(struct ref *remote_refs, int send_mirror,
13031283
int force_update)
13041284
{
@@ -1320,32 +1300,23 @@ void set_ref_status_for_push(struct ref *remote_refs, int send_mirror,
13201300
}
13211301

13221302
/*
1323-
* The below logic determines whether an individual
1324-
* refspec A:B can be pushed. The push will succeed
1325-
* if any of the following are true:
1303+
* Decide whether an individual refspec A:B can be
1304+
* pushed. The push will succeed if any of the
1305+
* following are true:
13261306
*
13271307
* (1) the remote reference B does not exist
13281308
*
13291309
* (2) the remote reference B is being removed (i.e.,
13301310
* pushing :B where no source is specified)
13311311
*
1332-
* (3) the update meets all fast-forwarding criteria:
1333-
*
1334-
* (a) the destination is not under refs/tags/
1335-
* (b) the old is a commit
1336-
* (c) the new is a descendant of the old
1337-
*
1338-
* NOTE: We must actually have the old object in
1339-
* order to overwrite it in the remote reference,
1340-
* and the new object must be commit-ish. These are
1341-
* implied by (b) and (c) respectively.
1312+
* (3) the destination is not under refs/tags/, and
1313+
* if the old and new value is a commit, the new
1314+
* is a descendant of the old.
13421315
*
13431316
* (4) it is forced using the +A:B notation, or by
13441317
* passing the --force argument
13451318
*/
13461319

1347-
ref->not_forwardable = !is_forwardable(ref);
1348-
13491320
ref->update =
13501321
!ref->deletion &&
13511322
!is_null_sha1(ref->old_sha1);
@@ -1355,7 +1326,7 @@ void set_ref_status_for_push(struct ref *remote_refs, int send_mirror,
13551326
!has_sha1_file(ref->old_sha1)
13561327
|| !ref_newer(ref->new_sha1, ref->old_sha1);
13571328

1358-
if (ref->not_forwardable) {
1329+
if (!prefixcmp(ref->name, "refs/tags/")) {
13591330
ref->requires_force = 1;
13601331
if (!force_ref_update) {
13611332
ref->status = REF_STATUS_REJECT_ALREADY_EXISTS;

t/t5516-fetch-push.sh

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -950,27 +950,6 @@ test_expect_success 'push requires --force to update lightweight tag' '
950950
)
951951
'
952952

953-
test_expect_success 'push requires --force to update annotated tag' '
954-
mk_test heads/master &&
955-
mk_child child1 &&
956-
mk_child child2 &&
957-
(
958-
cd child1 &&
959-
git tag -a -m "message 1" Tag &&
960-
git push ../child2 Tag:refs/tmp/Tag &&
961-
git push ../child2 Tag:refs/tmp/Tag &&
962-
>file1 &&
963-
git add file1 &&
964-
git commit -m "file1" &&
965-
git tag -f -a -m "message 2" Tag &&
966-
test_must_fail git push ../child2 Tag:refs/tmp/Tag &&
967-
git push --force ../child2 Tag:refs/tmp/Tag &&
968-
git tag -f -a -m "message 3" Tag HEAD~ &&
969-
test_must_fail git push ../child2 Tag:refs/tmp/Tag &&
970-
git push --force ../child2 Tag:refs/tmp/Tag
971-
)
972-
'
973-
974953
test_expect_success 'push --porcelain' '
975954
mk_empty &&
976955
echo >.git/foo "To testrepo" &&

0 commit comments

Comments
 (0)