Show More
@@ -2632,21 +2632,21 b' def remove(ui, repo, m, prefix, after, f' | |||
|
2632 | 2632 | |
|
2633 | 2633 | return ret |
|
2634 | 2634 | |
|
2635 | def cat(ui, repo, ctx, matcher, fntemplate, prefix, **opts): | |
|
2635 | def cat(ui, repo, ctx, matcher, basefm, fntemplate, prefix, **opts): | |
|
2636 | 2636 | err = 1 |
|
2637 | 2637 | |
|
2638 | 2638 | def write(path): |
|
2639 | filename = None | |
|
2639 | 2640 | if fntemplate: |
|
2640 | 2641 | filename = makefilename(repo, fntemplate, ctx.node(), |
|
2641 | 2642 | pathname=os.path.join(prefix, path)) |
|
2642 | fp = open(filename, 'wb') | |
|
2643 | else: | |
|
2644 | fp = _unclosablefile(ui.fout) | |
|
2645 | with fp: | |
|
2643 | with formatter.maybereopen(basefm, filename, opts) as fm: | |
|
2646 | 2644 | data = ctx[path].data() |
|
2647 | 2645 | if opts.get('decode'): |
|
2648 | 2646 | data = repo.wwritedata(path, data) |
|
2649 |
f |
|
|
2647 | fm.startitem() | |
|
2648 | fm.write('data', '%s', data) | |
|
2649 | fm.data(abspath=path, path=matcher.rel(path)) | |
|
2650 | 2650 | |
|
2651 | 2651 | # Automation often uses hg cat on single files, so special case it |
|
2652 | 2652 | # for performance to avoid the cost of parsing the manifest. |
@@ -2670,7 +2670,7 b' def cat(ui, repo, ctx, matcher, fntempla' | |||
|
2670 | 2670 | try: |
|
2671 | 2671 | submatch = matchmod.subdirmatcher(subpath, matcher) |
|
2672 | 2672 | |
|
2673 | if not sub.cat(submatch, fntemplate, | |
|
2673 | if not sub.cat(submatch, basefm, fntemplate, | |
|
2674 | 2674 | os.path.join(prefix, sub._path), **opts): |
|
2675 | 2675 | err = 0 |
|
2676 | 2676 | except error.RepoLookupError: |
@@ -35,6 +35,7 b' from . import (' | |||
|
35 | 35 | error, |
|
36 | 36 | exchange, |
|
37 | 37 | extensions, |
|
38 | formatter, | |
|
38 | 39 | graphmod, |
|
39 | 40 | hbisect, |
|
40 | 41 | help, |
@@ -1338,7 +1339,7 b' def bundle(ui, repo, fname, dest=None, *' | |||
|
1338 | 1339 | _('print output to file with formatted name'), _('FORMAT')), |
|
1339 | 1340 | ('r', 'rev', '', _('print the given revision'), _('REV')), |
|
1340 | 1341 | ('', 'decode', None, _('apply any matching decode filter')), |
|
1341 | ] + walkopts, | |
|
1342 | ] + walkopts + formatteropts, | |
|
1342 | 1343 | _('[OPTION]... FILE...'), |
|
1343 | 1344 | inferrepo=True) |
|
1344 | 1345 | def cat(ui, repo, file1, *pats, **opts): |
@@ -1368,9 +1369,13 b' def cat(ui, repo, file1, *pats, **opts):' | |||
|
1368 | 1369 | if cmdutil.isstdiofilename(fntemplate): |
|
1369 | 1370 | fntemplate = '' |
|
1370 | 1371 | |
|
1371 |
if |
|
|
1372 | if fntemplate: | |
|
1373 | fm = formatter.nullformatter(ui, 'cat') | |
|
1374 | else: | |
|
1372 | 1375 | ui.pager('cat') |
|
1373 | return cmdutil.cat(ui, repo, ctx, m, fntemplate, '', **opts) | |
|
1376 | fm = ui.formatter('cat', opts) | |
|
1377 | with fm: | |
|
1378 | return cmdutil.cat(ui, repo, ctx, m, fm, fntemplate, '', **opts) | |
|
1374 | 1379 | |
|
1375 | 1380 | @command('^clone', |
|
1376 | 1381 | [('U', 'noupdate', None, _('the clone will include an empty working ' |
@@ -538,7 +538,7 b' class abstractsubrepo(object):' | |||
|
538 | 538 | self.ui.warn("%s: %s" % (prefix, _("addremove is not supported"))) |
|
539 | 539 | return 1 |
|
540 | 540 | |
|
541 | def cat(self, match, fntemplate, prefix, **opts): | |
|
541 | def cat(self, match, fm, fntemplate, prefix, **opts): | |
|
542 | 542 | return 1 |
|
543 | 543 | |
|
544 | 544 | def status(self, rev2, **opts): |
@@ -767,11 +767,11 b' class hgsubrepo(abstractsubrepo):' | |||
|
767 | 767 | dry_run, similarity) |
|
768 | 768 | |
|
769 | 769 | @annotatesubrepoerror |
|
770 | def cat(self, match, fntemplate, prefix, **opts): | |
|
770 | def cat(self, match, fm, fntemplate, prefix, **opts): | |
|
771 | 771 | rev = self._state[1] |
|
772 | 772 | ctx = self._repo[rev] |
|
773 |
return cmdutil.cat(self.ui, self._repo, ctx, match, fntemplate, |
|
|
774 | **opts) | |
|
773 | return cmdutil.cat(self.ui, self._repo, ctx, match, fm, fntemplate, | |
|
774 | prefix, **opts) | |
|
775 | 775 | |
|
776 | 776 | @annotatesubrepoerror |
|
777 | 777 | def status(self, rev2, **opts): |
@@ -1833,7 +1833,7 b' class gitsubrepo(abstractsubrepo):' | |||
|
1833 | 1833 | |
|
1834 | 1834 | |
|
1835 | 1835 | @annotatesubrepoerror |
|
1836 | def cat(self, match, fntemplate, prefix, **opts): | |
|
1836 | def cat(self, match, fm, fntemplate, prefix, **opts): | |
|
1837 | 1837 | rev = self._state[1] |
|
1838 | 1838 | if match.anypats(): |
|
1839 | 1839 | return 1 #No support for include/exclude yet |
@@ -1841,6 +1841,7 b' class gitsubrepo(abstractsubrepo):' | |||
|
1841 | 1841 | if not match.files(): |
|
1842 | 1842 | return 1 |
|
1843 | 1843 | |
|
1844 | # TODO: add support for non-plain formatter (see cmdutil.cat()) | |
|
1844 | 1845 | for f in match.files(): |
|
1845 | 1846 | output = self._gitcommand(["show", "%s:%s" % (rev, f)]) |
|
1846 | 1847 | fp = cmdutil.makefileobj(self._subparent, fntemplate, |
@@ -63,6 +63,46 b' Test fileset' | |||
|
63 | 63 | tmp/h_45116003780e |
|
64 | 64 | tmp/r_2 |
|
65 | 65 | |
|
66 | Test template output | |
|
67 | ||
|
68 | $ hg --cwd tmp cat ../b ../c -T '== {path} ({abspath}) ==\n{data}' | |
|
69 | == ../b (b) == (glob) | |
|
70 | 1 | |
|
71 | == ../c (c) == (glob) | |
|
72 | 3 | |
|
73 | ||
|
74 | $ hg cat b c -Tjson --output - | |
|
75 | [ | |
|
76 | { | |
|
77 | "abspath": "b", | |
|
78 | "data": "1\n", | |
|
79 | "path": "b" | |
|
80 | }, | |
|
81 | { | |
|
82 | "abspath": "c", | |
|
83 | "data": "3\n", | |
|
84 | "path": "c" | |
|
85 | } | |
|
86 | ] | |
|
87 | ||
|
88 | $ hg cat b c -Tjson --output 'tmp/%p.json' | |
|
89 | $ cat tmp/b.json | |
|
90 | [ | |
|
91 | { | |
|
92 | "abspath": "b", | |
|
93 | "data": "1\n", | |
|
94 | "path": "b" | |
|
95 | } | |
|
96 | ] | |
|
97 | $ cat tmp/c.json | |
|
98 | [ | |
|
99 | { | |
|
100 | "abspath": "c", | |
|
101 | "data": "3\n", | |
|
102 | "path": "c" | |
|
103 | } | |
|
104 | ] | |
|
105 | ||
|
66 | 106 | Test working directory |
|
67 | 107 | |
|
68 | 108 | $ echo b-wdir > b |
@@ -241,7 +241,7 b' Show all commands + options' | |||
|
241 | 241 | branch: force, clean |
|
242 | 242 | branches: active, closed, template |
|
243 | 243 | bundle: force, rev, branch, base, all, type, ssh, remotecmd, insecure |
|
244 | cat: output, rev, decode, include, exclude | |
|
244 | cat: output, rev, decode, include, exclude, template | |
|
245 | 245 | config: untrusted, edit, local, global, template |
|
246 | 246 | copy: after, force, include, exclude, dry-run |
|
247 | 247 | debugancestor: |
@@ -99,9 +99,9 b' test generic hooks' | |||
|
99 | 99 | abort: pre-identify hook exited with status 1 |
|
100 | 100 | [255] |
|
101 | 101 | $ hg cat b |
|
102 | pre-cat hook: HG_ARGS=cat b HG_HOOKNAME=pre-cat HG_HOOKTYPE=pre-cat HG_OPTS={'decode': None, 'exclude': [], 'include': [], 'output': '', 'rev': ''} HG_PATS=['b'] | |
|
102 | pre-cat hook: HG_ARGS=cat b HG_HOOKNAME=pre-cat HG_HOOKTYPE=pre-cat HG_OPTS={'decode': None, 'exclude': [], 'include': [], 'output': '', 'rev': '', 'template': ''} HG_PATS=['b'] | |
|
103 | 103 | b |
|
104 | post-cat hook: HG_ARGS=cat b HG_HOOKNAME=post-cat HG_HOOKTYPE=post-cat HG_OPTS={'decode': None, 'exclude': [], 'include': [], 'output': '', 'rev': ''} HG_PATS=['b'] HG_RESULT=0 | |
|
104 | post-cat hook: HG_ARGS=cat b HG_HOOKNAME=post-cat HG_HOOKTYPE=post-cat HG_OPTS={'decode': None, 'exclude': [], 'include': [], 'output': '', 'rev': '', 'template': ''} HG_PATS=['b'] HG_RESULT=0 | |
|
105 | 105 | |
|
106 | 106 | $ cd ../b |
|
107 | 107 | $ hg pull ../a |
@@ -1020,6 +1020,14 b' Prepare a repo with subrepo' | |||
|
1020 | 1020 | $ hg cat sub/repo/foo |
|
1021 | 1021 | test |
|
1022 | 1022 | test |
|
1023 | $ hg cat sub/repo/foo -Tjson | |
|
1024 | [ | |
|
1025 | { | |
|
1026 | "abspath": "foo", | |
|
1027 | "data": "test\ntest\n", | |
|
1028 | "path": "sub/repo/foo" (glob) | |
|
1029 | } | |
|
1030 | ] | |
|
1023 | 1031 | $ mkdir -p tmp/sub/repo |
|
1024 | 1032 | $ hg cat -r 0 --output tmp/%p_p sub/repo/foo |
|
1025 | 1033 | $ cat tmp/sub/repo/foo_p |
General Comments 0
You need to be logged in to leave comments.
Login now