Merge branch 'it/fetch-pack-many-refs'
authorJunio C Hamano <gitster@pobox.com>
Tue, 24 Apr 2012 21:40:51 +0000 (14:40 -0700)
committerJunio C Hamano <gitster@pobox.com>
Tue, 24 Apr 2012 21:40:51 +0000 (14:40 -0700)
When "git fetch" encounters repositories with too many references, the
command line of "fetch-pack" that is run by a helper e.g. remote-curl,
may fail to hold all of them. Now such an internal invocation can feed
the references through the standard input of "fetch-pack".

By Ivan Todoroski
* it/fetch-pack-many-refs:
  remote-curl: main test case for the OS command line overflow
  fetch-pack: test cases for the new --stdin option
  remote-curl: send the refs to fetch-pack on stdin
  fetch-pack: new --stdin option to read refs from stdin

1  2 
builtin/fetch-pack.c
remote-curl.c
t/t5500-fetch-pack.sh

Simple merge
diff --cc remote-curl.c
Simple merge
index ce51692bb2b9ae221d11458a01ab8ef669f24659,1c56d9b883bdb2c55da1558071835ff80f00aac9..1d1ca98588bd7e8ae264179b5a4a93371c567346
@@@ -259,71 -248,70 +259,137 @@@ test_expect_success 'clone shallow obje
        grep "^count: 52" count.shallow
  '
  
 +test_expect_success 'clone shallow without --no-single-branch' '
 +      git clone --depth 1 "file://$(pwd)/." shallow2
 +'
 +
 +test_expect_success 'clone shallow object count' '
 +      (
 +              cd shallow2 &&
 +              git count-objects -v
 +      ) > count.shallow2 &&
 +      grep "^in-pack: 6" count.shallow2
 +'
 +
 +test_expect_success 'clone shallow with --branch' '
 +      git clone --depth 1 --branch A "file://$(pwd)/." shallow3
 +'
 +
 +test_expect_success 'clone shallow object count' '
 +      echo "in-pack: 12" > count3.expected &&
 +      GIT_DIR=shallow3/.git git count-objects -v |
 +              grep "^in-pack" > count3.actual &&
 +      test_cmp count3.expected count3.actual
 +'
 +
 +test_expect_success 'clone shallow with detached HEAD' '
 +      git checkout HEAD^ &&
 +      git clone --depth 1 "file://$(pwd)/." shallow5 &&
 +      git checkout - &&
 +      GIT_DIR=shallow5/.git git rev-parse HEAD >actual &&
 +      git rev-parse HEAD^ >expected &&
 +      test_cmp expected actual
 +'
 +
 +test_expect_success 'shallow clone pulling tags' '
 +      git tag -a -m A TAGA1 A &&
 +      git tag -a -m B TAGB1 B &&
 +      git tag TAGA2 A &&
 +      git tag TAGB2 B &&
 +      git clone --depth 1 "file://$(pwd)/." shallow6 &&
 +
 +      cat >taglist.expected <<\EOF &&
 +TAGB1
 +TAGB2
 +EOF
 +      GIT_DIR=shallow6/.git git tag -l >taglist.actual &&
 +      test_cmp taglist.expected taglist.actual &&
 +
 +      echo "in-pack: 7" > count6.expected &&
 +      GIT_DIR=shallow6/.git git count-objects -v |
 +              grep "^in-pack" > count6.actual &&
 +      test_cmp count6.expected count6.actual
 +'
 +
 +test_expect_success 'shallow cloning single tag' '
 +      git clone --depth 1 --branch=TAGB1 "file://$(pwd)/." shallow7 &&
 +      cat >taglist.expected <<\EOF &&
 +TAGB1
 +TAGB2
 +EOF
 +      GIT_DIR=shallow7/.git git tag -l >taglist.actual &&
 +      test_cmp taglist.expected taglist.actual &&
 +
 +      echo "in-pack: 7" > count7.expected &&
 +      GIT_DIR=shallow7/.git git count-objects -v |
 +              grep "^in-pack" > count7.actual &&
 +      test_cmp count7.expected count7.actual
 +'
 +
+ test_expect_success 'setup tests for the --stdin parameter' '
+       for head in C D E F
+       do
+               add $head
+       done &&
+       for head in A B C D E F
+       do
+               git tag $head $head
+       done &&
+       cat >input <<-\EOF
+       refs/heads/C
+       refs/heads/A
+       refs/heads/D
+       refs/tags/C
+       refs/heads/B
+       refs/tags/A
+       refs/heads/E
+       refs/tags/B
+       refs/tags/E
+       refs/tags/D
+       EOF
+       sort <input >expect &&
+       (
+               echo refs/heads/E &&
+               echo refs/tags/E &&
+               cat input
+       ) >input.dup
+ '
+ test_expect_success 'fetch refs from cmdline' '
+       (
+               cd client &&
+               git fetch-pack --no-progress .. $(cat ../input)
+       ) >output &&
+       cut -d " " -f 2 <output | sort >actual &&
+       test_cmp expect actual
+ '
+ test_expect_success 'fetch refs from stdin' '
+       (
+               cd client &&
+               git fetch-pack --stdin --no-progress .. <../input
+       ) >output &&
+       cut -d " " -f 2 <output | sort >actual &&
+       test_cmp expect actual
+ '
+ test_expect_success 'fetch mixed refs from cmdline and stdin' '
+       (
+               cd client &&
+               tail -n +5 ../input |
+               git fetch-pack --stdin --no-progress .. $(head -n 4 ../input)
+       ) >output &&
+       cut -d " " -f 2 <output | sort >actual &&
+       test_cmp expect actual
+ '
+ test_expect_success 'test duplicate refs from stdin' '
+       (
+       cd client &&
+       test_must_fail git fetch-pack --stdin --no-progress .. <../input.dup
+       ) >output &&
+       cut -d " " -f 2 <output | sort >actual &&
+       test_cmp expect actual
+ '
  test_done