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. |
739 def getnode(rev): |
739 def getnode(rev): |
740 return short(repo.changelog.node(rev)) |
740 return short(repo.changelog.node(rev)) |
741 |
741 |
742 ucache = {} |
742 ucache = {} |
743 def getname(rev): |
743 def getname(rev): |
744 cl = repo.changelog.read(repo.changelog.node(rev)) |
744 try: |
745 return trimuser(ui, cl[1], rev, ucache) |
745 return ucache[rev] |
|
746 except: |
|
747 u = trimuser(ui, repo.changectx(rev).user(), rev, ucache) |
|
748 ucache[rev] = u |
|
749 return u |
746 |
750 |
747 dcache = {} |
751 dcache = {} |
748 def getdate(rev): |
752 def getdate(rev): |
749 datestr = dcache.get(rev) |
753 datestr = dcache.get(rev) |
750 if datestr is None: |
754 if datestr is None: |
751 cl = repo.changelog.read(repo.changelog.node(rev)) |
755 datestr = dcache[rev] = util.datestr(repo.changectx(rev).date()) |
752 datestr = dcache[rev] = util.datestr(cl[2]) |
|
753 return datestr |
756 return datestr |
754 |
757 |
755 if not pats: |
758 if not pats: |
756 raise util.Abort(_('at least one file name or pattern required')) |
759 raise util.Abort(_('at least one file name or pattern required')) |
757 |
760 |
758 opmap = [['user', getname], ['number', str], ['changeset', getnode], |
761 opmap = [['user', getname], ['number', str], ['changeset', getnode], |
759 ['date', getdate]] |
762 ['date', getdate]] |
760 if not opts['user'] and not opts['changeset'] and not opts['date']: |
763 if not opts['user'] and not opts['changeset'] and not opts['date']: |
761 opts['number'] = 1 |
764 opts['number'] = 1 |
762 |
765 |
763 if opts['rev']: |
766 ctx = repo.changectx(opts['rev'] or repo.dirstate.parents()[0]) |
764 node = repo.changelog.lookup(opts['rev']) |
|
765 else: |
|
766 node = repo.dirstate.parents()[0] |
|
767 change = repo.changelog.read(node) |
|
768 mmap = repo.manifest.read(change[0]) |
|
769 |
767 |
770 for src, abs, rel, exact in walk(repo, pats, opts, node=node): |
768 for src, abs, rel, exact in walk(repo, pats, opts, node=node): |
771 f = repo.file(abs) |
769 fctx = ctx.filectx(abs) |
772 if not opts['text'] and util.binary(f.read(mmap[abs])): |
770 if not opts['text'] and util.binary(fctx.data()): |
773 ui.write(_("%s: binary file\n") % ((pats and rel) or abs)) |
771 ui.write(_("%s: binary file\n") % ((pats and rel) or abs)) |
774 continue |
772 continue |
775 |
773 |
776 lines = f.annotate(mmap[abs]) |
774 lines = fctx.annotate() |
777 pieces = [] |
775 pieces = [] |
778 |
776 |
779 for o, f in opmap: |
777 for o, f in opmap: |
780 if opts[o]: |
778 if opts[o]: |
781 l = [f(n) for n, dummy in lines] |
779 l = [f(n) for n, dummy in lines] |
817 node, p2 = repo.dirstate.parents() |
815 node, p2 = repo.dirstate.parents() |
818 if p2 != nullid: |
816 if p2 != nullid: |
819 raise util.Abort(_('uncommitted merge - please provide a ' |
817 raise util.Abort(_('uncommitted merge - please provide a ' |
820 'specific revision')) |
818 'specific revision')) |
821 |
819 |
822 dest = make_filename(repo, repo.changelog, dest, node) |
820 dest = make_filename(repo, dest, node) |
823 if os.path.realpath(dest) == repo.root: |
821 if os.path.realpath(dest) == repo.root: |
824 raise util.Abort(_('repository root cannot be destination')) |
822 raise util.Abort(_('repository root cannot be destination')) |
825 dummy, matchfn, dummy = matchpats(repo, [], opts) |
823 dummy, matchfn, dummy = matchpats(repo, [], opts) |
826 kind = opts.get('type') or 'files' |
824 kind = opts.get('type') or 'files' |
827 prefix = opts['prefix'] |
825 prefix = opts['prefix'] |
828 if dest == '-': |
826 if dest == '-': |
829 if kind == 'files': |
827 if kind == 'files': |
830 raise util.Abort(_('cannot archive plain files to stdout')) |
828 raise util.Abort(_('cannot archive plain files to stdout')) |
831 dest = sys.stdout |
829 dest = sys.stdout |
832 if not prefix: prefix = os.path.basename(repo.root) + '-%h' |
830 if not prefix: prefix = os.path.basename(repo.root) + '-%h' |
833 prefix = make_filename(repo, repo.changelog, prefix, node) |
831 prefix = make_filename(repo, prefix, node) |
834 archival.archive(repo, dest, node, kind, not opts['no_decode'], |
832 archival.archive(repo, dest, node, kind, not opts['no_decode'], |
835 matchfn, prefix) |
833 matchfn, prefix) |
836 |
834 |
837 def backout(ui, repo, rev, **opts): |
835 def backout(ui, repo, rev, **opts): |
838 '''reverse effect of earlier changeset |
836 '''reverse effect of earlier changeset |
918 |
916 |
919 %s basename of file being printed |
917 %s basename of file being printed |
920 %d dirname of file being printed, or '.' if in repo root |
918 %d dirname of file being printed, or '.' if in repo root |
921 %p root-relative path name of file being printed |
919 %p root-relative path name of file being printed |
922 """ |
920 """ |
923 mf = {} |
921 ctx = repo.changectx(opts['rev'] or -1) |
924 rev = opts['rev'] |
922 for src, abs, rel, exact in walk(repo, (file1,) + pats, opts, ctx.node()): |
925 if rev: |
923 fp = make_file(repo, opts['output'], ctx.node(), pathname=abs) |
926 node = repo.lookup(rev) |
924 fp.write(ctx.filectx(abs).data()) |
927 else: |
|
928 node = repo.changelog.tip() |
|
929 change = repo.changelog.read(node) |
|
930 mf = repo.manifest.read(change[0]) |
|
931 for src, abs, rel, exact in walk(repo, (file1,) + pats, opts, node): |
|
932 r = repo.file(abs) |
|
933 n = mf[abs] |
|
934 fp = make_file(repo, r, opts['output'], node=n, pathname=abs) |
|
935 fp.write(r.read(n)) |
|
936 |
925 |
937 def clone(ui, source, dest=None, **opts): |
926 def clone(ui, source, dest=None, **opts): |
938 """make a copy of an existing repository |
927 """make a copy of an existing repository |
939 |
928 |
940 Create a copy of an existing repository in a new directory. |
929 Create a copy of an existing repository in a new directory. |
1499 if opts['switch_parent']: |
1488 if opts['switch_parent']: |
1500 parents.reverse() |
1489 parents.reverse() |
1501 prev = (parents and parents[0]) or nullid |
1490 prev = (parents and parents[0]) or nullid |
1502 change = repo.changelog.read(node) |
1491 change = repo.changelog.read(node) |
1503 |
1492 |
1504 fp = make_file(repo, repo.changelog, opts['output'], |
1493 fp = make_file(repo, opts['output'], node, total=total, seqno=seqno, |
1505 node=node, total=total, seqno=seqno, |
|
1506 revwidth=revwidth) |
1494 revwidth=revwidth) |
1507 if fp != sys.stdout: |
1495 if fp != sys.stdout: |
1508 ui.note("%s\n" % fp.name) |
1496 ui.note("%s\n" % fp.name) |
1509 |
1497 |
1510 fp.write("# HG changeset patch\n") |
1498 fp.write("# HG changeset patch\n") |