]> git.ipfire.org Git - thirdparty/git.git/commitdiff
Merge branch 'jt/partial-clone-proto-v2'
authorJunio C Hamano <gitster@pobox.com>
Wed, 30 May 2018 05:04:10 +0000 (14:04 +0900)
committerJunio C Hamano <gitster@pobox.com>
Wed, 30 May 2018 05:04:10 +0000 (14:04 +0900)
Transfer protocol v2 learned to support the partial clone.

* jt/partial-clone-proto-v2:
  {fetch,upload}-pack: support filter in protocol v2
  upload-pack: read config when serving protocol v2
  upload-pack: fix error message typo

1  2 
Documentation/technical/protocol-v2.txt
fetch-pack.c
t/t5701-git-serve.sh
t/t5702-protocol-v2.sh
upload-pack.c

diff --cc fetch-pack.c
Simple merge
index 011a5796db5d98af3b2151563a8e9683b1139f1a,1b4b13cc2b29ba1f2eb83b37743533b867bc5c13..75ec79e6cb839e71f6830d9301d1982d0fc68925
@@@ -174,24 -173,18 +174,38 @@@ test_expect_success 'symrefs parameter
        test_cmp actual expect
  '
  
 +test_expect_success 'sending server-options' '
 +      test-pkt-line pack >in <<-EOF &&
 +      command=ls-refs
 +      server-option=hello
 +      server-option=world
 +      0001
 +      ref-prefix HEAD
 +      0000
 +      EOF
 +
 +      cat >expect <<-EOF &&
 +      $(git rev-parse HEAD) HEAD
 +      0000
 +      EOF
 +
 +      git serve --stateless-rpc <in >out &&
 +      test-pkt-line unpack <out >actual &&
 +      test_cmp actual expect
 +'
 +
+ test_expect_success 'unexpected lines are not allowed in fetch request' '
+       git init server &&
+       test-pkt-line pack >in <<-EOF &&
+       command=fetch
+       0001
+       this-is-not-a-command
+       0000
+       EOF
+       test_must_fail git -C server serve --stateless-rpc <in >/dev/null 2>err &&
+       grep "unexpected line: .this-is-not-a-command." err
+ '
  test_done
index dbfd0691c081c26dba76c70834966adaa3aacdae,25bf046b36c94856c3c3b2487d7d26e4ecad2689..4ad5c5769b4eab56d840709ee0bc0affa8de2e01
@@@ -217,22 -201,118 +217,134 @@@ test_expect_success 'ref advertisment i
        ! grep "refs/tags/three" log
  '
  
 +test_expect_success 'server-options are sent when fetching' '
 +      test_when_finished "rm -f log" &&
 +
 +      test_commit -C file_parent four &&
 +
 +      GIT_TRACE_PACKET="$(pwd)/log" git -C file_child -c protocol.version=2 \
 +              fetch -o hello -o world origin master &&
 +
 +      git -C file_child log -1 --format=%s origin/master >actual &&
 +      git -C file_parent log -1 --format=%s >expect &&
 +      test_cmp expect actual &&
 +
 +      grep "server-option=hello" log &&
 +      grep "server-option=world" log
 +'
 +
