From: Junio C Hamano Date: Fri, 15 Apr 2016 01:37:16 +0000 (-0700) Subject: Merge branch 'sb/clone-t57-t56' into maint X-Git-Tag: v2.8.2~23 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/5859f04f0807264c03951a2e7be9192e00487039 Merge branch 'sb/clone-t57-t56' into maint Rename bunch of tests on "git clone" for better organization. * sb/clone-t57-t56: clone tests: rename t57* => t56* --- 5859f04f0807264c03951a2e7be9192e00487039 diff --cc t/t5604-clone-reference.sh index 0000000000,dfa1bf79c5..4320082b1b mode 000000,100755..100755 --- a/t/t5604-clone-reference.sh +++ b/t/t5604-clone-reference.sh @@@ -1,0 -1,224 +1,224 @@@ + #!/bin/sh + # + # Copyright (C) 2006 Martin Waitz + # + + test_description='test clone --reference' + . ./test-lib.sh + -base_dir=`pwd` ++base_dir=$(pwd) + + U=$base_dir/UPLOAD_LOG + + # create a commit in repo $1 with name $2 + commit_in () { + ( + cd "$1" && + echo "$2" >"$2" && + git add "$2" && + git commit -m "$2" + ) + } + + # check that there are $2 loose objects in repo $1 + test_objcount () { + echo "$2" >expect && + git -C "$1" count-objects >actual.raw && + cut -d' ' -f1 actual && + test_cmp expect actual + } + + test_expect_success 'preparing first repository' ' + test_create_repo A && + commit_in A file1 + ' + + test_expect_success 'preparing second repository' ' + git clone A B && + commit_in B file2 && + git -C B repack -ad && + git -C B prune + ' + + test_expect_success 'cloning with reference (-l -s)' ' + git clone -l -s --reference B A C + ' + + test_expect_success 'existence of info/alternates' ' + test_line_count = 2 C/.git/objects/info/alternates + ' + + test_expect_success 'pulling from reference' ' + git -C C pull ../B master + ' + + test_expect_success 'that reference gets used' ' + test_objcount C 0 + ' + + test_expect_success 'cloning with reference (no -l -s)' ' + GIT_TRACE_PACKET=$U.D git clone --reference B "file://$(pwd)/A" D + ' + + test_expect_success 'fetched no objects' ' + test -s "$U.D" && + ! grep " want" "$U.D" + ' + + test_expect_success 'existence of info/alternates' ' + test_line_count = 1 D/.git/objects/info/alternates + ' + + test_expect_success 'pulling from reference' ' + git -C D pull ../B master + ' + + test_expect_success 'that reference gets used' ' + test_objcount D 0 + ' + + test_expect_success 'updating origin' ' + commit_in A file3 && + git -C A repack -ad && + git -C A prune + ' + + test_expect_success 'pulling changes from origin' ' + git -C C pull origin + ' + + # the 2 local objects are commit and tree from the merge + test_expect_success 'that alternate to origin gets used' ' + test_objcount C 2 + ' + + test_expect_success 'pulling changes from origin' ' + git -C D pull origin + ' + + # the 5 local objects are expected; file3 blob, commit in A to add it + # and its tree, and 2 are our tree and the merge commit. + test_expect_success 'check objects expected to exist locally' ' + test_objcount D 5 + ' + + test_expect_success 'preparing alternate repository #1' ' + test_create_repo F && + commit_in F file1 + ' + + test_expect_success 'cloning alternate repo #2 and adding changes to repo #1' ' + git clone F G && + commit_in F file2 + ' + + test_expect_success 'cloning alternate repo #1, using #2 as reference' ' + git clone --reference G F H + ' + + test_expect_success 'cloning with reference being subset of source (-l -s)' ' + git clone -l -s --reference A B E + ' + + test_expect_success 'cloning with multiple references drops duplicates' ' + git clone -s --reference B --reference A --reference B A dups && + test_line_count = 2 dups/.git/objects/info/alternates + ' + + test_expect_success 'clone with reference from a tagged repository' ' + ( + cd A && git tag -a -m tagged HEAD + ) && + git clone --reference=A A I + ' + + test_expect_success 'prepare branched repository' ' + git clone A J && + ( + cd J && + git checkout -b other master^ && + echo other >otherfile && + git add otherfile && + git commit -m other && + git checkout master + ) + ' + + test_expect_success 'fetch with incomplete alternates' ' + git init K && + echo "$base_dir/A/.git/objects" >K/.git/objects/info/alternates && + ( + cd K && + git remote add J "file://$base_dir/J" && + GIT_TRACE_PACKET=$U.K git fetch J + ) && + master_object=$(cd A && git for-each-ref --format="%(objectname)" refs/heads/master) && + test -s "$U.K" && + ! grep " want $master_object" "$U.K" && + tag_object=$(cd A && git for-each-ref --format="%(objectname)" refs/tags/HEAD) && + ! grep " want $tag_object" "$U.K" + ' + + test_expect_success 'clone using repo with gitfile as a reference' ' + git clone --separate-git-dir=L A M && + git clone --reference=M A N && + echo "$base_dir/L/objects" >expected && + test_cmp expected "$base_dir/N/.git/objects/info/alternates" + ' + + test_expect_success 'clone using repo pointed at by gitfile as reference' ' + git clone --reference=M/.git A O && + echo "$base_dir/L/objects" >expected && + test_cmp expected "$base_dir/O/.git/objects/info/alternates" + ' + + test_expect_success 'clone and dissociate from reference' ' + git init P && + ( + cd P && test_commit one + ) && + git clone P Q && + ( + cd Q && test_commit two + ) && + git clone --no-local --reference=P Q R && + git clone --no-local --reference=P --dissociate Q S && + # removing the reference P would corrupt R but not S + rm -fr P && + test_must_fail git -C R fsck && + git -C S fsck + ' + test_expect_success 'clone, dissociate from partial reference and repack' ' + rm -fr P Q R && + git init P && + ( + cd P && + test_commit one && + git repack && + test_commit two && + git repack + ) && + git clone --bare P Q && + ( + cd P && + git checkout -b second && + test_commit three && + git repack + ) && + git clone --bare --dissociate --reference=P Q R && + ls R/objects/pack/*.pack >packs.txt && + test_line_count = 1 packs.txt + ' + + test_expect_success 'clone, dissociate from alternates' ' + rm -fr A B C && + test_create_repo A && + commit_in A file1 && + git clone --reference=A A B && + test_line_count = 1 B/.git/objects/info/alternates && + git clone --local --dissociate B C && + ! test -f C/.git/objects/info/alternates && + ( cd C && git fsck ) + ' + + test_done diff --cc t/t5613-info-alternate.sh index 0000000000,5a6e49d18d..9cd2626dba mode 000000,100755..100755 --- a/t/t5613-info-alternate.sh +++ b/t/t5613-info-alternate.sh @@@ -1,0 -1,112 +1,112 @@@ + #!/bin/sh + # + # Copyright (C) 2006 Martin Waitz + # + + test_description='test transitive info/alternate entries' + . ./test-lib.sh + + # test that a file is not reachable in the current repository + # but that it is after creating a info/alternate entry + reachable_via() { + alternate="$1" + file="$2" + if git cat-file -e "HEAD:$file"; then return 1; fi + echo "$alternate" >> .git/objects/info/alternate + git cat-file -e "HEAD:$file" + } + + test_valid_repo() { + git fsck --full > fsck.log && + test_line_count = 0 fsck.log + } + -base_dir=`pwd` ++base_dir=$(pwd) + + test_expect_success 'preparing first repository' \ + 'test_create_repo A && cd A && + echo "Hello World" > file1 && + git add file1 && + git commit -m "Initial commit" file1 && + git repack -a -d && + git prune' + + cd "$base_dir" + + test_expect_success 'preparing second repository' \ + 'git clone -l -s A B && cd B && + echo "foo bar" > file2 && + git add file2 && + git commit -m "next commit" file2 && + git repack -a -d -l && + git prune' + + cd "$base_dir" + + test_expect_success 'preparing third repository' \ + 'git clone -l -s B C && cd C && + echo "Goodbye, cruel world" > file3 && + git add file3 && + git commit -m "one more" file3 && + git repack -a -d -l && + git prune' + + cd "$base_dir" + + test_expect_success 'creating too deep nesting' \ + 'git clone -l -s C D && + git clone -l -s D E && + git clone -l -s E F && + git clone -l -s F G && + git clone --bare -l -s G H' + + test_expect_success 'invalidity of deepest repository' \ + 'cd H && { + test_valid_repo + test $? -ne 0 + }' + + cd "$base_dir" + + test_expect_success 'validity of third repository' \ + 'cd C && + test_valid_repo' + + cd "$base_dir" + + test_expect_success 'validity of fourth repository' \ + 'cd D && + test_valid_repo' + + cd "$base_dir" + + test_expect_success 'breaking of loops' \ + 'echo "$base_dir"/B/.git/objects >> "$base_dir"/A/.git/objects/info/alternates&& + cd C && + test_valid_repo' + + cd "$base_dir" + + test_expect_success 'that info/alternates is necessary' \ + 'cd C && + rm -f .git/objects/info/alternates && + ! (test_valid_repo)' + + cd "$base_dir" + + test_expect_success 'that relative alternate is possible for current dir' \ + 'cd C && + echo "../../../B/.git/objects" > .git/objects/info/alternates && + test_valid_repo' + + cd "$base_dir" + + test_expect_success \ + 'that relative alternate is only possible for current dir' ' + cd D && + ! (test_valid_repo) + ' + + cd "$base_dir" + + test_done