transport-helper: add no-private-update capability

Since 664059fb (transport-helper: update remote helper namespace,
2013-04-17), a 'push' operation on a remote helper updates the
private ref by default. This is often a good thing, but it can also
be desirable to disable this update to force the next 'pull' to
re-import the pushed revisions.

Allow remote-helpers to disable the automatic update by introducing a new
capability.

Signed-off-by: Matthieu Moy <Matthieu.Moy@imag.fr>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Matthieu Moy
2013-09-03 17:45:14 +02:00
committed by Junio C Hamano
parent 8987cda9e1
commit 597b831afb
4 changed files with 22 additions and 2 deletions

View File

@ -120,6 +120,11 @@ connecting (see the 'connect' command under COMMANDS).
When choosing between 'push' and 'export', Git prefers 'push'. When choosing between 'push' and 'export', Git prefers 'push'.
Other frontends may have some other order of preference. Other frontends may have some other order of preference.
'no-private-update'::
When using the 'refspec' capability, git normally updates the
private ref on successful push. This update is disabled when
the remote-helper declares the capability 'no-private-update'.
Capabilities for Fetching Capabilities for Fetching
^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^

View File

@ -38,6 +38,7 @@ do
echo "*export-marks $gitmarks" echo "*export-marks $gitmarks"
fi fi
test -n "$GIT_REMOTE_TESTGIT_SIGNED_TAGS" && echo "signed-tags" test -n "$GIT_REMOTE_TESTGIT_SIGNED_TAGS" && echo "signed-tags"
test -n "$GIT_REMOTE_TESTGIT_NO_PRIVATE_UPDATE" && echo "no-private-update"
echo echo
;; ;;
list) list)

View File

@ -182,6 +182,17 @@ test_expect_success 'push update refs' '
) )
' '
test_expect_success 'push update refs disabled by no-private-update' '
(cd local &&
echo more-update >>file &&
git commit -a -m more-update &&
git rev-parse --verify testgit/origin/heads/update >expect &&
GIT_REMOTE_TESTGIT_NO_PRIVATE_UPDATE=t git push origin update &&
git rev-parse --verify testgit/origin/heads/update >actual &&
test_cmp expect actual
)
'
test_expect_success 'push update refs failure' ' test_expect_success 'push update refs failure' '
(cd local && (cd local &&
git checkout update && git checkout update &&

View File

@ -27,7 +27,8 @@ struct helper_data {
push : 1, push : 1,
connect : 1, connect : 1,
signed_tags : 1, signed_tags : 1,
no_disconnect_req : 1; no_disconnect_req : 1,
no_private_update : 1;
char *export_marks; char *export_marks;
char *import_marks; char *import_marks;
/* These go from remote name (as in "list") to private name */ /* These go from remote name (as in "list") to private name */
@ -205,6 +206,8 @@ static struct child_process *get_helper(struct transport *transport)
strbuf_addstr(&arg, "--import-marks="); strbuf_addstr(&arg, "--import-marks=");
strbuf_addstr(&arg, capname + strlen("import-marks ")); strbuf_addstr(&arg, capname + strlen("import-marks "));
data->import_marks = strbuf_detach(&arg, NULL); data->import_marks = strbuf_detach(&arg, NULL);
} else if (!prefixcmp(capname, "no-private-update")) {
data->no_private_update = 1;
} else if (mandatory) { } else if (mandatory) {
die("Unknown mandatory capability %s. This remote " die("Unknown mandatory capability %s. This remote "
"helper probably needs newer version of Git.", "helper probably needs newer version of Git.",
@ -723,7 +726,7 @@ static void push_update_refs_status(struct helper_data *data,
if (push_update_ref_status(&buf, &ref, remote_refs)) if (push_update_ref_status(&buf, &ref, remote_refs))
continue; continue;
if (!data->refspecs) if (!data->refspecs || data->no_private_update)
continue; continue;
/* propagate back the update to the remote namespace */ /* propagate back the update to the remote namespace */