##// END OF EJS Templates
filemerge: move decorator definition for internal merge tools to registrar...
FUJIWARA Katsunori -
r33663:50c44dee default
parent child Browse files
Show More
@@ -250,6 +250,7 b' def loadall(ui, whitelist=None):'
250 from . import (
250 from . import (
251 color,
251 color,
252 commands,
252 commands,
253 filemerge,
253 fileset,
254 fileset,
254 revset,
255 revset,
255 templatefilters,
256 templatefilters,
@@ -268,6 +269,7 b' def loadall(ui, whitelist=None):'
268 ('colortable', color, 'loadcolortable'),
269 ('colortable', color, 'loadcolortable'),
269 ('configtable', configitems, 'loadconfigtable'),
270 ('configtable', configitems, 'loadconfigtable'),
270 ('filesetpredicate', fileset, 'loadpredicate'),
271 ('filesetpredicate', fileset, 'loadpredicate'),
272 ('internalmerge', filemerge, 'loadinternalmerge'),
271 ('revsetpredicate', revset, 'loadpredicate'),
273 ('revsetpredicate', revset, 'loadpredicate'),
272 ('templatefilter', templatefilters, 'loadfilter'),
274 ('templatefilter', templatefilters, 'loadfilter'),
273 ('templatefunc', templater, 'loadfunction'),
275 ('templatefunc', templater, 'loadfunction'),
@@ -21,6 +21,7 b' from . import ('
21 formatter,
21 formatter,
22 match,
22 match,
23 pycompat,
23 pycompat,
24 registrar,
24 scmutil,
25 scmutil,
25 simplemerge,
26 simplemerge,
26 tagmerge,
27 tagmerge,
@@ -44,10 +45,12 b' internals = {}'
44 # Merge tools to document.
45 # Merge tools to document.
45 internalsdoc = {}
46 internalsdoc = {}
46
47
48 internaltool = registrar.internalmerge()
49
47 # internal tool merge types
50 # internal tool merge types
48 nomerge = None
51 nomerge = internaltool.nomerge
49 mergeonly = 'mergeonly' # just the full merge, no premerge
52 mergeonly = internaltool.mergeonly # just the full merge, no premerge
50 fullmerge = 'fullmerge' # both premerge and merge
53 fullmerge = internaltool.fullmerge # both premerge and merge
51
54
52 _localchangedotherdeletedmsg = _(
55 _localchangedotherdeletedmsg = _(
53 "local%(l)s changed %(fd)s which other%(o)s deleted\n"
56 "local%(l)s changed %(fd)s which other%(o)s deleted\n"
@@ -104,21 +107,6 b' class absentfilectx(object):'
104 def isabsent(self):
107 def isabsent(self):
105 return True
108 return True
106
109
107 def internaltool(name, mergetype, onfailure=None, precheck=None):
108 '''return a decorator for populating internal merge tool table'''
109 def decorator(func):
110 fullname = ':' + name
111 func.__doc__ = (pycompat.sysstr("``%s``\n" % fullname)
112 + func.__doc__.strip())
113 internals[fullname] = func
114 internals['internal:' + name] = func
115 internalsdoc[fullname] = func
116 func.mergetype = mergetype
117 func.onfailure = onfailure
118 func.precheck = precheck
119 return func
120 return decorator
121
122 def _findtool(ui, tool):
110 def _findtool(ui, tool):
123 if tool in internals:
111 if tool in internals:
124 return tool
112 return tool
@@ -743,5 +731,17 b' def premerge(repo, mynode, orig, fcd, fc'
743 def filemerge(repo, mynode, orig, fcd, fco, fca, labels=None):
731 def filemerge(repo, mynode, orig, fcd, fco, fca, labels=None):
744 return _filemerge(False, repo, mynode, orig, fcd, fco, fca, labels=labels)
732 return _filemerge(False, repo, mynode, orig, fcd, fco, fca, labels=labels)
745
733
734 def loadinternalmerge(ui, extname, registrarobj):
735 """Load internal merge tool from specified registrarobj
736 """
737 for name, func in registrarobj._table.iteritems():
738 fullname = ':' + name
739 internals[fullname] = func
740 internals['internal:' + name] = func
741 internalsdoc[fullname] = func
742
743 # load built-in merge tools explicitly to setup internalsdoc
744 loadinternalmerge(None, None, internaltool)
745
746 # tell hggettext to extract docstrings from these functions:
746 # tell hggettext to extract docstrings from these functions:
747 i18nfunctions = internals.values()
747 i18nfunctions = internals.values()
@@ -308,3 +308,64 b' class templatefunc(_templateregistrarbas'
308
308
309 def _extrasetup(self, name, func, argspec=None):
309 def _extrasetup(self, name, func, argspec=None):
310 func._argspec = argspec
310 func._argspec = argspec
311
312 class internalmerge(_funcregistrarbase):
313 """Decorator to register in-process merge tool
314
315 Usage::
316
317 internalmerge = registrar.internalmerge()
318
319 @internalmerge('mymerge', internalmerge.mergeonly,
320 onfailure=None, precheck=None):
321 def mymergefunc(repo, mynode, orig, fcd, fco, fca,
322 toolconf, files, labels=None):
323 '''Explanation of this internal merge tool ....
324 '''
325 return 1, False # means "conflicted", "no deletion needed"
326
327 The first string argument is used to compose actual merge tool name,
328 ":name" and "internal:name" (the latter is historical one).
329
330 The second argument is one of merge types below:
331
332 ========== ======== ======== =========
333 merge type precheck premerge fullmerge
334 ========== ======== ======== =========
335 nomerge x x x
336 mergeonly o x o
337 fullmerge o o o
338 ========== ======== ======== =========
339
340 Optional argument 'onfalure' is the format of warning message
341 to be used at failure of merging (target filename is specified
342 at formatting). Or, None or so, if warning message should be
343 suppressed.
344
345 Optional argument 'precheck' is the function to be used
346 before actual invocation of internal merge tool itself.
347 It takes as same arguments as internal merge tool does, other than
348 'files' and 'labels'. If it returns false value, merging is aborted
349 immediately (and file is marked as "unresolved").
350
351 'internalmerge' instance in example above can be used to
352 decorate multiple functions.
353
354 Decorated functions are registered automatically at loading
355 extension, if an instance named as 'internalmerge' is used for
356 decorating in extension.
357
358 Otherwise, explicit 'filemerge.loadinternalmerge()' is needed.
359 """
360 _docformat = "``:%s``\n %s"
361
362 # merge type definitions:
363 nomerge = None
364 mergeonly = 'mergeonly' # just the full merge, no premerge
365 fullmerge = 'fullmerge' # both premerge and merge
366
367 def _extrasetup(self, name, func, mergetype,
368 onfailure=None, precheck=None):
369 func.mergetype = mergetype
370 func.onfailure = onfailure
371 func.precheck = precheck
General Comments 0
You need to be logged in to leave comments. Login now