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 = |
|
52 | mergeonly = internaltool.mergeonly # just the full merge, no premerge | |
50 |
fullmerge = |
|
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