cat: move most of the implementation into cmdutils.cat()
This will allow access to the reusable parts from subrepos, similar to add(),
forget(), etc.
--- a/mercurial/cmdutil.py Tue Apr 15 17:51:27 2014 -0400
+++ b/mercurial/cmdutil.py Thu Mar 13 23:45:18 2014 -0400
@@ -1812,6 +1812,32 @@
forgot.extend(forget)
return bad, forgot
+def cat(ui, repo, ctx, matcher, **opts):
+ err = 1
+
+ def write(path):
+ fp = makefileobj(repo, opts.get('output'), ctx.node(), pathname=path)
+ data = ctx[path].data()
+ if opts.get('decode'):
+ data = repo.wwritedata(path, data)
+ fp.write(data)
+ fp.close()
+
+ # Automation often uses hg cat on single files, so special case it
+ # for performance to avoid the cost of parsing the manifest.
+ if len(matcher.files()) == 1 and not matcher.anypats():
+ file = matcher.files()[0]
+ mf = repo.manifest
+ mfnode = ctx._changeset[0]
+ if mf.find(mfnode, file)[0]:
+ write(file)
+ return 0
+
+ for abs in ctx.walk(matcher):
+ write(abs)
+ err = 0
+ return err
+
def duplicatecopies(repo, rev, fromrev):
'''reproduce copies from fromrev to rev in the dirstate'''
for dst, src in copies.pathcopies(repo[fromrev], repo[rev]).iteritems():
--- a/mercurial/commands.py Tue Apr 15 17:51:27 2014 -0400
+++ b/mercurial/commands.py Thu Mar 13 23:45:18 2014 -0400
@@ -1172,32 +1172,9 @@
Returns 0 on success.
"""
ctx = scmutil.revsingle(repo, opts.get('rev'))
- err = 1
m = scmutil.match(ctx, (file1,) + pats, opts)
- def write(path):
- fp = cmdutil.makefileobj(repo, opts.get('output'), ctx.node(),
- pathname=path)
- data = ctx[path].data()
- if opts.get('decode'):
- data = repo.wwritedata(path, data)
- fp.write(data)
- fp.close()
-
- # Automation often uses hg cat on single files, so special case it
- # for performance to avoid the cost of parsing the manifest.
- if len(m.files()) == 1 and not m.anypats():
- file = m.files()[0]
- mf = repo.manifest
- mfnode = ctx._changeset[0]
- if mf.find(mfnode, file)[0]:
- write(file)
- return 0
-
- for abs in ctx.walk(m):
- write(abs)
- err = 0
- return err
+ return cmdutil.cat(ui, repo, ctx, m, **opts)
@command('^clone',
[('U', 'noupdate', None,