246 if rev in seen: |
246 if rev in seen: |
247 continue |
247 continue |
248 seen[rev] = 1 |
248 seen[rev] = 1 |
249 yield str(rev) |
249 yield str(rev) |
250 |
250 |
251 def make_filename(repo, r, pat, node=None, |
251 def make_filename(repo, pat, node, |
252 total=None, seqno=None, revwidth=None, pathname=None): |
252 total=None, seqno=None, revwidth=None, pathname=None): |
253 node_expander = { |
253 node_expander = { |
254 'H': lambda: hex(node), |
254 'H': lambda: hex(node), |
255 'R': lambda: str(r.rev(node)), |
255 'R': lambda: str(repo.changelog.rev(node)), |
256 'h': lambda: short(node), |
256 'h': lambda: short(node), |
257 } |
257 } |
258 expander = { |
258 expander = { |
259 '%': lambda: '%', |
259 '%': lambda: '%', |
260 'b': lambda: os.path.basename(repo.root), |
260 'b': lambda: os.path.basename(repo.root), |
290 return ''.join(newname) |
290 return ''.join(newname) |
291 except KeyError, inst: |
291 except KeyError, inst: |
292 raise util.Abort(_("invalid format spec '%%%s' in output file name"), |
292 raise util.Abort(_("invalid format spec '%%%s' in output file name"), |
293 inst.args[0]) |
293 inst.args[0]) |
294 |
294 |
295 def make_file(repo, r, pat, node=None, |
295 def make_file(repo, pat, node=None, |
296 total=None, seqno=None, revwidth=None, mode='wb', pathname=None): |
296 total=None, seqno=None, revwidth=None, mode='wb', pathname=None): |
297 if not pat or pat == '-': |
297 if not pat or pat == '-': |
298 return 'w' in mode and sys.stdout or sys.stdin |
298 return 'w' in mode and sys.stdout or sys.stdin |
299 if hasattr(pat, 'write') and 'w' in mode: |
299 if hasattr(pat, 'write') and 'w' in mode: |
300 return pat |
300 return pat |
301 if hasattr(pat, 'read') and 'r' in mode: |
301 if hasattr(pat, 'read') and 'r' in mode: |
302 return pat |
302 return pat |
303 return open(make_filename(repo, r, pat, node, total, seqno, revwidth, |
303 return open(make_filename(repo, pat, node, total, seqno, revwidth, |
304 pathname), |
304 pathname), |
305 mode) |
305 mode) |
306 |
306 |
307 def write_bundle(cg, filename=None, compress=True): |
307 def write_bundle(cg, filename=None, compress=True): |
308 """Write a bundle file and return its filename. |
308 """Write a bundle file and return its filename. |
777 node, p2 = repo.dirstate.parents() |
777 node, p2 = repo.dirstate.parents() |
778 if p2 != nullid: |
778 if p2 != nullid: |
779 raise util.Abort(_('uncommitted merge - please provide a ' |
779 raise util.Abort(_('uncommitted merge - please provide a ' |
780 'specific revision')) |
780 'specific revision')) |
781 |
781 |
782 dest = make_filename(repo, repo.changelog, dest, node) |
782 dest = make_filename(repo, dest, node) |
783 if os.path.realpath(dest) == repo.root: |
783 if os.path.realpath(dest) == repo.root: |
784 raise util.Abort(_('repository root cannot be destination')) |
784 raise util.Abort(_('repository root cannot be destination')) |
785 dummy, matchfn, dummy = matchpats(repo, [], opts) |
785 dummy, matchfn, dummy = matchpats(repo, [], opts) |
786 kind = opts.get('type') or 'files' |
786 kind = opts.get('type') or 'files' |
787 prefix = opts['prefix'] |
787 prefix = opts['prefix'] |
788 if dest == '-': |
788 if dest == '-': |
789 if kind == 'files': |
789 if kind == 'files': |
790 raise util.Abort(_('cannot archive plain files to stdout')) |
790 raise util.Abort(_('cannot archive plain files to stdout')) |
791 dest = sys.stdout |
791 dest = sys.stdout |
792 if not prefix: prefix = os.path.basename(repo.root) + '-%h' |
792 if not prefix: prefix = os.path.basename(repo.root) + '-%h' |
793 prefix = make_filename(repo, repo.changelog, prefix, node) |
793 prefix = make_filename(repo, prefix, node) |
794 archival.archive(repo, dest, node, kind, not opts['no_decode'], |
794 archival.archive(repo, dest, node, kind, not opts['no_decode'], |
795 matchfn, prefix) |
795 matchfn, prefix) |
796 |
796 |
797 def backout(ui, repo, rev, **opts): |
797 def backout(ui, repo, rev, **opts): |
798 '''reverse effect of earlier changeset |
798 '''reverse effect of earlier changeset |
889 change = repo.changelog.read(node) |
889 change = repo.changelog.read(node) |
890 mf = repo.manifest.read(change[0]) |
890 mf = repo.manifest.read(change[0]) |
891 for src, abs, rel, exact in walk(repo, (file1,) + pats, opts, node): |
891 for src, abs, rel, exact in walk(repo, (file1,) + pats, opts, node): |
892 r = repo.file(abs) |
892 r = repo.file(abs) |
893 n = mf[abs] |
893 n = mf[abs] |
894 fp = make_file(repo, r, opts['output'], node=n, pathname=abs) |
894 fp = make_file(repo, opts['output'], node, pathname=abs) |
895 fp.write(r.read(n)) |
895 fp.write(r.read(n)) |
896 |
896 |
897 def clone(ui, source, dest=None, **opts): |
897 def clone(ui, source, dest=None, **opts): |
898 """make a copy of an existing repository |
898 """make a copy of an existing repository |
899 |
899 |
1441 if opts['switch_parent']: |
1441 if opts['switch_parent']: |
1442 parents.reverse() |
1442 parents.reverse() |
1443 prev = (parents and parents[0]) or nullid |
1443 prev = (parents and parents[0]) or nullid |
1444 change = repo.changelog.read(node) |
1444 change = repo.changelog.read(node) |
1445 |
1445 |
1446 fp = make_file(repo, repo.changelog, opts['output'], |
1446 fp = make_file(repo, opts['output'], node, total=total, seqno=seqno, |
1447 node=node, total=total, seqno=seqno, |
|
1448 revwidth=revwidth) |
1447 revwidth=revwidth) |
1449 if fp != sys.stdout: |
1448 if fp != sys.stdout: |
1450 ui.note("%s\n" % fp.name) |
1449 ui.note("%s\n" % fp.name) |
1451 |
1450 |
1452 fp.write("# HG changeset patch\n") |
1451 fp.write("# HG changeset patch\n") |