Merge branch 'jk/fetch-pack' into maint
authorJunio C Hamano <gitster@pobox.com>
Sat, 28 Mar 2015 16:33:08 +0000 (09:33 -0700)
committerJunio C Hamano <gitster@pobox.com>
Sat, 28 Mar 2015 16:33:08 +0000 (09:33 -0700)
"git fetch" that fetches a commit using the allow-tip-sha1-in-want
extension could have failed to fetch all the requested refs.

* jk/fetch-pack:
fetch-pack: remove dead assignment to ref->new_sha1
fetch_refs_via_pack: free extra copy of refs
filter_ref: make a copy of extra "sought" entries
filter_ref: avoid overwriting ref->old_sha1 with garbage

1  2 
t/t5516-fetch-push.sh
transport.c
diff --combined t/t5516-fetch-push.sh
index 594d7a6998ea96ba6a3de22abfe9cc05fb6a105f,f7947315ba0fda1060930932afe5e6a0c065d0da..050877f181cce19fa07adb289fcd1e21593a91c4
@@@ -238,7 -238,7 +238,7 @@@ test_expect_success 'push with pushInst
  test_expect_success 'push with pushInsteadOf and explicit pushurl (pushInsteadOf should not rewrite)' '
        mk_empty testrepo &&
        test_config "url.trash2/.pushInsteadOf" testrepo/ &&
 -      test_config "url.trash3/.pusnInsteadOf" trash/wrong &&
 +      test_config "url.trash3/.pushInsteadOf" trash/wrong &&
        test_config remote.r.url trash/wrong &&
        test_config remote.r.pushurl "testrepo/" &&
        git push r refs/heads/master:refs/remotes/origin/master &&
@@@ -1107,9 -1107,16 +1107,16 @@@ test_expect_success 'fetch exact SHA1' 
                        git config uploadpack.allowtipsha1inwant true
                ) &&
  
-               git fetch -v ../testrepo $the_commit:refs/heads/copy &&
-               result=$(git rev-parse --verify refs/heads/copy) &&
-               test "$the_commit" = "$result"
+               git fetch -v ../testrepo $the_commit:refs/heads/copy master:refs/heads/extra &&
+               cat >expect <<-EOF &&
+               $the_commit
+               $the_first_commit
+               EOF
+               {
+                       git rev-parse --verify refs/heads/copy &&
+                       git rev-parse --verify refs/heads/extra
+               } >actual &&
+               test_cmp expect actual
        )
  '
  
