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
--- 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