Mercurial > public > mercurial-scm > hg-stable
diff tests/autodiff.py @ 10189:e451e599fbcf
patch: support diff data loss detection and upgrade
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.
author | Patrick Mezard <pmezard@gmail.com> |
---|---|
date | Fri, 01 Jan 2010 20:54:05 +0100 |
parents | |
children | b33f3e35efb0 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/autodiff.py Fri Jan 01 20:54:05 2010 +0100 @@ -0,0 +1,46 @@ +# 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]...'), +}