Mercurial > hg
changeset 1254:e6560042b7b8
Switch cat command to use walk code.
The old syntax of "hg cat FILE REV" is now obsolete.
Use "hg cat -r REV FILE" instead, as for all other commands.
author | Bryan O'Sullivan <bos@serpentine.com> |
---|---|
date | Wed, 14 Sep 2005 21:57:41 -0700 |
parents | a45e717c61a8 |
children | e825dfea3823 |
files | doc/hg.1.txt mercurial/commands.py tests/test-help.out |
diffstat | 3 files changed, 56 insertions(+), 32 deletions(-) [+] |
line wrap: on
line diff
--- a/doc/hg.1.txt Wed Sep 14 16:34:22 2005 -0700 +++ b/doc/hg.1.txt Wed Sep 14 21:57:41 2005 -0700 @@ -121,10 +121,23 @@ Unlike import/export, this exactly preserves all changeset contents including permissions, rename data, and revision history. -cat <file> [revision]:: - Output to stdout the given revision for the specified file. +cat [options] <file ...>:: + Print the specified files as they were at the given revision. + If no revision is given then the tip is used. + + Output may be to a file, in which case the name of the file is + given using a format string. The formatting rules are the same as + for the export command, with the following additions: - If no revision is given then the tip is used. + %s basename of file being printed + %d dirname of file being printed, or '.' if in repo root + %p root-relative path name of file being printed + + options: + -I, --include <pat> include names matching the given patterns + -X, --exclude <pat> exclude names matching the given patterns + -o, --output <filespec> print output to file with formatted name + -r, --rev <rev> print the given revision clone [-U] <source> [dest]:: Create a copy of an existing repository in a new directory. @@ -176,9 +189,11 @@ This command takes effect in the next commit. Options: - -A, --after record a copy that has already occurred - -f, --force forcibly copy over an existing managed file - -p, --parents append source path to dest + -A, --after record a copy that has already occurred + -I, --include <pat> include names matching the given patterns + -X, --exclude <pat> exclude names matching the given patterns + -f, --force forcibly copy over an existing managed file + -p, --parents append source path to dest aliases: cp @@ -226,7 +241,7 @@ options: -a, --text treat all files as text - -o, --output <filespec> print output to file with formatted named + -o, --output <filespec> print output to file with formatted name forget [options] [files]:: Undo an 'hg add' scheduled for the next commit.
--- a/mercurial/commands.py Wed Sep 14 16:34:22 2005 -0700 +++ b/mercurial/commands.py Wed Sep 14 21:57:41 2005 -0700 @@ -194,7 +194,7 @@ yield str(rev) def make_filename(repo, r, pat, node=None, - total=None, seqno=None, revwidth=None): + total=None, seqno=None, revwidth=None, pathname=None): node_expander = { 'H': lambda: hex(node), 'R': lambda: str(r.rev(node)), @@ -216,6 +216,10 @@ expander['n'] = lambda: str(seqno) if total is not None and seqno is not None: expander['n'] = lambda:str(seqno).zfill(len(str(total))) + if pathname is not None: + expander['s'] = lambda: os.path.basename(pathname) + expander['d'] = lambda: os.path.dirname(pathname) or '.' + expander['p'] = lambda: pathname newname = [] patlen = len(pat) @@ -234,14 +238,15 @@ inst.args[0]) def make_file(repo, r, pat, node=None, - total=None, seqno=None, revwidth=None, mode='wb'): + total=None, seqno=None, revwidth=None, mode='wb', pathname=None): if not pat or pat == '-': return 'w' in mode and sys.stdout or sys.stdin if hasattr(pat, 'write') and 'w' in mode: return pat if hasattr(pat, 'read') and 'r' in mode: return pat - return open(make_filename(repo, r, pat, node, total, seqno, revwidth), + return open(make_filename(repo, r, pat, node, total, seqno, revwidth, + pathname), mode) def dodiff(fp, ui, repo, node1, node2, files=None, match=util.always, @@ -569,25 +574,26 @@ except: os.unlink(fname) -def cat(ui, repo, file1, rev=None, **opts): - """output the latest or given revision of a file""" - r = repo.file(relpath(repo, [file1])[0]) - if rev: - try: - # assume all revision numbers are for changesets - n = repo.lookup(rev) - change = repo.changelog.read(n) - m = repo.manifest.read(change[0]) - n = m[relpath(repo, [file1])[0]] - except (hg.RepoError, KeyError): +def cat(ui, repo, file1, *pats, **opts): + """output the latest or given revisions of files""" + mf = {} + if opts['rev']: + change = repo.changelog.read(repo.lookup(opts['rev'])) + mf = repo.manifest.read(change[0]) + for src, abs, rel, exact in walk(repo, (file1,) + pats, opts): + r = repo.file(abs) + if opts['rev']: try: - n = r.lookup(rev) - except KeyError, inst: - raise util.Abort('cannot find file %s in rev %s', file1, rev) - else: - n = r.tip() - fp = make_file(repo, r, opts['output'], node=n) - fp.write(r.read(n)) + 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() + fp = make_file(repo, r, opts['output'], node=n, pathname=abs) + fp.write(r.read(n)) def clone(ui, source, dest=None, **opts): """make a copy of an existing repository""" @@ -1765,8 +1771,11 @@ 'hg bundle FILE DEST'), "cat": (cat, - [('o', 'output', "", 'output to file')], - 'hg cat [-o OUTFILE] FILE [REV]'), + [('I', 'include', [], 'include path in search'), + ('X', 'exclude', [], 'exclude path from search'), + ('o', 'output', "", 'output to file'), + ('r', 'rev', '', 'revision')], + 'hg cat [OPTION]... FILE...'), "^clone": (clone, [('U', 'noupdate', None, 'skip update after cloning'),
--- a/tests/test-help.out Wed Sep 14 16:34:22 2005 -0700 +++ b/tests/test-help.out Wed Sep 14 21:57:41 2005 -0700 @@ -40,7 +40,7 @@ addremove add all new files, delete all missing files annotate show changeset information per file line bundle create a changegroup file - cat output the latest or given revision of a file + cat output the latest or given revisions of files clone make a copy of an existing repository commit commit the specified files or all outstanding changes copy mark files as copied for the next commit @@ -82,7 +82,7 @@ addremove add all new files, delete all missing files annotate show changeset information per file line bundle create a changegroup file - cat output the latest or given revision of a file + cat output the latest or given revisions of files clone make a copy of an existing repository commit commit the specified files or all outstanding changes copy mark files as copied for the next commit