# HG changeset patch # User Ryan McElroy # Date 1510091313 28800 # Node ID 407ec7f3ff02ae357074104fe892adc2b12b42a7 # Parent 8154119ed2360ee274df5ff7b17dde422e48802c 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 diff -r 8154119ed236 -r 407ec7f3ff02 mercurial/cmdutil.py --- 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'): diff -r 8154119ed236 -r 407ec7f3ff02 tests/test-cat.t --- 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