sapling/eden/hg-server/tests/test-mergedriver2.t

97 lines
2.6 KiB
Perl
Raw Normal View History

#chg-compatible
Test adding, removing, changing files in both merge parents, without telling
mergedriver the exact file list to change at "preprocess" time.
$ enable mergedriver
$ newrepo
$ drawdag << 'EOS'
> B C # C/A=1
> |/ # B/A=2
> A # C/C_del=C
> | # B/B_del=B
> Z # C/C_change=C
> # B/B_change=B
> EOS
$ hg up -q $B
The merge driver wants to delete B_del and C_del, change B_change and C_change,
and add B_add and C_add. Note: there are no conflicts.
$ setconfig experimental.mergedriver=python:$TESTTMP/mergedriver-test.py
$ cat > $TESTTMP/mergedriver-test.py << EOF
> from edenscm.mercurial import node
> from mercurial import node as node2
> assert node is node2
> import os
> def preprocess(ui, repo, hooktype, mergestate, wctx, labels):
> from edenscm.mercurial import util
> from mercurial import util as util2
> assert util is util2
> ui.write("merge driver preprocess\n")
> # Right now, need to mark at least one file to get mergedriver running
> mergestate.mark("A", "d") # driver-resovled
> # Intentionally not marking all touched files as "driver-resolved", to
> # emulate some practical use-cases where it is impossible to know the
> # file list before hand.
>
> def conclude(ui, repo, hooktype, mergestate, wctx, labels):
> ui.write("merge driver conclude\n")
>
> # emulating an external script making changes to the working copy
> os.unlink("A")
> os.unlink("B_del")
> os.unlink("C_del")
>
> _ = open("B_add", "w").write("B")
> _ = open("C_add", "w").write("C")
>
> _ = open("B_change", "a").write("B")
> _ = open("C_change", "a").write("C")
>
> # mark files using mergedriver APIs
> mergestate.queueremove("A")
> mergestate.queueremove("B_del")
> mergestate.queueremove("C_del")
> mergestate.queueadd("B_add")
> mergestate.queueadd("C_add")
> mergestate.queueget("B_change")
> mergestate.queueget("C_change")
> EOF
Do the merge:
$ hg graft $C
grafting cb95dc195621 "C"
merge driver preprocess
merge driver conclude
Status should be clean:
$ hg status
Working copy and commit made should have expected changes:
>>> import glob
>>> for path in sorted(glob.glob("*")):
... print("%s: %s" % (path, open(path).read().strip()))
B: B
B_add: B
B_change: BB
C: C
C_add: C
C_change: CC
Z: Z
$ hg diff -r 'p1(.)' -r '.' --stat
A | 1 -
B_add | 1 +
B_change | 2 +-
B_del | 1 -
C | 1 +
C_add | 1 +
C_change | 1 +
7 files changed, 5 insertions(+), 3 deletions(-)