e7ea40ceb6c68a69fefae30ef5cee09acd02a6b2
   1#!/bin/sh
   2
   3test_description='.mailmap configurations'
   4
   5. ./test-lib.sh
   6
   7fuzz_blame () {
   8        sed "
   9                s/$_x05[0-9a-f][0-9a-f][0-9a-f]/OBJID/g
  10                s/$_x05[0-9a-f][0-9a-f]/OBJI/g
  11                s/[-0-9]\{10\} [:0-9]\{8\} [-+][0-9]\{4\}/DATE/g
  12        " "$@"
  13}
  14
  15test_expect_success setup '
  16        echo one >one &&
  17        git add one &&
  18        test_tick &&
  19        git commit -m initial &&
  20        echo two >>one &&
  21        git add one &&
  22        test_tick &&
  23        git commit --author "nick1 <bugs@company.xx>" -m second
  24'
  25
  26cat >expect <<\EOF
  27A U Thor (1):
  28      initial
  29
  30nick1 (1):
  31      second
  32
  33EOF
  34
  35test_expect_success 'No mailmap' '
  36        git shortlog HEAD >actual &&
  37        test_cmp expect actual
  38'
  39
  40cat >expect <<\EOF
  41Repo Guy (1):
  42      initial
  43
  44nick1 (1):
  45      second
  46
  47EOF
  48
  49test_expect_success 'default .mailmap' '
  50        echo "Repo Guy <author@example.com>" > .mailmap &&
  51        git shortlog HEAD >actual &&
  52        test_cmp expect actual
  53'
  54
  55# Using a mailmap file in a subdirectory of the repo here, but
  56# could just as well have been a file outside of the repository
  57cat >expect <<\EOF
  58Internal Guy (1):
  59      second
  60
  61Repo Guy (1):
  62      initial
  63
  64EOF
  65test_expect_success 'mailmap.file set' '
  66        mkdir -p internal_mailmap &&
  67        echo "Internal Guy <bugs@company.xx>" > internal_mailmap/.mailmap &&
  68        git config mailmap.file internal_mailmap/.mailmap &&
  69        git shortlog HEAD >actual &&
  70        test_cmp expect actual
  71'
  72
  73cat >expect <<\EOF
  74External Guy (1):
  75      initial
  76
  77Internal Guy (1):
  78      second
  79
  80EOF
  81test_expect_success 'mailmap.file override' '
  82        echo "External Guy <author@example.com>" >> internal_mailmap/.mailmap &&
  83        git config mailmap.file internal_mailmap/.mailmap &&
  84        git shortlog HEAD >actual &&
  85        test_cmp expect actual
  86'
  87
  88cat >expect <<\EOF
  89Repo Guy (1):
  90      initial
  91
  92nick1 (1):
  93      second
  94
  95EOF
  96
  97test_expect_success 'mailmap.file non-existent' '
  98        rm internal_mailmap/.mailmap &&
  99        rmdir internal_mailmap &&
 100        git shortlog HEAD >actual &&
 101        test_cmp expect actual
 102'
 103
 104cat >expect <<\EOF
 105Internal Guy (1):
 106      second
 107
 108Repo Guy (1):
 109      initial
 110
 111EOF
 112
 113test_expect_success 'name entry after email entry' '
 114        mkdir -p internal_mailmap &&
 115        echo "<bugs@company.xy> <bugs@company.xx>" >internal_mailmap/.mailmap &&
 116        echo "Internal Guy <bugs@company.xx>" >>internal_mailmap/.mailmap &&
 117        git shortlog HEAD >actual &&
 118        test_cmp expect actual
 119'
 120
 121cat >expect <<\EOF
 122Internal Guy (1):
 123      second
 124
 125Repo Guy (1):
 126      initial
 127
 128EOF
 129
 130test_expect_success 'name entry after email entry, case-insensitive' '
 131        mkdir -p internal_mailmap &&
 132        echo "<bugs@company.xy> <bugs@company.xx>" >internal_mailmap/.mailmap &&
 133        echo "Internal Guy <BUGS@Company.xx>" >>internal_mailmap/.mailmap &&
 134        git shortlog HEAD >actual &&
 135        test_cmp expect actual
 136'
 137
 138cat >expect <<\EOF
 139A U Thor (1):
 140      initial
 141
 142nick1 (1):
 143      second
 144
 145EOF
 146test_expect_success 'No mailmap files, but configured' '
 147        rm -f .mailmap internal_mailmap/.mailmap &&
 148        git shortlog HEAD >actual &&
 149        test_cmp expect actual
 150'
 151
 152test_expect_success 'setup mailmap blob tests' '
 153        git checkout -b map &&
 154        test_when_finished "git checkout master" &&
 155        cat >just-bugs <<-\EOF &&
 156        Blob Guy <bugs@company.xx>
 157        EOF
 158        cat >both <<-\EOF &&
 159        Blob Guy <author@example.com>
 160        Blob Guy <bugs@company.xx>
 161        EOF
 162        git add just-bugs both &&
 163        git commit -m "my mailmaps" &&
 164        echo "Repo Guy <author@example.com>" >.mailmap &&
 165        echo "Internal Guy <author@example.com>" >internal.map
 166'
 167
 168test_expect_success 'mailmap.blob set' '
 169        cat >expect <<-\EOF &&
 170        Blob Guy (1):
 171              second
 172
 173        Repo Guy (1):
 174              initial
 175
 176        EOF
 177        git -c mailmap.blob=map:just-bugs shortlog HEAD >actual &&
 178        test_cmp expect actual
 179'
 180
 181test_expect_success 'mailmap.blob overrides .mailmap' '
 182        cat >expect <<-\EOF &&
 183        Blob Guy (2):
 184              initial
 185              second
 186
 187        EOF
 188        git -c mailmap.blob=map:both shortlog HEAD >actual &&
 189        test_cmp expect actual
 190'
 191
 192test_expect_success 'mailmap.file overrides mailmap.blob' '
 193        cat >expect <<-\EOF &&
 194        Blob Guy (1):
 195              second
 196
 197        Internal Guy (1):
 198              initial
 199
 200        EOF
 201        git \
 202          -c mailmap.blob=map:both \
 203          -c mailmap.file=internal.map \
 204          shortlog HEAD >actual &&
 205        test_cmp expect actual
 206'
 207
 208test_expect_success 'mailmap.blob can be missing' '
 209        cat >expect <<-\EOF &&
 210        Repo Guy (1):
 211              initial
 212
 213        nick1 (1):
 214              second
 215
 216        EOF
 217        git -c mailmap.blob=map:nonexistent shortlog HEAD >actual &&
 218        test_cmp expect actual
 219'
 220
 221test_expect_success 'cleanup after mailmap.blob tests' '
 222        rm -f .mailmap
 223'
 224
 225# Extended mailmap configurations should give us the following output for shortlog
 226cat >expect <<\EOF
 227A U Thor <author@example.com> (1):
 228      initial
 229
 230CTO <cto@company.xx> (1):
 231      seventh
 232
 233Other Author <other@author.xx> (2):
 234      third
 235      fourth
 236
 237Santa Claus <santa.claus@northpole.xx> (2):
 238      fifth
 239      sixth
 240
 241Some Dude <some@dude.xx> (1):
 242      second
 243
 244EOF
 245
 246test_expect_success 'Shortlog output (complex mapping)' '
 247        echo three >>one &&
 248        git add one &&
 249        test_tick &&
 250        git commit --author "nick2 <bugs@company.xx>" -m third &&
 251
 252        echo four >>one &&
 253        git add one &&
 254        test_tick &&
 255        git commit --author "nick2 <nick2@company.xx>" -m fourth &&
 256
 257        echo five >>one &&
 258        git add one &&
 259        test_tick &&
 260        git commit --author "santa <me@company.xx>" -m fifth &&
 261
 262        echo six >>one &&
 263        git add one &&
 264        test_tick &&
 265        git commit --author "claus <me@company.xx>" -m sixth &&
 266
 267        echo seven >>one &&
 268        git add one &&
 269        test_tick &&
 270        git commit --author "CTO <cto@coompany.xx>" -m seventh &&
 271
 272        mkdir -p internal_mailmap &&
 273        echo "Committed <committer@example.com>" > internal_mailmap/.mailmap &&
 274        echo "<cto@company.xx>                       <cto@coompany.xx>" >> internal_mailmap/.mailmap &&
 275        echo "Some Dude <some@dude.xx>         nick1 <bugs@company.xx>" >> internal_mailmap/.mailmap &&
 276        echo "Other Author <other@author.xx>   nick2 <bugs@company.xx>" >> internal_mailmap/.mailmap &&
 277        echo "Other Author <other@author.xx>         <nick2@company.xx>" >> internal_mailmap/.mailmap &&
 278        echo "Santa Claus <santa.claus@northpole.xx> <me@company.xx>" >> internal_mailmap/.mailmap &&
 279        echo "Santa Claus <santa.claus@northpole.xx> <me@company.xx>" >> internal_mailmap/.mailmap &&
 280
 281        git shortlog -e HEAD >actual &&
 282        test_cmp expect actual
 283
 284'
 285
 286# git log with --pretty format which uses the name and email mailmap placemarkers
 287cat >expect <<\EOF
 288Author CTO <cto@coompany.xx> maps to CTO <cto@company.xx>
 289Committer C O Mitter <committer@example.com> maps to Committed <committer@example.com>
 290
 291Author claus <me@company.xx> maps to Santa Claus <santa.claus@northpole.xx>
 292Committer C O Mitter <committer@example.com> maps to Committed <committer@example.com>
 293
 294Author santa <me@company.xx> maps to Santa Claus <santa.claus@northpole.xx>
 295Committer C O Mitter <committer@example.com> maps to Committed <committer@example.com>
 296
 297Author nick2 <nick2@company.xx> maps to Other Author <other@author.xx>
 298Committer C O Mitter <committer@example.com> maps to Committed <committer@example.com>
 299
 300Author nick2 <bugs@company.xx> maps to Other Author <other@author.xx>
 301Committer C O Mitter <committer@example.com> maps to Committed <committer@example.com>
 302
 303Author nick1 <bugs@company.xx> maps to Some Dude <some@dude.xx>
 304Committer C O Mitter <committer@example.com> maps to Committed <committer@example.com>
 305
 306Author A U Thor <author@example.com> maps to A U Thor <author@example.com>
 307Committer C O Mitter <committer@example.com> maps to Committed <committer@example.com>
 308EOF
 309
 310test_expect_success 'Log output (complex mapping)' '
 311        git log --pretty=format:"Author %an <%ae> maps to %aN <%aE>%nCommitter %cn <%ce> maps to %cN <%cE>%n" >actual &&
 312        test_cmp expect actual
 313'
 314
 315# git blame
 316cat >expect <<\EOF
 317^OBJI (A U Thor     DATE 1) one
 318OBJID (Some Dude    DATE 2) two
 319OBJID (Other Author DATE 3) three
 320OBJID (Other Author DATE 4) four
 321OBJID (Santa Claus  DATE 5) five
 322OBJID (Santa Claus  DATE 6) six
 323OBJID (CTO          DATE 7) seven
 324EOF
 325test_expect_success 'Blame output (complex mapping)' '
 326        git blame one >actual &&
 327        fuzz_blame actual >actual.fuzz &&
 328        test_cmp expect actual.fuzz
 329'
 330
 331test_done