Brandon Casey | 9245ddd | 2008-11-12 11:59:02 -0600 | [diff] [blame] | 1 | #!/bin/sh |
| 2 | |
| 3 | test_description='git repack works correctly' |
| 4 | |
| 5 | . ./test-lib.sh |
| 6 | |
Brandon Casey | dd71836 | 2008-11-12 11:59:05 -0600 | [diff] [blame] | 7 | test_expect_success 'objects in packs marked .keep are not repacked' ' |
Brandon Casey | 9245ddd | 2008-11-12 11:59:02 -0600 | [diff] [blame] | 8 | echo content1 > file1 && |
| 9 | echo content2 > file2 && |
| 10 | git add . && |
Junio C Hamano | 713c79e | 2010-04-14 15:09:57 -0700 | [diff] [blame] | 11 | test_tick && |
Brandon Casey | 9245ddd | 2008-11-12 11:59:02 -0600 | [diff] [blame] | 12 | git commit -m initial_commit && |
| 13 | # Create two packs |
| 14 | # The first pack will contain all of the objects except one |
| 15 | git rev-list --objects --all | grep -v file2 | |
| 16 | git pack-objects pack > /dev/null && |
| 17 | # The second pack will contain the excluded object |
| 18 | packsha1=$(git rev-list --objects --all | grep file2 | |
| 19 | git pack-objects pack) && |
| 20 | touch -r pack-$packsha1.pack pack-$packsha1.keep && |
| 21 | objsha1=$(git verify-pack -v pack-$packsha1.idx | head -n 1 | |
| 22 | sed -e "s/^\([0-9a-f]\{40\}\).*/\1/") && |
| 23 | mv pack-* .git/objects/pack/ && |
| 24 | git repack -A -d -l && |
| 25 | git prune-packed && |
| 26 | for p in .git/objects/pack/*.idx; do |
| 27 | idx=$(basename $p) |
| 28 | test "pack-$packsha1.idx" = "$idx" && continue |
| 29 | if git verify-pack -v $p | egrep "^$objsha1"; then |
| 30 | found_duplicate_object=1 |
| 31 | echo "DUPLICATE OBJECT FOUND" |
| 32 | break |
| 33 | fi |
| 34 | done && |
| 35 | test -z "$found_duplicate_object" |
| 36 | ' |
| 37 | |
Brandon Casey | daae062 | 2008-11-09 23:59:58 -0600 | [diff] [blame] | 38 | test_expect_success 'loose objects in alternate ODB are not repacked' ' |
Brandon Casey | 3c3df42 | 2008-11-09 23:59:56 -0600 | [diff] [blame] | 39 | mkdir alt_objects && |
| 40 | echo `pwd`/alt_objects > .git/objects/info/alternates && |
| 41 | echo content3 > file3 && |
| 42 | objsha1=$(GIT_OBJECT_DIRECTORY=alt_objects git hash-object -w file3) && |
| 43 | git add file3 && |
Junio C Hamano | 713c79e | 2010-04-14 15:09:57 -0700 | [diff] [blame] | 44 | test_tick && |
Brandon Casey | 3c3df42 | 2008-11-09 23:59:56 -0600 | [diff] [blame] | 45 | git commit -m commit_file3 && |
| 46 | git repack -a -d -l && |
| 47 | git prune-packed && |
| 48 | for p in .git/objects/pack/*.idx; do |
| 49 | if git verify-pack -v $p | egrep "^$objsha1"; then |
| 50 | found_duplicate_object=1 |
| 51 | echo "DUPLICATE OBJECT FOUND" |
| 52 | break |
| 53 | fi |
| 54 | done && |
| 55 | test -z "$found_duplicate_object" |
| 56 | ' |
| 57 | |
Brandon Casey | 3289b9d | 2008-11-12 18:50:26 -0600 | [diff] [blame] | 58 | test_expect_success 'packed obs in alt ODB are repacked even when local repo is packless' ' |
Jonathan Nieder | 2dec68c | 2010-10-31 02:30:58 -0500 | [diff] [blame] | 59 | mkdir alt_objects/pack && |
Brandon Casey | 3289b9d | 2008-11-12 18:50:26 -0600 | [diff] [blame] | 60 | mv .git/objects/pack/* alt_objects/pack && |
| 61 | git repack -a && |
| 62 | myidx=$(ls -1 .git/objects/pack/*.idx) && |
| 63 | test -f "$myidx" && |
| 64 | for p in alt_objects/pack/*.idx; do |
| 65 | git verify-pack -v $p | sed -n -e "/^[0-9a-f]\{40\}/p" |
| 66 | done | while read sha1 rest; do |
| 67 | if ! ( git verify-pack -v $myidx | grep "^$sha1" ); then |
| 68 | echo "Missing object in local pack: $sha1" |
| 69 | return 1 |
| 70 | fi |
| 71 | done |
| 72 | ' |
| 73 | |
Brandon Casey | 1ef2d5a | 2009-04-24 18:18:53 -0500 | [diff] [blame] | 74 | test_expect_success 'packed obs in alt ODB are repacked when local repo has packs' ' |
Brandon Casey | a83c885 | 2009-01-09 16:14:39 -0600 | [diff] [blame] | 75 | rm -f .git/objects/pack/* && |
| 76 | echo new_content >> file1 && |
| 77 | git add file1 && |
Junio C Hamano | 713c79e | 2010-04-14 15:09:57 -0700 | [diff] [blame] | 78 | test_tick && |
Brandon Casey | a83c885 | 2009-01-09 16:14:39 -0600 | [diff] [blame] | 79 | git commit -m more_content && |
| 80 | git repack && |
| 81 | git repack -a -d && |
| 82 | myidx=$(ls -1 .git/objects/pack/*.idx) && |
| 83 | test -f "$myidx" && |
| 84 | for p in alt_objects/pack/*.idx; do |
| 85 | git verify-pack -v $p | sed -n -e "/^[0-9a-f]\{40\}/p" |
| 86 | done | while read sha1 rest; do |
| 87 | if ! ( git verify-pack -v $myidx | grep "^$sha1" ); then |
| 88 | echo "Missing object in local pack: $sha1" |
| 89 | return 1 |
| 90 | fi |
| 91 | done |
| 92 | ' |
| 93 | |
Brandon Casey | 171110a | 2009-03-19 22:47:51 -0500 | [diff] [blame] | 94 | test_expect_success 'packed obs in alternate ODB kept pack are repacked' ' |
Brandon Casey | 92cd872 | 2009-03-19 22:47:50 -0500 | [diff] [blame] | 95 | # swap the .keep so the commit object is in the pack with .keep |
| 96 | for p in alt_objects/pack/*.pack |
| 97 | do |
Jonathan Nieder | 2dec68c | 2010-10-31 02:30:58 -0500 | [diff] [blame] | 98 | base_name=$(basename $p .pack) && |
Brandon Casey | 92cd872 | 2009-03-19 22:47:50 -0500 | [diff] [blame] | 99 | if test -f alt_objects/pack/$base_name.keep |
| 100 | then |
| 101 | rm alt_objects/pack/$base_name.keep |
| 102 | else |
| 103 | touch alt_objects/pack/$base_name.keep |
| 104 | fi |
Jonathan Nieder | 2dec68c | 2010-10-31 02:30:58 -0500 | [diff] [blame] | 105 | done && |
Brandon Casey | 92cd872 | 2009-03-19 22:47:50 -0500 | [diff] [blame] | 106 | git repack -a -d && |
| 107 | myidx=$(ls -1 .git/objects/pack/*.idx) && |
| 108 | test -f "$myidx" && |
| 109 | for p in alt_objects/pack/*.idx; do |
| 110 | git verify-pack -v $p | sed -n -e "/^[0-9a-f]\{40\}/p" |
| 111 | done | while read sha1 rest; do |
| 112 | if ! ( git verify-pack -v $myidx | grep "^$sha1" ); then |
| 113 | echo "Missing object in local pack: $sha1" |
| 114 | return 1 |
| 115 | fi |
| 116 | done |
| 117 | ' |
| 118 | |
Brandon Casey | 79bc4c7 | 2009-03-19 22:47:52 -0500 | [diff] [blame] | 119 | test_expect_success 'packed unreachable obs in alternate ODB are not loosened' ' |
Brandon Casey | 92cd872 | 2009-03-19 22:47:50 -0500 | [diff] [blame] | 120 | rm -f alt_objects/pack/*.keep && |
| 121 | mv .git/objects/pack/* alt_objects/pack/ && |
| 122 | csha1=$(git rev-parse HEAD^{commit}) && |
| 123 | git reset --hard HEAD^ && |
Junio C Hamano | 713c79e | 2010-04-14 15:09:57 -0700 | [diff] [blame] | 124 | test_tick && |
| 125 | git reflog expire --expire=$test_tick --expire-unreachable=$test_tick --all && |
Brandon Casey | 92cd872 | 2009-03-19 22:47:50 -0500 | [diff] [blame] | 126 | # The pack-objects call on the next line is equivalent to |
| 127 | # git repack -A -d without the call to prune-packed |
| 128 | git pack-objects --honor-pack-keep --non-empty --all --reflog \ |
| 129 | --unpack-unreachable </dev/null pack && |
| 130 | rm -f .git/objects/pack/* && |
| 131 | mv pack-* .git/objects/pack/ && |
| 132 | test 0 = $(git verify-pack -v -- .git/objects/pack/*.idx | |
| 133 | egrep "^$csha1 " | sort | uniq | wc -l) && |
| 134 | echo > .git/objects/info/alternates && |
| 135 | test_must_fail git show $csha1 |
| 136 | ' |
| 137 | |
Brandon Casey | 094085e | 2009-03-21 17:26:11 -0500 | [diff] [blame] | 138 | test_expect_success 'local packed unreachable obs that exist in alternate ODB are not loosened' ' |
Brandon Casey | 869a3d3 | 2009-03-21 17:25:30 -0500 | [diff] [blame] | 139 | echo `pwd`/alt_objects > .git/objects/info/alternates && |
| 140 | echo "$csha1" | git pack-objects --non-empty --all --reflog pack && |
| 141 | rm -f .git/objects/pack/* && |
| 142 | mv pack-* .git/objects/pack/ && |
| 143 | # The pack-objects call on the next line is equivalent to |
| 144 | # git repack -A -d without the call to prune-packed |
| 145 | git pack-objects --honor-pack-keep --non-empty --all --reflog \ |
| 146 | --unpack-unreachable </dev/null pack && |
| 147 | rm -f .git/objects/pack/* && |
| 148 | mv pack-* .git/objects/pack/ && |
| 149 | test 0 = $(git verify-pack -v -- .git/objects/pack/*.idx | |
| 150 | egrep "^$csha1 " | sort | uniq | wc -l) && |
| 151 | echo > .git/objects/info/alternates && |
| 152 | test_must_fail git show $csha1 |
| 153 | ' |
| 154 | |
Johannes Schindelin | 7f3140c | 2009-07-23 17:33:49 +0200 | [diff] [blame] | 155 | test_expect_success 'objects made unreachable by grafts only are kept' ' |
Björn Steinbrink | 1ec6482 | 2009-07-23 17:33:45 +0200 | [diff] [blame] | 156 | test_tick && |
| 157 | git commit --allow-empty -m "commit 4" && |
| 158 | H0=$(git rev-parse HEAD) && |
| 159 | H1=$(git rev-parse HEAD^) && |
| 160 | H2=$(git rev-parse HEAD^^) && |
| 161 | echo "$H0 $H2" > .git/info/grafts && |
Junio C Hamano | 713c79e | 2010-04-14 15:09:57 -0700 | [diff] [blame] | 162 | git reflog expire --expire=$test_tick --expire-unreachable=$test_tick --all && |
Björn Steinbrink | 1ec6482 | 2009-07-23 17:33:45 +0200 | [diff] [blame] | 163 | git repack -a -d && |
| 164 | git cat-file -t $H1 |
| 165 | ' |
| 166 | |
Brandon Casey | 9245ddd | 2008-11-12 11:59:02 -0600 | [diff] [blame] | 167 | test_done |
| 168 | |