Skip to content

Commit

Permalink
transport-helper: add 'force' to 'export' helpers
Browse files Browse the repository at this point in the history
Otherwise they cannot know when to force the push or not (other than
hacks).

Tests-by: Richard Hansen <rhansen@bbn.com>
Documentation-by: Richard Hansen <rhansen@bbn.com>
Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Felipe Contreras authored and Junio C Hamano committed Nov 12, 2013
1 parent 5a75353 commit 510fa6f
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 0 deletions.
4 changes: 4 additions & 0 deletions Documentation/gitremote-helpers.txt
Original file line number Diff line number Diff line change
Expand Up @@ -437,6 +437,10 @@ set by Git if the remote helper has the 'option' capability.
'option check-connectivity' \{'true'|'false'\}::
Request the helper to check connectivity of a clone.

'option force' \{'true'|'false'\}::
Request the helper to perform a force update. Defaults to
'false'.

SEE ALSO
--------
linkgit:git-remote[1]
Expand Down
18 changes: 18 additions & 0 deletions git-remote-testgit.sh
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ test -z "$refspec" && prefix="refs"

export GIT_DIR="$url/.git"

force=

mkdir -p "$dir"

if test -z "$GIT_REMOTE_TESTGIT_NO_MARKS"
Expand All @@ -39,6 +41,7 @@ do
fi
test -n "$GIT_REMOTE_TESTGIT_SIGNED_TAGS" && echo "signed-tags"
test -n "$GIT_REMOTE_TESTGIT_NO_PRIVATE_UPDATE" && echo "no-private-update"
echo 'option'
echo
;;
list)
Expand Down Expand Up @@ -93,6 +96,7 @@ do
before=$(git for-each-ref --format=' %(refname) %(objectname) ')

git fast-import \
${force:+--force} \
${testgitmarks:+"--import-marks=$testgitmarks"} \
${testgitmarks:+"--export-marks=$testgitmarks"} \
--quiet
Expand All @@ -115,6 +119,20 @@ do

echo
;;
option\ *)
read cmd opt val <<-EOF
$line
EOF
case $opt in
force)
test $val = "true" && force="true" || force=
echo "ok"
;;
*)
echo "unsupported"
;;
esac
;;
'')
exit
;;
Expand Down
13 changes: 13 additions & 0 deletions t/t5801-remote-helpers.sh
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,19 @@ test_expect_failure 'push new branch with old:new refspec' '
compare_refs local HEAD server refs/heads/new-refspec
'

test_expect_success 'forced push' '
(cd local &&
git checkout -b force-test &&
echo content >> file &&
git commit -a -m eight &&
git push origin force-test &&
echo content >> file &&
git commit -a --amend -m eight-modified &&
git push --force origin force-test
) &&
compare_refs local refs/heads/force-test server refs/heads/force-test
'

test_expect_success 'cloning without refspec' '
GIT_REMOTE_TESTGIT_REFSPEC="" \
git clone "testgit::${PWD}/server" local2 2>error &&
Expand Down
5 changes: 5 additions & 0 deletions transport-helper.c
Original file line number Diff line number Diff line change
Expand Up @@ -854,6 +854,11 @@ static int push_refs_with_export(struct transport *transport,
die("helper %s does not support dry-run", data->name);
}

if (flags & TRANSPORT_PUSH_FORCE) {
if (set_helper_option(transport, "force", "true") != 0)
warning("helper %s does not support 'force'", data->name);
}

helper = get_helper(transport);

write_constant(helper->in, "export\n");
Expand Down

0 comments on commit 510fa6f

Please sign in to comment.