============================================== Test merge algorithm with "relaxed block sync" ============================================== Setup ===== $ cat >> $HGRCPATH << EOF > [experimental] > relaxed-block-sync-merge=yes > [ui] > merge=:merge3 > EOF $ unset HGMERGE $ hg init repo $ cd repo $ m=../scratch $ mkdir "$m" # For the purpose of this test, we use a file [listing] that has one line # per file of [scratch] directory. # This way, the patches can be represented as bash scripts. # # Adding a line is then just "touch", removing a line is "rm", and # modifying a line is "echo modfied > file1". # Make_change takes a "patch script", as described above, and # produces a file [listing] with the coresponding contents # past applying the patch to a fixed base state. $ make_change() { > cmd=$1 > rm -r ../scratch > mkdir ../scratch > (cat listing 2>/dev/null || true) | while IFS=' :' read k v; do echo "$v" > ../scratch/"$k"; done > > ( > cd ../scratch > eval "$cmd" >&2 > for f in *; do val=$(cat "$f"); printf "$f: $val\n"; done) > listing > } # mk_rev takes a [base] and a patch, and produces a child revision of [base] # corresponding to that patch. $ mk_rev() { > base=$1 > cmd=$2 > (hg update -C "$base" -q > make_change "$cmd" > (hg commit -qAm _ 2>&1) | grep -v 'commit already existed') >&2 > hg log -r . -T '{rev}' > } $ test() { > cmd1=$1 > cmd2=$2 > r2=$(mk_rev 0 "$cmd2") > r1=$(mk_rev 0 "$cmd1") > # already at r1 > hg merge -q "$r2" > cat listing > } $ rev0=$(mk_rev 'rev(-1)' 'echo val1 > key1; echo val2 > key2; echo val3 > key3; ') $ cat listing key1: val1 key2: val2 key3: val3 Actual testing ============== easy merge: no need for relaxed block sync: ------------------------------------------- $ test 'echo modified1 > key1' 'echo modified3 > key3' key1: modified1 key2: val2 key3: modified3 Add adjacent to modify: ----------------------- $ test 'echo modified > key3' 'echo val4 > key4' key1: val1 key2: val2 key3: modified key4: val4 Modify adjacent to modify: -------------------------- $ test 'echo modified3 > key3' 'echo modified2 > key2' key1: val1 key2: modified2 key3: modified3 Remove adjacent to modify: -------------------------- $ test 'rm key2' 'echo modified > key1' key1: modified key3: val3 Add adjacent to remove: ----------------------- $ test 'rm key2' 'touch key1a' key1: val1 key1a: key3: val3 Remove adjacent to remove: -------------------------- $ test 'rm key2' 'rm key1' key3: val3 It even works if you're sandwiched between additions above and below: $ test 'echo val-changed-3 > key3' 'touch key2a; touch key4' key1: val1 key2: val2 key2a: key3: val-changed-3 key4: Add adjacent to add: -------------------- Add adjacent to add is still disallowed because we don't know what order to add lines in: $ test 'touch key1a' 'touch key1b' warning: conflicts while merging listing! (edit, then use 'hg resolve --mark') key1: val1 <<<<<<< working copy: 744662bcc33a - test: _ key1a: ||||||| common ancestor: b1791e356cd4 - test: _ ======= key1b: >>>>>>> merge rev: 06735b47f956 - test: _ key2: val2 key3: val3 Add kinda-adjacent to add can still work if there's an adjacent line that helps resolve the order ambiguity: $ test 'touch key1a; rm key2' 'touch key2a' key1: val1 key1a: key2a: key3: val3