t / t4203-mailmap.shon commit t/t9802: explicitly name the upstream branch to use as a base (9d58c4a)
   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
 250# Extended mailmap configurations should give us the following output for shortlog
 251cat >expect <<\EOF
 252A U Thor <author@example.com> (1):
 253      initial
 254
 255CTO <cto@company.xx> (1):
 256      seventh
 257
 258Other Author <other@author.xx> (2):
 259      third
 260      fourth
 261
 262Santa Claus <santa.claus@northpole.xx> (2):
 263      fifth
 264      sixth
 265
 266Some Dude <some@dude.xx> (1):
 267      second
 268
 269EOF
 270
 271test_expect_success 'Shortlog output (complex mapping)' '
 272        echo three >>one &&
 273        git add one &&
 274        test_tick &&
 275        git commit --author "nick2 <bugs@company.xx>" -m third &&
 276
 277        echo four >>one &&
 278        git add one &&
 279        test_tick &&
 280        git commit --author "nick2 <nick2@company.xx>" -m fourth &&
 281
 282        echo five >>one &&
 283        git add one &&
 284        test_tick &&
 285        git commit --author "santa <me@company.xx>" -m fifth &&
 286
 287        echo six >>one &&
 288        git add one &&
 289        test_tick &&
 290        git commit --author "claus <me@company.xx>" -m sixth &&
 291
 292        echo seven >>one &&
 293        git add one &&
 294        test_tick &&
 295        git commit --author "CTO <cto@coompany.xx>" -m seventh &&
 296
 297        mkdir -p internal_mailmap &&
 298        echo "Committed <committer@example.com>" > internal_mailmap/.mailmap &&
 299        echo "<cto@company.xx>                       <cto@coompany.xx>" >> internal_mailmap/.mailmap &&
 300        echo "Some Dude <some@dude.xx>         nick1 <bugs@company.xx>" >> internal_mailmap/.mailmap &&
 301        echo "Other Author <other@author.xx>   nick2 <bugs@company.xx>" >> internal_mailmap/.mailmap &&
 302        echo "Other Author <other@author.xx>         <nick2@company.xx>" >> internal_mailmap/.mailmap &&
 303        echo "Santa Claus <santa.claus@northpole.xx> <me@company.xx>" >> internal_mailmap/.mailmap &&
 304        echo "Santa Claus <santa.claus@northpole.xx> <me@company.xx>" >> internal_mailmap/.mailmap &&
 305
 306        git shortlog -e HEAD >actual &&
 307        test_cmp expect actual
 308
 309'
 310
 311# git log with --pretty format which uses the name and email mailmap placemarkers
 312cat >expect <<\EOF
 313Author CTO <cto@coompany.xx> maps to CTO <cto@company.xx>
 314Committer C O Mitter <committer@example.com> maps to Committed <committer@example.com>
 315
 316Author claus <me@company.xx> maps to Santa Claus <santa.claus@northpole.xx>
 317Committer C O Mitter <committer@example.com> maps to Committed <committer@example.com>
 318
 319Author santa <me@company.xx> maps to Santa Claus <santa.claus@northpole.xx>
 320Committer C O Mitter <committer@example.com> maps to Committed <committer@example.com>
 321
 322Author nick2 <nick2@company.xx> maps to Other Author <other@author.xx>
 323Committer C O Mitter <committer@example.com> maps to Committed <committer@example.com>
 324
 325Author nick2 <bugs@company.xx> maps to Other Author <other@author.xx>
 326Committer C O Mitter <committer@example.com> maps to Committed <committer@example.com>
 327
 328Author nick1 <bugs@company.xx> maps to Some Dude <some@dude.xx>
 329Committer C O Mitter <committer@example.com> maps to Committed <committer@example.com>
 330
 331Author A U Thor <author@example.com> maps to A U Thor <author@example.com>
 332Committer C O Mitter <committer@example.com> maps to Committed <committer@example.com>
 333EOF
 334
 335test_expect_success 'Log output (complex mapping)' '
 336        git log --pretty=format:"Author %an <%ae> maps to %aN <%aE>%nCommitter %cn <%ce> maps to %cN <%cE>%n" >actual &&
 337        test_cmp expect actual
 338'
 339
 340cat >expect <<\EOF
 341Author: CTO <cto@company.xx>
 342Author: Santa Claus <santa.claus@northpole.xx>
 343Author: Santa Claus <santa.claus@northpole.xx>
 344Author: Other Author <other@author.xx>
 345Author: Other Author <other@author.xx>
 346Author: Some Dude <some@dude.xx>
 347Author: A U Thor <author@example.com>
 348EOF
 349
 350test_expect_success 'Log output with --use-mailmap' '
 351        git log --use-mailmap | grep Author >actual &&
 352        test_cmp expect actual
 353'
 354
 355cat >expect <<\EOF
 356Author: CTO <cto@company.xx>
 357Author: Santa Claus <santa.claus@northpole.xx>
 358Author: Santa Claus <santa.claus@northpole.xx>
 359Author: Other Author <other@author.xx>
 360Author: Other Author <other@author.xx>
 361Author: Some Dude <some@dude.xx>
 362Author: A U Thor <author@example.com>
 363EOF
 364
 365test_expect_success 'Log output with log.mailmap' '
 366        git -c log.mailmap=True log | grep Author >actual &&
 367        test_cmp expect actual
 368'
 369
 370cat >expect <<\EOF
 371Author: Santa Claus <santa.claus@northpole.xx>
 372Author: Santa Claus <santa.claus@northpole.xx>
 373EOF
 374
 375test_expect_success 'Grep author with --use-mailmap' '
 376        git log --use-mailmap --author Santa | grep Author >actual &&
 377        test_cmp expect actual
 378'
 379cat >expect <<\EOF
 380Author: Santa Claus <santa.claus@northpole.xx>
 381Author: Santa Claus <santa.claus@northpole.xx>
 382EOF
 383
 384test_expect_success 'Grep author with log.mailmap' '
 385        git -c log.mailmap=True log --author Santa | grep Author >actual &&
 386        test_cmp expect actual
 387'
 388
 389>expect
 390
 391test_expect_success 'Only grep replaced author with --use-mailmap' '
 392        git log --use-mailmap --author "<cto@coompany.xx>" >actual &&
 393        test_cmp expect actual
 394'
 395
 396# git blame
 397cat >expect <<\EOF
 398^OBJI (A U Thor     DATE 1) one
 399OBJID (Some Dude    DATE 2) two
 400OBJID (Other Author DATE 3) three
 401OBJID (Other Author DATE 4) four
 402OBJID (Santa Claus  DATE 5) five
 403OBJID (Santa Claus  DATE 6) six
 404OBJID (CTO          DATE 7) seven
 405EOF
 406test_expect_success 'Blame output (complex mapping)' '
 407        git blame one >actual &&
 408        fuzz_blame actual >actual.fuzz &&
 409        test_cmp expect actual.fuzz
 410'
 411
 412test_done