changeset 35007:407ec7f3ff02

cmdutil: create dirs for templated cat file output Previously, the caller was responsible for creating the directory structure of files written out using a path template. This is onerous, especially if the exact filenames are not known upfront, but are being accessed via a matcher. This patch changes things so that hg will attempt to create the appropriate directories before writing the output file. Differential Revision: https://phab.mercurial-scm.org/D1332
author Ryan McElroy <rmcelroy@fb.com>
date Tue, 07 Nov 2017 13:48:33 -0800
parents 8154119ed236
children b81ad5b78a81
files mercurial/cmdutil.py tests/test-cat.t
diffstat 2 files changed, 7 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/cmdutil.py	Tue Nov 07 13:46:15 2017 -0800
+++ b/mercurial/cmdutil.py	Tue Nov 07 13:48:33 2017 -0800
@@ -3029,6 +3029,11 @@
         if fntemplate:
             filename = makefilename(repo, fntemplate, ctx.node(),
                                     pathname=os.path.join(prefix, path))
+            # attempt to create the directory if it does not already exist
+            try:
+                os.makedirs(os.path.dirname(filename))
+            except OSError:
+                pass
         with formatter.maybereopen(basefm, filename, opts) as fm:
             data = ctx[path].data()
             if opts.get('decode'):
--- a/tests/test-cat.t	Tue Nov 07 13:46:15 2017 -0800
+++ b/tests/test-cat.t	Tue Nov 07 13:48:33 2017 -0800
@@ -126,7 +126,6 @@
   $ echo a > foo/a
   $ hg add foo/a
   $ hg commit -qm "add foo/a"
-  $ mkdir output
   $ hg cat --output "output/%p" foo/a
-  abort: No such file or directory: output/foo/a
-  [255]
+  $ cat output/foo/a
+  a