t / t6111-rev-list-treesame.shon commit commit_tree: take a pointer/len pair rather than a const strbuf (3ffefb5)
   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
  69check_outcome () {
  70        outcome=$1
  71        shift
  72
  73        case "$1" in
  74        *"("*)
  75                FMT="%P %H | %s"
  76                munge_actual="
  77                        s/^\([^ ]*\)    \([^ ]*\) .*/(\1)\2/
  78                        s/ //g
  79                        s/()//
  80                "
  81                ;;
  82        *)
  83                FMT="%H | %s"
  84                munge_actual="s/^\([^ ]*\) .*/\1/"
  85                ;;
  86        esac &&
  87        printf "%s\n" $1 >expect &&
  88        shift
  89
  90        param="$*" &&
  91        test_expect_$outcome "log $param" '
  92                git log --format="$FMT" $param |
  93                unnote >actual &&
  94                sed -e "$munge_actual" <actual >check &&
  95                test_cmp expect check || {
  96                        cat actual
  97                        false
  98                }
  99        '
 100}
 101
 102check_result () {
 103        check_outcome success "$@"
 104}
 105
 106# Odd merge G drops a change in F. Important that G is listed in all
 107# except the most basic list. Achieving this means normal merge D will also be
 108# shown in normal full-history, as we can't distinguish unless we do a
 109# simplification pass. After simplification, D is dropped but G remains.
 110# Also, merge simplification of G should not drop the parent B that the default
 111# simple history follows.
 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 '(LH)M (B)L (B)H (A)B A' --parents -- file
 117check_result 'M L J I H G F D B A' --full-history -- file
 118check_result '(LH)M (K)L (GJ)K (I)J (G)I (G)H (FB)G (D)F (BA)D (A)B A' --full-history --parents -- file
 119check_result '(LH)M (G)H (J)L (I)J (G)I (FB)G (B)F (A)B A' --simplify-merges -- file
 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 '(LH)M (B)L (B)H' --parents F..M -- file
 128check_result 'M L J I H G' F..M --full-history -- file
 129check_result '(LH)M (K)L (GJ)K (I)J (G)I (G)H (FB)G' F..M --full-history --parents -- file
 130check_result '(LH)M (G)H (J)L (I)J (G)I (FB)G' F..M --simplify-merges -- file
 131check_result 'M L K J I H G' F..M --ancestry-path
 132check_result 'M L J I H G' F..M --ancestry-path -- file
 133check_result '(LH)M (K)L (GJ)K (I)J (G)I (G)H (FE)G' F..M --ancestry-path --parents -- file
 134check_result '(LH)M (G)H (J)L (I)J (G)I (FE)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_result '(LH)M (K)L (EJ)K (I)J (E)I (E)H' E..M --ancestry-path --parents -- file
 143check_result '(LH)M (E)H (J)L (I)J (E)I' E..M --ancestry-path --simplify-merges -- file
 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_result 'M L H' G..M -- file
 150check_result '(LH)M (G)L (G)H' G..M --parents -- file
 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_result '(B)F' B..F --parents -- file
 166check_result 'F D' B..F --full-history -- file
 167check_result '(D)F (BA)D' B..F --full-history --parents -- file
 168check_result '(B)F' B..F --simplify-merges -- file
 169check_result 'F D' B..F --ancestry-path
 170check_result 'F' B..F --ancestry-path -- file
 171check_result 'F' B..F --ancestry-path --parents -- file
 172check_result 'F' B..F --ancestry-path --simplify-merges -- file
 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 # includes D
 178check_result 'F' E...F -- file # includes D
 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 '(B)F (A)B' C..F --parents -- file
 185check_result 'F D B' C..F --full-history -- file
 186check_result '(D)F (BC)D (A)B' C..F --full-history --parents -- file
 187check_result '(D)F (BC)D (A)B' C..F --simplify-merges -- file
 188check_result 'F D' C..F --ancestry-path
 189check_result 'F D' C..F --ancestry-path -- file
 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