--- a/mercurial/commands.py
+++ b/mercurial/commands.py
@@ -42,16 +42,16 @@ def matchpats(repo, pats=[], opts={}, he
return util.cmdmatcher(repo.root, cwd, pats or ['.'], opts.get('include'),
opts.get('exclude'), head) + (cwd,)
-def makewalk(repo, pats, opts, head=''):
+def makewalk(repo, pats, opts, node=None, head=''):
files, matchfn, anypats, cwd = matchpats(repo, pats, opts, head)
exact = dict(zip(files, files))
def walk():
- for src, fn in repo.walk(files=files, match=matchfn):
+ for src, fn in repo.walk(node=node, files=files, match=matchfn):
yield src, fn, util.pathto(cwd, fn), fn in exact
return files, matchfn, walk()
-def walk(repo, pats, opts, head=''):
- files, matchfn, results = makewalk(repo, pats, opts, head)
+def walk(repo, pats, opts, node=None, head=''):
+ files, matchfn, results = makewalk(repo, pats, opts, node, head)
for r in results:
yield r
@@ -634,20 +634,14 @@ def cat(ui, repo, file1, *pats, **opts):
mf = {}
rev = opts['rev']
if rev:
- change = repo.changelog.read(repo.lookup(rev))
- mf = repo.manifest.read(change[0])
- for src, abs, rel, exact in walk(repo, (file1,) + pats, opts):
+ node = repo.lookup(rev)
+ else:
+ node = repo.changelog.tip()
+ change = repo.changelog.read(node)
+ mf = repo.manifest.read(change[0])
+ for src, abs, rel, exact in walk(repo, (file1,) + pats, opts, node):
r = repo.file(abs)
- if rev:
- try:
- n = mf[abs]
- except (hg.RepoError, KeyError):
- try:
- n = r.lookup(rev)
- except KeyError, inst:
- raise util.Abort(_('cannot find file %s in rev %s'), rel, rev)
- else:
- n = r.tip()
+ n = mf[abs]
fp = make_file(repo, r, opts['output'], node=n, pathname=abs)
fp.write(r.read(n))
--- a/mercurial/localrepo.py
+++ b/mercurial/localrepo.py
@@ -462,8 +462,14 @@ class localrepository(object):
def walk(self, node=None, files=[], match=util.always):
if node:
+ fdict = dict.fromkeys(files)
for fn in self.manifest.read(self.changelog.read(node)[0]):
- if match(fn): yield 'm', fn
+ fdict.pop(fn, None)
+ if match(fn):
+ yield 'm', fn
+ for fn in fdict:
+ self.ui.warn(_('%s: No such file in rev %s\n') % (
+ util.pathto(self.getcwd(), fn), short(node)))
else:
for src, fn in self.dirstate.walk(files, match):
yield src, fn