comparison mercurial/commands.py @ 2567:2748253b49c2

Merge context patches
author Matt Mackall <mpm@selenic.com>
date Wed, 05 Jul 2006 13:28:25 -0500
parents 5b426676f616 d8560b458f76
children 83cfd95eafb5 82e3b2966862
comparison
equal deleted inserted replaced
2559:bf67d0f6531c 2567:2748253b49c2
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")