changeset 21040:bdf5ed5246d2

cat: move most of the implementation into cmdutils.cat() This will allow access to the reusable parts from subrepos, similar to add(), forget(), etc.
author Matt Harbison <matt_harbison@yahoo.com>
date Thu, 13 Mar 2014 23:45:18 -0400
parents d0cc92ba0406
children a2cc3c08c3ac
files mercurial/cmdutil.py mercurial/commands.py
diffstat 2 files changed, 27 insertions(+), 24 deletions(-) [+]
line wrap: on
line diff
--- 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,