t / t8003-blame-corner-cases.shon commit t4000: make hash size independent (8cc5ff8)
   1#!/bin/sh
   2
   3test_description='git blame corner cases'
   4. ./test-lib.sh
   5
   6pick_fc='s/^[0-9a-f^]* *\([^ ]*\) *(\([^ ]*\) .*/\1-\2/'
   7
   8test_expect_success setup '
   9
  10        echo A A A A A >one &&
  11        echo B B B B B >two &&
  12        echo C C C C C >tres &&
  13        echo ABC >mouse &&
  14        for i in 1 2 3 4 5 6 7 8 9
  15        do
  16                echo $i
  17        done >nine_lines &&
  18        for i in 1 2 3 4 5 6 7 8 9 a
  19        do
  20                echo $i
  21        done >ten_lines &&
  22        git add one two tres mouse nine_lines ten_lines &&
  23        test_tick &&
  24        GIT_AUTHOR_NAME=Initial git commit -m Initial &&
  25
  26        cat one >uno &&
  27        mv two dos &&
  28        cat one >>tres &&
  29        echo DEF >>mouse &&
  30        git add uno dos tres mouse &&
  31        test_tick &&
  32        GIT_AUTHOR_NAME=Second git commit -a -m Second &&
  33
  34        echo GHIJK >>mouse &&
  35        git add mouse &&
  36        test_tick &&
  37        GIT_AUTHOR_NAME=Third git commit -m Third &&
  38
  39        cat mouse >cow &&
  40        git add cow &&
  41        test_tick &&
  42        GIT_AUTHOR_NAME=Fourth git commit -m Fourth &&
  43
  44        cat >cow <<-\EOF &&
  45        ABC
  46        DEF
  47        XXXX
  48        GHIJK
  49        EOF
  50        git add cow &&
  51        test_tick &&
  52        GIT_AUTHOR_NAME=Fifth git commit -m Fifth
  53'
  54
  55test_expect_success 'straight copy without -C' '
  56
  57        git blame uno | grep Second
  58
  59'
  60
  61test_expect_success 'straight move without -C' '
  62
  63        git blame dos | grep Initial
  64
  65'
  66
  67test_expect_success 'straight copy with -C' '
  68
  69        git blame -C1 uno | grep Second
  70
  71'
  72
  73test_expect_success 'straight move with -C' '
  74
  75        git blame -C1 dos | grep Initial
  76
  77'
  78
  79test_expect_success 'straight copy with -C -C' '
  80
  81        git blame -C -C1 uno | grep Initial
  82
  83'
  84
  85test_expect_success 'straight move with -C -C' '
  86
  87        git blame -C -C1 dos | grep Initial
  88
  89'
  90
  91test_expect_success 'append without -C' '
  92
  93        git blame -L2 tres | grep Second
  94
  95'
  96
  97test_expect_success 'append with -C' '
  98
  99        git blame -L2 -C1 tres | grep Second
 100
 101'
 102
 103test_expect_success 'append with -C -C' '
 104
 105        git blame -L2 -C -C1 tres | grep Second
 106
 107'
 108
 109test_expect_success 'append with -C -C -C' '
 110
 111        git blame -L2 -C -C -C1 tres | grep Initial
 112
 113'
 114
 115test_expect_success 'blame wholesale copy' '
 116
 117        git blame -f -C -C1 HEAD^ -- cow | sed -e "$pick_fc" >current &&
 118        cat >expected <<-\EOF &&
 119        mouse-Initial
 120        mouse-Second
 121        mouse-Third
 122        EOF
 123        test_cmp expected current
 124
 125'
 126
 127test_expect_success 'blame wholesale copy and more' '
 128
 129        git blame -f -C -C1 HEAD -- cow | sed -e "$pick_fc" >current &&
 130        cat >expected <<-\EOF &&
 131        mouse-Initial
 132        mouse-Second
 133        cow-Fifth
 134        mouse-Third
 135        EOF
 136        test_cmp expected current
 137
 138'
 139
 140test_expect_success 'blame wholesale copy and more in the index' '
 141
 142        cat >horse <<-\EOF &&
 143        ABC
 144        DEF
 145        XXXX
 146        YYYY
 147        GHIJK
 148        EOF
 149        git add horse &&
 150        test_when_finished "git rm -f horse" &&
 151        git blame -f -C -C1 -- horse | sed -e "$pick_fc" >current &&
 152        cat >expected <<-\EOF &&
 153        mouse-Initial
 154        mouse-Second
 155        cow-Fifth
 156        horse-Not
 157        mouse-Third
 158        EOF
 159        test_cmp expected current
 160
 161'
 162
 163test_expect_success 'blame during cherry-pick with file rename conflict' '
 164
 165        test_when_finished "git reset --hard && git checkout master" &&
 166        git checkout HEAD~3 &&
 167        echo MOUSE >> mouse &&
 168        git mv mouse rodent &&
 169        git add rodent &&
 170        GIT_AUTHOR_NAME=Rodent git commit -m "rodent" &&
 171        git checkout --detach master &&
 172        (git cherry-pick HEAD@{1} || test $? -eq 1) &&
 173        git show HEAD@{1}:rodent > rodent &&
 174        git add rodent &&
 175        git blame -f -C -C1 rodent | sed -e "$pick_fc" >current &&
 176        cat current &&
 177        cat >expected <<-\EOF &&
 178        mouse-Initial
 179        mouse-Second
 180        rodent-Not
 181        EOF
 182        test_cmp expected current
 183'
 184
 185test_expect_success 'blame path that used to be a directory' '
 186        mkdir path &&
 187        echo A A A A A >path/file &&
 188        echo B B B B B >path/elif &&
 189        git add path &&
 190        test_tick &&
 191        git commit -m "path was a directory" &&
 192        rm -fr path &&
 193        echo A A A A A >path &&
 194        git add path &&
 195        test_tick &&
 196        git commit -m "path is a regular file" &&
 197        git blame HEAD^.. -- path
 198'
 199
 200test_expect_success 'blame to a commit with no author name' '
 201  TREE=$(git rev-parse HEAD:) &&
 202  cat >badcommit <<EOF &&
 203tree $TREE
 204author <noname> 1234567890 +0000
 205committer David Reiss <dreiss@facebook.com> 1234567890 +0000
 206
 207some message
 208EOF
 209  COMMIT=$(git hash-object -t commit -w badcommit) &&
 210  git --no-pager blame $COMMIT -- uno >/dev/null
 211'
 212
 213test_expect_success 'blame -L with invalid start' '
 214        test_must_fail git blame -L5 tres 2>errors &&
 215        test_i18ngrep "has only 2 lines" errors
 216'
 217
 218test_expect_success 'blame -L with invalid end' '
 219        git blame -L1,5 tres >out &&
 220        test_line_count = 2 out
 221'
 222
 223test_expect_success 'blame parses <end> part of -L' '
 224        git blame -L1,1 tres >out &&
 225        test_line_count = 1 out
 226'
 227
 228test_expect_success 'blame -Ln,-(n+1)' '
 229        git blame -L3,-4 nine_lines >out &&
 230        test_line_count = 3 out
 231'
 232
 233test_expect_success 'indent of line numbers, nine lines' '
 234        git blame nine_lines >actual &&
 235        test $(grep -c "  " actual) = 0
 236'
 237
 238test_expect_success 'indent of line numbers, ten lines' '
 239        git blame ten_lines >actual &&
 240        test $(grep -c "  " actual) = 9
 241'
 242
 243test_expect_success 'setup file with CRLF newlines' '
 244        git config core.autocrlf false &&
 245        printf "testcase\n" >crlffile &&
 246        git add crlffile &&
 247        git commit -m testcase &&
 248        printf "testcase\r\n" >crlffile
 249'
 250
 251test_expect_success 'blame file with CRLF core.autocrlf true' '
 252        git config core.autocrlf true &&
 253        git blame crlffile >actual &&
 254        grep "A U Thor" actual
 255'
 256
 257test_expect_success 'blame file with CRLF attributes text' '
 258        git config core.autocrlf false &&
 259        echo "crlffile text" >.gitattributes &&
 260        git blame crlffile >actual &&
 261        grep "A U Thor" actual
 262'
 263
 264test_expect_success 'blame file with CRLF core.autocrlf=true' '
 265        git config core.autocrlf false &&
 266        printf "testcase\r\n" >crlfinrepo &&
 267        >.gitattributes &&
 268        git add crlfinrepo &&
 269        git commit -m "add crlfinrepo" &&
 270        git config core.autocrlf true &&
 271        mv crlfinrepo tmp &&
 272        git checkout crlfinrepo &&
 273        rm tmp &&
 274        git blame crlfinrepo >actual &&
 275        grep "A U Thor" actual
 276'
 277
 278# Tests the splitting and merging of blame entries in blame_coalesce().
 279# The output of blame is the same, regardless of whether blame_coalesce() runs
 280# or not, so we'd likely only notice a problem if blame crashes or assigned
 281# blame to the "splitting" commit ('SPLIT' below).
 282test_expect_success 'blame coalesce' '
 283        cat >giraffe <<-\EOF &&
 284        ABC
 285        DEF
 286        EOF
 287        git add giraffe &&
 288        git commit -m "original file" &&
 289        oid=$(git rev-parse HEAD) &&
 290
 291        cat >giraffe <<-\EOF &&
 292        ABC
 293        SPLIT
 294        DEF
 295        EOF
 296        git add giraffe &&
 297        git commit -m "interior SPLIT line" &&
 298
 299        cat >giraffe <<-\EOF &&
 300        ABC
 301        DEF
 302        EOF
 303        git add giraffe &&
 304        git commit -m "same contents as original" &&
 305
 306        cat >expect <<-EOF &&
 307        $oid 1) ABC
 308        $oid 2) DEF
 309        EOF
 310        git -c core.abbrev=40 blame -s giraffe >actual &&
 311        test_cmp expect actual
 312'
 313
 314test_done