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