t / t4203-mailmap.shon commit blame: reject empty ranges -LX,+0 and -LX,-0 (abba353)
   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        cat >contacts <<-\EOF &&
  17        A U Thor <author@example.com>
  18        nick1 <bugs@company.xx>
  19        EOF
  20
  21        echo one >one &&
  22        git add one &&
  23        test_tick &&
  24        git commit -m initial &&
  25        echo two >>one &&
  26        git add one &&
  27        test_tick &&
  28        git commit --author "nick1 <bugs@company.xx>" -m second
  29'
  30
  31test_expect_success 'check-mailmap no arguments' '
  32        test_must_fail git check-mailmap
  33'
  34
  35test_expect_success 'check-mailmap arguments' '
  36        cat >expect <<-\EOF &&
  37        A U Thor <author@example.com>
  38        nick1 <bugs@company.xx>
  39        EOF
  40        git check-mailmap \
  41                "A U Thor <author@example.com>" \
  42                "nick1 <bugs@company.xx>" >actual &&
  43        test_cmp expect actual
  44'
  45
  46test_expect_success 'check-mailmap --stdin' '
  47        cat >expect <<-\EOF &&
  48        A U Thor <author@example.com>
  49        nick1 <bugs@company.xx>
  50        EOF
  51        git check-mailmap --stdin <contacts >actual &&
  52        test_cmp expect actual
  53'
  54
  55test_expect_success 'check-mailmap --stdin arguments' '
  56        cat >expect <<-\EOF &&
  57        Internal Guy <bugs@company.xy>
  58        EOF
  59        cat <contacts >>expect &&
  60        git check-mailmap --stdin "Internal Guy <bugs@company.xy>" \
  61                <contacts >actual &&
  62        test_cmp expect actual
  63'
  64
  65test_expect_success 'check-mailmap bogus contact' '
  66        test_must_fail git check-mailmap bogus
  67'
  68
  69cat >expect <<\EOF
  70A U Thor (1):
  71      initial
  72
  73nick1 (1):
  74      second
  75
  76EOF
  77
  78test_expect_success 'No mailmap' '
  79        git shortlog HEAD >actual &&
  80        test_cmp expect actual
  81'
  82
  83cat >expect <<\EOF
  84Repo Guy (1):
  85      initial
  86
  87nick1 (1):
  88      second
  89
  90EOF
  91
  92test_expect_success 'default .mailmap' '
  93        echo "Repo Guy <author@example.com>" > .mailmap &&
  94        git shortlog HEAD >actual &&
  95        test_cmp expect actual
  96'
  97
  98# Using a mailmap file in a subdirectory of the repo here, but
  99# could just as well have been a file outside of the repository
 100cat >expect <<\EOF
 101Internal Guy (1):
 102      second
 103
 104Repo Guy (1):
 105      initial
 106
 107EOF
 108test_expect_success 'mailmap.file set' '
 109        mkdir -p internal_mailmap &&
 110        echo "Internal Guy <bugs@company.xx>" > internal_mailmap/.mailmap &&
 111        git config mailmap.file internal_mailmap/.mailmap &&
 112        git shortlog HEAD >actual &&
 113        test_cmp expect actual
 114'
 115
 116cat >expect <<\EOF
 117External Guy (1):
 118      initial
 119
 120Internal Guy (1):
 121      second
 122
 123EOF
 124test_expect_success 'mailmap.file override' '
 125        echo "External Guy <author@example.com>" >> internal_mailmap/.mailmap &&
 126        git config mailmap.file internal_mailmap/.mailmap &&
 127        git shortlog HEAD >actual &&
 128        test_cmp expect actual
 129'
 130
 131cat >expect <<\EOF
 132Repo Guy (1):
 133      initial
 134
 135nick1 (1):
 136      second
 137
 138EOF
 139
 140test_expect_success 'mailmap.file non-existent' '
 141        rm internal_mailmap/.mailmap &&
 142        rmdir internal_mailmap &&
 143        git shortlog HEAD >actual &&
 144        test_cmp expect actual
 145'
 146
 147cat >expect <<\EOF
 148Internal Guy (1):
 149      second
 150
 151Repo Guy (1):
 152      initial
 153
 154EOF
 155
 156test_expect_success 'name entry after email entry' '
 157        mkdir -p internal_mailmap &&
 158        echo "<bugs@company.xy> <bugs@company.xx>" >internal_mailmap/.mailmap &&
 159        echo "Internal Guy <bugs@company.xx>" >>internal_mailmap/.mailmap &&
 160        git shortlog HEAD >actual &&
 161        test_cmp expect actual
 162'
 163
 164cat >expect <<\EOF
 165Internal Guy (1):
 166      second
 167
 168Repo Guy (1):
 169      initial
 170
 171EOF
 172
 173test_expect_success 'name entry after email entry, case-insensitive' '
 174        mkdir -p internal_mailmap &&
 175        echo "<bugs@company.xy> <bugs@company.xx>" >internal_mailmap/.mailmap &&
 176        echo "Internal Guy <BUGS@Company.xx>" >>internal_mailmap/.mailmap &&
 177        git shortlog HEAD >actual &&
 178        test_cmp expect actual
 179'
 180
 181cat >expect <<\EOF
 182A U Thor (1):
 183      initial
 184
 185nick1 (1):
 186      second
 187
 188EOF
 189test_expect_success 'No mailmap files, but configured' '
 190        rm -f .mailmap internal_mailmap/.mailmap &&
 191        git shortlog HEAD >actual &&
 192        test_cmp expect actual
 193'
 194
 195test_expect_success 'setup mailmap blob tests' '
 196        git checkout -b map &&
 197        test_when_finished "git checkout master" &&
 198        cat >just-bugs <<-\EOF &&
 199        Blob Guy <bugs@company.xx>
 200        EOF
 201        cat >both <<-\EOF &&
 202        Blob Guy <author@example.com>
 203        Blob Guy <bugs@company.xx>
 204        EOF
 205        git add just-bugs both &&
 206        git commit -m "my mailmaps" &&
 207        echo "Repo Guy <author@example.com>" >.mailmap &&
 208        echo "Internal Guy <author@example.com>" >internal.map
 209'
 210
 211test_expect_success 'mailmap.blob set' '
 212        cat >expect <<-\EOF &&
 213        Blob Guy (1):
 214              second
 215
 216        Repo Guy (1):
 217              initial
 218
 219        EOF
 220        git -c mailmap.blob=map:just-bugs shortlog HEAD >actual &&
 221        test_cmp expect actual
 222'
 223
 224test_expect_success 'mailmap.blob overrides .mailmap' '
 225        cat >expect <<-\EOF &&
 226        Blob Guy (2):
 227              initial
 228              second
 229
 230        EOF
 231        git -c mailmap.blob=map:both shortlog HEAD >actual &&
 232        test_cmp expect actual
 233'
 234
 235test_expect_success 'mailmap.file overrides mailmap.blob' '
 236        cat >expect <<-\EOF &&
 237        Blob Guy (1):
 238              second
 239
 240        Internal Guy (1):
 241              initial
 242
 243        EOF
 244        git \
 245          -c mailmap.blob=map:both \
 246          -c mailmap.file=internal.map \
 247          shortlog HEAD >actual &&
 248        test_cmp expect actual
 249'
 250
 251test_expect_success 'mailmap.blob can be missing' '
 252        cat >expect <<-\EOF &&
 253        Repo Guy (1):
 254              initial
 255
 256        nick1 (1):
 257              second
 258
 259        EOF
 260        git -c mailmap.blob=map:nonexistent shortlog HEAD >actual &&
 261        test_cmp expect actual
 262'
 263
 264test_expect_success 'mailmap.blob defaults to off in non-bare repo' '
 265        git init non-bare &&
 266        (
 267                cd non-bare &&
 268                test_commit one .mailmap "Fake Name <author@example.com>" &&
 269                echo "     1    Fake Name" >expect &&
 270                git shortlog -ns HEAD >actual &&
 271                test_cmp expect actual &&
 272                rm .mailmap &&
 273                echo "     1    A U Thor" >expect &&
 274                git shortlog -ns HEAD >actual &&
 275                test_cmp expect actual
 276        )
 277'
 278
 279test_expect_success 'mailmap.blob defaults to HEAD:.mailmap in bare repo' '
 280        git clone --bare non-bare bare &&
 281        (
 282                cd bare &&
 283                echo "     1    Fake Name" >expect &&
 284                git shortlog -ns HEAD >actual &&
 285                test_cmp expect actual
 286        )
 287'
 288
 289test_expect_success 'cleanup after mailmap.blob tests' '
 290        rm -f .mailmap
 291'
 292
 293test_expect_success 'single-character name' '
 294        echo "     1    A <author@example.com>" >expect &&
 295        echo "     1    nick1 <bugs@company.xx>" >>expect &&
 296        echo "A <author@example.com>" >.mailmap &&
 297        test_when_finished "rm .mailmap" &&
 298        git shortlog -es HEAD >actual &&
 299        test_cmp expect actual
 300'
 301
 302test_expect_success 'preserve canonical email case' '
 303        echo "     1    A U Thor <AUTHOR@example.com>" >expect &&
 304        echo "     1    nick1 <bugs@company.xx>" >>expect &&
 305        echo "<AUTHOR@example.com> <author@example.com>" >.mailmap &&
 306        test_when_finished "rm .mailmap" &&
 307        git shortlog -es HEAD >actual &&
 308        test_cmp expect actual
 309'
 310
 311# Extended mailmap configurations should give us the following output for shortlog
 312cat >expect <<\EOF
 313A U Thor <author@example.com> (1):
 314      initial
 315
 316CTO <cto@company.xx> (1):
 317      seventh
 318
 319Other Author <other@author.xx> (2):
 320      third
 321      fourth
 322
 323Santa Claus <santa.claus@northpole.xx> (2):
 324      fifth
 325      sixth
 326
 327Some Dude <some@dude.xx> (1):
 328      second
 329
 330EOF
 331
 332test_expect_success 'Shortlog output (complex mapping)' '
 333        echo three >>one &&
 334        git add one &&
 335        test_tick &&
 336        git commit --author "nick2 <bugs@company.xx>" -m third &&
 337
 338        echo four >>one &&
 339        git add one &&
 340        test_tick &&
 341        git commit --author "nick2 <nick2@company.xx>" -m fourth &&
 342
 343        echo five >>one &&
 344        git add one &&
 345        test_tick &&
 346        git commit --author "santa <me@company.xx>" -m fifth &&
 347
 348        echo six >>one &&
 349        git add one &&
 350        test_tick &&
 351        git commit --author "claus <me@company.xx>" -m sixth &&
 352
 353        echo seven >>one &&
 354        git add one &&
 355        test_tick &&
 356        git commit --author "CTO <cto@coompany.xx>" -m seventh &&
 357
 358        mkdir -p internal_mailmap &&
 359        echo "Committed <committer@example.com>" > internal_mailmap/.mailmap &&
 360        echo "<cto@company.xx>                       <cto@coompany.xx>" >> internal_mailmap/.mailmap &&
 361        echo "Some Dude <some@dude.xx>         nick1 <bugs@company.xx>" >> internal_mailmap/.mailmap &&
 362        echo "Other Author <other@author.xx>   nick2 <bugs@company.xx>" >> internal_mailmap/.mailmap &&
 363        echo "Other Author <other@author.xx>         <nick2@company.xx>" >> internal_mailmap/.mailmap &&
 364        echo "Santa Claus <santa.claus@northpole.xx> <me@company.xx>" >> internal_mailmap/.mailmap &&
 365        echo "Santa Claus <santa.claus@northpole.xx> <me@company.xx>" >> internal_mailmap/.mailmap &&
 366
 367        git shortlog -e HEAD >actual &&
 368        test_cmp expect actual
 369
 370'
 371
 372# git log with --pretty format which uses the name and email mailmap placemarkers
 373cat >expect <<\EOF
 374Author CTO <cto@coompany.xx> maps to CTO <cto@company.xx>
 375Committer C O Mitter <committer@example.com> maps to Committed <committer@example.com>
 376
 377Author claus <me@company.xx> maps to Santa Claus <santa.claus@northpole.xx>
 378Committer C O Mitter <committer@example.com> maps to Committed <committer@example.com>
 379
 380Author santa <me@company.xx> maps to Santa Claus <santa.claus@northpole.xx>
 381Committer C O Mitter <committer@example.com> maps to Committed <committer@example.com>
 382
 383Author nick2 <nick2@company.xx> maps to Other Author <other@author.xx>
 384Committer C O Mitter <committer@example.com> maps to Committed <committer@example.com>
 385
 386Author nick2 <bugs@company.xx> maps to Other Author <other@author.xx>
 387Committer C O Mitter <committer@example.com> maps to Committed <committer@example.com>
 388
 389Author nick1 <bugs@company.xx> maps to Some Dude <some@dude.xx>
 390Committer C O Mitter <committer@example.com> maps to Committed <committer@example.com>
 391
 392Author A U Thor <author@example.com> maps to A U Thor <author@example.com>
 393Committer C O Mitter <committer@example.com> maps to Committed <committer@example.com>
 394EOF
 395
 396test_expect_success 'Log output (complex mapping)' '
 397        git log --pretty=format:"Author %an <%ae> maps to %aN <%aE>%nCommitter %cn <%ce> maps to %cN <%cE>%n" >actual &&
 398        test_cmp expect actual
 399'
 400
 401cat >expect <<\EOF
 402Author: CTO <cto@company.xx>
 403Author: Santa Claus <santa.claus@northpole.xx>
 404Author: Santa Claus <santa.claus@northpole.xx>
 405Author: Other Author <other@author.xx>
 406Author: Other Author <other@author.xx>
 407Author: Some Dude <some@dude.xx>
 408Author: A U Thor <author@example.com>
 409EOF
 410
 411test_expect_success 'Log output with --use-mailmap' '
 412        git log --use-mailmap | grep Author >actual &&
 413        test_cmp expect actual
 414'
 415
 416cat >expect <<\EOF
 417Author: CTO <cto@company.xx>
 418Author: Santa Claus <santa.claus@northpole.xx>
 419Author: Santa Claus <santa.claus@northpole.xx>
 420Author: Other Author <other@author.xx>
 421Author: Other Author <other@author.xx>
 422Author: Some Dude <some@dude.xx>
 423Author: A U Thor <author@example.com>
 424EOF
 425
 426test_expect_success 'Log output with log.mailmap' '
 427        git -c log.mailmap=True log | grep Author >actual &&
 428        test_cmp expect actual
 429'
 430
 431cat >expect <<\EOF
 432Author: Santa Claus <santa.claus@northpole.xx>
 433Author: Santa Claus <santa.claus@northpole.xx>
 434EOF
 435
 436test_expect_success 'Grep author with --use-mailmap' '
 437        git log --use-mailmap --author Santa | grep Author >actual &&
 438        test_cmp expect actual
 439'
 440cat >expect <<\EOF
 441Author: Santa Claus <santa.claus@northpole.xx>
 442Author: Santa Claus <santa.claus@northpole.xx>
 443EOF
 444
 445test_expect_success 'Grep author with log.mailmap' '
 446        git -c log.mailmap=True log --author Santa | grep Author >actual &&
 447        test_cmp expect actual
 448'
 449
 450>expect
 451
 452test_expect_success 'Only grep replaced author with --use-mailmap' '
 453        git log --use-mailmap --author "<cto@coompany.xx>" >actual &&
 454        test_cmp expect actual
 455'
 456
 457# git blame
 458cat >expect <<\EOF
 459^OBJI (A U Thor     DATE 1) one
 460OBJID (Some Dude    DATE 2) two
 461OBJID (Other Author DATE 3) three
 462OBJID (Other Author DATE 4) four
 463OBJID (Santa Claus  DATE 5) five
 464OBJID (Santa Claus  DATE 6) six
 465OBJID (CTO          DATE 7) seven
 466EOF
 467test_expect_success 'Blame output (complex mapping)' '
 468        git blame one >actual &&
 469        fuzz_blame actual >actual.fuzz &&
 470        test_cmp expect actual.fuzz
 471'
 472
 473test_done