@@@ -1330,108 -1337,4 +1337,108 @@@ test_expect_success 'fetch into bare re
        )
  '
  
 +test_expect_success 'receive.denyCurrentBranch = updateInstead' '
 +      git push testrepo master &&
 +      (
 +              cd testrepo &&
 +              git reset --hard &&
 +              git config receive.denyCurrentBranch updateInstead
 +      ) &&
 +      test_commit third path2 &&
 +
 +      # Try pushing into a repository with pristine working tree
 +      git push testrepo master &&
 +      (
 +              cd testrepo &&
 +              git update-index -q --refresh &&
 +              git diff-files --quiet -- &&
 +              git diff-index --quiet --cached HEAD -- &&
 +              test third = "$(cat path2)" &&
 +              test $(git -C .. rev-parse HEAD) = $(git rev-parse HEAD)
 +      ) &&
 +
 +      # Try pushing into a repository with working tree needing a refresh
 +      (
 +              cd testrepo &&
 +              git reset --hard HEAD^ &&
 +              test $(git -C .. rev-parse HEAD^) = $(git rev-parse HEAD) &&
 +              test-chmtime +100 path1
 +      ) &&
 +      git push testrepo master &&
 +      (
 +              cd testrepo &&
 +              git update-index -q --refresh &&
 +              git diff-files --quiet -- &&
 +              git diff-index --quiet --cached HEAD -- &&
 +              test_cmp ../path1 path1 &&
 +              test third = "$(cat path2)" &&
 +              test $(git -C .. rev-parse HEAD) = $(git rev-parse HEAD)
 +      ) &&
 +
 +      # Update what is to be pushed
 +      test_commit fourth path2 &&
 +
 +      # Try pushing into a repository with a dirty working tree
 +      # (1) the working tree updated
 +      (
 +              cd testrepo &&
 +              echo changed >path1
 +      ) &&
 +      test_must_fail git push testrepo master &&
 +      (
 +              cd testrepo &&
 +              test $(git -C .. rev-parse HEAD^) = $(git rev-parse HEAD) &&
 +              git diff --quiet --cached &&
 +              test changed = "$(cat path1)"
 +      ) &&
 +
 +      # (2) the index updated
 +      (
 +              cd testrepo &&
 +              echo changed >path1 &&
 +              git add path1
 +      ) &&
 +      test_must_fail git push testrepo master &&
 +      (
 +              cd testrepo &&
 +              test $(git -C .. rev-parse HEAD^) = $(git rev-parse HEAD) &&
 +              git diff --quiet &&
 +              test changed = "$(cat path1)"
 +      ) &&
 +
 +      # Introduce a new file in the update
 +      test_commit fifth path3 &&
 +
 +      # (3) the working tree has an untracked file that would interfere
 +      (
 +              cd testrepo &&
 +              git reset --hard &&
 +              echo changed >path3
 +      ) &&
 +      test_must_fail git push testrepo master &&
 +      (
 +              cd testrepo &&
 +              test $(git -C .. rev-parse HEAD^^) = $(git rev-parse HEAD) &&
 +              git diff --quiet &&
 +              git diff --quiet --cached &&
 +              test changed = "$(cat path3)"
 +      ) &&
 +
 +      # (4) the target changes to what gets pushed but it still is a change
 +      (
 +              cd testrepo &&
 +              git reset --hard &&
 +              echo fifth >path3 &&
 +              git add path3
 +      ) &&
 +      test_must_fail git push testrepo master &&
 +      (
 +              cd testrepo &&
 +              test $(git -C .. rev-parse HEAD^^) = $(git rev-parse HEAD) &&
 +              git diff --quiet &&
 +              test fifth = "$(cat path3)"
 +      )
 +
 +'
 +
  test_done
diff --combined transport.c
index 862f63f4e1a5250d3d701699e4c5bb4e71a6b2e9,2e11f8ea82ee980aec86c0394aeed30aa7f52053..88bde1d85e48e7866881806d1ec3f1e3d420ab67
@@@ -117,7 -117,7 +117,7 @@@ static void insert_packed_refs(const ch
                        return;
                }
  
 -              if (hexval(buffer[0]) > 0xf)
 +              if (!isxdigit(buffer[0]))
                        continue;
                len = strlen(buffer);
                if (len && buffer[len - 1] == '\n')
@@@ -519,7 -519,7 +519,7 @@@ static int fetch_refs_via_pack(struct t
                               int nr_heads, struct ref **to_fetch)
  {
        struct git_transport_data *data = transport->data;
-       const struct ref *refs;
+       struct ref *refs;
        char *dest = xstrdup(transport->url);
        struct fetch_pack_args args;
        struct ref *refs_tmp = NULL;
                          &transport->pack_lockfile);
        close(data->fd[0]);
        close(data->fd[1]);
-       if (finish_connect(data->conn))
+       if (finish_connect(data->conn)) {
+               free_refs(refs);
                refs = NULL;
+       }
        data->conn = NULL;
        data->got_remote_heads = 0;
        data->options.self_contained_and_connected =
                args.self_contained_and_connected;
  
        free_refs(refs_tmp);
+       free_refs(refs);
        free(dest);
        return (refs ? 0 : -1);
  }
@@@ -971,7 -973,9 +973,7 @@@ struct transport *transport_get(struct 
        } else {
                /* Unknown protocol in URL. Pass to external handler. */
                int len = external_specification_len(url);
 -              char *handler = xmalloc(len + 1);
 -              handler[len] = 0;
 -              strncpy(handler, url, len);
 +              char *handler = xmemdupz(url, len);
                transport_helper_init(ret, handler);
        }