formatter: add pickle format
authorMatt Mackall <mpm@selenic.com>
Fri, 12 Sep 2014 18:36:38 -0500
changeset 22430 968247e8f4ac
parent 22429 7a7eed5176a4
child 22431 eaeee6f95fc0
formatter: add pickle format This gives convenient Python2 output. Python 3 users will need encoding=bytes.
mercurial/formatter.py
tests/test-locate.t
tests/test-status.t
--- a/mercurial/formatter.py	Mon Sep 15 13:15:07 2014 -0500
+++ b/mercurial/formatter.py	Fri Sep 12 18:36:38 2014 -0500
@@ -5,6 +5,7 @@
 # This software may be used and distributed according to the terms of the
 # GNU General Public License version 2 or any later version.
 
+import cPickle
 from i18n import _
 import encoding, util
 
@@ -77,6 +78,16 @@
         baseformatter.end(self)
         self._ui.write("]\n")
 
+class pickleformatter(baseformatter):
+    def __init__(self, ui, topic, opts):
+        baseformatter.__init__(self, ui, topic, opts)
+        self._data = []
+    def _showitem(self):
+        self._data.append(self._item)
+    def end(self):
+        baseformatter.end(self)
+        self._ui.write(cPickle.dumps(self._data))
+
 class jsonformatter(baseformatter):
     def __init__(self, ui, topic, opts):
         baseformatter.__init__(self, ui, topic, opts)
@@ -108,6 +119,8 @@
     template = opts.get("template", "")
     if template == "json":
         return jsonformatter(ui, topic, opts)
+    elif template == "pickle":
+        return pickleformatter(ui, topic, opts)
     elif template == "debug":
         return debugformatter(ui, topic, opts)
     elif template != "":
--- a/tests/test-locate.t	Mon Sep 15 13:15:07 2014 -0500
+++ b/tests/test-locate.t	Fri Sep 12 18:36:38 2014 -0500
@@ -128,4 +128,14 @@
   ../t.h (glob)
   ../t/e.h (glob)
 
+  $ hg files
+  ../b
+  ../dir.h/foo
+  ../t.h
+  ../t/b
+  ../t/e.h
+  ../t/x
+  $ hg files .
+  [1]
+
   $ cd ../..
--- a/tests/test-status.t	Mon Sep 15 13:15:07 2014 -0500
+++ b/tests/test-status.t	Fri Sep 12 18:36:38 2014 -0500
@@ -202,6 +202,12 @@
    }
   ]
 
+  $ hg status -A -Tpickle > pickle
+  >>> import pickle
+  >>> print sorted((x['status'], x['path']) for x in pickle.load(open("pickle")))
+  [('!', 'deleted'), ('?', 'pickle'), ('?', 'unknown'), ('A', 'added'), ('A', 'copied'), ('C', '.hgignore'), ('C', 'modified'), ('I', 'ignored'), ('R', 'removed')]
+  $ rm pickle
+
   $ echo "^ignoreddir$" > .hgignore
   $ mkdir ignoreddir
   $ touch ignoreddir/file