t / t6111-rev-list-treesame.shon commit t6111: allow checking the parents as well (e16f434)
   1#!/bin/sh
   2#
   3#        ,---E--.   *H----------.             * marks !TREESAME parent paths
   4#       /        \ /             \*
   5# *A--*B---D--*F-*G---------K-*L-*M
   6#   \     /*       \       /
   7#    `-C-'          `-*I-*J
   8#
   9# A creates "file", B and F change it.
  10# Odd merge G takes the old version from B.
  11# I changes it, but J reverts it, so K is TREESAME to both parents.
  12# H and L both change "file", and M merges those changes.
  13
  14test_description='TREESAME and limiting'
  15
  16. ./test-lib.sh
  17
  18note () {
  19        git tag "$1"
  20}
  21
  22unnote () {
  23        git name-rev --tags --stdin | sed -e "s|$_x40 (tags/\([^)]*\))\([       ]\)|\1\2|g"
  24}
  25
  26test_expect_success setup '
  27        test_commit "Initial file" file "Hi there" A &&
  28        git branch other-branch &&
  29
  30        test_commit "file=Hello" file "Hello" B &&
  31        git branch third-branch &&
  32
  33        git checkout other-branch &&
  34        test_commit "Added other" other "Hello" C &&
  35
  36        git checkout master &&
  37        test_merge D other-branch &&
  38
  39        git checkout third-branch &&
  40        test_commit "Third file" third "Nothing" E &&
  41
  42        git checkout master &&
  43        test_commit "file=Blah" file "Blah" F &&
  44
  45        test_tick && git merge --no-commit third-branch &&
  46        git checkout third-branch file &&
  47        git commit &&
  48        note G &&
  49        git branch fiddler-branch &&
  50
  51        git checkout -b part2-branch &&
  52        test_commit "file=Part 2" file "Part 2" H &&
  53
  54        git checkout fiddler-branch &&
  55        test_commit "Bad commit" file "Silly" I &&
  56
  57        test_tick && git revert I && note J &&
  58
  59        git checkout master &&
  60        test_tick && git merge --no-ff fiddler-branch &&
  61        note K
  62
  63        test_commit "file=Part 1" file "Part 1" L &&
  64
  65        test_tick && test_must_fail git merge part2-branch &&
  66        test_commit M file "Parts 1+2"
  67'
  68
  69# could we soup this up to optionally check parents? So "(BA)C" would check
  70# that C is shown and has parents B A.
  71check_outcome () {
  72        outcome=$1
  73        shift
  74
  75        case "$1" in
  76        *"("*)
  77                FMT="%P %H | %s"
  78                munge_actual="
  79                        s/^\([^ ]*\)    \([^ ]*\) .*/(\1)\2/
  80                        s/ //g
  81                        s/()//
  82                "
  83                ;;
  84        *)
  85                FMT="%H | %s"
  86                munge_actual="s/^\([^ ]*\) .*/\1/"
  87                ;;
  88        esac &&
  89        printf "%s\n" $1 >expect &&
  90        shift
  91
  92        param="$*" &&
  93        test_expect_$outcome "log $param" '
  94                git log --format="$FMT" $param |
  95                unnote >actual &&
  96                sed -e "$munge_actual" <actual >check &&
  97                test_cmp expect check || {
  98                        cat actual
  99                        false
 100                }
 101        '
 102}
 103
 104check_result () {
 105        check_outcome success "$@"
 106}
 107
 108# Odd merge G drops a change in F. Important that G is listed in all
 109# except the most basic list. Achieving this means normal merge D will also be
 110# shown in normal full-history, as we can't distinguish unless we do a
 111# simplification pass. After simplification, D is dropped but G remains.
 112check_result 'M L K J I H G F E D C B A'
 113check_result '(LH)M (K)L (GJ)K (I)J (G)I (G)H (FE)G (D)F (B)E (BC)D (A)C (A)B A'
 114check_result 'M H L K J I G E F D C B A' --topo-order
 115check_result 'M L H B A' -- file
 116check_result 'M L H B A' --parents -- file
 117check_outcome failure 'M L J I H G F D B A' --full-history -- file # drops G
 118check_result 'M L K J I H G F D B A' --full-history --parents -- file
 119check_outcome failure 'M H L J I G F B A' --simplify-merges -- file # drops G
 120check_result 'M L K G F D B A' --first-parent
 121check_result 'M L G F B A' --first-parent -- file
 122
 123# Check that odd merge G remains shown when F is the bottom.
 124check_result 'M L K J I H G E' F..M
 125check_result 'M H L K J I G E' F..M --topo-order
 126check_result 'M L H' F..M -- file
 127check_result 'M L H' F..M --parents -- file # L+H's parents rewritten to B, so more useful than it may seem
 128check_outcome failure 'M L J I H G' F..M --full-history -- file # drops G
 129check_result 'M L K J I H G' F..M --full-history --parents -- file
 130check_outcome failure 'M H L J I G' F..M --simplify-merges -- file # drops G
 131check_result 'M L K J I H G' F..M --ancestry-path
 132check_outcome failure 'M L J I H G' F..M --ancestry-path -- file # drops G
 133check_result 'M L K J I H G' F..M --ancestry-path --parents -- file
 134check_result 'M H L J I G' F..M --ancestry-path --simplify-merges -- file
 135check_result 'M L K G' F..M --first-parent
 136check_result 'M L G' F..M --first-parent -- file
 137
 138# Note that G is pruned when E is the bottom, even if it's the same commit list
 139# If we want history since E, then we're quite happy to ignore G that took E.
 140check_result 'M L K J I H G' E..M --ancestry-path
 141check_result 'M L J I H' E..M --ancestry-path -- file
 142check_outcome failure 'M L K J I H' E..M --ancestry-path --parents -- file # includes G
 143check_outcome failure 'M H L J I' E..M --ancestry-path --simplify-merges -- file # includes G
 144
 145# Should still be able to ignore I-J branch in simple log, despite limiting
 146# to G.
 147check_result 'M L K J I H' G..M
 148check_result 'M H L K J I' G..M --topo-order
 149check_outcome failure 'M L H' G..M -- file # includes J I
 150check_outcome failure 'M L H' G..M --parents -- file # includes J I
 151check_result 'M L J I H' G..M --full-history -- file
 152check_result 'M L K J I H' G..M --full-history --parents -- file
 153check_result 'M H L J I' G..M --simplify-merges -- file
 154check_result 'M L K J I H' G..M --ancestry-path
 155check_result 'M L J I H' G..M --ancestry-path -- file
 156check_result 'M L K J I H' G..M --ancestry-path --parents -- file
 157check_result 'M H L J I' G..M --ancestry-path --simplify-merges -- file
 158
 159# B..F should be able to simplify the merge D from irrelevant side branch C.
 160# Default log should also be free to follow B-D, and ignore C.
 161# But --full-history shouldn't drop D on its own - without simplification,
 162# we can't decide if the merge from INTERESTING commit C was sensible.
 163check_result 'F D C' B..F
 164check_result 'F' B..F -- file
 165check_outcome failure 'F' B..F --parents -- file # includes D
 166check_outcome failure 'F D' B..F --full-history -- file # drops D prematurely
 167check_result 'F D' B..F --full-history --parents -- file
 168check_result 'F' B..F --simplify-merges -- file
 169check_result 'F D' B..F --ancestry-path
 170check_result 'F' B..F --ancestry-path -- file
 171check_outcome failure 'F' B..F --ancestry-path --parents -- file # includes D
 172check_outcome failure 'F' B..F --ancestry-path --simplify-merges -- file # includes D
 173check_result 'F D' B..F --first-parent
 174check_result 'F' B..F --first-parent -- file
 175
 176# E...F should be equivalent to E F ^B, and be able to drop D as above.
 177check_result 'F' E F ^B -- file
 178check_result 'F' E...F -- file
 179
 180# Any sort of full history of C..F should show D, as it's the connection to C,
 181# and it differs from it.
 182check_result 'F D B' C..F
 183check_result 'F B' C..F -- file
 184check_result 'F B' C..F --parents -- file
 185check_outcome failure 'F D B' C..F --full-history -- file # drops D
 186check_result 'F D B' C..F --full-history --parents -- file
 187check_result 'F D B' C..F --simplify-merges -- file
 188check_result 'F D' C..F --ancestry-path
 189check_outcome failure 'F D' C..F --ancestry-path -- file # drops D
 190check_result 'F D' C..F --ancestry-path --parents -- file
 191check_result 'F D' C..F --ancestry-path --simplify-merges -- file
 192check_result 'F D B' C..F --first-parent
 193check_result 'F B' C..F --first-parent -- file
 194
 195
 196test_done