##// END OF EJS Templates
merge: allow smarter tool configuration...
Matt Mackall -
r6004:5af5f0f9 default
parent child Browse files
Show More
@@ -813,40 +813,6 b' def debuginstall(ui):'
813 os.unlink(fa)
813 os.unlink(fa)
814 os.unlink(fd)
814 os.unlink(fd)
815
815
816 # merge helper
817 ui.status(_("Checking merge helper...\n"))
818 cmd = (os.environ.get("HGMERGE") or ui.config("ui", "merge")
819 or "hgmerge")
820 cmdpath = util.find_exe(cmd) or util.find_exe(cmd.split()[0])
821 if not cmdpath:
822 if cmd == 'hgmerge':
823 ui.write(_(" No merge helper set and can't find default"
824 " hgmerge script in PATH\n"))
825 ui.write(_(" (specify a merge helper in your .hgrc file)\n"))
826 else:
827 ui.write(_(" Can't find merge helper '%s' in PATH\n") % cmd)
828 ui.write(_(" (specify a merge helper in your .hgrc file)\n"))
829 problems += 1
830 else:
831 # actually attempt a patch here
832 fa = writetemp("1\n2\n3\n4\n")
833 fl = writetemp("1\n2\n3\ninsert\n4\n")
834 fr = writetemp("begin\n1\n2\n3\n4\n")
835 r = util.system('%s "%s" "%s" "%s"' % (cmd, fl, fa, fr))
836 if r:
837 ui.write(_(" Got unexpected merge error %d!\n") % r)
838 problems += 1
839 m = file(fl).read()
840 if m != "begin\n1\n2\n3\ninsert\n4\n":
841 ui.write(_(" Got unexpected merge results!\n"))
842 ui.write(_(" (your merge helper may have the"
843 " wrong argument order)\n"))
844 ui.write(_(" Result: %r\n") % m)
845 problems += 1
846 os.unlink(fa)
847 os.unlink(fl)
848 os.unlink(fr)
849
850 # editor
816 # editor
851 ui.status(_("Checking commit editor...\n"))
817 ui.status(_("Checking commit editor...\n"))
852 editor = ui.geteditor()
818 editor = ui.geteditor()
@@ -7,7 +7,57 b''
7
7
8 from node import *
8 from node import *
9 from i18n import _
9 from i18n import _
10 import util, os, tempfile, context
10 import util, os, tempfile, context, simplemerge, re
11
12 def _toolstr(ui, tool, part, default=None):
13 return ui.config("merge-tools", tool + "." + part, default)
14
15 def _toolbool(ui, tool, part, default=False):
16 return ui.configbool("merge-tools", tool + "." + part, default)
17
18 def _findtool(ui, tool):
19 return util.find_exe(_toolstr(ui, tool, "executable", tool))
20
21 def _picktool(repo, ui, path, binary, symlink):
22 def check(tool, pat, symlink, binary):
23 tmsg = tool
24 if pat:
25 tmsg += " specified for " + pat
26 if pat and not _findtool(ui, tool): # skip search if not matching
27 ui.warn(_("couldn't find merge tool %s\n") % tmsg)
28 elif symlink and not _toolbool(ui, tool, "symlink"):
29 ui.warn(_("tool %s can't handle symlinks\n") % tmsg)
30 elif binary and not _toolbool(ui, tool, "binary"):
31 ui.warn(_("tool %s can't handle binary\n") % tmsg)
32 else:
33 return True
34 return False
35
36 # HGMERGE takes precedence
37 if os.environ.get("HGMERGE"):
38 return os.environ.get("HGMERGE")
39
40 # then patterns
41 for pattern, tool in ui.configitems("merge-patterns"):
42 mf = util.matcher(repo.root, "", [pat], [], [])[1]
43 if mf(path) and check(tool, pat, symlink, False):
44 return tool
45
46 # then merge tools
47 tools = {}
48 for k,v in ui.configitems("merge-tools"):
49 t = k.split('.')[0]
50 if t not in tools:
51 tools[t] = int(_toolstr(ui, t, "priority", "0"))
52 tools = [(-p,t) for t,p in tools.items()]
53 tools.sort()
54 if ui.config("ui", "merge"):
55 tools.insert(0, (None, ui.config("ui", "merge"))) # highest priority
56 tools.append((None, "hgmerge")) # the old default, if found
57 tools.append((None, "internal:merge")) # internal merge as last resort
58 for p,t in tools:
59 if _findtool(ui, t) and check(t, None, symlink, binary):
60 return t
11
61
12 def filemerge(repo, fw, fd, fo, wctx, mctx):
62 def filemerge(repo, fw, fd, fo, wctx, mctx):
13 """perform a 3-way merge in the working directory
63 """perform a 3-way merge in the working directory
@@ -27,38 +77,91 b' def filemerge(repo, fw, fd, fo, wctx, mc'
27 f.close()
77 f.close()
28 return name
78 return name
29
79
30 fcm = wctx.filectx(fw)
80 def isbin(ctx):
31 fcmdata = wctx.filectx(fd).data()
81 try:
82 return util.binary(ctx.data())
83 except IOError:
84 return False
85
32 fco = mctx.filectx(fo)
86 fco = mctx.filectx(fo)
33
87 if not fco.cmp(wctx.filectx(fd).data()): # files identical?
34 if not fco.cmp(fcmdata): # files identical?
35 return None
88 return None
36
89
37 fca = fcm.ancestor(fco)
90 ui = repo.ui
38 if not fca:
91 fcm = wctx.filectx(fw)
39 fca = repo.filectx(fw, fileid=nullrev)
92 fca = fcm.ancestor(fco) or repo.filectx(fw, fileid=nullrev)
93 binary = isbin(fcm) or isbin(fco) or isbin(fca)
94 symlink = fcm.islink() or fco.islink()
95 tool = _picktool(repo, ui, fw, binary, symlink)
96 ui.debug(_("picked tool '%s' for %s (binary %s symlink %s)\n") %
97 (tool, fw, binary, symlink))
98
99 if not tool:
100 tool = "internal:local"
101 if ui.prompt(_(" no tool found to merge %s\n"
102 "keep (l)ocal or take (o)ther?") % fw,
103 _("[lo]"), _("l")) != _("l"):
104 tool = "internal:other"
105 if tool == "internal:local":
106 return 0
107 if tool == "internal:other":
108 repo.wwrite(fd, fco.data(), fco.fileflags())
109 return 0
110 if tool == "internal:fail":
111 return 1
112
113 # do the actual merge
40 a = repo.wjoin(fd)
114 a = repo.wjoin(fd)
41 b = temp("base", fca)
115 b = temp("base", fca)
42 c = temp("other", fco)
116 c = temp("other", fco)
117 out = ""
118 back = a + ".orig"
119 util.copyfile(a, back)
43
120
44 if fw != fo:
121 if fw != fo:
45 repo.ui.status(_("merging %s and %s\n") % (fw, fo))
122 repo.ui.status(_("merging %s and %s\n") % (fw, fo))
46 else:
123 else:
47 repo.ui.status(_("merging %s\n") % fw)
124 repo.ui.status(_("merging %s\n") % fw)
48
49 repo.ui.debug(_("my %s other %s ancestor %s\n") % (fcm, fco, fca))
125 repo.ui.debug(_("my %s other %s ancestor %s\n") % (fcm, fco, fca))
50
126
51 cmd = (os.environ.get("HGMERGE") or repo.ui.config("ui", "merge")
127 # do we attempt to simplemerge first?
52 or "hgmerge")
128 if _toolbool(ui, tool, "premerge", not (binary or symlink)):
53 r = util.system('%s "%s" "%s" "%s"' % (cmd, a, b, c), cwd=repo.root,
129 r = simplemerge.simplemerge(a, b, c, quiet=True)
54 environ={'HG_FILE': fd,
130 if not r:
55 'HG_MY_NODE': str(wctx.parents()[0]),
131 ui.debug(_(" premerge successful\n"))
56 'HG_OTHER_NODE': str(mctx),
132 os.unlink(back)
57 'HG_MY_ISLINK': fcm.islink(),
133 os.unlink(b)
58 'HG_OTHER_ISLINK': fco.islink(),
134 os.unlink(c)
59 'HG_BASE_ISLINK': fca.islink(),})
135 return 0
136 util.copyfile(back, a) # restore from backup and try again
137
138 env = dict(HG_FILE=fd,
139 HG_MY_NODE=str(wctx.parents()[0]),
140 HG_OTHER_NODE=str(mctx),
141 HG_MY_ISLINK=fcm.islink(),
142 HG_OTHER_ISLINK=fco.islink(),
143 HG_BASE_ISLINK=fca.islink())
144
145 if tool == "internal:merge":
146 r = simplemerge.simplemerge(a, b, c, label=['local', 'other'])
147 else:
148 toolpath = _findtool(ui, tool)
149 args = _toolstr(ui, tool, "args", '$local $base $other')
150 if "$output" in args:
151 out, a = a, back # read input from backup, write to original
152 replace = dict(local=a, base=b, other=c, output=out)
153 args = re.sub("\$(local|base|other|output)",
154 lambda x: '"%s"' % replace[x.group()[1:]], args)
155 r = util.system(toolpath + ' ' + args, cwd=repo.root, environ=env)
156
157 if not r and _toolbool(ui, tool, "checkconflicts"):
158 if re.match("^(<<<<<<< .*|=======|>>>>>>> .*)$", fcm.data()):
159 r = 1
160
60 if r:
161 if r:
61 repo.ui.warn(_("merging %s failed!\n") % fd)
162 repo.ui.warn(_("merging %s failed!\n") % fd)
163 else:
164 os.unlink(back)
62
165
63 os.unlink(b)
166 os.unlink(b)
64 os.unlink(c)
167 os.unlink(c)
@@ -420,9 +420,7 b' DAEMON_PIDS = None'
420 HGRCPATH = None
420 HGRCPATH = None
421
421
422 os.environ["HGEDITOR"] = sys.executable + ' -c "import sys; sys.exit(0)"'
422 os.environ["HGEDITOR"] = sys.executable + ' -c "import sys; sys.exit(0)"'
423 os.environ["HGMERGE"] = ('python "%s" -L my -L other'
423 os.environ["HGMERGE"] = "internal:merge"
424 % os.path.join(TESTDIR, os.path.pardir,
425 'contrib', 'simplemerge'))
426 os.environ["HGUSER"] = "test"
424 os.environ["HGUSER"] = "test"
427 os.environ["HGENCODING"] = "ascii"
425 os.environ["HGENCODING"] = "ascii"
428 os.environ["HGENCODINGMODE"] = "strict"
426 os.environ["HGENCODINGMODE"] = "strict"
@@ -13,21 +13,26 b' A b'
13 % should fail
13 % should fail
14 a already tracked!
14 a already tracked!
15 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
15 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
16 merging a
16 warning: conflicts during merge.
17 warning: conflicts during merge.
17 merging a
18 merging a failed!
18 merging a failed!
19 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
19 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
20 There are unresolved merges, you can redo the full merge using:
20 There are unresolved merges, you can redo the full merge using:
21 hg update -C 2
21 hg update -C 2
22 hg merge 1
22 hg merge 1
23 M a
23 M a
24 ? a.orig
24 % should fail
25 % should fail
25 a already tracked!
26 a already tracked!
26 M a
27 M a
28 ? a.orig
27 % issue683
29 % issue683
28 R a
30 R a
31 ? a.orig
29 M a
32 M a
33 ? a.orig
30 c does not exist!
34 c does not exist!
31 d does not exist!
35 d does not exist!
32 M a
36 M a
33 A c
37 A c
38 ? a.orig
@@ -1,15 +1,16 b''
1 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
2 merging a
2 warning: conflicts during merge.
3 warning: conflicts during merge.
3 merging a
4 merging a failed!
4 merging a failed!
5 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
5 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
6 There are unresolved merges, you can redo the full merge using:
6 There are unresolved merges, you can redo the full merge using:
7 hg update -C 2
7 hg update -C 2
8 hg merge 1
8 hg merge 1
9 e7fe8eb3e180+0d24b7662d3e+ tip
9 e7fe8eb3e180+0d24b7662d3e+ tip
10 <<<<<<< my
10 <<<<<<< local
11 something else
11 something else
12 =======
12 =======
13 something
13 something
14 >>>>>>> other
14 >>>>>>> other
15 M a
15 M a
16 ? a.orig
@@ -260,8 +260,8 b' 1 files updated, 0 files merged, 2 files'
260 adding right-1
260 adding right-1
261 adding right-2
261 adding right-2
262 3 files updated, 0 files merged, 2 files removed, 0 files unresolved
262 3 files updated, 0 files merged, 2 files removed, 0 files unresolved
263 merging b
263 warning: conflicts during merge.
264 warning: conflicts during merge.
264 merging b
265 merging b failed!
265 merging b failed!
266 2 files updated, 0 files merged, 0 files removed, 1 files unresolved
266 2 files updated, 0 files merged, 0 files removed, 1 files unresolved
267 There are unresolved merges, you can redo the full merge using:
267 There are unresolved merges, you can redo the full merge using:
@@ -14,11 +14,15 b' resolving manifests'
14 a: remote moved to b -> m
14 a: remote moved to b -> m
15 copying a to b
15 copying a to b
16 copying a to c
16 copying a to c
17 picked tool 'internal:merge' for a (binary False symlink False)
17 merging a and b
18 merging a and b
18 my a@fb3948d97f07+ other b@40da226db0f0 ancestor a@583c7b748052
19 my a@fb3948d97f07+ other b@40da226db0f0 ancestor a@583c7b748052
20 premerge successful
19 removing a
21 removing a
22 picked tool 'internal:merge' for a (binary False symlink False)
20 merging a and c
23 merging a and c
21 my a@fb3948d97f07+ other c@40da226db0f0 ancestor a@583c7b748052
24 my a@fb3948d97f07+ other c@40da226db0f0 ancestor a@583c7b748052
25 premerge successful
22 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
26 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
23 (branch merge, don't forget to commit)
27 (branch merge, don't forget to commit)
24 -- b --
28 -- b --
@@ -10,10 +10,14 b' resolving manifests'
10 foo: versions differ -> m
10 foo: versions differ -> m
11 foo: remote copied to bar -> m
11 foo: remote copied to bar -> m
12 copying foo to bar
12 copying foo to bar
13 picked tool 'internal:merge' for foo (binary False symlink False)
13 merging foo and bar
14 merging foo and bar
14 my foo@2092631ce82b+ other bar@7731dad1c2b9 ancestor foo@310fd17130da
15 my foo@2092631ce82b+ other bar@7731dad1c2b9 ancestor foo@310fd17130da
16 premerge successful
17 picked tool 'internal:merge' for foo (binary False symlink False)
15 merging foo
18 merging foo
16 my foo@2092631ce82b+ other foo@7731dad1c2b9 ancestor foo@310fd17130da
19 my foo@2092631ce82b+ other foo@7731dad1c2b9 ancestor foo@310fd17130da
20 premerge successful
17 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
21 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
18 (branch merge, don't forget to commit)
22 (branch merge, don't forget to commit)
19 -- foo --
23 -- foo --
@@ -2,7 +2,6 b' Checking encoding (ascii)...'
2 Checking extensions...
2 Checking extensions...
3 Checking templates...
3 Checking templates...
4 Checking patch...
4 Checking patch...
5 Checking merge helper...
6 Checking commit editor...
5 Checking commit editor...
7 Checking username...
6 Checking username...
8 No problems detected
7 No problems detected
@@ -28,8 +28,10 b' resolving manifests'
28 1a -> 1 *
28 1a -> 1 *
29 checking for directory renames
29 checking for directory renames
30 1a: local moved to 1 -> m
30 1a: local moved to 1 -> m
31 picked tool 'internal:merge' for 1a (binary False symlink False)
31 merging 1a and 1
32 merging 1a and 1
32 my 1a@ac7575e3c052+ other 1@746e9549ea96 ancestor 1@81f4b099af3d
33 my 1a@ac7575e3c052+ other 1@746e9549ea96 ancestor 1@81f4b099af3d
34 premerge successful
33 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
35 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
34 (branch merge, don't forget to commit)
36 (branch merge, don't forget to commit)
35 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
37 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
@@ -44,8 +46,10 b' resolving manifests'
44 checking for directory renames
46 checking for directory renames
45 1: remote moved to 1a -> m
47 1: remote moved to 1a -> m
46 copying 1 to 1a
48 copying 1 to 1a
49 picked tool 'internal:merge' for 1 (binary False symlink False)
47 merging 1 and 1a
50 merging 1 and 1a
48 my 1@746e9549ea96+ other 1a@ac7575e3c052 ancestor 1@81f4b099af3d
51 my 1@746e9549ea96+ other 1a@ac7575e3c052 ancestor 1@81f4b099af3d
52 premerge successful
49 removing 1
53 removing 1
50 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
54 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
51 (branch merge, don't forget to commit)
55 (branch merge, don't forget to commit)
@@ -25,8 +25,10 b' resolving manifests'
25 ancestor 0a3ab4856510 local 2d2f9a22c82b+ remote 7d3b554bfdf1
25 ancestor 0a3ab4856510 local 2d2f9a22c82b+ remote 7d3b554bfdf1
26 searching for copies back to rev 1
26 searching for copies back to rev 1
27 bar: versions differ -> m
27 bar: versions differ -> m
28 picked tool 'internal:merge' for bar (binary False symlink False)
28 merging bar
29 merging bar
29 my bar@2d2f9a22c82b+ other bar@7d3b554bfdf1 ancestor bar@0a3ab4856510
30 my bar@2d2f9a22c82b+ other bar@7d3b554bfdf1 ancestor bar@0a3ab4856510
31 premerge successful
30 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
32 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
31 (branch merge, don't forget to commit)
33 (branch merge, don't forget to commit)
32 % contents of bar should be line1 line2
34 % contents of bar should be line1 line2
@@ -71,8 +73,10 b' resolving manifests'
71 ancestor 0a3ab4856510 local 2d2f9a22c82b+ remote 96ab80c60897
73 ancestor 0a3ab4856510 local 2d2f9a22c82b+ remote 96ab80c60897
72 searching for copies back to rev 1
74 searching for copies back to rev 1
73 bar: versions differ -> m
75 bar: versions differ -> m
76 picked tool 'internal:merge' for bar (binary False symlink False)
74 merging bar
77 merging bar
75 my bar@2d2f9a22c82b+ other bar@96ab80c60897 ancestor bar@0a3ab4856510
78 my bar@2d2f9a22c82b+ other bar@96ab80c60897 ancestor bar@0a3ab4856510
79 premerge successful
76 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
80 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
77 (branch merge, don't forget to commit)
81 (branch merge, don't forget to commit)
78 % contents of bar should be line1 line2
82 % contents of bar should be line1 line2
@@ -18,27 +18,28 b' M zzz1_merge_ok'
18 M zzz2_merge_bad
18 M zzz2_merge_bad
19 # local merge with bad merge tool
19 # local merge with bad merge tool
20 merging zzz1_merge_ok
20 merging zzz1_merge_ok
21 merging zzz1_merge_ok failed!
22 merging zzz2_merge_bad
21 merging zzz2_merge_bad
23 merging zzz2_merge_bad failed!
22 merging zzz2_merge_bad failed!
24 3 files updated, 0 files merged, 2 files removed, 2 files unresolved
23 3 files updated, 1 files merged, 2 files removed, 1 files unresolved
25 There are unresolved merges with locally modified files.
24 There are unresolved merges with locally modified files.
26 You can redo the full merge using:
25 You can finish the partial merge using:
27 hg update 0
26 hg update 0
28 hg update 1
27 hg update 1
29 2 files updated, 0 files merged, 3 files removed, 0 files unresolved
28 2 files updated, 0 files merged, 3 files removed, 0 files unresolved
30 --- a/zzz1_merge_ok
29 --- a/zzz1_merge_ok
31 +++ b/zzz1_merge_ok
30 +++ b/zzz1_merge_ok
31 +new first line
32 +new last line
32 +new last line
33 --- a/zzz2_merge_bad
33 --- a/zzz2_merge_bad
34 +++ b/zzz2_merge_bad
34 +++ b/zzz2_merge_bad
35 +another last line
35 +another last line
36 M zzz1_merge_ok
36 M zzz1_merge_ok
37 M zzz2_merge_bad
37 M zzz2_merge_bad
38 ? zzz2_merge_bad.orig
38 # local merge with conflicts
39 # local merge with conflicts
39 warning: conflicts during merge.
40 merging zzz1_merge_ok
40 merging zzz1_merge_ok
41 merging zzz2_merge_bad
41 merging zzz2_merge_bad
42 warning: conflicts during merge.
42 merging zzz2_merge_bad failed!
43 merging zzz2_merge_bad failed!
43 3 files updated, 1 files merged, 2 files removed, 1 files unresolved
44 3 files updated, 1 files merged, 2 files removed, 1 files unresolved
44 There are unresolved merges with locally modified files.
45 There are unresolved merges with locally modified files.
@@ -57,6 +58,7 b' 2 files updated, 0 files merged, 3 files'
57 +new last line
58 +new last line
58 M zzz1_merge_ok
59 M zzz1_merge_ok
59 M zzz2_merge_bad
60 M zzz2_merge_bad
61 ? zzz2_merge_bad.orig
60 # local merge without conflicts
62 # local merge without conflicts
61 merging zzz1_merge_ok
63 merging zzz1_merge_ok
62 4 files updated, 1 files merged, 2 files removed, 0 files unresolved
64 4 files updated, 1 files merged, 2 files removed, 0 files unresolved
@@ -9,8 +9,8 b' 9eca13a34789'
9 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
9 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
10 f248da0d4c3e tip
10 f248da0d4c3e tip
11 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
11 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
12 merging file1
12 warning: conflicts during merge.
13 warning: conflicts during merge.
13 merging file1
14 merging file1 failed!
14 merging file1 failed!
15 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
15 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
16 There are unresolved merges with locally modified files.
16 There are unresolved merges with locally modified files.
@@ -23,15 +23,19 b' diff -r f248da0d4c3e file1'
23 @@ -1,3 +1,7 @@
23 @@ -1,3 +1,7 @@
24 added file1
24 added file1
25 another line of text
25 another line of text
26 +<<<<<<< my
26 +<<<<<<< local
27 +changed file1 different
27 +changed file1 different
28 +=======
28 +=======
29 changed file1
29 changed file1
30 +>>>>>>> other
30 +>>>>>>> other
31 M file1
31 M file1
32 ? file1.orig
32 f248da0d4c3e+ tip
33 f248da0d4c3e+ tip
33 reverting file1
34 reverting file1
35 ? file1.orig
34 f248da0d4c3e tip
36 f248da0d4c3e tip
37 ? file1.orig
35 f248da0d4c3e tip
38 f248da0d4c3e tip
36 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
39 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
40 ? file1.orig
37 f248da0d4c3e tip
41 f248da0d4c3e tip
@@ -6,8 +6,8 b' adding manifests'
6 adding file changes
6 adding file changes
7 added 1 changesets with 1 changes to 1 files (+1 heads)
7 added 1 changesets with 1 changes to 1 files (+1 heads)
8 (run 'hg heads' to see heads, 'hg merge' to merge)
8 (run 'hg heads' to see heads, 'hg merge' to merge)
9 merging test.txt
9 warning: conflicts during merge.
10 warning: conflicts during merge.
10 merging test.txt
11 merging test.txt failed!
11 merging test.txt failed!
12 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
12 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
13 There are unresolved merges, you can redo the full merge using:
13 There are unresolved merges, you can redo the full merge using:
@@ -20,21 +20,22 b' adding manifests'
20 adding file changes
20 adding file changes
21 added 1 changesets with 1 changes to 1 files (+1 heads)
21 added 1 changesets with 1 changes to 1 files (+1 heads)
22 (run 'hg heads' to see heads, 'hg merge' to merge)
22 (run 'hg heads' to see heads, 'hg merge' to merge)
23 warning: conflicts during merge.
24 resolving manifests
23 resolving manifests
25 overwrite None partial False
24 overwrite None partial False
26 ancestor faaea63e63a9 local 451c744aabcc+ remote a070d41e8360
25 ancestor faaea63e63a9 local 451c744aabcc+ remote a070d41e8360
27 searching for copies back to rev 1
26 searching for copies back to rev 1
28 test.txt: versions differ -> m
27 test.txt: versions differ -> m
28 picked tool 'internal:merge' for test.txt (binary False symlink False)
29 merging test.txt
29 merging test.txt
30 my test.txt@451c744aabcc+ other test.txt@a070d41e8360 ancestor test.txt@faaea63e63a9
30 my test.txt@451c744aabcc+ other test.txt@a070d41e8360 ancestor test.txt@faaea63e63a9
31 warning: conflicts during merge.
31 merging test.txt failed!
32 merging test.txt failed!
32 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
33 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
33 There are unresolved merges, you can redo the full merge using:
34 There are unresolved merges, you can redo the full merge using:
34 hg update -C 3
35 hg update -C 3
35 hg merge 4
36 hg merge 4
36 one
37 one
37 <<<<<<< my
38 <<<<<<< local
38 two-point-five
39 two-point-five
39 =======
40 =======
40 two-point-one
41 two-point-one
@@ -5,8 +5,7 b' adding quux2'
5 merging bar
5 merging bar
6 merging bar failed!
6 merging bar failed!
7 merging foo and baz
7 merging foo and baz
8 merging baz failed!
8 1 files updated, 1 files merged, 0 files removed, 1 files unresolved
9 1 files updated, 0 files merged, 0 files removed, 2 files unresolved
10 There are unresolved merges, you can redo the full merge using:
9 There are unresolved merges, you can redo the full merge using:
11 hg update -C 2
10 hg update -C 2
12 hg merge 1
11 hg merge 1
@@ -14,8 +13,7 b' 3 files updated, 0 files merged, 1 files'
14 merging bar
13 merging bar
15 merging bar failed!
14 merging bar failed!
16 merging baz and foo
15 merging baz and foo
17 merging baz failed!
16 1 files updated, 1 files merged, 0 files removed, 1 files unresolved
18 1 files updated, 0 files merged, 0 files removed, 2 files unresolved
19 There are unresolved merges, you can redo the full merge using:
17 There are unresolved merges, you can redo the full merge using:
20 hg update -C 1
18 hg update -C 1
21 hg merge 2
19 hg merge 2
@@ -19,8 +19,10 b' resolving manifests'
19 a: remote moved to b -> m
19 a: remote moved to b -> m
20 b2: remote created -> g
20 b2: remote created -> g
21 copying a to b
21 copying a to b
22 picked tool 'internal:merge' for a (binary False symlink False)
22 merging a and b
23 merging a and b
23 my a@f26ec4fc3fa3+ other b@8e765a822af2 ancestor a@af1939970a1c
24 my a@f26ec4fc3fa3+ other b@8e765a822af2 ancestor a@af1939970a1c
25 premerge successful
24 removing a
26 removing a
25 warning: detected divergent renames of a2 to:
27 warning: detected divergent renames of a2 to:
26 c2
28 c2
@@ -13,8 +13,11 b' resolving manifests'
13 rev: versions differ -> m
13 rev: versions differ -> m
14 a: remote copied to b -> m
14 a: remote copied to b -> m
15 copying a to b
15 copying a to b
16 picked tool 'python ../merge' for a (binary False symlink False)
16 merging a and b
17 merging a and b
17 my a@e300d1c794ec+ other b@735846fee2d7 ancestor a@924404dff337
18 my a@e300d1c794ec+ other b@735846fee2d7 ancestor a@924404dff337
19 premerge successful
20 picked tool 'python ../merge' for rev (binary False symlink False)
18 merging rev
21 merging rev
19 my rev@e300d1c794ec+ other rev@735846fee2d7 ancestor rev@924404dff337
22 my rev@e300d1c794ec+ other rev@735846fee2d7 ancestor rev@924404dff337
20 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
23 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
@@ -41,8 +44,11 b' resolving manifests'
41 b: local copied to a -> m
44 b: local copied to a -> m
42 rev: versions differ -> m
45 rev: versions differ -> m
43 getting a
46 getting a
47 picked tool 'python ../merge' for b (binary False symlink False)
44 merging b and a
48 merging b and a
45 my b@ac809aeed39a+ other a@f4db7e329e71 ancestor a@924404dff337
49 my b@ac809aeed39a+ other a@f4db7e329e71 ancestor a@924404dff337
50 premerge successful
51 picked tool 'python ../merge' for rev (binary False symlink False)
46 merging rev
52 merging rev
47 my rev@ac809aeed39a+ other rev@f4db7e329e71 ancestor rev@924404dff337
53 my rev@ac809aeed39a+ other rev@f4db7e329e71 ancestor rev@924404dff337
48 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
54 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
@@ -68,9 +74,12 b' resolving manifests'
68 rev: versions differ -> m
74 rev: versions differ -> m
69 a: remote moved to b -> m
75 a: remote moved to b -> m
70 copying a to b
76 copying a to b
77 picked tool 'python ../merge' for a (binary False symlink False)
71 merging a and b
78 merging a and b
72 my a@e300d1c794ec+ other b@e03727d2d66b ancestor a@924404dff337
79 my a@e300d1c794ec+ other b@e03727d2d66b ancestor a@924404dff337
80 premerge successful
73 removing a
81 removing a
82 picked tool 'python ../merge' for rev (binary False symlink False)
74 merging rev
83 merging rev
75 my rev@e300d1c794ec+ other rev@e03727d2d66b ancestor rev@924404dff337
84 my rev@e300d1c794ec+ other rev@e03727d2d66b ancestor rev@924404dff337
76 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
85 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
@@ -94,8 +103,11 b' resolving manifests'
94 checking for directory renames
103 checking for directory renames
95 b: local moved to a -> m
104 b: local moved to a -> m
96 rev: versions differ -> m
105 rev: versions differ -> m
106 picked tool 'python ../merge' for b (binary False symlink False)
97 merging b and a
107 merging b and a
98 my b@ecf3cb2a4219+ other a@f4db7e329e71 ancestor a@924404dff337
108 my b@ecf3cb2a4219+ other a@f4db7e329e71 ancestor a@924404dff337
109 premerge successful
110 picked tool 'python ../merge' for rev (binary False symlink False)
99 merging rev
111 merging rev
100 my rev@ecf3cb2a4219+ other rev@f4db7e329e71 ancestor rev@924404dff337
112 my rev@ecf3cb2a4219+ other rev@f4db7e329e71 ancestor rev@924404dff337
101 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
113 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
@@ -120,6 +132,7 b' resolving manifests'
120 rev: versions differ -> m
132 rev: versions differ -> m
121 b: remote created -> g
133 b: remote created -> g
122 getting b
134 getting b
135 picked tool 'python ../merge' for rev (binary False symlink False)
123 merging rev
136 merging rev
124 my rev@94b33a1b7f2d+ other rev@735846fee2d7 ancestor rev@924404dff337
137 my rev@94b33a1b7f2d+ other rev@735846fee2d7 ancestor rev@924404dff337
125 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
138 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
@@ -142,6 +155,7 b' resolving manifests'
142 b -> a
155 b -> a
143 checking for directory renames
156 checking for directory renames
144 rev: versions differ -> m
157 rev: versions differ -> m
158 picked tool 'python ../merge' for rev (binary False symlink False)
145 merging rev
159 merging rev
146 my rev@ac809aeed39a+ other rev@97c705ade336 ancestor rev@924404dff337
160 my rev@ac809aeed39a+ other rev@97c705ade336 ancestor rev@924404dff337
147 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
161 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
@@ -168,6 +182,7 b' resolving manifests'
168 b: remote created -> g
182 b: remote created -> g
169 removing a
183 removing a
170 getting b
184 getting b
185 picked tool 'python ../merge' for rev (binary False symlink False)
171 merging rev
186 merging rev
172 my rev@94b33a1b7f2d+ other rev@e03727d2d66b ancestor rev@924404dff337
187 my rev@94b33a1b7f2d+ other rev@e03727d2d66b ancestor rev@924404dff337
173 1 files updated, 1 files merged, 1 files removed, 0 files unresolved
188 1 files updated, 1 files merged, 1 files removed, 0 files unresolved
@@ -189,6 +204,7 b' resolving manifests'
189 b -> a
204 b -> a
190 checking for directory renames
205 checking for directory renames
191 rev: versions differ -> m
206 rev: versions differ -> m
207 picked tool 'python ../merge' for rev (binary False symlink False)
192 merging rev
208 merging rev
193 my rev@ecf3cb2a4219+ other rev@97c705ade336 ancestor rev@924404dff337
209 my rev@ecf3cb2a4219+ other rev@97c705ade336 ancestor rev@924404dff337
194 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
210 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
@@ -206,8 +222,10 b' resolving manifests'
206 searching for copies back to rev 1
222 searching for copies back to rev 1
207 b: versions differ -> m
223 b: versions differ -> m
208 rev: versions differ -> m
224 rev: versions differ -> m
225 picked tool 'python ../merge' for b (binary False symlink False)
209 merging b
226 merging b
210 my b@ec03c2ca8642+ other b@79cc6877a3b7 ancestor a@924404dff337
227 my b@ec03c2ca8642+ other b@79cc6877a3b7 ancestor a@924404dff337
228 picked tool 'python ../merge' for rev (binary False symlink False)
211 merging rev
229 merging rev
212 my rev@ec03c2ca8642+ other rev@79cc6877a3b7 ancestor rev@924404dff337
230 my rev@ec03c2ca8642+ other rev@79cc6877a3b7 ancestor rev@924404dff337
213 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
231 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
@@ -238,6 +256,7 b' warning: detected divergent renames of a'
238 b
256 b
239 c
257 c
240 getting c
258 getting c
259 picked tool 'python ../merge' for rev (binary False symlink False)
241 merging rev
260 merging rev
242 my rev@ecf3cb2a4219+ other rev@e6abcc1a30c2 ancestor rev@924404dff337
261 my rev@ecf3cb2a4219+ other rev@e6abcc1a30c2 ancestor rev@924404dff337
243 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
262 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
@@ -256,8 +275,10 b' resolving manifests'
256 searching for copies back to rev 1
275 searching for copies back to rev 1
257 b: versions differ -> m
276 b: versions differ -> m
258 rev: versions differ -> m
277 rev: versions differ -> m
278 picked tool 'python ../merge' for b (binary False symlink False)
259 merging b
279 merging b
260 my b@ac809aeed39a+ other b@af30c7647fc7 ancestor b@000000000000
280 my b@ac809aeed39a+ other b@af30c7647fc7 ancestor b@000000000000
281 picked tool 'python ../merge' for rev (binary False symlink False)
261 merging rev
282 merging rev
262 my rev@ac809aeed39a+ other rev@af30c7647fc7 ancestor rev@924404dff337
283 my rev@ac809aeed39a+ other rev@af30c7647fc7 ancestor rev@924404dff337
263 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
284 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
@@ -278,8 +299,10 b' resolving manifests'
278 b: versions differ -> m
299 b: versions differ -> m
279 rev: versions differ -> m
300 rev: versions differ -> m
280 removing a
301 removing a
302 picked tool 'python ../merge' for b (binary False symlink False)
281 merging b
303 merging b
282 my b@59318016310c+ other b@e03727d2d66b ancestor b@000000000000
304 my b@59318016310c+ other b@e03727d2d66b ancestor b@000000000000
305 picked tool 'python ../merge' for rev (binary False symlink False)
283 merging rev
306 merging rev
284 my rev@59318016310c+ other rev@e03727d2d66b ancestor rev@924404dff337
307 my rev@59318016310c+ other rev@e03727d2d66b ancestor rev@924404dff337
285 0 files updated, 2 files merged, 1 files removed, 0 files unresolved
308 0 files updated, 2 files merged, 1 files removed, 0 files unresolved
@@ -299,8 +322,10 b' resolving manifests'
299 b: versions differ -> m
322 b: versions differ -> m
300 rev: versions differ -> m
323 rev: versions differ -> m
301 getting a
324 getting a
325 picked tool 'python ../merge' for b (binary False symlink False)
302 merging b
326 merging b
303 my b@ac809aeed39a+ other b@8dbce441892a ancestor b@000000000000
327 my b@ac809aeed39a+ other b@8dbce441892a ancestor b@000000000000
328 picked tool 'python ../merge' for rev (binary False symlink False)
304 merging rev
329 merging rev
305 my rev@ac809aeed39a+ other rev@8dbce441892a ancestor rev@924404dff337
330 my rev@ac809aeed39a+ other rev@8dbce441892a ancestor rev@924404dff337
306 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
331 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
@@ -321,8 +346,10 b' resolving manifests'
321 b: versions differ -> m
346 b: versions differ -> m
322 rev: versions differ -> m
347 rev: versions differ -> m
323 removing a
348 removing a
349 picked tool 'python ../merge' for b (binary False symlink False)
324 merging b
350 merging b
325 my b@59318016310c+ other b@e03727d2d66b ancestor b@000000000000
351 my b@59318016310c+ other b@e03727d2d66b ancestor b@000000000000
352 picked tool 'python ../merge' for rev (binary False symlink False)
326 merging rev
353 merging rev
327 my rev@59318016310c+ other rev@e03727d2d66b ancestor rev@924404dff337
354 my rev@59318016310c+ other rev@e03727d2d66b ancestor rev@924404dff337
328 0 files updated, 2 files merged, 1 files removed, 0 files unresolved
355 0 files updated, 2 files merged, 1 files removed, 0 files unresolved
@@ -342,8 +369,10 b' resolving manifests'
342 b: versions differ -> m
369 b: versions differ -> m
343 rev: versions differ -> m
370 rev: versions differ -> m
344 getting a
371 getting a
372 picked tool 'python ../merge' for b (binary False symlink False)
345 merging b
373 merging b
346 my b@ac809aeed39a+ other b@8dbce441892a ancestor b@000000000000
374 my b@ac809aeed39a+ other b@8dbce441892a ancestor b@000000000000
375 picked tool 'python ../merge' for rev (binary False symlink False)
347 merging rev
376 merging rev
348 my rev@ac809aeed39a+ other rev@8dbce441892a ancestor rev@924404dff337
377 my rev@ac809aeed39a+ other rev@8dbce441892a ancestor rev@924404dff337
349 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
378 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
@@ -362,8 +391,10 b' resolving manifests'
362 searching for copies back to rev 1
391 searching for copies back to rev 1
363 b: versions differ -> m
392 b: versions differ -> m
364 rev: versions differ -> m
393 rev: versions differ -> m
394 picked tool 'python ../merge' for b (binary False symlink False)
365 merging b
395 merging b
366 my b@0b76e65c8289+ other b@735846fee2d7 ancestor b@000000000000
396 my b@0b76e65c8289+ other b@735846fee2d7 ancestor b@000000000000
397 picked tool 'python ../merge' for rev (binary False symlink False)
367 merging rev
398 merging rev
368 my rev@0b76e65c8289+ other rev@735846fee2d7 ancestor rev@924404dff337
399 my rev@0b76e65c8289+ other rev@735846fee2d7 ancestor rev@924404dff337
369 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
400 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
@@ -384,8 +415,10 b' resolving manifests'
384 rev: versions differ -> m
415 rev: versions differ -> m
385 a: prompt recreating -> g
416 a: prompt recreating -> g
386 getting a
417 getting a
418 picked tool 'python ../merge' for b (binary False symlink False)
387 merging b
419 merging b
388 my b@ecf3cb2a4219+ other b@8dbce441892a ancestor b@000000000000
420 my b@ecf3cb2a4219+ other b@8dbce441892a ancestor b@000000000000
421 picked tool 'python ../merge' for rev (binary False symlink False)
389 merging rev
422 merging rev
390 my rev@ecf3cb2a4219+ other rev@8dbce441892a ancestor rev@924404dff337
423 my rev@ecf3cb2a4219+ other rev@8dbce441892a ancestor rev@924404dff337
391 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
424 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
@@ -404,8 +437,10 b' resolving manifests'
404 searching for copies back to rev 1
437 searching for copies back to rev 1
405 b: versions differ -> m
438 b: versions differ -> m
406 rev: versions differ -> m
439 rev: versions differ -> m
440 picked tool 'python ../merge' for b (binary False symlink False)
407 merging b
441 merging b
408 my b@0b76e65c8289+ other b@e03727d2d66b ancestor b@000000000000
442 my b@0b76e65c8289+ other b@e03727d2d66b ancestor b@000000000000
443 picked tool 'python ../merge' for rev (binary False symlink False)
409 merging rev
444 merging rev
410 my rev@0b76e65c8289+ other rev@e03727d2d66b ancestor rev@924404dff337
445 my rev@0b76e65c8289+ other rev@e03727d2d66b ancestor rev@924404dff337
411 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
446 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
@@ -430,9 +465,11 b' resolving manifests'
430 rev: versions differ -> m
465 rev: versions differ -> m
431 a: remote moved to b -> m
466 a: remote moved to b -> m
432 copying a to b
467 copying a to b
468 picked tool 'python ../merge' for a (binary False symlink False)
433 merging a and b
469 merging a and b
434 my a@e300d1c794ec+ other b@79cc6877a3b7 ancestor a@924404dff337
470 my a@e300d1c794ec+ other b@79cc6877a3b7 ancestor a@924404dff337
435 removing a
471 removing a
472 picked tool 'python ../merge' for rev (binary False symlink False)
436 merging rev
473 merging rev
437 my rev@e300d1c794ec+ other rev@79cc6877a3b7 ancestor rev@924404dff337
474 my rev@e300d1c794ec+ other rev@79cc6877a3b7 ancestor rev@924404dff337
438 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
475 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
@@ -456,8 +493,10 b' resolving manifests'
456 checking for directory renames
493 checking for directory renames
457 b: local moved to a -> m
494 b: local moved to a -> m
458 rev: versions differ -> m
495 rev: versions differ -> m
496 picked tool 'python ../merge' for b (binary False symlink False)
459 merging b and a
497 merging b and a
460 my b@ec03c2ca8642+ other a@f4db7e329e71 ancestor a@924404dff337
498 my b@ec03c2ca8642+ other a@f4db7e329e71 ancestor a@924404dff337
499 picked tool 'python ../merge' for rev (binary False symlink False)
461 merging rev
500 merging rev
462 my rev@ec03c2ca8642+ other rev@f4db7e329e71 ancestor rev@924404dff337
501 my rev@ec03c2ca8642+ other rev@f4db7e329e71 ancestor rev@924404dff337
463 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
502 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
@@ -484,9 +523,12 b' resolving manifests'
484 b: local moved to a -> m
523 b: local moved to a -> m
485 rev: versions differ -> m
524 rev: versions differ -> m
486 c: remote created -> g
525 c: remote created -> g
526 picked tool 'python ../merge' for b (binary False symlink False)
487 merging b and a
527 merging b and a
488 my b@ecf3cb2a4219+ other a@2b958612230f ancestor a@924404dff337
528 my b@ecf3cb2a4219+ other a@2b958612230f ancestor a@924404dff337
529 premerge successful
489 getting c
530 getting c
531 picked tool 'python ../merge' for rev (binary False symlink False)
490 merging rev
532 merging rev
491 my rev@ecf3cb2a4219+ other rev@2b958612230f ancestor rev@924404dff337
533 my rev@ecf3cb2a4219+ other rev@2b958612230f ancestor rev@924404dff337
492 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
534 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
@@ -22,6 +22,7 b' resolving manifests'
22 b
22 b
23 a: versions differ -> m
23 a: versions differ -> m
24 b: remote created -> g
24 b: remote created -> g
25 picked tool 'true' for a (binary False symlink False)
25 merging a
26 merging a
26 my a@33aaa84a386b+ other a@802f095af299 ancestor a@33aaa84a386b
27 my a@33aaa84a386b+ other a@802f095af299 ancestor a@33aaa84a386b
27 getting b
28 getting b
@@ -58,6 +59,7 b' resolving manifests'
58 b
59 b
59 a: versions differ -> m
60 a: versions differ -> m
60 b: remote created -> g
61 b: remote created -> g
62 picked tool 'true' for a (binary False symlink False)
61 merging a
63 merging a
62 my a@33aaa84a386b+ other a@802f095af299 ancestor a@33aaa84a386b
64 my a@33aaa84a386b+ other a@802f095af299 ancestor a@33aaa84a386b
63 getting b
65 getting b
@@ -109,8 +111,10 b' resolving manifests'
109 searching for copies back to rev 1
111 searching for copies back to rev 1
110 a: versions differ -> m
112 a: versions differ -> m
111 b: versions differ -> m
113 b: versions differ -> m
114 picked tool 'true' for a (binary False symlink False)
112 merging a
115 merging a
113 my a@802f095af299+ other a@030602aee63d ancestor a@33aaa84a386b
116 my a@802f095af299+ other a@030602aee63d ancestor a@33aaa84a386b
117 picked tool 'true' for b (binary False symlink False)
114 merging b
118 merging b
115 my b@802f095af299+ other b@030602aee63d ancestor b@000000000000
119 my b@802f095af299+ other b@030602aee63d ancestor b@000000000000
116 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
120 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
General Comments 0
You need to be logged in to leave comments. Login now