mirror of
https://github.com/facebook/sapling.git
synced 2024-10-09 16:31:02 +03:00
d6ce43b965
In worst case, generating diff in upgrade mode can be two times more expensive than generating it in git mode directly: we may have to regenerate the whole diff again whenever a git feature is detected. Also, the first diff attempt is completely buffered instead of being streamed. That said, even without having profiled it yet, I am convinced we can fast-path the upgrade mode if necessary were it to be used in regular diff commands, and not only in mq where avoiding data loss is worth the price.
47 lines
1.3 KiB
Python
47 lines
1.3 KiB
Python
# Extension dedicated to test patch.diff() upgrade modes
|
|
#
|
|
#
|
|
from mercurial import cmdutil, patch, util
|
|
|
|
def autodiff(ui, repo, *pats, **opts):
|
|
diffopts = patch.diffopts(ui, opts)
|
|
git = opts.get('git', 'no')
|
|
brokenfiles = set()
|
|
losedatafn = None
|
|
if git in ('yes', 'no'):
|
|
diffopts.git = git == 'yes'
|
|
diffopts.upgrade = False
|
|
elif git == 'auto':
|
|
diffopts.git = False
|
|
diffopts.upgrade = True
|
|
elif git == 'warn':
|
|
diffopts.git = False
|
|
diffopts.upgrade = True
|
|
def losedatafn(fn=None, **kwargs):
|
|
brokenfiles.add(fn)
|
|
return True
|
|
elif git == 'abort':
|
|
diffopts.git = False
|
|
diffopts.upgrade = True
|
|
def losedatafn(fn=None, **kwargs):
|
|
raise util.Abort('losing data for %s' % fn)
|
|
else:
|
|
raise util.Abort('--git must be yes, no or auto')
|
|
|
|
node1, node2 = cmdutil.revpair(repo, [])
|
|
m = cmdutil.match(repo, pats, opts)
|
|
it = patch.diff(repo, node1, node2, match=m, opts=diffopts,
|
|
losedatafn=losedatafn)
|
|
for chunk in it:
|
|
ui.write(chunk)
|
|
for fn in sorted(brokenfiles):
|
|
ui.write('data lost for: %s\n' % fn)
|
|
|
|
cmdtable = {
|
|
"autodiff":
|
|
(autodiff,
|
|
[('', 'git', '', 'git upgrade mode (yes/no/auto/warn/abort)'),
|
|
],
|
|
'[OPTION]... [FILE]...'),
|
|
}
|