+ test_expect_success 'upload-pack respects config using protocol v2' '
+       git init server &&
+       write_script server/.git/hook <<-\EOF &&
+               touch hookout
+               "$@"
+       EOF
+       test_commit -C server one &&
+       test_config_global uploadpack.packobjectshook ./hook &&
+       test_path_is_missing server/.git/hookout &&
+       git -c protocol.version=2 clone "file://$(pwd)/server" client &&
+       test_path_is_file server/.git/hookout
+ '
+ test_expect_success 'setup filter tests' '
+       rm -rf server client &&
+       git init server &&
+       # 1 commit to create a file, and 1 commit to modify it
+       test_commit -C server message1 a.txt &&
+       test_commit -C server message2 a.txt &&
+       git -C server config protocol.version 2 &&
+       git -C server config uploadpack.allowfilter 1 &&
+       git -C server config uploadpack.allowanysha1inwant 1 &&
+       git -C server config protocol.version 2
+ '
+ test_expect_success 'partial clone' '
+       GIT_TRACE_PACKET="$(pwd)/trace" git -c protocol.version=2 \
+               clone --filter=blob:none "file://$(pwd)/server" client &&
+       grep "version 2" trace &&
+       # Ensure that the old version of the file is missing
+       git -C client rev-list master --quiet --objects --missing=print \
+               >observed.oids &&
+       grep "$(git -C server rev-parse message1:a.txt)" observed.oids &&
+       # Ensure that client passes fsck
+       git -C client fsck
+ '
+ test_expect_success 'dynamically fetch missing object' '
+       rm "$(pwd)/trace" &&
+       GIT_TRACE_PACKET="$(pwd)/trace" git -C client -c protocol.version=2 \
+               cat-file -p $(git -C server rev-parse message1:a.txt) &&
+       grep "version 2" trace
+ '
+ test_expect_success 'partial fetch' '
+       rm -rf client "$(pwd)/trace" &&
+       git init client &&
+       SERVER="file://$(pwd)/server" &&
+       test_config -C client extensions.partialClone "$SERVER" &&
+       GIT_TRACE_PACKET="$(pwd)/trace" git -C client -c protocol.version=2 \
+               fetch --filter=blob:none "$SERVER" master:refs/heads/other &&
+       grep "version 2" trace &&
+       # Ensure that the old version of the file is missing
+       git -C client rev-list other --quiet --objects --missing=print \
+               >observed.oids &&
+       grep "$(git -C server rev-parse message1:a.txt)" observed.oids &&
+       # Ensure that client passes fsck
+       git -C client fsck
+ '
+ test_expect_success 'do not advertise filter if not configured to do so' '
+       SERVER="file://$(pwd)/server" &&
+       rm "$(pwd)/trace" &&
+       git -C server config uploadpack.allowfilter 1 &&
+       GIT_TRACE_PACKET="$(pwd)/trace" git -c protocol.version=2 \
+               ls-remote "$SERVER" &&
+       grep "fetch=.*filter" trace &&
+       rm "$(pwd)/trace" &&
+       git -C server config uploadpack.allowfilter 0 &&
+       GIT_TRACE_PACKET="$(pwd)/trace" git -c protocol.version=2 \
+               ls-remote "$SERVER" &&
+       grep "fetch=" trace >fetch_capabilities &&
+       ! grep filter fetch_capabilities
+ '
+ test_expect_success 'partial clone warns if filter is not advertised' '
+       rm -rf client &&
+       git -C server config uploadpack.allowfilter 0 &&
+       git -c protocol.version=2 \
+               clone --filter=blob:none "file://$(pwd)/server" client 2>err &&
+       test_i18ngrep "filtering not recognized by server, ignoring" err
+ '
+ test_expect_success 'even with handcrafted request, filter does not work if not advertised' '
+       git -C server config uploadpack.allowfilter 0 &&
+       # Custom request that tries to filter even though it is not advertised.
+       test-pkt-line pack >in <<-EOF &&
+       command=fetch
+       0001
+       want $(git -C server rev-parse master)
+       filter blob:none
+       0000
+       EOF
+       test_must_fail git -C server serve --stateless-rpc <in >/dev/null 2>err &&
+       grep "unexpected line: .filter blob:none." err &&
+       # Exercise to ensure that if advertised, filter works
+       git -C server config uploadpack.allowfilter 1 &&
+       git -C server serve --stateless-rpc <in >/dev/null
+ '
  # Test protocol v2 with 'http://' transport
  #
  . "$TEST_DIRECTORY"/lib-httpd.sh
diff --cc upload-pack.c
Simple merge