push: allow pushing new branches with --force-with-lease
authorJohn Keeping <john@keeping.me.uk>
Tue, 26 Jul 2016 20:44:45 +0000 (21:44 +0100)
committerJunio C Hamano <gitster@pobox.com>
Tue, 26 Jul 2016 20:48:28 +0000 (13:48 -0700)
If there is no upstream information for a branch, it is likely that it
is newly created and can safely be pushed under the normal fast-forward
rules. Relax the --force-with-lease check so that we do not reject
these branches immediately but rather attempt to push them as new
branches, using the null SHA-1 as the expected value.

In fact, it is already possible to push new branches using the explicit
--force-with-lease=<branch>:<expect> syntax, so all we do here is make
this behaviour the default if no explicit "expect" value is specified.

Signed-off-by: John Keeping <john@keeping.me.uk>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
remote.c
remote.h
t/t5533-push-cas.sh
index 29ecd3d8c5f254f7ab29c44551808e721787740c..3b6f4b7e6d18960ba6ffa72a8dc7803d5377a140 100644 (file)
--- a/remote.c
+++ b/remote.c
@@ -1554,8 +1554,7 @@ void set_ref_status_for_push(struct ref *remote_refs, int send_mirror,
                 * branch.
                 */
                if (ref->expect_old_sha1) {
-                       if (ref->expect_old_no_trackback ||
-                           oidcmp(&ref->old_oid, &ref->old_oid_expect))
+                       if (oidcmp(&ref->old_oid, &ref->old_oid_expect))
                                reject_reason = REF_STATUS_REJECT_STALE;
                        else
                                /* If the ref isn't stale then force the update. */
@@ -2355,7 +2354,7 @@ static void apply_cas(struct push_cas_option *cas,
                if (!entry->use_tracking)
                        hashcpy(ref->old_oid_expect.hash, cas->entry[i].expect);
                else if (remote_tracking(remote, ref->name, &ref->old_oid_expect))
-                       ref->expect_old_no_trackback = 1;
+                       oidclr(&ref->old_oid_expect);
                return;
        }
 
@@ -2365,7 +2364,7 @@ static void apply_cas(struct push_cas_option *cas,
 
        ref->expect_old_sha1 = 1;
        if (remote_tracking(remote, ref->name, &ref->old_oid_expect))
-               ref->expect_old_no_trackback = 1;
+               oidclr(&ref->old_oid_expect);
 }
 
 void apply_push_cas(struct push_cas_option *cas,
index 4a039bae0b15d6d28aace0c62287c3f3bb11befa..9674ddb0afe1f944c9ccf5e3ca1c782eafe9bdc8 100644 (file)
--- a/remote.h
+++ b/remote.h
@@ -87,7 +87,6 @@ struct ref {
                force:1,
                forced_update:1,
                expect_old_sha1:1,
-               expect_old_no_trackback:1,
                deletion:1,
                matched:1;
 
index ed631c3d0b65a1b5daf7fac1dbb3ce951d2e2777..09899af3b0c0c6f7fa01af3b54f1347b55bb2784 100755 (executable)
@@ -191,6 +191,18 @@ test_expect_success 'cover everything with default force-with-lease (allowed)' '
        test_cmp expect actual
 '
 
+test_expect_success 'new branch covered by force-with-lease' '
+       setup_srcdst_basic &&
+       (
+               cd dst &&
+               git branch branch master &&
+               git push --force-with-lease=branch origin branch
+       ) &&
+       git ls-remote dst refs/heads/branch >expect &&
+       git ls-remote src refs/heads/branch >actual &&
+       test_cmp expect actual
+'
+
 test_expect_success 'new branch covered by force-with-lease (explicit)' '
        setup_srcdst_basic &&
        (