Merge branch 'fc/fetch-with-import-fix'
authorJunio C Hamano <gitster@pobox.com>
Tue, 9 Jul 2019 22:25:34 +0000 (15:25 -0700)
committerJunio C Hamano <gitster@pobox.com>
Tue, 9 Jul 2019 22:25:34 +0000 (15:25 -0700)
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

1  2 
builtin/fetch.c
t/t5801-remote-helpers.sh
t/t5801/git-remote-testgit
diff --cc builtin/fetch.c
index 4ba63d5ac642844832a5c832cea93ddf99507764,e485d429c9e7f580010a4ee6a011106954d17ad5..f2be50a4a3cf4291fd2ea40e2bd33db417925f44
@@@ -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;
                }
                 * 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;
  
         * 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,
Simple merge
index 752c763eb666e197304efbc7ea006325a36ff870,0000000000000000000000000000000000000000..6b9f0b5dc79cf0239daf4f6a210baaccf8612d74
mode 100755,000000..100755
--- /dev/null
@@@ -1,147 -1,0 +1,151 @@@
- prefix="refs/testgit/$alias"
 +#!/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"
- default_refspec="refs/heads/*:${prefix}/heads/*"
 +
- refspec="${GIT_REMOTE_TESTGIT_REFSPEC-$default_refspec}"
- test -z "$refspec" && prefix="refs"
++h_refspec="refs/heads/*:refs/testgit/$alias/heads/*"
++t_refspec="refs/tags/*:refs/testgit/$alias/tags/*"
 +
-               test -n "$refspec" && echo "refspec $refspec"
++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'
-               git for-each-ref --format='? %(refname)' 'refs/heads/'
++              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)
-                       $refs |
-               sed -e "s#refs/heads/#${prefix}/heads/#g"
++              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
 +              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