ffe6a11ac09105e945f43575060b520c65627d60
   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 'mailmap.blob defaults to off in non-bare repo' '
 222        git init non-bare &&
 223        (
 224                cd non-bare &&
 225                test_commit one .mailmap "Fake Name <author@example.com>" &&
 226                echo "     1    Fake Name" >expect &&
 227                git shortlog -ns HEAD >actual &&
 228                test_cmp expect actual &&
 229                rm .mailmap &&
 230                echo "     1    A U Thor" >expect &&
 231                git shortlog -ns HEAD >actual &&
 232                test_cmp expect actual
 233        )
 234'
 235
 236test_expect_success 'mailmap.blob defaults to HEAD:.mailmap in bare repo' '
 237        git clone --bare non-bare bare &&
 238        (
 239                cd bare &&
 240                echo "     1    Fake Name" >expect &&
 241                git shortlog -ns HEAD >actual &&
 242                test_cmp expect actual
 243        )
 244'
 245
 246test_expect_success 'cleanup after mailmap.blob tests' '
 247        rm -f .mailmap
 248'
 249
 250test_expect_success 'single-character name' '
 251        echo "     1    A <author@example.com>" >expect &&
 252        echo "     1    nick1 <bugs@company.xx>" >>expect &&
 253        echo "A <author@example.com>" >.mailmap &&
 254        test_when_finished "rm .mailmap" &&
 255        git shortlog -es HEAD >actual &&
 256        test_cmp expect actual
 257'
 258
 259test_expect_failure 'preserve canonical email case' '
 260        echo "     1    A U Thor <AUTHOR@example.com>" >expect &&
 261        echo "     1    nick1 <bugs@company.xx>" >>expect &&
 262        echo "<AUTHOR@example.com> <author@example.com>" >.mailmap &&
 263        test_when_finished "rm .mailmap" &&
 264        git shortlog -es HEAD >actual &&
 265        test_cmp expect actual
 266'
 267
 268# Extended mailmap configurations should give us the following output for shortlog
 269cat >expect <<\EOF
 270A U Thor <author@example.com> (1):
 271      initial
 272
 273CTO <cto@company.xx> (1):
 274      seventh
 275
 276Other Author <other@author.xx> (2):
 277      third
 278      fourth
 279
 280Santa Claus <santa.claus@northpole.xx> (2):
 281      fifth
 282      sixth
 283
 284Some Dude <some@dude.xx> (1):
 285      second
 286
 287EOF
 288
 289test_expect_success 'Shortlog output (complex mapping)' '
 290        echo three >>one &&
 291        git add one &&
 292        test_tick &&
 293        git commit --author "nick2 <bugs@company.xx>" -m third &&
 294
 295        echo four >>one &&
 296        git add one &&
 297        test_tick &&
 298        git commit --author "nick2 <nick2@company.xx>" -m fourth &&
 299
 300        echo five >>one &&
 301        git add one &&
 302        test_tick &&
 303        git commit --author "santa <me@company.xx>" -m fifth &&
 304
 305        echo six >>one &&
 306        git add one &&
 307        test_tick &&
 308        git commit --author "claus <me@company.xx>" -m sixth &&
 309
 310        echo seven >>one &&
 311        git add one &&
 312        test_tick &&
 313        git commit --author "CTO <cto@coompany.xx>" -m seventh &&
 314
 315        mkdir -p internal_mailmap &&
 316        echo "Committed <committer@example.com>" > internal_mailmap/.mailmap &&
 317        echo "<cto@company.xx>                       <cto@coompany.xx>" >> internal_mailmap/.mailmap &&
 318        echo "Some Dude <some@dude.xx>         nick1 <bugs@company.xx>" >> internal_mailmap/.mailmap &&
 319        echo "Other Author <other@author.xx>   nick2 <bugs@company.xx>" >> internal_mailmap/.mailmap &&
 320        echo "Other Author <other@author.xx>         <nick2@company.xx>" >> internal_mailmap/.mailmap &&
 321        echo "Santa Claus <santa.claus@northpole.xx> <me@company.xx>" >> internal_mailmap/.mailmap &&
 322        echo "Santa Claus <santa.claus@northpole.xx> <me@company.xx>" >> internal_mailmap/.mailmap &&
 323
 324        git shortlog -e HEAD >actual &&
 325        test_cmp expect actual
 326
 327'
 328
 329# git log with --pretty format which uses the name and email mailmap placemarkers
 330cat >expect <<\EOF
 331Author CTO <cto@coompany.xx> maps to CTO <cto@company.xx>
 332Committer C O Mitter <committer@example.com> maps to Committed <committer@example.com>
 333
 334Author claus <me@company.xx> maps to Santa Claus <santa.claus@northpole.xx>
 335Committer C O Mitter <committer@example.com> maps to Committed <committer@example.com>
 336
 337Author santa <me@company.xx> maps to Santa Claus <santa.claus@northpole.xx>
 338Committer C O Mitter <committer@example.com> maps to Committed <committer@example.com>
 339
 340Author nick2 <nick2@company.xx> maps to Other Author <other@author.xx>
 341Committer C O Mitter <committer@example.com> maps to Committed <committer@example.com>
 342
 343Author nick2 <bugs@company.xx> maps to Other Author <other@author.xx>
 344Committer C O Mitter <committer@example.com> maps to Committed <committer@example.com>
 345
 346Author nick1 <bugs@company.xx> maps to Some Dude <some@dude.xx>
 347Committer C O Mitter <committer@example.com> maps to Committed <committer@example.com>
 348
 349Author A U Thor <author@example.com> maps to A U Thor <author@example.com>
 350Committer C O Mitter <committer@example.com> maps to Committed <committer@example.com>
 351EOF
 352
 353test_expect_success 'Log output (complex mapping)' '
 354        git log --pretty=format:"Author %an <%ae> maps to %aN <%aE>%nCommitter %cn <%ce> maps to %cN <%cE>%n" >actual &&
 355        test_cmp expect actual
 356'
 357
 358cat >expect <<\EOF
 359Author: CTO <cto@company.xx>
 360Author: Santa Claus <santa.claus@northpole.xx>
 361Author: Santa Claus <santa.claus@northpole.xx>
 362Author: Other Author <other@author.xx>
 363Author: Other Author <other@author.xx>
 364Author: Some Dude <some@dude.xx>
 365Author: A U Thor <author@example.com>
 366EOF
 367
 368test_expect_success 'Log output with --use-mailmap' '
 369        git log --use-mailmap | grep Author >actual &&
 370        test_cmp expect actual
 371'
 372
 373cat >expect <<\EOF
 374Author: CTO <cto@company.xx>
 375Author: Santa Claus <santa.claus@northpole.xx>
 376Author: Santa Claus <santa.claus@northpole.xx>
 377Author: Other Author <other@author.xx>
 378Author: Other Author <other@author.xx>
 379Author: Some Dude <some@dude.xx>
 380Author: A U Thor <author@example.com>
 381EOF
 382
 383test_expect_success 'Log output with log.mailmap' '
 384        git -c log.mailmap=True log | grep Author >actual &&
 385        test_cmp expect actual
 386'
 387
 388cat >expect <<\EOF
 389Author: Santa Claus <santa.claus@northpole.xx>
 390Author: Santa Claus <santa.claus@northpole.xx>
 391EOF
 392
 393test_expect_success 'Grep author with --use-mailmap' '
 394        git log --use-mailmap --author Santa | grep Author >actual &&
 395        test_cmp expect actual
 396'
 397cat >expect <<\EOF
 398Author: Santa Claus <santa.claus@northpole.xx>
 399Author: Santa Claus <santa.claus@northpole.xx>
 400EOF
 401
 402test_expect_success 'Grep author with log.mailmap' '
 403        git -c log.mailmap=True log --author Santa | grep Author >actual &&
 404        test_cmp expect actual
 405'
 406
 407>expect
 408
 409test_expect_success 'Only grep replaced author with --use-mailmap' '
 410        git log --use-mailmap --author "<cto@coompany.xx>" >actual &&
 411        test_cmp expect actual
 412'
 413
 414# git blame
 415cat >expect <<\EOF
 416^OBJI (A U Thor     DATE 1) one
 417OBJID (Some Dude    DATE 2) two
 418OBJID (Other Author DATE 3) three
 419OBJID (Other Author DATE 4) four
 420OBJID (Santa Claus  DATE 5) five
 421OBJID (Santa Claus  DATE 6) six
 422OBJID (CTO          DATE 7) seven
 423EOF
 424test_expect_success 'Blame output (complex mapping)' '
 425        git blame one >actual &&
 426        fuzz_blame actual >actual.fuzz &&
 427        test_cmp expect actual.fuzz
 428'
 429
 430test_done