t / t5317-pack-objects-filter-objects.shon commit list-objects-filter: use BUG rather than die (696aa73)
   1#!/bin/sh
   2
   3test_description='git pack-objects using object filtering'
   4
   5. ./test-lib.sh
   6
   7# Test blob:none filter.
   8
   9test_expect_success 'setup r1' '
  10        echo "{print \$1}" >print_1.awk &&
  11        echo "{print \$2}" >print_2.awk &&
  12
  13        git init r1 &&
  14        for n in 1 2 3 4 5
  15        do
  16                echo "This is file: $n" > r1/file.$n
  17                git -C r1 add file.$n
  18                git -C r1 commit -m "$n"
  19        done
  20'
  21
  22test_expect_success 'verify blob count in normal packfile' '
  23        git -C r1 ls-files -s file.1 file.2 file.3 file.4 file.5 \
  24                | awk -f print_2.awk \
  25                | sort >expected &&
  26        git -C r1 pack-objects --rev --stdout >all.pack <<-EOF &&
  27        HEAD
  28        EOF
  29        git -C r1 index-pack ../all.pack &&
  30        git -C r1 verify-pack -v ../all.pack \
  31                | grep blob \
  32                | awk -f print_1.awk \
  33                | sort >observed &&
  34        test_cmp observed expected
  35'
  36
  37test_expect_success 'verify blob:none packfile has no blobs' '
  38        git -C r1 pack-objects --rev --stdout --filter=blob:none >filter.pack <<-EOF &&
  39        HEAD
  40        EOF
  41        git -C r1 index-pack ../filter.pack &&
  42        git -C r1 verify-pack -v ../filter.pack \
  43                | grep blob \
  44                | awk -f print_1.awk \
  45                | sort >observed &&
  46        nr=$(wc -l <observed) &&
  47        test 0 -eq $nr
  48'
  49
  50test_expect_success 'verify normal and blob:none packfiles have same commits/trees' '
  51        git -C r1 verify-pack -v ../all.pack \
  52                | grep -E "commit|tree" \
  53                | awk -f print_1.awk \
  54                | sort >expected &&
  55        git -C r1 verify-pack -v ../filter.pack \
  56                | grep -E "commit|tree" \
  57                | awk -f print_1.awk \
  58                | sort >observed &&
  59        test_cmp observed expected
  60'
  61
  62test_expect_success 'get an error for missing tree object' '
  63        git init r5 &&
  64        echo foo >r5/foo &&
  65        git -C r5 add foo &&
  66        git -C r5 commit -m "foo" &&
  67        del=$(git -C r5 rev-parse HEAD^{tree} | sed "s|..|&/|") &&
  68        rm r5/.git/objects/$del &&
  69        test_must_fail git -C r5 pack-objects --rev --stdout 2>bad_tree <<-EOF &&
  70        HEAD
  71        EOF
  72        grep -q "bad tree object" bad_tree
  73'
  74
  75# Test blob:limit=<n>[kmg] filter.
  76# We boundary test around the size parameter.  The filter is strictly less than
  77# the value, so size 500 and 1000 should have the same results, but 1001 should
  78# filter more.
  79
  80test_expect_success 'setup r2' '
  81        git init r2 &&
  82        for n in 1000 10000
  83        do
  84                printf "%"$n"s" X > r2/large.$n
  85                git -C r2 add large.$n
  86                git -C r2 commit -m "$n"
  87        done
  88'
  89
  90test_expect_success 'verify blob count in normal packfile' '
  91        git -C r2 ls-files -s large.1000 large.10000 \
  92                | awk -f print_2.awk \
  93                | sort >expected &&
  94        git -C r2 pack-objects --rev --stdout >all.pack <<-EOF &&
  95        HEAD
  96        EOF
  97        git -C r2 index-pack ../all.pack &&
  98        git -C r2 verify-pack -v ../all.pack \
  99                | grep blob \
 100                | awk -f print_1.awk \
 101                | sort >observed &&
 102        test_cmp observed expected
 103'
 104
 105test_expect_success 'verify blob:limit=500 omits all blobs' '
 106        git -C r2 pack-objects --rev --stdout --filter=blob:limit=500 >filter.pack <<-EOF &&
 107        HEAD
 108        EOF
 109        git -C r2 index-pack ../filter.pack &&
 110        git -C r2 verify-pack -v ../filter.pack \
 111                | grep blob \
 112                | awk -f print_1.awk \
 113                | sort >observed &&
 114        nr=$(wc -l <observed) &&
 115        test 0 -eq $nr
 116'
 117
 118test_expect_success 'verify blob:limit=1000' '
 119        git -C r2 pack-objects --rev --stdout --filter=blob:limit=1000 >filter.pack <<-EOF &&
 120        HEAD
 121        EOF
 122        git -C r2 index-pack ../filter.pack &&
 123        git -C r2 verify-pack -v ../filter.pack \
 124                | grep blob \
 125                | awk -f print_1.awk \
 126                | sort >observed &&
 127        nr=$(wc -l <observed) &&
 128        test 0 -eq $nr
 129'
 130
 131test_expect_success 'verify blob:limit=1001' '
 132        git -C r2 ls-files -s large.1000 \
 133                | awk -f print_2.awk \
 134                | sort >expected &&
 135        git -C r2 pack-objects --rev --stdout --filter=blob:limit=1001 >filter.pack <<-EOF &&
 136        HEAD
 137        EOF
 138        git -C r2 index-pack ../filter.pack &&
 139        git -C r2 verify-pack -v ../filter.pack \
 140                | grep blob \
 141                | awk -f print_1.awk \
 142                | sort >observed &&
 143        test_cmp observed expected
 144'
 145
 146test_expect_success 'verify blob:limit=10001' '
 147        git -C r2 ls-files -s large.1000 large.10000 \
 148                | awk -f print_2.awk \
 149                | sort >expected &&
 150        git -C r2 pack-objects --rev --stdout --filter=blob:limit=10001 >filter.pack <<-EOF &&
 151        HEAD
 152        EOF
 153        git -C r2 index-pack ../filter.pack &&
 154        git -C r2 verify-pack -v ../filter.pack \
 155                | grep blob \
 156                | awk -f print_1.awk \
 157                | sort >observed &&
 158        test_cmp observed expected
 159'
 160
 161test_expect_success 'verify blob:limit=1k' '
 162        git -C r2 ls-files -s large.1000 \
 163                | awk -f print_2.awk \
 164                | sort >expected &&
 165        git -C r2 pack-objects --rev --stdout --filter=blob:limit=1k >filter.pack <<-EOF &&
 166        HEAD
 167        EOF
 168        git -C r2 index-pack ../filter.pack &&
 169        git -C r2 verify-pack -v ../filter.pack \
 170                | grep blob \
 171                | awk -f print_1.awk \
 172                | sort >observed &&
 173        test_cmp observed expected
 174'
 175
 176test_expect_success 'verify explicitly specifying oversized blob in input' '
 177        git -C r2 ls-files -s large.1000 large.10000 \
 178                | awk -f print_2.awk \
 179                | sort >expected &&
 180        git -C r2 pack-objects --rev --stdout --filter=blob:limit=1k >filter.pack <<-EOF &&
 181        HEAD
 182        $(git -C r2 rev-parse HEAD:large.10000)
 183        EOF
 184        git -C r2 index-pack ../filter.pack &&
 185        git -C r2 verify-pack -v ../filter.pack \
 186                | grep blob \
 187                | awk -f print_1.awk \
 188                | sort >observed &&
 189        test_cmp observed expected
 190'
 191
 192test_expect_success 'verify blob:limit=1m' '
 193        git -C r2 ls-files -s large.1000 large.10000 \
 194                | awk -f print_2.awk \
 195                | sort >expected &&
 196        git -C r2 pack-objects --rev --stdout --filter=blob:limit=1m >filter.pack <<-EOF &&
 197        HEAD
 198        EOF
 199        git -C r2 index-pack ../filter.pack &&
 200        git -C r2 verify-pack -v ../filter.pack \
 201                | grep blob \
 202                | awk -f print_1.awk \
 203                | sort >observed &&
 204        test_cmp observed expected
 205'
 206
 207test_expect_success 'verify normal and blob:limit packfiles have same commits/trees' '
 208        git -C r2 verify-pack -v ../all.pack \
 209                | grep -E "commit|tree" \
 210                | awk -f print_1.awk \
 211                | sort >expected &&
 212        git -C r2 verify-pack -v ../filter.pack \
 213                | grep -E "commit|tree" \
 214                | awk -f print_1.awk \
 215                | sort >observed &&
 216        test_cmp observed expected
 217'
 218
 219# Test sparse:path=<path> filter.
 220# Use a local file containing a sparse-checkout specification to filter
 221# out blobs not required for the corresponding sparse-checkout.  We do not
 222# require sparse-checkout to actually be enabled.
 223
 224test_expect_success 'setup r3' '
 225        git init r3 &&
 226        mkdir r3/dir1 &&
 227        for n in sparse1 sparse2
 228        do
 229                echo "This is file: $n" > r3/$n
 230                git -C r3 add $n
 231                echo "This is file: dir1/$n" > r3/dir1/$n
 232                git -C r3 add dir1/$n
 233        done &&
 234        git -C r3 commit -m "sparse" &&
 235        echo dir1/ >pattern1 &&
 236        echo sparse1 >pattern2
 237'
 238
 239test_expect_success 'verify blob count in normal packfile' '
 240        git -C r3 ls-files -s sparse1 sparse2 dir1/sparse1 dir1/sparse2 \
 241                | awk -f print_2.awk \
 242                | sort >expected &&
 243        git -C r3 pack-objects --rev --stdout >all.pack <<-EOF &&
 244        HEAD
 245        EOF
 246        git -C r3 index-pack ../all.pack &&
 247        git -C r3 verify-pack -v ../all.pack \
 248                | grep blob \
 249                | awk -f print_1.awk \
 250                | sort >observed &&
 251        test_cmp observed expected
 252'
 253
 254test_expect_success 'verify sparse:path=pattern1' '
 255        git -C r3 ls-files -s dir1/sparse1 dir1/sparse2 \
 256                | awk -f print_2.awk \
 257                | sort >expected &&
 258        git -C r3 pack-objects --rev --stdout --filter=sparse:path=../pattern1 >filter.pack <<-EOF &&
 259        HEAD
 260        EOF
 261        git -C r3 index-pack ../filter.pack &&
 262        git -C r3 verify-pack -v ../filter.pack \
 263                | grep blob \
 264                | awk -f print_1.awk \
 265                | sort >observed &&
 266        test_cmp observed expected
 267'
 268
 269test_expect_success 'verify normal and sparse:path=pattern1 packfiles have same commits/trees' '
 270        git -C r3 verify-pack -v ../all.pack \
 271                | grep -E "commit|tree" \
 272                | awk -f print_1.awk \
 273                | sort >expected &&
 274        git -C r3 verify-pack -v ../filter.pack \
 275                | grep -E "commit|tree" \
 276                | awk -f print_1.awk \
 277                | sort >observed &&
 278        test_cmp observed expected
 279'
 280
 281test_expect_success 'verify sparse:path=pattern2' '
 282        git -C r3 ls-files -s sparse1 dir1/sparse1 \
 283                | awk -f print_2.awk \
 284                | sort >expected &&
 285        git -C r3 pack-objects --rev --stdout --filter=sparse:path=../pattern2 >filter.pack <<-EOF &&
 286        HEAD
 287        EOF
 288        git -C r3 index-pack ../filter.pack &&
 289        git -C r3 verify-pack -v ../filter.pack \
 290                | grep blob \
 291                | awk -f print_1.awk \
 292                | sort >observed &&
 293        test_cmp observed expected
 294'
 295
 296test_expect_success 'verify normal and sparse:path=pattern2 packfiles have same commits/trees' '
 297        git -C r3 verify-pack -v ../all.pack \
 298                | grep -E "commit|tree" \
 299                | awk -f print_1.awk \
 300                | sort >expected &&
 301        git -C r3 verify-pack -v ../filter.pack \
 302                | grep -E "commit|tree" \
 303                | awk -f print_1.awk \
 304                | sort >observed &&
 305        test_cmp observed expected
 306'
 307
 308# Test sparse:oid=<oid-ish> filter.
 309# Like sparse:path, but we get the sparse-checkout specification from
 310# a blob rather than a file on disk.
 311
 312test_expect_success 'setup r4' '
 313        git init r4 &&
 314        mkdir r4/dir1 &&
 315        for n in sparse1 sparse2
 316        do
 317                echo "This is file: $n" > r4/$n
 318                git -C r4 add $n
 319                echo "This is file: dir1/$n" > r4/dir1/$n
 320                git -C r4 add dir1/$n
 321        done &&
 322        echo dir1/ >r4/pattern &&
 323        git -C r4 add pattern &&
 324        git -C r4 commit -m "pattern"
 325'
 326
 327test_expect_success 'verify blob count in normal packfile' '
 328        git -C r4 ls-files -s pattern sparse1 sparse2 dir1/sparse1 dir1/sparse2 \
 329                | awk -f print_2.awk \
 330                | sort >expected &&
 331        git -C r4 pack-objects --rev --stdout >all.pack <<-EOF &&
 332        HEAD
 333        EOF
 334        git -C r4 index-pack ../all.pack &&
 335        git -C r4 verify-pack -v ../all.pack \
 336                | grep blob \
 337                | awk -f print_1.awk \
 338                | sort >observed &&
 339        test_cmp observed expected
 340'
 341
 342test_expect_success 'verify sparse:oid=OID' '
 343        git -C r4 ls-files -s dir1/sparse1 dir1/sparse2 \
 344                | awk -f print_2.awk \
 345                | sort >expected &&
 346        oid=$(git -C r4 ls-files -s pattern | awk -f print_2.awk) &&
 347        git -C r4 pack-objects --rev --stdout --filter=sparse:oid=$oid >filter.pack <<-EOF &&
 348        HEAD
 349        EOF
 350        git -C r4 index-pack ../filter.pack &&
 351        git -C r4 verify-pack -v ../filter.pack \
 352                | grep blob \
 353                | awk -f print_1.awk \
 354                | sort >observed &&
 355        test_cmp observed expected
 356'
 357
 358test_expect_success 'verify sparse:oid=oid-ish' '
 359        git -C r4 ls-files -s dir1/sparse1 dir1/sparse2 \
 360                | awk -f print_2.awk \
 361                | sort >expected &&
 362        git -C r4 pack-objects --rev --stdout --filter=sparse:oid=master:pattern >filter.pack <<-EOF &&
 363        HEAD
 364        EOF
 365        git -C r4 index-pack ../filter.pack &&
 366        git -C r4 verify-pack -v ../filter.pack \
 367                | grep blob \
 368                | awk -f print_1.awk \
 369                | sort >observed &&
 370        test_cmp observed expected
 371'
 372
 373# Delete some loose objects and use pack-objects, but WITHOUT any filtering.
 374# This models previously omitted objects that we did not receive.
 375
 376test_expect_success 'setup r1 - delete loose blobs' '
 377        git -C r1 ls-files -s file.1 file.2 file.3 file.4 file.5 \
 378                | awk -f print_2.awk \
 379                | sort >expected &&
 380        for id in `cat expected | sed "s|..|&/|"`
 381        do
 382                rm r1/.git/objects/$id
 383        done
 384'
 385
 386test_expect_success 'verify pack-objects fails w/ missing objects' '
 387        test_must_fail git -C r1 pack-objects --rev --stdout >miss.pack <<-EOF
 388        HEAD
 389        EOF
 390'
 391
 392test_expect_success 'verify pack-objects fails w/ --missing=error' '
 393        test_must_fail git -C r1 pack-objects --rev --stdout --missing=error >miss.pack <<-EOF
 394        HEAD
 395        EOF
 396'
 397
 398test_expect_success 'verify pack-objects w/ --missing=allow-any' '
 399        git -C r1 pack-objects --rev --stdout --missing=allow-any >miss.pack <<-EOF
 400        HEAD
 401        EOF
 402'
 403
 404test_done