]> git.ipfire.org Git - thirdparty/git.git/commitdiff
push: add shorthand for --force-with-lease branch creation
authorJohn Keeping <john@keeping.me.uk>
Tue, 26 Jul 2016 20:44:44 +0000 (21:44 +0100)
committerJunio C Hamano <gitster@pobox.com>
Tue, 26 Jul 2016 20:48:09 +0000 (13:48 -0700)
Allow the empty string to stand in for the null SHA-1 when pushing a new
branch, like we do when deleting branches.

This means that the following command ensures that `new-branch` is
created on the remote (that is, is must not already exist):

git push --force-with-lease=new-branch: origin new-branch

Signed-off-by: John Keeping <john@keeping.me.uk>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/git-push.txt
remote.c
t/t5533-push-cas.sh

index 5355a8d54a0747620a994273f5a6d231c5bcfb19..02b5dd3490c38d99f77a195e3024b644c32a434f 100644 (file)
@@ -201,7 +201,8 @@ if it is going to be updated, by requiring its current value to be
 the same as the specified value `<expect>` (which is allowed to be
 different from the remote-tracking branch we have for the refname,
 or we do not even have to have such a remote-tracking branch when
-this form is used).
+this form is used).  If `<expect>` is the empty string, then the named ref
+must not already exist.
 +
 Note that all forms other than `--force-with-lease=<refname>:<expect>`
 that specifies the expected current value of the ref explicitly are
index 6e5c1a876f5044ffdea71531695ce04305b072f1..29ecd3d8c5f254f7ab29c44551808e721787740c 100644 (file)
--- a/remote.c
+++ b/remote.c
@@ -2304,6 +2304,8 @@ int parse_push_cas_option(struct push_cas_option *cas, const char *arg, int unse
        entry = add_cas_entry(cas, arg, colon - arg);
        if (!*colon)
                entry->use_tracking = 1;
+       else if (!colon[1])
+               hashclr(entry->expect);
        else if (get_sha1(colon + 1, entry->expect))
                return error("cannot parse expected object name '%s'", colon + 1);
        return 0;
index c7320121ecfa74dce8389d3790364501c8bb12b8..ed631c3d0b65a1b5daf7fac1dbb3ce951d2e2777 100755 (executable)
@@ -191,4 +191,30 @@ 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 (explicit)' '
+       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 already exists' '
+       setup_srcdst_basic &&
+       (
+               cd src &&
+               git checkout -b branch master &&
+               test_commit c
+       ) &&
+       (
+               cd dst &&
+               git branch branch master &&
+               test_must_fail git push --force-with-lease=branch: origin branch
+       )
+'
+
 test_done