Signed-off-by: Elijah Newren <newren@xxxxxxxxx> --- t/sparse-lib.sh | 38 ++++++++++ t/t5720-sparse-repository-basics.sh | 130 +++++++++++++++++++++++++++++++++++ 2 files changed, 168 insertions(+), 0 deletions(-) create mode 100644 t/sparse-lib.sh create mode 100755 t/t5720-sparse-repository-basics.sh diff --git a/t/sparse-lib.sh b/t/sparse-lib.sh new file mode 100644 index 0000000..0b779c6 --- /dev/null +++ b/t/sparse-lib.sh @@ -0,0 +1,38 @@ +#!/bin/sh + +make_sparse() { + # We only want loose objects + mv .git/objects/pack/* . && + for i in $(ls *.pack); do + git unpack-objects -q < $i + done && + rm -f *.pack *.idx && + + cd .git/objects && + + # Find the objects need for the specified paths + for i in $(git rev-list master); do + echo $i; + git rev-parse $i^{tree}; + git ls-tree -rt $i -- "$@" | awk '{print $3}'; + done | sort | uniq > ../wanted && + + # Find all other objects and delete them + find . -type f | sed -e s#[\./]##g \ + | grep -v -F "$(cat ../wanted)" > ../bad && + for i in $(cat ../bad); do + rm -f ./${i:0:2}/${i:2}; + done && + + # Record the sparse limits + cd .. && + echo -n "'--'" > sparse-limits && + for i in "$@"; do + echo -n " '$i'" >> sparse-limits + done && + echo >> sparse-limits && + + # Trim the index while we're at it + cd .. && + git reset --hard HEAD +} diff --git a/t/t5720-sparse-repository-basics.sh b/t/t5720-sparse-repository-basics.sh new file mode 100755 index 0000000..b8e9a3a --- /dev/null +++ b/t/t5720-sparse-repository-basics.sh @@ -0,0 +1,130 @@ +#!/bin/sh + +test_description='sparse repository basics' +. ./test-lib.sh +. "$TEST_DIRECTORY"/sparse-lib.sh + +test_expect_success 'setup' ' + rm -fr .git && + test_create_repo src && + ( + cd src && + + mkdir -p sub/{a,b} && + > sub/a/file && + git add sub/a/file && + test_tick && + git commit -q -m initial && + + > sub/b/file && + git add sub/b/file && + test_tick && + git commit -q -m two && + + echo unique > sub/file && + git add sub/file && + test_tick && + git commit -q -m three && + + echo content > sub/b/file && + test_tick && + git commit -q -m subbfile sub/b/file && + + cp -a sub/b sub/bcopy && + git add sub/bcopy && + test_tick && + git commit -q -m subbcopy && + + echo stuff > sub/a/file && + test_tick && + git commit -q -m subafile sub/a/file + ) +' + +test_expect_failure 'make sparse repository' ' + git clone -q "file://$(pwd)/src" dst && + ( + cd dst && + test 25 = "$(git rev-list --objects master | wc -l)" && + make_sparse sub/b/file && + test 0 = $(find .git/objects/pack -type f | wc -l) && + test 22 = $(find .git/objects -type f | wc -l) + ) +' + +cd dst 2>/dev/null || test_done +srcgit="--git-dir=../src/.git" + +test_expect_failure 'plumbing: ls-files works' ' + git ls-files > output && + test "sub/b/file" = "$(cat output)" +' + +test_expect_failure 'plumbing: rev-list works' ' + test "$(git rev-list HEAD)" = \ + "$(git $srcgit rev-list HEAD -- sub/b/)" && + test "$(git rev-list --objects HEAD)" = \ + "$(git $srcgit rev-list --objects HEAD -- sub/b/)" +' + +for i in $(git $srcgit rev-list HEAD | xargs git name-rev | cut -b 42-); do + git $srcgit rev-parse $i:sub/b/file >/dev/null 2>&1 && + test_expect_success "plumbing: We can access $i:sub/b/file" " + git cat-file -t $i:sub/b/file + " +done + +final_afile_sha=$(git $srcgit rev-parse master:sub/a/file) +known_objects=$(git $srcgit rev-list --objects master \ + | grep sub \ + | grep -v $final_afile_sha \ + | cut -b -40) +for i in $(git $srcgit rev-list HEAD | xargs git name-rev | cut -b 42-); do + git $srcgit ls-tree -rt $i | grep -F "$known_objects" >expect && + test_expect_failure "plumbing: ls-tree -rt $i works" " + git ls-tree -rt $i 2>error >output && + test_cmp output expect + " +done + +test_expect_failure 'basic: log works' ' + git log > /dev/null && + git log -p > /dev/null && + git log -Scontent > /dev/null +' + +test_expect_failure 'basic: diff works' ' + git diff master~3 master && + git diff master~3 +' + +test_expect_failure 'basic: checkout works' ' + git checkout master~2 && + git checkout master +' + +test_expect_failure 'basic: status works with modified stuff' ' + git status && + echo more content >> sub/b/file && + echo newfile content >> sub/b/whatever && + git status +' + +test_expect_failure 'basic: add works' ' + git add sub/b/file && + git add sub/b/whatever +' + +test_expect_failure 'basic: commit works' ' + git commit -m "Commit in a sparse clone" && + git rev-parse master^{tree} && + git rev-parse master:sub && + git rev-parse master:sub/b && + git rev-parse master:sub/b/file && + git rev-parse master:sub/bcopy && + git rev-parse master:sub/bcopy/file && + git rev-parse master:sub/a && + git rev-parse master:sub/file +' + +test_done -- 1.7.2.2.140.gd06af -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html