changeset 29886:307b20e5e505

formatter: add context manager interface for convenience And port "hg files" to test it. As you can see, extra indent is necessary to port to this API. I don't think we should switch every fm.formatter() call to "with" statement.
author Yuya Nishihara <yuya@tcha.org>
date Mon, 29 Aug 2016 00:00:05 +0900
parents 12f8bef59bfa
children 0c8c388c7d62
files mercurial/commands.py mercurial/formatter.py
diffstat 2 files changed, 7 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/commands.py	Fri Aug 26 21:06:31 2016 +0200
+++ b/mercurial/commands.py	Mon Aug 29 00:00:05 2016 +0900
@@ -3963,15 +3963,11 @@
     end = '\n'
     if opts.get('print0'):
         end = '\0'
-    fm = ui.formatter('files', opts)
     fmt = '%s' + end
 
     m = scmutil.match(ctx, pats, opts)
-    ret = cmdutil.files(ui, ctx, m, fm, fmt, opts.get('subrepos'))
-
-    fm.end()
-
-    return ret
+    with ui.formatter('files', opts) as fm:
+        return cmdutil.files(ui, ctx, m, fm, fmt, opts.get('subrepos'))
 
 @command('^forget', walkopts, _('[OPTION]... FILE...'), inferrepo=True)
 def forget(ui, repo, *pats, **opts):
--- a/mercurial/formatter.py	Fri Aug 26 21:06:31 2016 +0200
+++ b/mercurial/formatter.py	Mon Aug 29 00:00:05 2016 +0900
@@ -52,6 +52,11 @@
         self._item = None
         # function to convert node to string suitable for this output
         self.hexfunc = hex
+    def __enter__(self):
+        return self
+    def __exit__(self, exctype, excvalue, traceback):
+        if exctype is None:
+            self.end()
     def __nonzero__(self):
         '''return False if we're not doing real templating so we can
         skip extra work'''