From: Junio C Hamano Date: Tue, 9 Jul 2019 22:25:34 +0000 (-0700) Subject: Merge branch 'fc/fetch-with-import-fix' X-Git-Tag: v2.23.0-rc0~93 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/dbf491e9e947141eab7ffce65d6c97c121def6e0 Merge branch 'fc/fetch-with-import-fix' Code restructuring during 2.20 period broke fetching tags via "import" based transports. * fc/fetch-with-import-fix: fetch: fix regression with transport helpers fetch: make the code more understandable fetch: trivial cleanup t5801 (remote-helpers): add test to fetch tags t5801 (remote-helpers): cleanup refspec stuff --- dbf491e9e947141eab7ffce65d6c97c121def6e0 diff --cc builtin/fetch.c index 4ba63d5ac6,e485d429c9..f2be50a4a3 --- a/builtin/fetch.c +++ b/builtin/fetch.c @@@ -317,9 -321,10 +323,9 @@@ static void find_non_local_tags(const s !has_object_file_with_flags(&ref->old_oid, OBJECT_INFO_QUICK) && !will_fetch(head, ref->old_oid.hash) && - !has_sha1_file_with_flags(item->oid.hash, - OBJECT_INFO_QUICK) && + !has_object_file_with_flags(&item->oid, OBJECT_INFO_QUICK) && !will_fetch(head, item->oid.hash)) - oidclr(&item->oid); + clear_item(item); item = NULL; continue; } @@@ -331,9 -336,9 +337,9 @@@ * fetch. */ if (item && - !has_sha1_file_with_flags(item->oid.hash, OBJECT_INFO_QUICK) && + !has_object_file_with_flags(&item->oid, OBJECT_INFO_QUICK) && !will_fetch(head, item->oid.hash)) - oidclr(&item->oid); + clear_item(item); item = NULL; @@@ -352,9 -357,9 +358,9 @@@ * checked to see if it needs fetching. */ if (item && - !has_sha1_file_with_flags(item->oid.hash, OBJECT_INFO_QUICK) && + !has_object_file_with_flags(&item->oid, OBJECT_INFO_QUICK) && !will_fetch(head, item->oid.hash)) - oidclr(&item->oid); + clear_item(item); /* * For all the tags in the remote_refs_list, diff --cc t/t5801/git-remote-testgit index 752c763eb6,0000000000..6b9f0b5dc7 mode 100755,000000..100755 --- a/t/t5801/git-remote-testgit +++ b/t/t5801/git-remote-testgit @@@ -1,147 -1,0 +1,151 @@@ +#!/bin/sh +# Copyright (c) 2012 Felipe Contreras + +# The first argument can be a url when the fetch/push command was a url +# instead of a configured remote. In this case, use a generic alias. +if test "$1" = "testgit::$2"; then + alias=_ +else + alias=$1 +fi +url=$2 + +dir="$GIT_DIR/testgit/$alias" - prefix="refs/testgit/$alias" + - default_refspec="refs/heads/*:${prefix}/heads/*" ++h_refspec="refs/heads/*:refs/testgit/$alias/heads/*" ++t_refspec="refs/tags/*:refs/testgit/$alias/tags/*" + - refspec="${GIT_REMOTE_TESTGIT_REFSPEC-$default_refspec}" - - test -z "$refspec" && prefix="refs" ++if test -n "$GIT_REMOTE_TESTGIT_NOREFSPEC" ++then ++ h_refspec="" ++ t_refspec="" ++fi + +GIT_DIR="$url/.git" +export GIT_DIR + +force= + +mkdir -p "$dir" + +if test -z "$GIT_REMOTE_TESTGIT_NO_MARKS" +then + gitmarks="$dir/git.marks" + testgitmarks="$dir/testgit.marks" + test -e "$gitmarks" || >"$gitmarks" + test -e "$testgitmarks" || >"$testgitmarks" +fi + +while read line +do + case $line in + capabilities) + echo 'import' + echo 'export' - test -n "$refspec" && echo "refspec $refspec" ++ test -n "$h_refspec" && echo "refspec $h_refspec" ++ test -n "$t_refspec" && echo "refspec $t_refspec" + if test -n "$gitmarks" + then + echo "*import-marks $gitmarks" + echo "*export-marks $gitmarks" + 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) - git for-each-ref --format='? %(refname)' 'refs/heads/' ++ git for-each-ref --format='? %(refname)' 'refs/heads/' 'refs/tags/' + head=$(git symbolic-ref HEAD) + echo "@$head HEAD" + echo + ;; + import*) + # read all import lines + while true + do + ref="${line#* }" + refs="$refs $ref" + read line + test "${line%% *}" != "import" && break + done + + if test -n "$gitmarks" + then + echo "feature import-marks=$gitmarks" + echo "feature export-marks=$gitmarks" + fi + + if test -n "$GIT_REMOTE_TESTGIT_FAILURE" + then + echo "feature done" + exit 1 + fi + + echo "feature done" + git fast-export \ ++ ${h_refspec:+"--refspec=$h_refspec"} \ ++ ${t_refspec:+"--refspec=$t_refspec"} \ + ${testgitmarks:+"--import-marks=$testgitmarks"} \ + ${testgitmarks:+"--export-marks=$testgitmarks"} \ - $refs | - sed -e "s#refs/heads/#${prefix}/heads/#g" ++ $refs + echo "done" + ;; + export) + if test -n "$GIT_REMOTE_TESTGIT_FAILURE" + then + # consume input so fast-export doesn't get SIGPIPE; + # git would also notice that case, but we want + # to make sure we are exercising the later + # error checks + while read line; do + test "done" = "$line" && break + done + exit 1 + fi + + before=$(git for-each-ref --format=' %(refname) %(objectname) ') + + git fast-import \ + ${force:+--force} \ + ${testgitmarks:+"--import-marks=$testgitmarks"} \ + ${testgitmarks:+"--export-marks=$testgitmarks"} \ + --quiet + + # figure out which refs were updated + git for-each-ref --format='%(refname) %(objectname)' | + while read ref a + do + case "$before" in + *" $ref $a "*) + continue ;; # unchanged + esac + if test -z "$GIT_REMOTE_TESTGIT_PUSH_ERROR" + then + echo "ok $ref" + else + echo "error $ref $GIT_REMOTE_TESTGIT_PUSH_ERROR" + fi + done + + 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 + ;; + esac +done