# HG changeset patch # User Yuya Nishihara # Date 1472396405 -32400 # Node ID 307b20e5e5057195d66aec41c26ca296eb98779d # Parent 12f8bef59bfa2739d0c5d8425ab494fd2fe38a81 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. diff -r 12f8bef59bfa -r 307b20e5e505 mercurial/commands.py --- 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): diff -r 12f8bef59bfa -r 307b20e5e505 mercurial/formatter.py --- 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'''