t / t6012-rev-list-simplify.shon commit Merge branch 'jk/diff-cc-stat-fixes' (5d2710b)
   1#!/bin/sh
   2
   3test_description='merge simplification'
   4
   5. ./test-lib.sh
   6
   7note () {
   8        git tag "$1"
   9}
  10
  11unnote () {
  12        git name-rev --tags --stdin | sed -e "s|$OID_REGEX (tags/\([^)]*\)) |\1 |g"
  13}
  14
  15#
  16# Create a test repo with interesting commit graph:
  17#
  18# A--B----------G--H--I--K--L
  19#  \  \           /     /
  20#   \  \         /     /
  21#    C------E---F     J
  22#        \_/
  23#
  24# The commits are laid out from left-to-right starting with
  25# the root commit A and terminating at the tip commit L.
  26#
  27# There are a few places where we adjust the commit date or
  28# author date to make the --topo-order, --date-order, and
  29# --author-date-order flags produce different output.
  30
  31test_expect_success setup '
  32        echo "Hi there" >file &&
  33        echo "initial" >lost &&
  34        git add file lost &&
  35        test_tick && git commit -m "Initial file and lost" &&
  36        note A &&
  37
  38        git branch other-branch &&
  39
  40        git symbolic-ref HEAD refs/heads/unrelated &&
  41        git rm -f "*" &&
  42        echo "Unrelated branch" >side &&
  43        git add side &&
  44        test_tick && git commit -m "Side root" &&
  45        note J &&
  46        git checkout master &&
  47
  48        echo "Hello" >file &&
  49        echo "second" >lost &&
  50        git add file lost &&
  51        test_tick && GIT_AUTHOR_DATE=$(($test_tick + 120)) git commit -m "Modified file and lost" &&
  52        note B &&
  53
  54        git checkout other-branch &&
  55
  56        echo "Hello" >file &&
  57        >lost &&
  58        git add file lost &&
  59        test_tick && git commit -m "Modified the file identically" &&
  60        note C &&
  61
  62        echo "This is a stupid example" >another-file &&
  63        git add another-file &&
  64        test_tick && git commit -m "Add another file" &&
  65        note D &&
  66
  67        test_tick &&
  68        test_must_fail git merge -m "merge" master &&
  69        >lost && git commit -a -m "merge" &&
  70        note E &&
  71
  72        echo "Yet another" >elif &&
  73        git add elif &&
  74        test_tick && git commit -m "Irrelevant change" &&
  75        note F &&
  76
  77        git checkout master &&
  78        echo "Yet another" >elif &&
  79        git add elif &&
  80        test_tick && git commit -m "Another irrelevant change" &&
  81        note G &&
  82
  83        test_tick && git merge -m "merge" other-branch &&
  84        note H &&
  85
  86        echo "Final change" >file &&
  87        test_tick && git commit -a -m "Final change" &&
  88        note I &&
  89
  90        git checkout master &&
  91        test_tick && git merge --allow-unrelated-histories -m "Coolest" unrelated &&
  92        note K &&
  93
  94        echo "Immaterial" >elif &&
  95        git add elif &&
  96        test_tick && git commit -m "Last" &&
  97        note L
  98'
  99
 100FMT='tformat:%P         %H | %s'
 101
 102check_outcome () {
 103        outcome=$1
 104        shift
 105        for c in $1
 106        do
 107                echo "$c"
 108        done >expect &&
 109        shift &&
 110        param="$*" &&
 111        test_expect_$outcome "log $param" '
 112                git log --pretty="$FMT" --parents $param |
 113                unnote >actual &&
 114                sed -e "s/^.*   \([^ ]*\) .*/\1/" >check <actual &&
 115                test_cmp expect check
 116        '
 117}
 118
 119check_result () {
 120        check_outcome success "$@"
 121}
 122
 123check_result 'L K J I H F E D C G B A' --full-history --topo-order
 124check_result 'L K I H G F E D C B J A' --full-history
 125check_result 'L K I H G F E D C B J A' --full-history --date-order
 126check_result 'L K I H G F E D B C J A' --full-history --author-date-order
 127check_result 'K I H E C B A' --full-history -- file
 128check_result 'K I H E C B A' --full-history --topo-order -- file
 129check_result 'K I H E C B A' --full-history --date-order -- file
 130check_result 'K I H E B C A' --full-history --author-date-order -- file
 131check_result 'I E C B A' --simplify-merges -- file
 132check_result 'I E C B A' --simplify-merges --topo-order -- file
 133check_result 'I E C B A' --simplify-merges --date-order -- file
 134check_result 'I E B C A' --simplify-merges --author-date-order -- file
 135check_result 'I B A' -- file
 136check_result 'I B A' --topo-order -- file
 137check_result 'I B A' --date-order -- file
 138check_result 'I B A' --author-date-order -- file
 139check_result 'H' --first-parent -- another-file
 140check_result 'H' --first-parent --topo-order -- another-file
 141
 142check_result 'E C B A' --full-history E -- lost
 143test_expect_success 'full history simplification without parent' '
 144        printf "%s\n" E C B A >expect &&
 145        git log --pretty="$FMT" --full-history E -- lost |
 146        unnote >actual &&
 147        sed -e "s/^.*   \([^ ]*\) .*/\1/" >check <actual &&
 148        test_cmp expect check
 149'
 150
 151test_expect_success '--full-diff is not affected by --parents' '
 152        git log -p --pretty="%H" --full-diff -- file >expected &&
 153        git log -p --pretty="%H" --full-diff --parents -- file >actual &&
 154        test_cmp expected actual
 155'
 156
 157test_done