]>
Commit | Line | Data |
---|---|---|
d3038d22 JK |
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 | ||
27 | test_description='check pruning of dependent objects' | |
5902f5f4 | 28 | GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main |
334afbc7 JS |
29 | export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME |
30 | ||
b2e5d75d | 31 | TEST_PASSES_SANITIZE_LEAK=true |
d3038d22 JK |
32 | . ./test-lib.sh |
33 | ||
34 | # We care about reachability, so we do not want to use | |
35 | # the normal test_commit, which creates extra tags. | |
36 | add () { | |
37 | echo "$1" >"$1" && | |
38 | git add "$1" | |
39 | } | |
40 | commit () { | |
41 | test_tick && | |
42 | add "$1" && | |
43 | git commit -m "$1" | |
44 | } | |
45 | ||
abcb8655 | 46 | maybe_repack () { |
2ba582ba JK |
47 | case "$title" in |
48 | loose) | |
49 | : skip repack | |
50 | ;; | |
51 | repack) | |
abcb8655 | 52 | git repack -ad |
2ba582ba JK |
53 | ;; |
54 | bitmap) | |
55 | git repack -adb | |
56 | ;; | |
57 | *) | |
58 | echo >&2 "unknown test type in maybe_repack" | |
59 | return 1 | |
60 | ;; | |
61 | esac | |
abcb8655 JK |
62 | } |
63 | ||
2ba582ba JK |
64 | for title in loose repack bitmap |
65 | do | |
abcb8655 JK |
66 | test_expect_success "make repo completely empty ($title)" ' |
67 | rm -rf .git && | |
68 | git init | |
69 | ' | |
70 | ||
71 | test_expect_success "disable reflogs ($title)" ' | |
72 | git config core.logallrefupdates false && | |
d0ab0584 | 73 | git reflog expire --expire=all --all |
abcb8655 | 74 | ' |
d3038d22 | 75 | |
abcb8655 JK |
76 | test_expect_success "setup basic history ($title)" ' |
77 | commit base | |
78 | ' | |
d3038d22 | 79 | |
abcb8655 JK |
80 | test_expect_success "create and abandon some objects ($title)" ' |
81 | git checkout -b experiment && | |
82 | commit abandon && | |
83 | maybe_repack && | |
5902f5f4 | 84 | git checkout main && |
abcb8655 JK |
85 | git branch -D experiment |
86 | ' | |
d3038d22 | 87 | |
abcb8655 | 88 | test_expect_success "simulate time passing ($title)" ' |
deb9845a | 89 | test-tool chmtime --get -86400 $(find .git/objects -type f) |
abcb8655 | 90 | ' |
d3038d22 | 91 | |
abcb8655 JK |
92 | test_expect_success "start writing new commit with old blob ($title)" ' |
93 | tree=$( | |
94 | GIT_INDEX_FILE=index.tmp && | |
95 | export GIT_INDEX_FILE && | |
96 | git read-tree HEAD && | |
97 | add unrelated && | |
98 | add abandon && | |
99 | git write-tree | |
100 | ) | |
101 | ' | |
d3038d22 | 102 | |
abcb8655 JK |
103 | test_expect_success "simultaneous gc ($title)" ' |
104 | git gc --prune=12.hours.ago | |
105 | ' | |
d3038d22 | 106 | |
abcb8655 JK |
107 | test_expect_success "finish writing out commit ($title)" ' |
108 | commit=$(echo foo | git commit-tree -p HEAD $tree) && | |
109 | git update-ref HEAD $commit | |
110 | ' | |
d3038d22 | 111 | |
abcb8655 JK |
112 | # "abandon" blob should have been rescued by reference from new tree |
113 | test_expect_success "repository passes fsck ($title)" ' | |
114 | git fsck | |
115 | ' | |
33d4221c JK |
116 | |
117 | test_expect_success "abandon objects again ($title)" ' | |
118 | git reset --hard HEAD^ && | |
deb9845a | 119 | test-tool chmtime --get -86400 $(find .git/objects -type f) |
33d4221c JK |
120 | ' |
121 | ||
122 | test_expect_success "start writing new commit with same tree ($title)" ' | |
123 | tree=$( | |
124 | GIT_INDEX_FILE=index.tmp && | |
125 | export GIT_INDEX_FILE && | |
126 | git read-tree HEAD && | |
127 | add abandon && | |
128 | add unrelated && | |
129 | git write-tree | |
130 | ) | |
131 | ' | |
132 | ||
133 | test_expect_success "simultaneous gc ($title)" ' | |
134 | git gc --prune=12.hours.ago | |
135 | ' | |
136 | ||
137 | # tree should have been refreshed by write-tree | |
138 | test_expect_success "finish writing out commit ($title)" ' | |
139 | commit=$(echo foo | git commit-tree -p HEAD $tree) && | |
140 | git update-ref HEAD $commit | |
141 | ' | |
abcb8655 | 142 | done |
d3038d22 | 143 | |
a3ba6bf1 | 144 | test_expect_success 'do not complain about existing broken links (commit)' ' |
252a4ee6 | 145 | cat >broken-commit <<-EOF && |
146 | tree $(test_oid 001) | |
147 | parent $(test_oid 002) | |
daf7d867 JK |
148 | author whatever <whatever@example.com> 1234 -0000 |
149 | committer whatever <whatever@example.com> 1234 -0000 | |
150 | ||
151 | some message | |
152 | EOF | |
153 | commit=$(git hash-object -t commit -w broken-commit) && | |
b068d9a2 | 154 | git gc -q 2>stderr && |
daf7d867 JK |
155 | verbose git cat-file -e $commit && |
156 | test_must_be_empty stderr | |
157 | ' | |
158 | ||
a3ba6bf1 | 159 | test_expect_success 'do not complain about existing broken links (tree)' ' |
252a4ee6 | 160 | cat >broken-tree <<-EOF && |
161 | 100644 blob $(test_oid 003) foo | |
a3ba6bf1 JK |
162 | EOF |
163 | tree=$(git mktree --missing <broken-tree) && | |
b068d9a2 | 164 | git gc -q 2>stderr && |
a3ba6bf1 JK |
165 | git cat-file -e $tree && |
166 | test_must_be_empty stderr | |
167 | ' | |
168 | ||
169 | test_expect_success 'do not complain about existing broken links (tag)' ' | |
252a4ee6 | 170 | cat >broken-tag <<-EOF && |
171 | object $(test_oid 004) | |
a3ba6bf1 JK |
172 | type commit |
173 | tag broken | |
174 | tagger whatever <whatever@example.com> 1234 -0000 | |
175 | ||
176 | this is a broken tag | |
177 | EOF | |
178 | tag=$(git hash-object -t tag -w broken-tag) && | |
b068d9a2 | 179 | git gc -q 2>stderr && |
a3ba6bf1 JK |
180 | git cat-file -e $tag && |
181 | test_must_be_empty stderr | |
182 | ' | |
183 | ||
d3038d22 | 184 | test_done |