[PATCH 7 of 9] export: port _exportsingle() to formatter
Gregory Szorc
gregory.szorc at gmail.com
Thu Apr 12 12:51:53 EDT 2018
On Thu, Apr 12, 2018 at 9:17 AM, Yuya Nishihara <yuya at tcha.org> wrote:
> # HG changeset patch
> # User Yuya Nishihara <yuya at tcha.org>
> # Date 1523540383 -32400
> # Thu Apr 12 22:39:43 2018 +0900
> # Node ID 6041c9cdcee8f25328016f1727055d1bc1677054
> # Parent 724b281e9d9b9ebd91d5ab12482f93a25efb1259
> export: port _exportsingle() to formatter
>
> Pass 'fm' instead of 'write', and use fm.plain(), fm.write(), etc. instead.
> The callers will be updated later.
>
> diff --git a/mercurial/cmdutil.py b/mercurial/cmdutil.py
> --- a/mercurial/cmdutil.py
> +++ b/mercurial/cmdutil.py
> @@ -1522,7 +1522,7 @@ extraexport = []
> # it is given two arguments (sequencenumber, changectx)
> extraexportmap = {}
>
> -def _exportsingle(repo, ctx, match, switch_parent, seqno, write,
> diffopts):
> +def _exportsingle(repo, ctx, fm, match, switch_parent, seqno, diffopts):
> node = scmutil.binnode(ctx)
> parents = [p.node() for p in ctx.parents() if p]
> branch = ctx.branch()
> @@ -1534,42 +1534,53 @@ def _exportsingle(repo, ctx, match, swit
> else:
> prev = nullid
>
> - write("# HG changeset patch\n")
> - write("# User %s\n" % ctx.user())
> - write("# Date %d %d\n" % ctx.date())
> - write("# %s\n" % dateutil.datestr(ctx.date()))
> - if branch and branch != 'default':
> - write("# Branch %s\n" % branch)
> - write("# Node ID %s\n" % hex(node))
> - write("# Parent %s\n" % hex(prev))
> + fm.context(ctx=ctx)
> + fm.plain('# HG changeset patch\n')
> + fm.write('user', '# User %s\n', ctx.user())
> + fm.plain('# Date %d %d\n' % ctx.date())
> + fm.write('date', '# %s\n', fm.formatdate(ctx.date()))
> + fm.condwrite(branch and branch != 'default',
> + 'branch', '# Branch %s\n', branch)
> + fm.write('node', '# Node ID %s\n', hex(node))
> + fm.plain('# Parent %s\n' % hex(prev))
> if len(parents) > 1:
> - write("# Parent %s\n" % hex(parents[1]))
> -
> + fm.plain('# Parent %s\n' % hex(parents[1]))
> + fm.data(parents=fm.formatlist(pycompat.maplist(hex, parents),
> name='node'))
> +
> + # TODO: redesign extraexportmap function to support formatter
> for headerid in extraexport:
> header = extraexportmap[headerid](seqno, ctx)
> if header is not None:
> - write('# %s\n' % header)
> - write(ctx.description().rstrip())
> - write("\n\n")
> -
> - for chunk, label in patch.diffui(repo, prev, node, match,
> opts=diffopts):
> - write(chunk, label=label)
> + fm.plain('# %s\n' % header)
> +
> + fm.write('desc', '%s\n', ctx.description().rstrip())
> + fm.plain('\n')
> +
> + if fm.isplain():
> + chunkiter = patch.diffui(repo, prev, node, match, opts=diffopts)
> + for chunk, label in chunkiter:
> + fm.plain(chunk, label=label)
> + else:
> + chunkiter = patch.diff(repo, prev, node, match, opts=diffopts)
> + # TODO: make it structured?
> + fm.data(diff=b''.join(chunkiter))
>
A concern I have is that we'll want to keep the door open for writing the
diff chunks in a structured manner. That would seemingly require a
different key for the templater. But I think "diff" is fine as the key that
means "a textual diff format recognized by most patch tools." We can
introduce a "diffparts" (or similar) and make "diff" lazily evaluate as
follow-ups, when needed.
>
> def _exportfile(repo, revs, fp, switch_parent, diffopts, match):
> """Export changesets to stdout or a single file"""
> dest = '<unnamed>'
> if fp:
> dest = getattr(fp, 'name', dest)
> - def write(s, **kw):
> - fp.write(s)
> + fm = formatter.formatter(repo.ui, fp, 'export', {})
> else:
> - write = repo.ui.write
> + fm = repo.ui.formatter('export', {})
>
> for seqno, rev in enumerate(revs, 1):
> ctx = repo[rev]
> if not dest.startswith('<'):
> repo.ui.note("%s\n" % dest)
> - _exportsingle(repo, ctx, match, switch_parent, seqno, write,
> diffopts)
> + fm.startitem()
> + _exportsingle(repo, ctx, fm, match, switch_parent, seqno,
> diffopts)
> + fm.end()
>
> def _exportfntemplate(repo, revs, fntemplate, switch_parent, diffopts,
> match):
> """Export changesets to possibly multiple files"""
> @@ -1584,13 +1595,12 @@ def _exportfntemplate(repo, revs, fntemp
> filemap.setdefault(dest, []).append((seqno, rev))
>
> for dest in filemap:
> - with open(dest, 'wb') as fo:
> + with formatter.openformatter(repo.ui, dest, 'export', {}) as fm:
> repo.ui.note("%s\n" % dest)
> - def write(s, **kw):
> - fo.write(s)
> for seqno, rev in filemap[dest]:
> + fm.startitem()
> ctx = repo[rev]
> - _exportsingle(repo, ctx, match, switch_parent, seqno,
> write,
> + _exportsingle(repo, ctx, fm, match, switch_parent, seqno,
> diffopts)
>
> def export(repo, revs, fntemplate='hg-%h.patch', fp=None,
> switch_parent=False,
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at mercurial-scm.org
> https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.mercurial-scm.org/pipermail/mercurial-devel/attachments/20180412/f97ff1aa/attachment.html>
More information about the Mercurial-devel
mailing list