t / t1007-hash-object.shon commit t3903: abstract away SHA-1-specific constants (c784815)
   1#!/bin/sh
   2
   3test_description="git hash-object"
   4
   5. ./test-lib.sh
   6
   7echo_without_newline() {
   8        printf '%s' "$*"
   9}
  10
  11test_blob_does_not_exist() {
  12        test_expect_success 'blob does not exist in database' "
  13                test_must_fail git cat-file blob $1
  14        "
  15}
  16
  17test_blob_exists() {
  18        test_expect_success 'blob exists in database' "
  19                git cat-file blob $1
  20        "
  21}
  22
  23hello_content="Hello World"
  24example_content="This is an example"
  25
  26setup_repo() {
  27        echo_without_newline "$hello_content" > hello
  28        echo_without_newline "$example_content" > example
  29}
  30
  31test_repo=test
  32push_repo() {
  33        test_create_repo $test_repo
  34        cd $test_repo
  35
  36        setup_repo
  37}
  38
  39pop_repo() {
  40        cd ..
  41        rm -rf $test_repo
  42}
  43
  44test_expect_success 'setup' '
  45        setup_repo &&
  46        test_oid_cache <<-EOF
  47        hello sha1:5e1c309dae7f45e0f39b1bf3ac3cd9db12e7d689
  48        hello sha256:1e3b6c04d2eeb2b3e45c8a330445404c0b7cc7b257e2b097167d26f5230090c4
  49
  50        example sha1:ddd3f836d3e3fbb7ae289aa9ae83536f76956399
  51        example sha256:b44fe1fe65589848253737db859bd490453510719d7424daab03daf0767b85ae
  52        EOF
  53'
  54
  55# Argument checking
  56
  57test_expect_success "multiple '--stdin's are rejected" '
  58        echo example | test_must_fail git hash-object --stdin --stdin
  59'
  60
  61test_expect_success "Can't use --stdin and --stdin-paths together" '
  62        echo example | test_must_fail git hash-object --stdin --stdin-paths &&
  63        echo example | test_must_fail git hash-object --stdin-paths --stdin
  64'
  65
  66test_expect_success "Can't pass filenames as arguments with --stdin-paths" '
  67        echo example | test_must_fail git hash-object --stdin-paths hello
  68'
  69
  70test_expect_success "Can't use --path with --stdin-paths" '
  71        echo example | test_must_fail git hash-object --stdin-paths --path=foo
  72'
  73
  74test_expect_success "Can't use --path with --no-filters" '
  75        test_must_fail git hash-object --no-filters --path=foo
  76'
  77
  78# Behavior
  79
  80push_repo
  81
  82test_expect_success 'hash a file' '
  83        test "$(test_oid hello)" = $(git hash-object hello)
  84'
  85
  86test_blob_does_not_exist "$(test_oid hello)"
  87
  88test_expect_success 'hash from stdin' '
  89        test "$(test_oid example)" = $(git hash-object --stdin < example)
  90'
  91
  92test_blob_does_not_exist "$(test_oid example)"
  93
  94test_expect_success 'hash a file and write to database' '
  95        test "$(test_oid hello)" = $(git hash-object -w hello)
  96'
  97
  98test_blob_exists "$(test_oid hello)"
  99
 100test_expect_success 'git hash-object --stdin file1 <file0 first operates on file0, then file1' '
 101        echo foo > file1 &&
 102        obname0=$(echo bar | git hash-object --stdin) &&
 103        obname1=$(git hash-object file1) &&
 104        obname0new=$(echo bar | git hash-object --stdin file1 | sed -n -e 1p) &&
 105        obname1new=$(echo bar | git hash-object --stdin file1 | sed -n -e 2p) &&
 106        test "$obname0" = "$obname0new" &&
 107        test "$obname1" = "$obname1new"
 108'
 109
 110test_expect_success 'set up crlf tests' '
 111        echo fooQ | tr Q "\\015" >file0 &&
 112        cp file0 file1 &&
 113        echo "file0 -crlf" >.gitattributes &&
 114        echo "file1 crlf" >>.gitattributes &&
 115        git config core.autocrlf true &&
 116        file0_sha=$(git hash-object file0) &&
 117        file1_sha=$(git hash-object file1) &&
 118        test "$file0_sha" != "$file1_sha"
 119'
 120
 121test_expect_success 'check that appropriate filter is invoke when --path is used' '
 122        path1_sha=$(git hash-object --path=file1 file0) &&
 123        path0_sha=$(git hash-object --path=file0 file1) &&
 124        test "$file0_sha" = "$path0_sha" &&
 125        test "$file1_sha" = "$path1_sha" &&
 126        path1_sha=$(cat file0 | git hash-object --path=file1 --stdin) &&
 127        path0_sha=$(cat file1 | git hash-object --path=file0 --stdin) &&
 128        test "$file0_sha" = "$path0_sha" &&
 129        test "$file1_sha" = "$path1_sha"
 130'
 131
 132test_expect_success 'gitattributes also work in a subdirectory' '
 133        mkdir subdir &&
 134        (
 135                cd subdir &&
 136                subdir_sha0=$(git hash-object ../file0) &&
 137                subdir_sha1=$(git hash-object ../file1) &&
 138                test "$file0_sha" = "$subdir_sha0" &&
 139                test "$file1_sha" = "$subdir_sha1"
 140        )
 141'
 142
 143test_expect_success '--path works in a subdirectory' '
 144        (
 145                cd subdir &&
 146                path1_sha=$(git hash-object --path=../file1 ../file0) &&
 147                path0_sha=$(git hash-object --path=../file0 ../file1) &&
 148                test "$file0_sha" = "$path0_sha" &&
 149                test "$file1_sha" = "$path1_sha"
 150        )
 151'
 152
 153test_expect_success 'check that --no-filters option works' '
 154        nofilters_file1=$(git hash-object --no-filters file1) &&
 155        test "$file0_sha" = "$nofilters_file1" &&
 156        nofilters_file1=$(cat file1 | git hash-object --stdin) &&
 157        test "$file0_sha" = "$nofilters_file1"
 158'
 159
 160test_expect_success 'check that --no-filters option works with --stdin-paths' '
 161        nofilters_file1=$(echo "file1" | git hash-object --stdin-paths --no-filters) &&
 162        test "$file0_sha" = "$nofilters_file1"
 163'
 164
 165pop_repo
 166
 167for args in "-w --stdin" "--stdin -w"; do
 168        push_repo
 169
 170        test_expect_success "hash from stdin and write to database ($args)" '
 171                test "$(test_oid example)" = $(git hash-object $args < example)
 172        '
 173
 174        test_blob_exists "$(test_oid example)"
 175
 176        pop_repo
 177done
 178
 179filenames="hello
 180example"
 181
 182oids="$(test_oid hello)
 183$(test_oid example)"
 184
 185test_expect_success "hash two files with names on stdin" '
 186        test "$oids" = "$(echo_without_newline "$filenames" | git hash-object --stdin-paths)"
 187'
 188
 189for args in "-w --stdin-paths" "--stdin-paths -w"; do
 190        push_repo
 191
 192        test_expect_success "hash two files with names on stdin and write to database ($args)" '
 193                test "$oids" = "$(echo_without_newline "$filenames" | git hash-object $args)"
 194        '
 195
 196        test_blob_exists "$(test_oid hello)"
 197        test_blob_exists "$(test_oid example)"
 198
 199        pop_repo
 200done
 201
 202test_expect_success 'too-short tree' '
 203        echo abc >malformed-tree &&
 204        test_must_fail git hash-object -t tree malformed-tree 2>err &&
 205        test_i18ngrep "too-short tree object" err
 206'
 207
 208test_expect_success 'malformed mode in tree' '
 209        hex_sha1=$(echo foo | git hash-object --stdin -w) &&
 210        bin_sha1=$(echo $hex_sha1 | hex2oct) &&
 211        printf "9100644 \0$bin_sha1" >tree-with-malformed-mode &&
 212        test_must_fail git hash-object -t tree tree-with-malformed-mode 2>err &&
 213        test_i18ngrep "malformed mode in tree entry" err
 214'
 215
 216test_expect_success 'empty filename in tree' '
 217        hex_sha1=$(echo foo | git hash-object --stdin -w) &&
 218        bin_sha1=$(echo $hex_sha1 | hex2oct) &&
 219        printf "100644 \0$bin_sha1" >tree-with-empty-filename &&
 220        test_must_fail git hash-object -t tree tree-with-empty-filename 2>err &&
 221        test_i18ngrep "empty filename in tree entry" err
 222'
 223
 224test_expect_success 'corrupt commit' '
 225        test_must_fail git hash-object -t commit --stdin </dev/null
 226'
 227
 228test_expect_success 'corrupt tag' '
 229        test_must_fail git hash-object -t tag --stdin </dev/null
 230'
 231
 232test_expect_success 'hash-object complains about bogus type name' '
 233        test_must_fail git hash-object -t bogus --stdin </dev/null
 234'
 235
 236test_expect_success 'hash-object complains about truncated type name' '
 237        test_must_fail git hash-object -t bl --stdin </dev/null
 238'
 239
 240test_expect_success '--literally' '
 241        t=1234567890 &&
 242        echo example | git hash-object -t $t --literally --stdin
 243'
 244
 245test_expect_success '--literally with extra-long type' '
 246        t=12345678901234567890123456789012345678901234567890 &&
 247        t="$t$t$t$t$t$t$t$t$t$t$t$t$t$t$t$t$t$t$t$t$t$t$t$t$t$t$t$t$t$t" &&
 248        echo example | git hash-object -t $t --literally --stdin
 249'
 250
 251test_done