t / t4067-diff-partial-clone.shon commit diff: skip GITLINK when lazy fetching missing objs (a63694f)
   1#!/bin/sh
   2
   3test_description='behavior of diff when reading objects in a partial clone'
   4
   5. ./test-lib.sh
   6
   7test_expect_success 'git show batches blobs' '
   8        test_when_finished "rm -rf server client trace" &&
   9
  10        test_create_repo server &&
  11        echo a >server/a &&
  12        echo b >server/b &&
  13        git -C server add a b &&
  14        git -C server commit -m x &&
  15
  16        test_config -C server uploadpack.allowfilter 1 &&
  17        test_config -C server uploadpack.allowanysha1inwant 1 &&
  18        git clone --bare --filter=blob:limit=0 "file://$(pwd)/server" client &&
  19
  20        # Ensure that there is exactly 1 negotiation by checking that there is
  21        # only 1 "done" line sent. ("done" marks the end of negotiation.)
  22        GIT_TRACE_PACKET="$(pwd)/trace" git -C client show HEAD &&
  23        grep "git> done" trace >done_lines &&
  24        test_line_count = 1 done_lines
  25'
  26
  27test_expect_success 'diff batches blobs' '
  28        test_when_finished "rm -rf server client trace" &&
  29
  30        test_create_repo server &&
  31        echo a >server/a &&
  32        echo b >server/b &&
  33        git -C server add a b &&
  34        git -C server commit -m x &&
  35        echo c >server/c &&
  36        echo d >server/d &&
  37        git -C server add c d &&
  38        git -C server commit -m x &&
  39
  40        test_config -C server uploadpack.allowfilter 1 &&
  41        test_config -C server uploadpack.allowanysha1inwant 1 &&
  42        git clone --bare --filter=blob:limit=0 "file://$(pwd)/server" client &&
  43
  44        # Ensure that there is exactly 1 negotiation by checking that there is
  45        # only 1 "done" line sent. ("done" marks the end of negotiation.)
  46        GIT_TRACE_PACKET="$(pwd)/trace" git -C client diff HEAD^ HEAD &&
  47        grep "git> done" trace >done_lines &&
  48        test_line_count = 1 done_lines
  49'
  50
  51test_expect_success 'diff skips same-OID blobs' '
  52        test_when_finished "rm -rf server client trace" &&
  53
  54        test_create_repo server &&
  55        echo a >server/a &&
  56        echo b >server/b &&
  57        git -C server add a b &&
  58        git -C server commit -m x &&
  59        echo another-a >server/a &&
  60        git -C server add a &&
  61        git -C server commit -m x &&
  62
  63        test_config -C server uploadpack.allowfilter 1 &&
  64        test_config -C server uploadpack.allowanysha1inwant 1 &&
  65        git clone --bare --filter=blob:limit=0 "file://$(pwd)/server" client &&
  66
  67        echo a | git hash-object --stdin >hash-old-a &&
  68        echo another-a | git hash-object --stdin >hash-new-a &&
  69        echo b | git hash-object --stdin >hash-b &&
  70
  71        # Ensure that only a and another-a are fetched.
  72        GIT_TRACE_PACKET="$(pwd)/trace" git -C client diff HEAD^ HEAD &&
  73        grep "want $(cat hash-old-a)" trace &&
  74        grep "want $(cat hash-new-a)" trace &&
  75        ! grep "want $(cat hash-b)" trace
  76'
  77
  78test_expect_success 'when fetching missing objects, diff skips GITLINKs' '
  79        test_when_finished "rm -rf sub server client trace" &&
  80
  81        test_create_repo sub &&
  82        test_commit -C sub first &&
  83
  84        test_create_repo server &&
  85        echo a >server/a &&
  86        git -C server add a &&
  87        git -C server submodule add "file://$(pwd)/sub" &&
  88        git -C server commit -m x &&
  89
  90        test_commit -C server/sub second &&
  91        echo another-a >server/a &&
  92        git -C server add a sub &&
  93        git -C server commit -m x &&
  94
  95        test_config -C server uploadpack.allowfilter 1 &&
  96        test_config -C server uploadpack.allowanysha1inwant 1 &&
  97        git clone --bare --filter=blob:limit=0 "file://$(pwd)/server" client &&
  98
  99        echo a | git hash-object --stdin >hash-old-a &&
 100        echo another-a | git hash-object --stdin >hash-new-a &&
 101
 102        # Ensure that a and another-a are fetched, and check (by successful
 103        # execution of the diff) that no invalid OIDs are sent.
 104        GIT_TRACE_PACKET="$(pwd)/trace" git -C client diff HEAD^ HEAD &&
 105        grep "want $(cat hash-old-a)" trace &&
 106        grep "want $(cat hash-new-a)" trace
 107'
 108
 109test_expect_success 'diff with rename detection batches blobs' '
 110        test_when_finished "rm -rf server client trace" &&
 111
 112        test_create_repo server &&
 113        echo a >server/a &&
 114        printf "b\nb\nb\nb\nb\n" >server/b &&
 115        git -C server add a b &&
 116        git -C server commit -m x &&
 117        rm server/b &&
 118        printf "b\nb\nb\nb\nbX\n" >server/c &&
 119        git -C server add c &&
 120        git -C server commit -a -m x &&
 121
 122        test_config -C server uploadpack.allowfilter 1 &&
 123        test_config -C server uploadpack.allowanysha1inwant 1 &&
 124        git clone --bare --filter=blob:limit=0 "file://$(pwd)/server" client &&
 125
 126        # Ensure that there is exactly 1 negotiation by checking that there is
 127        # only 1 "done" line sent. ("done" marks the end of negotiation.)
 128        GIT_TRACE_PACKET="$(pwd)/trace" git -C client diff -M HEAD^ HEAD >out &&
 129        grep "similarity index" out &&
 130        grep "git> done" trace >done_lines &&
 131        test_line_count = 1 done_lines
 132'
 133
 134test_done