Merge branch 'js/fsck-tag-validation'
[gitweb.git] / t / t6501-freshen-objects.sh
index de941c2cb2211f01a06c5a6dcc60fbefd65f6c7c..157f3f91db1e54f3069e45a5087cdb6a8838c7db 100755 (executable)
@@ -39,50 +39,94 @@ commit () {
        git commit -m "$1"
 }
 
-test_expect_success 'disable reflogs' '
-       git config core.logallrefupdates false &&
-       rm -rf .git/logs
-'
-
-test_expect_success 'setup basic history' '
-       commit base
-'
-
-test_expect_success 'create and abandon some objects' '
-       git checkout -b experiment &&
-       commit abandon &&
-       git checkout master &&
-       git branch -D experiment
-'
-
-test_expect_success 'simulate time passing' '
-       find .git/objects -type f |
-       xargs test-chmtime -v -86400
-'
-
-test_expect_success 'start writing new commit with old blob' '
-       tree=$(
-               GIT_INDEX_FILE=index.tmp &&
-               export GIT_INDEX_FILE &&
-               git read-tree HEAD &&
-               add unrelated &&
-               add abandon &&
-               git write-tree
-       )
-'
-
-test_expect_success 'simultaneous gc' '
-       git gc --prune=12.hours.ago
-'
-
-test_expect_success 'finish writing out commit' '
-       commit=$(echo foo | git commit-tree -p HEAD $tree) &&
-       git update-ref HEAD $commit
-'
-
-# "abandon" blob should have been rescued by reference from new tree
-test_expect_success 'repository passes fsck' '
-       git fsck
-'
+maybe_repack () {
+       if test -n "$repack"; then
+               git repack -ad
+       fi
+}
+
+for repack in '' true; do
+       title=${repack:+repack}
+       title=${title:-loose}
+
+       test_expect_success "make repo completely empty ($title)" '
+               rm -rf .git &&
+               git init
+       '
+
+       test_expect_success "disable reflogs ($title)" '
+               git config core.logallrefupdates false &&
+               rm -rf .git/logs
+       '
+
+       test_expect_success "setup basic history ($title)" '
+               commit base
+       '
+
+       test_expect_success "create and abandon some objects ($title)" '
+               git checkout -b experiment &&
+               commit abandon &&
+               maybe_repack &&
+               git checkout master &&
+               git branch -D experiment
+       '
+
+       test_expect_success "simulate time passing ($title)" '
+               find .git/objects -type f |
+               xargs test-chmtime -v -86400
+       '
+
+       test_expect_success "start writing new commit with old blob ($title)" '
+               tree=$(
+                       GIT_INDEX_FILE=index.tmp &&
+                       export GIT_INDEX_FILE &&
+                       git read-tree HEAD &&
+                       add unrelated &&
+                       add abandon &&
+                       git write-tree
+               )
+       '
+
+       test_expect_success "simultaneous gc ($title)" '
+               git gc --prune=12.hours.ago
+       '
+
+       test_expect_success "finish writing out commit ($title)" '
+               commit=$(echo foo | git commit-tree -p HEAD $tree) &&
+               git update-ref HEAD $commit
+       '
+
+       # "abandon" blob should have been rescued by reference from new tree
+       test_expect_success "repository passes fsck ($title)" '
+               git fsck
+       '
+
+       test_expect_success "abandon objects again ($title)" '
+               git reset --hard HEAD^ &&
+               find .git/objects -type f |
+               xargs test-chmtime -v -86400
+       '
+
+       test_expect_success "start writing new commit with same tree ($title)" '
+               tree=$(
+                       GIT_INDEX_FILE=index.tmp &&
+                       export GIT_INDEX_FILE &&
+                       git read-tree HEAD &&
+                       add abandon &&
+                       add unrelated &&
+                       git write-tree
+               )
+       '
+
+       test_expect_success "simultaneous gc ($title)" '
+               git gc --prune=12.hours.ago
+       '
+
+       # tree should have been refreshed by write-tree
+       test_expect_success "finish writing out commit ($title)" '
+               commit=$(echo foo | git commit-tree -p HEAD $tree) &&
+               git update-ref HEAD $commit
+       '
+done
 
 test_done