comparison mercurial/filemerge.py @ 16126:0c4bec9596d8

filemerge: create detail of internal merge tools from documentation string this patch introduces 'internaltoolsmarker' which creates detail of each internal merge tools from documentation string for 'hg help merge-tools'.
author FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
date Sun, 12 Feb 2012 21:38:12 +0900
parents 83925d3a4559
children 14dc2bbba6d2
comparison
equal deleted inserted replaced
16125:83925d3a4559 16126:0c4bec9596d8
17 return ui.configbool("merge-tools", tool + "." + part, default) 17 return ui.configbool("merge-tools", tool + "." + part, default)
18 18
19 def _toollist(ui, tool, part, default=[]): 19 def _toollist(ui, tool, part, default=[]):
20 return ui.configlist("merge-tools", tool + "." + part, default) 20 return ui.configlist("merge-tools", tool + "." + part, default)
21 21
22 _internal = {} 22 internals = {}
23 23
24 def internaltool(name, trymerge, onfailure=None): 24 def internaltool(name, trymerge, onfailure=None):
25 '''return a decorator for populating internal merge tool table''' 25 '''return a decorator for populating internal merge tool table'''
26 def decorator(func): 26 def decorator(func):
27 _internal[name] = func 27 internals[name] = func
28 func.trymerge = trymerge 28 func.trymerge = trymerge
29 func.onfailure = onfailure 29 func.onfailure = onfailure
30 return func 30 return func
31 return decorator 31 return decorator
32 32
33 def _findtool(ui, tool): 33 def _findtool(ui, tool):
34 if tool in _internal: 34 if tool in internals:
35 return tool 35 return tool
36 for kn in ("regkey", "regkeyalt"): 36 for kn in ("regkey", "regkeyalt"):
37 k = _toolstr(ui, tool, kn) 37 k = _toolstr(ui, tool, kn)
38 if not k: 38 if not k:
39 continue 39 continue
131 if newdata != data: 131 if newdata != data:
132 util.writefile(file, newdata) 132 util.writefile(file, newdata)
133 133
134 @internaltool('internal:prompt', False) 134 @internaltool('internal:prompt', False)
135 def _iprompt(repo, mynode, orig, fcd, fco, fca, toolconf): 135 def _iprompt(repo, mynode, orig, fcd, fco, fca, toolconf):
136 """``internal:prompt``
137 Asks the user which of the local or the other version to keep as
138 the merged version."""
136 ui = repo.ui 139 ui = repo.ui
137 fd = fcd.path() 140 fd = fcd.path()
138 141
139 if ui.promptchoice(_(" no tool found to merge %s\n" 142 if ui.promptchoice(_(" no tool found to merge %s\n"
140 "keep (l)ocal or take (o)ther?") % fd, 143 "keep (l)ocal or take (o)ther?") % fd,
143 else: 146 else:
144 return _ilocal(repo, mynode, orig, fcd, fco, fca, toolconf) 147 return _ilocal(repo, mynode, orig, fcd, fco, fca, toolconf)
145 148
146 @internaltool('internal:local', False) 149 @internaltool('internal:local', False)
147 def _ilocal(repo, mynode, orig, fcd, fco, fca, toolconf): 150 def _ilocal(repo, mynode, orig, fcd, fco, fca, toolconf):
151 """``internal:local``
152 Uses the local version of files as the merged version."""
148 return 0 153 return 0
149 154
150 @internaltool('internal:other', False) 155 @internaltool('internal:other', False)
151 def _iother(repo, mynode, orig, fcd, fco, fca, toolconf): 156 def _iother(repo, mynode, orig, fcd, fco, fca, toolconf):
157 """``internal:other``
158 Uses the other version of files as the merged version."""
152 repo.wwrite(fcd.path(), fco.data(), fco.flags()) 159 repo.wwrite(fcd.path(), fco.data(), fco.flags())
153 return 0 160 return 0
154 161
155 @internaltool('internal:fail', False) 162 @internaltool('internal:fail', False)
156 def _ifail(repo, mynode, orig, fcd, fco, fca, toolconf): 163 def _ifail(repo, mynode, orig, fcd, fco, fca, toolconf):
164 """``internal:fail``
165 Rather than attempting to merge files that were modified on both
166 branches, it marks them as unresolved. The resolve command must be
167 used to resolve these conflicts."""
157 return 1 168 return 1
158 169
159 def _premerge(repo, toolconf, files): 170 def _premerge(repo, toolconf, files):
160 tool, toolpath, binary, symlink = toolconf 171 tool, toolpath, binary, symlink = toolconf
161 a, b, c, back = files 172 a, b, c, back = files
185 196
186 @internaltool('internal:merge', True, 197 @internaltool('internal:merge', True,
187 _("merging %s incomplete! " 198 _("merging %s incomplete! "
188 "(edit conflicts, then use 'hg resolve --mark')\n")) 199 "(edit conflicts, then use 'hg resolve --mark')\n"))
189 def _imerge(repo, mynode, orig, fcd, fco, fca, toolconf, files): 200 def _imerge(repo, mynode, orig, fcd, fco, fca, toolconf, files):
201 """``internal:merge``
202 Uses the internal non-interactive simple merge algorithm for merging
203 files. It will fail if there are any conflicts and leave markers in
204 the partially merged file."""
190 r = _premerge(repo, toolconf, files) 205 r = _premerge(repo, toolconf, files)
191 if r: 206 if r:
192 a, b, c, back = files 207 a, b, c, back = files
193 208
194 ui = repo.ui 209 ui = repo.ui
197 return True, r 212 return True, r
198 return False, 0 213 return False, 0
199 214
200 @internaltool('internal:dump', True) 215 @internaltool('internal:dump', True)
201 def _idump(repo, mynode, orig, fcd, fco, fca, toolconf, files): 216 def _idump(repo, mynode, orig, fcd, fco, fca, toolconf, files):
217 """``internal:dump``
218 Creates three versions of the files to merge, containing the
219 contents of local, other and base. These files can then be used to
220 perform a merge manually. If the file to be merged is named
221 ``a.txt``, these files will accordingly be named ``a.txt.local``,
222 ``a.txt.other`` and ``a.txt.base`` and they will be placed in the
223 same directory as ``a.txt``."""
202 r = _premerge(repo, toolconf, files) 224 r = _premerge(repo, toolconf, files)
203 if r: 225 if r:
204 a, b, c, back = files 226 a, b, c, back = files
205 227
206 fd = fcd.path() 228 fd = fcd.path()
265 symlink = 'l' in fcd.flags() + fco.flags() 287 symlink = 'l' in fcd.flags() + fco.flags()
266 tool, toolpath = _picktool(repo, ui, fd, binary, symlink) 288 tool, toolpath = _picktool(repo, ui, fd, binary, symlink)
267 ui.debug("picked tool '%s' for %s (binary %s symlink %s)\n" % 289 ui.debug("picked tool '%s' for %s (binary %s symlink %s)\n" %
268 (tool, fd, binary, symlink)) 290 (tool, fd, binary, symlink))
269 291
270 if tool in _internal: 292 if tool in internals:
271 func = _internal[tool] 293 func = internals[tool]
272 trymerge = func.trymerge 294 trymerge = func.trymerge
273 onfailure = func.onfailure 295 onfailure = func.onfailure
274 else: 296 else:
275 func = _xmerge 297 func = _xmerge
276 trymerge = True 298 trymerge = True
338 os.unlink(back) 360 os.unlink(back)
339 361
340 os.unlink(b) 362 os.unlink(b)
341 os.unlink(c) 363 os.unlink(c)
342 return r 364 return r
365
366 # tell hggettext to extract docstrings from these functions:
367 i18nfunctions = internals.values()