comparison mercurial/cmdutil.py @ 37604:daafaff4e5be

export: enable formatter support (API) This change is basically the same as "hg cat". A formatter object is created by caller. .. api:: ``cmdutil.export()`` takes a formatter as an argument.
author Yuya Nishihara <yuya@tcha.org>
date Thu, 12 Apr 2018 23:13:55 +0900
parents 678d760c71ff
children fd1dd79cff20
comparison
equal deleted inserted replaced
37603:678d760c71ff 37604:daafaff4e5be
1563 else: 1563 else:
1564 chunkiter = patch.diff(repo, prev, node, match, opts=diffopts) 1564 chunkiter = patch.diff(repo, prev, node, match, opts=diffopts)
1565 # TODO: make it structured? 1565 # TODO: make it structured?
1566 fm.data(diff=b''.join(chunkiter)) 1566 fm.data(diff=b''.join(chunkiter))
1567 1567
1568 def _exportfile(repo, revs, fp, switch_parent, diffopts, match): 1568 def _exportfile(repo, revs, fm, dest, switch_parent, diffopts, match):
1569 """Export changesets to stdout or a single file""" 1569 """Export changesets to stdout or a single file"""
1570 dest = '<unnamed>'
1571 if fp:
1572 dest = getattr(fp, 'name', dest)
1573 fm = formatter.formatter(repo.ui, fp, 'export', {})
1574 else:
1575 fm = repo.ui.formatter('export', {})
1576
1577 for seqno, rev in enumerate(revs, 1): 1570 for seqno, rev in enumerate(revs, 1):
1578 ctx = repo[rev] 1571 ctx = repo[rev]
1579 if not dest.startswith('<'): 1572 if not dest.startswith('<'):
1580 repo.ui.note("%s\n" % dest) 1573 repo.ui.note("%s\n" % dest)
1581 fm.startitem() 1574 fm.startitem()
1582 _exportsingle(repo, ctx, fm, match, switch_parent, seqno, diffopts) 1575 _exportsingle(repo, ctx, fm, match, switch_parent, seqno, diffopts)
1583 fm.end() 1576
1584 1577 def _exportfntemplate(repo, revs, basefm, fntemplate, switch_parent, diffopts,
1585 def _exportfntemplate(repo, revs, fntemplate, switch_parent, diffopts, match): 1578 match):
1586 """Export changesets to possibly multiple files""" 1579 """Export changesets to possibly multiple files"""
1587 total = len(revs) 1580 total = len(revs)
1588 revwidth = max(len(str(rev)) for rev in revs) 1581 revwidth = max(len(str(rev)) for rev in revs)
1589 filemap = util.sortdict() # filename: [(seqno, rev), ...] 1582 filemap = util.sortdict() # filename: [(seqno, rev), ...]
1590 1583
1593 dest = makefilename(ctx, fntemplate, 1586 dest = makefilename(ctx, fntemplate,
1594 total=total, seqno=seqno, revwidth=revwidth) 1587 total=total, seqno=seqno, revwidth=revwidth)
1595 filemap.setdefault(dest, []).append((seqno, rev)) 1588 filemap.setdefault(dest, []).append((seqno, rev))
1596 1589
1597 for dest in filemap: 1590 for dest in filemap:
1598 with formatter.openformatter(repo.ui, dest, 'export', {}) as fm: 1591 with formatter.maybereopen(basefm, dest) as fm:
1599 repo.ui.note("%s\n" % dest) 1592 repo.ui.note("%s\n" % dest)
1600 for seqno, rev in filemap[dest]: 1593 for seqno, rev in filemap[dest]:
1601 fm.startitem() 1594 fm.startitem()
1602 ctx = repo[rev] 1595 ctx = repo[rev]
1603 _exportsingle(repo, ctx, fm, match, switch_parent, seqno, 1596 _exportsingle(repo, ctx, fm, match, switch_parent, seqno,
1604 diffopts) 1597 diffopts)
1605 1598
1606 def export(repo, revs, fntemplate='hg-%h.patch', switch_parent=False, 1599 def export(repo, revs, basefm, fntemplate='hg-%h.patch', switch_parent=False,
1607 opts=None, match=None): 1600 opts=None, match=None):
1608 '''export changesets as hg patches 1601 '''export changesets as hg patches
1609 1602
1610 Args: 1603 Args:
1611 repo: The repository from which we're exporting revisions. 1604 repo: The repository from which we're exporting revisions.
1612 revs: A list of revisions to export as revision numbers. 1605 revs: A list of revisions to export as revision numbers.
1606 basefm: A formatter to which patches should be written.
1613 fntemplate: An optional string to use for generating patch file names. 1607 fntemplate: An optional string to use for generating patch file names.
1614 switch_parent: If True, show diffs against second parent when not nullid. 1608 switch_parent: If True, show diffs against second parent when not nullid.
1615 Default is false, which always shows diff against p1. 1609 Default is false, which always shows diff against p1.
1616 opts: diff options to use for generating the patch. 1610 opts: diff options to use for generating the patch.
1617 match: If specified, only export changes to files matching this matcher. 1611 match: If specified, only export changes to files matching this matcher.
1622 Side Effect: 1616 Side Effect:
1623 "HG Changeset Patch" data is emitted to one of the following 1617 "HG Changeset Patch" data is emitted to one of the following
1624 destinations: 1618 destinations:
1625 fntemplate specified: Each rev is written to a unique file named using 1619 fntemplate specified: Each rev is written to a unique file named using
1626 the given template. 1620 the given template.
1627 Otherwise: All revs written to repo.ui.write() 1621 Otherwise: All revs will be written to basefm.
1628 ''' 1622 '''
1629 if not fntemplate: 1623 if not fntemplate:
1630 _exportfile(repo, revs, None, switch_parent, opts, match) 1624 _exportfile(repo, revs, basefm, '<unnamed>', switch_parent, opts, match)
1631 else: 1625 else:
1632 _exportfntemplate(repo, revs, fntemplate, switch_parent, opts, match) 1626 _exportfntemplate(repo, revs, basefm, fntemplate, switch_parent, opts,
1627 match)
1633 1628
1634 def exportfile(repo, revs, fp, switch_parent=False, opts=None, match=None): 1629 def exportfile(repo, revs, fp, switch_parent=False, opts=None, match=None):
1635 """Export changesets to the given file stream""" 1630 """Export changesets to the given file stream"""
1636 _exportfile(repo, revs, fp, switch_parent, opts, match) 1631 dest = getattr(fp, 'name', '<unnamed>')
1632 with formatter.formatter(repo.ui, fp, 'export', {}) as fm:
1633 _exportfile(repo, revs, fm, dest, switch_parent, opts, match)
1637 1634
1638 def showmarker(fm, marker, index=None): 1635 def showmarker(fm, marker, index=None):
1639 """utility function to display obsolescence marker in a readable way 1636 """utility function to display obsolescence marker in a readable way
1640 1637
1641 To be used by debug function.""" 1638 To be used by debug function."""