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