comparison mercurial/commands.py @ 2562:a020024c5870

simplify make_filename, fix hg cat bug hg cat was using file-level rev/node ids for generating filename templates. This simplifies make_filename to only use changeset rev/node ids.
author Matt Mackall <mpm@selenic.com>
date Wed, 28 Jun 2006 17:06:56 -0500
parents 73ac95671788
children 7f78ca2c7977
comparison
equal deleted inserted replaced
2561:494f7787d8ee 2562:a020024c5870
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")