1#!/bin/sh 2# 3# This test covers the handling of objects which might have old 4# mtimes in the filesystem (because they were used previously) 5# and are just now becoming referenced again. 6# 7# We're going to do two things that are a little bit "fake" to 8# help make our simulation easier: 9# 10# 1. We'll turn off reflogs. You can still run into 11# problems with reflogs on, but your objects 12# don't get pruned until both the reflog expiration 13# has passed on their references, _and_ they are out 14# of prune's expiration period. Dropping reflogs 15# means we only have to deal with one variable in our tests, 16# but the results generalize. 17# 18# 2. We'll use a temporary index file to create our 19# works-in-progress. Most workflows would mention 20# referenced objects in the index, which prune takes 21# into account. However, many operations don't. For 22# example, a partial commit with "git commit foo" 23# will use a temporary index. Or they may not need 24# an index at all (e.g., creating a new commit 25# to refer to an existing tree). 26 27test_description='check pruning of dependent objects' 28. ./test-lib.sh 29 30# We care about reachability, so we do not want to use 31# the normal test_commit, which creates extra tags. 32add () { 33echo"$1">"$1"&& 34 git add "$1" 35} 36commit () { 37 test_tick && 38 add "$1"&& 39 git commit -m"$1" 40} 41 42test_expect_success 'disable reflogs'' 43 git config core.logallrefupdates false && 44 rm -rf .git/logs 45' 46 47test_expect_success 'setup basic history'' 48 commit base 49' 50 51test_expect_success 'create and abandon some objects'' 52 git checkout -b experiment && 53 commit abandon && 54 git checkout master && 55 git branch -D experiment 56' 57 58test_expect_success 'simulate time passing'' 59 find .git/objects -type f | 60 xargs test-chmtime -v -86400 61' 62 63test_expect_success 'start writing new commit with old blob'' 64 tree=$( 65 GIT_INDEX_FILE=index.tmp && 66 export GIT_INDEX_FILE && 67 git read-tree HEAD && 68 add unrelated && 69 add abandon && 70 git write-tree 71 ) 72' 73 74test_expect_success 'simultaneous gc'' 75 git gc --prune=12.hours.ago 76' 77 78test_expect_success 'finish writing out commit'' 79 commit=$(echo foo | git commit-tree -p HEAD $tree)&& 80 git update-ref HEAD$commit 81' 82 83# "abandon" blob should have been rescued by reference from new tree 84test_expect_success 'repository passes fsck'' 85 git fsck 86' 87 88test_done