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:

committed by
Junio C Hamano

parent
8987cda9e1
commit
597b831afb
@ -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
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
@ -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)
|
||||||
|
@ -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 &&
|
||||||
|
@ -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 */
|
||||||
|
Reference in New Issue
Block a user