Mercurial > public > mercurial-scm > hg-stable
comparison mercurial/cmdutil.py @ 37601:2e0e61312a25
export: serialize revisions to be exported per destination file
Prepares for porting to the formatter API, where we can't simply append
to existing files because JSON can't be streamed for example.
The modemap hack is removed since cmdutil.export() was the only user.
I also made the destination filename printed only once.
author | Yuya Nishihara <yuya@tcha.org> |
---|---|
date | Thu, 12 Apr 2018 22:08:55 +0900 |
parents | 7800ed2e4980 |
children | 52670eaa14b4 |
comparison
equal
deleted
inserted
replaced
37600:7800ed2e4980 | 37601:2e0e61312a25 |
---|---|
1012 return self | 1012 return self |
1013 | 1013 |
1014 def __exit__(self, exc_type, exc_value, exc_tb): | 1014 def __exit__(self, exc_type, exc_value, exc_tb): |
1015 pass | 1015 pass |
1016 | 1016 |
1017 def makefileobj(ctx, pat, mode='wb', modemap=None, **props): | 1017 def makefileobj(ctx, pat, mode='wb', **props): |
1018 writable = mode not in ('r', 'rb') | 1018 writable = mode not in ('r', 'rb') |
1019 | 1019 |
1020 if isstdiofilename(pat): | 1020 if isstdiofilename(pat): |
1021 repo = ctx.repo() | 1021 repo = ctx.repo() |
1022 if writable: | 1022 if writable: |
1023 fp = repo.ui.fout | 1023 fp = repo.ui.fout |
1024 else: | 1024 else: |
1025 fp = repo.ui.fin | 1025 fp = repo.ui.fin |
1026 return _unclosablefile(fp) | 1026 return _unclosablefile(fp) |
1027 fn = makefilename(ctx, pat, **props) | 1027 fn = makefilename(ctx, pat, **props) |
1028 if modemap is not None: | |
1029 mode = modemap.get(fn, mode) | |
1030 if mode == 'wb': | |
1031 modemap[fn] = 'ab' | |
1032 return open(fn, mode) | 1028 return open(fn, mode) |
1033 | 1029 |
1034 def openrevlog(repo, cmd, file_, opts): | 1030 def openrevlog(repo, cmd, file_, opts): |
1035 """opens the changelog, manifest, a filelog or a given revlog""" | 1031 """opens the changelog, manifest, a filelog or a given revlog""" |
1036 cl = opts['changelog'] | 1032 cl = opts['changelog'] |
1577 | 1573 |
1578 def _exportfntemplate(repo, revs, fntemplate, switch_parent, diffopts, match): | 1574 def _exportfntemplate(repo, revs, fntemplate, switch_parent, diffopts, match): |
1579 """Export changesets to possibly multiple files""" | 1575 """Export changesets to possibly multiple files""" |
1580 total = len(revs) | 1576 total = len(revs) |
1581 revwidth = max(len(str(rev)) for rev in revs) | 1577 revwidth = max(len(str(rev)) for rev in revs) |
1582 filemode = {} | 1578 filemap = util.sortdict() # filename: [(seqno, rev), ...] |
1583 | 1579 |
1584 for seqno, rev in enumerate(revs, 1): | 1580 for seqno, rev in enumerate(revs, 1): |
1585 ctx = repo[rev] | 1581 ctx = repo[rev] |
1586 fo = makefileobj(ctx, fntemplate, mode='wb', modemap=filemode, | 1582 dest = makefilename(ctx, fntemplate, |
1587 total=total, seqno=seqno, revwidth=revwidth) | 1583 total=total, seqno=seqno, revwidth=revwidth) |
1588 dest = fo.name | 1584 filemap.setdefault(dest, []).append((seqno, rev)) |
1589 def write(s, **kw): | 1585 |
1590 fo.write(s) | 1586 for dest in filemap: |
1591 repo.ui.note("%s\n" % dest) | 1587 with open(dest, 'wb') as fo: |
1592 _exportsingle(repo, ctx, match, switch_parent, seqno, write, diffopts) | 1588 repo.ui.note("%s\n" % dest) |
1593 fo.close() | 1589 def write(s, **kw): |
1590 fo.write(s) | |
1591 for seqno, rev in filemap[dest]: | |
1592 ctx = repo[rev] | |
1593 _exportsingle(repo, ctx, match, switch_parent, seqno, write, | |
1594 diffopts) | |
1594 | 1595 |
1595 def export(repo, revs, fntemplate='hg-%h.patch', fp=None, switch_parent=False, | 1596 def export(repo, revs, fntemplate='hg-%h.patch', fp=None, switch_parent=False, |
1596 opts=None, match=None): | 1597 opts=None, match=None): |
1597 '''export changesets as hg patches | 1598 '''export changesets as hg patches |
1598 | 1599 |