t / t3206-range-diff.shon commit Merge branch 'jk/fast-import-history-bugfix' (991fd97)
   1#!/bin/sh
   2
   3test_description='range-diff tests'
   4
   5. ./test-lib.sh
   6
   7# Note that because of the range-diff's heuristics, test_commit does more
   8# harm than good.  We need some real history.
   9
  10test_expect_success 'setup' '
  11        git fast-import < "$TEST_DIRECTORY"/t3206/history.export &&
  12        test_oid_cache <<-EOF
  13        # topic
  14        t1 sha1:4de457d
  15        t2 sha1:fccce22
  16        t3 sha1:147e64e
  17        t4 sha1:a63e992
  18        t1 sha256:b89f8b9
  19        t2 sha256:5f12aad
  20        t3 sha256:ea8b273
  21        t4 sha256:14b7336
  22
  23        # unmodified
  24        u1 sha1:35b9b25
  25        u2 sha1:de345ab
  26        u3 sha1:9af6654
  27        u4 sha1:2901f77
  28        u1 sha256:e3731be
  29        u2 sha256:14fadf8
  30        u3 sha256:736c4bc
  31        u4 sha256:673e77d
  32
  33        # reordered
  34        r1 sha1:aca177a
  35        r2 sha1:14ad629
  36        r3 sha1:ee58208
  37        r4 sha1:307b27a
  38        r1 sha256:f59d3aa
  39        r2 sha256:fb261a8
  40        r3 sha256:cb2649b
  41        r4 sha256:958577e
  42
  43        # removed (deleted)
  44        d1 sha1:7657159
  45        d2 sha1:43d84d3
  46        d3 sha1:a740396
  47        d1 sha256:e312513
  48        d2 sha256:eb19258
  49        d3 sha256:1ccb3c1
  50
  51        # added
  52        a1 sha1:2716022
  53        a2 sha1:b62accd
  54        a3 sha1:df46cfa
  55        a4 sha1:3e64548
  56        a5 sha1:12b4063
  57        a1 sha256:d724f4d
  58        a2 sha256:1de7762
  59        a3 sha256:e159431
  60        a4 sha256:b3e483c
  61        a5 sha256:90866a7
  62
  63        # rebased
  64        b1 sha1:cc9c443
  65        b2 sha1:c5d9641
  66        b3 sha1:28cc2b6
  67        b4 sha1:5628ab7
  68        b5 sha1:a31b12e
  69        b1 sha256:a1a8717
  70        b2 sha256:20a5862
  71        b3 sha256:587172a
  72        b4 sha256:2721c5d
  73        b5 sha256:7b57864
  74
  75        # changed
  76        c1 sha1:a4b3333
  77        c2 sha1:f51d370
  78        c3 sha1:0559556
  79        c4 sha1:d966c5c
  80        c1 sha256:f8c2b9d
  81        c2 sha256:3fb6318
  82        c3 sha256:168ab68
  83        c4 sha256:3526539
  84
  85        # changed-message
  86        m1 sha1:f686024
  87        m2 sha1:4ab067d
  88        m3 sha1:b9cb956
  89        m4 sha1:8add5f1
  90        m1 sha256:31e6281
  91        m2 sha256:a06bf1b
  92        m3 sha256:82dc654
  93        m4 sha256:48470c5
  94
  95        # renamed
  96        n1 sha1:f258d75
  97        n2 sha1:017b62d
  98        n3 sha1:3ce7af6
  99        n4 sha1:1e6226b
 100        n1 sha256:ad52114
 101        n2 sha256:3b54c8f
 102        n3 sha256:3b0a644
 103        n4 sha256:e461653
 104
 105        # added and removed
 106        s1 sha1:096b1ba
 107        s2 sha1:d92e698
 108        s3 sha1:9a1db4d
 109        s4 sha1:fea3b5c
 110        s1 sha256:a7f9134
 111        s2 sha256:b4c2580
 112        s3 sha256:1d62aa2
 113        s4 sha256:48160e8
 114
 115        # Empty delimiter (included so lines match neatly)
 116        __ sha1:-------
 117        __ sha256:-------
 118        EOF
 119'
 120
 121test_expect_success 'simple A..B A..C (unmodified)' '
 122        git range-diff --no-color master..topic master..unmodified \
 123                >actual &&
 124        cat >expected <<-EOF &&
 125        1:  $(test_oid t1) = 1:  $(test_oid u1) s/5/A/
 126        2:  $(test_oid t2) = 2:  $(test_oid u2) s/4/A/
 127        3:  $(test_oid t3) = 3:  $(test_oid u3) s/11/B/
 128        4:  $(test_oid t4) = 4:  $(test_oid u4) s/12/B/
 129        EOF
 130        test_cmp expected actual
 131'
 132
 133test_expect_success 'simple B...C (unmodified)' '
 134        git range-diff --no-color topic...unmodified >actual &&
 135        # same "expected" as above
 136        test_cmp expected actual
 137'
 138
 139test_expect_success 'simple A B C (unmodified)' '
 140        git range-diff --no-color master topic unmodified >actual &&
 141        # same "expected" as above
 142        test_cmp expected actual
 143'
 144
 145test_expect_success 'trivial reordering' '
 146        git range-diff --no-color master topic reordered >actual &&
 147        cat >expected <<-EOF &&
 148        1:  $(test_oid t1) = 1:  $(test_oid r1) s/5/A/
 149        3:  $(test_oid t3) = 2:  $(test_oid r2) s/11/B/
 150        4:  $(test_oid t4) = 3:  $(test_oid r3) s/12/B/
 151        2:  $(test_oid t2) = 4:  $(test_oid r4) s/4/A/
 152        EOF
 153        test_cmp expected actual
 154'
 155
 156test_expect_success 'removed a commit' '
 157        git range-diff --no-color master topic removed >actual &&
 158        cat >expected <<-EOF &&
 159        1:  $(test_oid t1) = 1:  $(test_oid d1) s/5/A/
 160        2:  $(test_oid t2) < -:  $(test_oid __) s/4/A/
 161        3:  $(test_oid t3) = 2:  $(test_oid d2) s/11/B/
 162        4:  $(test_oid t4) = 3:  $(test_oid d3) s/12/B/
 163        EOF
 164        test_cmp expected actual
 165'
 166
 167test_expect_success 'added a commit' '
 168        git range-diff --no-color master topic added >actual &&
 169        cat >expected <<-EOF &&
 170        1:  $(test_oid t1) = 1:  $(test_oid a1) s/5/A/
 171        2:  $(test_oid t2) = 2:  $(test_oid a2) s/4/A/
 172        -:  $(test_oid __) > 3:  $(test_oid a3) s/6/A/
 173        3:  $(test_oid t3) = 4:  $(test_oid a4) s/11/B/
 174        4:  $(test_oid t4) = 5:  $(test_oid a5) s/12/B/
 175        EOF
 176        test_cmp expected actual
 177'
 178
 179test_expect_success 'new base, A B C' '
 180        git range-diff --no-color master topic rebased >actual &&
 181        cat >expected <<-EOF &&
 182        1:  $(test_oid t1) = 1:  $(test_oid b1) s/5/A/
 183        2:  $(test_oid t2) = 2:  $(test_oid b2) s/4/A/
 184        3:  $(test_oid t3) = 3:  $(test_oid b3) s/11/B/
 185        4:  $(test_oid t4) = 4:  $(test_oid b4) s/12/B/
 186        EOF
 187        test_cmp expected actual
 188'
 189
 190test_expect_success 'new base, B...C' '
 191        # this syntax includes the commits from master!
 192        git range-diff --no-color topic...rebased >actual &&
 193        cat >expected <<-EOF &&
 194        -:  $(test_oid __) > 1:  $(test_oid b5) unrelated
 195        1:  $(test_oid t1) = 2:  $(test_oid b1) s/5/A/
 196        2:  $(test_oid t2) = 3:  $(test_oid b2) s/4/A/
 197        3:  $(test_oid t3) = 4:  $(test_oid b3) s/11/B/
 198        4:  $(test_oid t4) = 5:  $(test_oid b4) s/12/B/
 199        EOF
 200        test_cmp expected actual
 201'
 202
 203test_expect_success 'changed commit' '
 204        git range-diff --no-color topic...changed >actual &&
 205        cat >expected <<-EOF &&
 206        1:  $(test_oid t1) = 1:  $(test_oid c1) s/5/A/
 207        2:  $(test_oid t2) = 2:  $(test_oid c2) s/4/A/
 208        3:  $(test_oid t3) ! 3:  $(test_oid c3) s/11/B/
 209            @@ file: A
 210              9
 211              10
 212             -11
 213            -+B
 214            ++BB
 215              12
 216              13
 217              14
 218        4:  $(test_oid t4) ! 4:  $(test_oid c4) s/12/B/
 219            @@ file
 220             @@ file: A
 221              9
 222              10
 223            - B
 224            + BB
 225             -12
 226             +B
 227              13
 228        EOF
 229        test_cmp expected actual
 230'
 231
 232test_expect_success 'changed commit with --no-patch diff option' '
 233        git range-diff --no-color --no-patch topic...changed >actual &&
 234        cat >expected <<-EOF &&
 235        1:  $(test_oid t1) = 1:  $(test_oid c1) s/5/A/
 236        2:  $(test_oid t2) = 2:  $(test_oid c2) s/4/A/
 237        3:  $(test_oid t3) ! 3:  $(test_oid c3) s/11/B/
 238        4:  $(test_oid t4) ! 4:  $(test_oid c4) s/12/B/
 239        EOF
 240        test_cmp expected actual
 241'
 242
 243test_expect_success 'changed commit with --stat diff option' '
 244        git range-diff --no-color --stat topic...changed >actual &&
 245        cat >expected <<-EOF &&
 246        1:  $(test_oid t1) = 1:  $(test_oid c1) s/5/A/
 247             a => b | 0
 248             1 file changed, 0 insertions(+), 0 deletions(-)
 249        2:  $(test_oid t2) = 2:  $(test_oid c2) s/4/A/
 250             a => b | 0
 251             1 file changed, 0 insertions(+), 0 deletions(-)
 252        3:  $(test_oid t3) ! 3:  $(test_oid c3) s/11/B/
 253             a => b | 0
 254             1 file changed, 0 insertions(+), 0 deletions(-)
 255        4:  $(test_oid t4) ! 4:  $(test_oid c4) s/12/B/
 256             a => b | 0
 257             1 file changed, 0 insertions(+), 0 deletions(-)
 258        EOF
 259        test_cmp expected actual
 260'
 261
 262test_expect_success 'changed commit with sm config' '
 263        git range-diff --no-color --submodule=log topic...changed >actual &&
 264        cat >expected <<-EOF &&
 265        1:  $(test_oid t1) = 1:  $(test_oid c1) s/5/A/
 266        2:  $(test_oid t2) = 2:  $(test_oid c2) s/4/A/
 267        3:  $(test_oid t3) ! 3:  $(test_oid c3) s/11/B/
 268            @@ file: A
 269              9
 270              10
 271             -11
 272            -+B
 273            ++BB
 274              12
 275              13
 276              14
 277        4:  $(test_oid t4) ! 4:  $(test_oid c4) s/12/B/
 278            @@ file
 279             @@ file: A
 280              9
 281              10
 282            - B
 283            + BB
 284             -12
 285             +B
 286              13
 287        EOF
 288        test_cmp expected actual
 289'
 290
 291test_expect_success 'renamed file' '
 292        git range-diff --no-color --submodule=log topic...renamed-file >actual &&
 293        sed s/Z/\ /g >expected <<-EOF &&
 294        1:  $(test_oid t1) = 1:  $(test_oid n1) s/5/A/
 295        2:  $(test_oid t2) ! 2:  $(test_oid n2) s/4/A/
 296            @@ Metadata
 297            ZAuthor: Thomas Rast <trast@inf.ethz.ch>
 298            Z
 299            Z ## Commit message ##
 300            -    s/4/A/
 301            +    s/4/A/ + rename file
 302            Z
 303            - ## file ##
 304            + ## file => renamed-file ##
 305            Z@@
 306            Z 1
 307            Z 2
 308        3:  $(test_oid t3) ! 3:  $(test_oid n3) s/11/B/
 309            @@ Metadata
 310            Z ## Commit message ##
 311            Z    s/11/B/
 312            Z
 313            - ## file ##
 314            -@@ file: A
 315            + ## renamed-file ##
 316            +@@ renamed-file: A
 317            Z 8
 318            Z 9
 319            Z 10
 320        4:  $(test_oid t4) ! 4:  $(test_oid n4) s/12/B/
 321            @@ Metadata
 322            Z ## Commit message ##
 323            Z    s/12/B/
 324            Z
 325            - ## file ##
 326            -@@ file: A
 327            + ## renamed-file ##
 328            +@@ renamed-file: A
 329            Z 9
 330            Z 10
 331            Z B
 332        EOF
 333        test_cmp expected actual
 334'
 335
 336test_expect_success 'file added and later removed' '
 337        git range-diff --no-color --submodule=log topic...added-removed >actual &&
 338        sed s/Z/\ /g >expected <<-EOF &&
 339        1:  $(test_oid t1) = 1:  $(test_oid s1) s/5/A/
 340        2:  $(test_oid t2) ! 2:  $(test_oid s2) s/4/A/
 341            @@ Metadata
 342            ZAuthor: Thomas Rast <trast@inf.ethz.ch>
 343            Z
 344            Z ## Commit message ##
 345            -    s/4/A/
 346            +    s/4/A/ + new-file
 347            Z
 348            Z ## file ##
 349            Z@@
 350            @@ file
 351            Z A
 352            Z 6
 353            Z 7
 354            +
 355            + ## new-file (new) ##
 356        3:  $(test_oid t3) ! 3:  $(test_oid s3) s/11/B/
 357            @@ Metadata
 358            ZAuthor: Thomas Rast <trast@inf.ethz.ch>
 359            Z
 360            Z ## Commit message ##
 361            -    s/11/B/
 362            +    s/11/B/ + remove file
 363            Z
 364            Z ## file ##
 365            Z@@ file: A
 366            @@ file: A
 367            Z 12
 368            Z 13
 369            Z 14
 370            +
 371            + ## new-file (deleted) ##
 372        4:  $(test_oid t4) = 4:  $(test_oid s4) s/12/B/
 373        EOF
 374        test_cmp expected actual
 375'
 376
 377test_expect_success 'no commits on one side' '
 378        git commit --amend -m "new message" &&
 379        git range-diff master HEAD@{1} HEAD
 380'
 381
 382test_expect_success 'changed message' '
 383        git range-diff --no-color topic...changed-message >actual &&
 384        sed s/Z/\ /g >expected <<-EOF &&
 385        1:  $(test_oid t1) = 1:  $(test_oid m1) s/5/A/
 386        2:  $(test_oid t2) ! 2:  $(test_oid m2) s/4/A/
 387            @@ Metadata
 388            Z ## Commit message ##
 389            Z    s/4/A/
 390            Z
 391            +    Also a silly comment here!
 392            +
 393            Z ## file ##
 394            Z@@
 395            Z 1
 396        3:  $(test_oid t3) = 3:  $(test_oid m3) s/11/B/
 397        4:  $(test_oid t4) = 4:  $(test_oid m4) s/12/B/
 398        EOF
 399        test_cmp expected actual
 400'
 401
 402test_expect_success 'dual-coloring' '
 403        sed -e "s|^:||" >expect <<-EOF &&
 404        :<YELLOW>1:  $(test_oid c1) = 1:  $(test_oid m1) s/5/A/<RESET>
 405        :<RED>2:  $(test_oid c2) <RESET><YELLOW>!<RESET><GREEN> 2:  $(test_oid m2)<RESET><YELLOW> s/4/A/<RESET>
 406        :    <REVERSE><CYAN>@@<RESET> <RESET>Metadata<RESET>
 407        :      ## Commit message ##<RESET>
 408        :         s/4/A/<RESET>
 409        :     <RESET>
 410        :    <REVERSE><GREEN>+<RESET><BOLD>    Also a silly comment here!<RESET>
 411        :    <REVERSE><GREEN>+<RESET>
 412        :      ## file ##<RESET>
 413        :    <CYAN> @@<RESET>
 414        :      1<RESET>
 415        :<RED>3:  $(test_oid c3) <RESET><YELLOW>!<RESET><GREEN> 3:  $(test_oid m3)<RESET><YELLOW> s/11/B/<RESET>
 416        :    <REVERSE><CYAN>@@<RESET> <RESET>file: A<RESET>
 417        :      9<RESET>
 418        :      10<RESET>
 419        :    <RED> -11<RESET>
 420        :    <REVERSE><RED>-<RESET><FAINT;GREEN>+BB<RESET>
 421        :    <REVERSE><GREEN>+<RESET><BOLD;GREEN>+B<RESET>
 422        :      12<RESET>
 423        :      13<RESET>
 424        :      14<RESET>
 425        :<RED>4:  $(test_oid c4) <RESET><YELLOW>!<RESET><GREEN> 4:  $(test_oid m4)<RESET><YELLOW> s/12/B/<RESET>
 426        :    <REVERSE><CYAN>@@<RESET> <RESET>file<RESET>
 427        :    <CYAN> @@ file: A<RESET>
 428        :      9<RESET>
 429        :      10<RESET>
 430        :    <REVERSE><RED>-<RESET><FAINT> BB<RESET>
 431        :    <REVERSE><GREEN>+<RESET><BOLD> B<RESET>
 432        :    <RED> -12<RESET>
 433        :    <GREEN> +B<RESET>
 434        :      13<RESET>
 435        EOF
 436        git range-diff changed...changed-message --color --dual-color >actual.raw &&
 437        test_decode_color >actual <actual.raw &&
 438        test_cmp expect actual
 439'
 440
 441for prev in topic master..topic
 442do
 443        test_expect_success "format-patch --range-diff=$prev" '
 444                git format-patch --cover-letter --range-diff=$prev \
 445                        master..unmodified >actual &&
 446                test_when_finished "rm 000?-*" &&
 447                test_line_count = 5 actual &&
 448                test_i18ngrep "^Range-diff:$" 0000-* &&
 449                grep "= 1: .* s/5/A" 0000-* &&
 450                grep "= 2: .* s/4/A" 0000-* &&
 451                grep "= 3: .* s/11/B" 0000-* &&
 452                grep "= 4: .* s/12/B" 0000-*
 453        '
 454done
 455
 456test_expect_success 'format-patch --range-diff as commentary' '
 457        git format-patch --range-diff=HEAD~1 HEAD~1 >actual &&
 458        test_when_finished "rm 0001-*" &&
 459        test_line_count = 1 actual &&
 460        test_i18ngrep "^Range-diff:$" 0001-* &&
 461        grep "> 1: .* new message" 0001-*
 462'
 463
 464test_done