comparison mercurial/cmdutil.py @ 37602:52670eaa14b4

export: port _exportsingle() to formatter Pass 'fm' instead of 'write', and use fm.plain(), fm.write(), etc. instead. The callers will be updated later.
author Yuya Nishihara <yuya@tcha.org>
date Thu, 12 Apr 2018 22:39:43 +0900
parents 2e0e61312a25
children 678d760c71ff
comparison
equal deleted inserted replaced
37601:2e0e61312a25 37602:52670eaa14b4
1520 # mapping from identifier to actual export function 1520 # mapping from identifier to actual export function
1521 # function as to return a string to be added to the header or None 1521 # function as to return a string to be added to the header or None
1522 # it is given two arguments (sequencenumber, changectx) 1522 # it is given two arguments (sequencenumber, changectx)
1523 extraexportmap = {} 1523 extraexportmap = {}
1524 1524
1525 def _exportsingle(repo, ctx, match, switch_parent, seqno, write, diffopts): 1525 def _exportsingle(repo, ctx, fm, match, switch_parent, seqno, diffopts):
1526 node = scmutil.binnode(ctx) 1526 node = scmutil.binnode(ctx)
1527 parents = [p.node() for p in ctx.parents() if p] 1527 parents = [p.node() for p in ctx.parents() if p]
1528 branch = ctx.branch() 1528 branch = ctx.branch()
1529 if switch_parent: 1529 if switch_parent:
1530 parents.reverse() 1530 parents.reverse()
1532 if parents: 1532 if parents:
1533 prev = parents[0] 1533 prev = parents[0]
1534 else: 1534 else:
1535 prev = nullid 1535 prev = nullid
1536 1536
1537 write("# HG changeset patch\n") 1537 fm.context(ctx=ctx)
1538 write("# User %s\n" % ctx.user()) 1538 fm.plain('# HG changeset patch\n')
1539 write("# Date %d %d\n" % ctx.date()) 1539 fm.write('user', '# User %s\n', ctx.user())
1540 write("# %s\n" % dateutil.datestr(ctx.date())) 1540 fm.plain('# Date %d %d\n' % ctx.date())
1541 if branch and branch != 'default': 1541 fm.write('date', '# %s\n', fm.formatdate(ctx.date()))
1542 write("# Branch %s\n" % branch) 1542 fm.condwrite(branch and branch != 'default',
1543 write("# Node ID %s\n" % hex(node)) 1543 'branch', '# Branch %s\n', branch)
1544 write("# Parent %s\n" % hex(prev)) 1544 fm.write('node', '# Node ID %s\n', hex(node))
1545 fm.plain('# Parent %s\n' % hex(prev))
1545 if len(parents) > 1: 1546 if len(parents) > 1:
1546 write("# Parent %s\n" % hex(parents[1])) 1547 fm.plain('# Parent %s\n' % hex(parents[1]))
1547 1548 fm.data(parents=fm.formatlist(pycompat.maplist(hex, parents), name='node'))
1549
1550 # TODO: redesign extraexportmap function to support formatter
1548 for headerid in extraexport: 1551 for headerid in extraexport:
1549 header = extraexportmap[headerid](seqno, ctx) 1552 header = extraexportmap[headerid](seqno, ctx)
1550 if header is not None: 1553 if header is not None:
1551 write('# %s\n' % header) 1554 fm.plain('# %s\n' % header)
1552 write(ctx.description().rstrip()) 1555
1553 write("\n\n") 1556 fm.write('desc', '%s\n', ctx.description().rstrip())
1554 1557 fm.plain('\n')
1555 for chunk, label in patch.diffui(repo, prev, node, match, opts=diffopts): 1558
1556 write(chunk, label=label) 1559 if fm.isplain():
1560 chunkiter = patch.diffui(repo, prev, node, match, opts=diffopts)
1561 for chunk, label in chunkiter:
1562 fm.plain(chunk, label=label)
1563 else:
1564 chunkiter = patch.diff(repo, prev, node, match, opts=diffopts)
1565 # TODO: make it structured?
1566 fm.data(diff=b''.join(chunkiter))
1557 1567
1558 def _exportfile(repo, revs, fp, switch_parent, diffopts, match): 1568 def _exportfile(repo, revs, fp, switch_parent, diffopts, match):
1559 """Export changesets to stdout or a single file""" 1569 """Export changesets to stdout or a single file"""
1560 dest = '<unnamed>' 1570 dest = '<unnamed>'
1561 if fp: 1571 if fp:
1562 dest = getattr(fp, 'name', dest) 1572 dest = getattr(fp, 'name', dest)
1563 def write(s, **kw): 1573 fm = formatter.formatter(repo.ui, fp, 'export', {})
1564 fp.write(s)
1565 else: 1574 else:
1566 write = repo.ui.write 1575 fm = repo.ui.formatter('export', {})
1567 1576
1568 for seqno, rev in enumerate(revs, 1): 1577 for seqno, rev in enumerate(revs, 1):
1569 ctx = repo[rev] 1578 ctx = repo[rev]
1570 if not dest.startswith('<'): 1579 if not dest.startswith('<'):
1571 repo.ui.note("%s\n" % dest) 1580 repo.ui.note("%s\n" % dest)
1572 _exportsingle(repo, ctx, match, switch_parent, seqno, write, diffopts) 1581 fm.startitem()
1582 _exportsingle(repo, ctx, fm, match, switch_parent, seqno, diffopts)
1583 fm.end()
1573 1584
1574 def _exportfntemplate(repo, revs, fntemplate, switch_parent, diffopts, match): 1585 def _exportfntemplate(repo, revs, fntemplate, switch_parent, diffopts, match):
1575 """Export changesets to possibly multiple files""" 1586 """Export changesets to possibly multiple files"""
1576 total = len(revs) 1587 total = len(revs)
1577 revwidth = max(len(str(rev)) for rev in revs) 1588 revwidth = max(len(str(rev)) for rev in revs)
1582 dest = makefilename(ctx, fntemplate, 1593 dest = makefilename(ctx, fntemplate,
1583 total=total, seqno=seqno, revwidth=revwidth) 1594 total=total, seqno=seqno, revwidth=revwidth)
1584 filemap.setdefault(dest, []).append((seqno, rev)) 1595 filemap.setdefault(dest, []).append((seqno, rev))
1585 1596
1586 for dest in filemap: 1597 for dest in filemap:
1587 with open(dest, 'wb') as fo: 1598 with formatter.openformatter(repo.ui, dest, 'export', {}) as fm:
1588 repo.ui.note("%s\n" % dest) 1599 repo.ui.note("%s\n" % dest)
1589 def write(s, **kw):
1590 fo.write(s)
1591 for seqno, rev in filemap[dest]: 1600 for seqno, rev in filemap[dest]:
1601 fm.startitem()
1592 ctx = repo[rev] 1602 ctx = repo[rev]
1593 _exportsingle(repo, ctx, match, switch_parent, seqno, write, 1603 _exportsingle(repo, ctx, fm, match, switch_parent, seqno,
1594 diffopts) 1604 diffopts)
1595 1605
1596 def export(repo, revs, fntemplate='hg-%h.patch', fp=None, switch_parent=False, 1606 def export(repo, revs, fntemplate='hg-%h.patch', fp=None, switch_parent=False,
1597 opts=None, match=None): 1607 opts=None, match=None):
1598 '''export changesets as hg patches 1608 '''export changesets as hg patches