Mercurial > public > mercurial-scm > hg-stable
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.""" |