# HG changeset patch # User Benoit Boissinot # Date 1133874638 -3600 # Node ID 63799b01985c75b4583227de7cf92757ac4300c5 # Parent 1d7d0c07e8f38005e779adb41eda042251c0c40c fix the cat command - improve localrepo.walk when passed a node - make the differents walk commands in commands.py accept a node - change commands.cat to walk over a revision - add a test diff --git a/mercurial/commands.py b/mercurial/commands.py --- 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)) diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py --- 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 diff --git a/tests/test-cat b/tests/test-cat new file mode 100755 --- /dev/null +++ b/tests/test-cat @@ -0,0 +1,18 @@ +#!/bin/sh +# +mkdir t +cd t +hg init +echo 0 > a +echo 0 > b +hg ci -A -m m -d "0 0" +hg rm a +hg cat a +sleep 1 # make sure mtime is changed +echo 1 > b +hg ci -m m -d "0 0" +echo 2 > b +hg cat -r 0 a +hg cat -r 0 b +hg cat -r 1 a +hg cat -r 1 b diff --git a/tests/test-cat.out b/tests/test-cat.out new file mode 100644 --- /dev/null +++ b/tests/test-cat.out @@ -0,0 +1,7 @@ +adding a +adding b +0 +0 +0 +a: No such file in rev 551e7cb14b32 +1