t / t8003-blame-corner-cases.shon commit Merge branch 'jk/options-cleanup' (722c924)
   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        {
  45                echo ABC
  46                echo DEF
  47                echo XXXX
  48                echo GHIJK
  49        } >cow &&
  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        {
 119                echo mouse-Initial
 120                echo mouse-Second
 121                echo mouse-Third
 122        } >expected &&
 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        {
 131                echo mouse-Initial
 132                echo mouse-Second
 133                echo cow-Fifth
 134                echo mouse-Third
 135        } >expected &&
 136        test_cmp expected current
 137
 138'
 139
 140test_expect_success 'blame path that used to be a directory' '
 141        mkdir path &&
 142        echo A A A A A >path/file &&
 143        echo B B B B B >path/elif &&
 144        git add path &&
 145        test_tick &&
 146        git commit -m "path was a directory" &&
 147        rm -fr path &&
 148        echo A A A A A >path &&
 149        git add path &&
 150        test_tick &&
 151        git commit -m "path is a regular file" &&
 152        git blame HEAD^.. -- path
 153'
 154
 155test_expect_success 'blame to a commit with no author name' '
 156  TREE=$(git rev-parse HEAD:) &&
 157  cat >badcommit <<EOF &&
 158tree $TREE
 159author <noname> 1234567890 +0000
 160committer David Reiss <dreiss@facebook.com> 1234567890 +0000
 161
 162some message
 163EOF
 164  COMMIT=$(git hash-object -t commit -w badcommit) &&
 165  git --no-pager blame $COMMIT -- uno >/dev/null
 166'
 167
 168test_expect_success 'blame -L with invalid start' '
 169        test_must_fail git blame -L5 tres 2>errors &&
 170        grep "has only 2 lines" errors
 171'
 172
 173test_expect_success 'blame -L with invalid end' '
 174        test_must_fail git blame -L1,5 tres 2>errors &&
 175        grep "has only 2 lines" errors
 176'
 177
 178test_expect_success 'blame parses <end> part of -L' '
 179        git blame -L1,1 tres >out &&
 180        cat out &&
 181        test $(wc -l < out) -eq 1
 182'
 183
 184test_expect_success 'indent of line numbers, nine lines' '
 185        git blame nine_lines >actual &&
 186        test $(grep -c "  " actual) = 0
 187'
 188
 189test_expect_success 'indent of line numbers, ten lines' '
 190        git blame ten_lines >actual &&
 191        test $(grep -c "  " actual) = 9
 192'
 193
 194test_expect_success 'setup file with CRLF newlines' '
 195        git config core.autocrlf false &&
 196        printf "testcase\n" >crlffile &&
 197        git add crlffile &&
 198        git commit -m testcase &&
 199        printf "testcase\r\n" >crlffile
 200'
 201
 202test_expect_success 'blame file with CRLF core.autocrlf true' '
 203        git config core.autocrlf true &&
 204        git blame crlffile >actual &&
 205        grep "A U Thor" actual
 206'
 207
 208test_expect_success 'blame file with CRLF attributes text' '
 209        git config core.autocrlf false &&
 210        echo "crlffile text" >.gitattributes &&
 211        git blame crlffile >actual &&
 212        grep "A U Thor" actual
 213'
 214
 215test_done