hooper created this revision. Herald added a subscriber: mercurial-devel. Herald added a reviewer: hg-reviewers.
REVISION SUMMARY This lets fixer tools do things like find configuration files, with the caveat that they'll only see the version of that file in the working copy, regardless of what revisions are being fixed. REPOSITORY rHG Mercurial REVISION DETAIL https://phab.mercurial-scm.org/D6440 AFFECTED FILES hgext/fix.py tests/test-fix.t CHANGE DETAILS diff --git a/tests/test-fix.t b/tests/test-fix.t --- a/tests/test-fix.t +++ b/tests/test-fix.t @@ -1264,3 +1264,37 @@ $ cd .. +We run fixer tools in the cwd so they can look for config files or other +important things in the working directory. This does NOT mean we are +reconstructing a working copy of every revision being fixed; we're just giving +the tool knowledge of the cwd in case it can do something reasonable with that. + + $ hg init subprocesscwd + $ cd subprocesscwd + + $ cat >> .hg/hgrc <<EOF + > [fix] + > printcwd:command = pwd + > printcwd:pattern = path:foo/bar + > EOF + + $ mkdir foo + $ printf "bar\n" > foo/bar + $ hg commit -Aqm blah + + $ hg fix -w -r . foo/bar + $ hg cat -r tip foo/bar + $TESTTMP/subprocesscwd + $ cat foo/bar + $TESTTMP/subprocesscwd + + $ cd foo + + $ hg fix -w -r . bar + $ hg cat -r tip bar + $TESTTMP/subprocesscwd/foo + $ cat bar + $TESTTMP/subprocesscwd/foo + + $ cd ../.. + diff --git a/hgext/fix.py b/hgext/fix.py --- a/hgext/fix.py +++ b/hgext/fix.py @@ -102,6 +102,13 @@ mapping fixer tool names to lists of metadata values returned from executions that modified a file. This aggregates the same metadata previously passed to the "postfixfile" hook. + +Fixer tools are run the in same working directory as the :hg:`fix` command. This +allows them to read configuration files from the working copy, or even write to +the working copy. The working copy is not updated to match the revision being +fixed. In fact, several revisions may be fixed in parallel. Writes to the +working copy are not amended into the revision being fixed; fixer tools should +always write fixed file content back to stdout as documented above. """ from __future__ import absolute_import @@ -233,7 +240,7 @@ for rev, path in items: ctx = repo[rev] olddata = ctx[path].data() - metadata, newdata = fixfile(ui, opts, fixers, ctx, path, + metadata, newdata = fixfile(ui, repo, opts, fixers, ctx, path, basectxs[rev]) # Don't waste memory/time passing unchanged content back, but # produce one result per item either way. @@ -530,16 +537,17 @@ basectxs[rev].add(pctx) return basectxs -def fixfile(ui, opts, fixers, fixctx, path, basectxs): +def fixfile(ui, repo, opts, fixers, fixctx, path, basectxs): """Run any configured fixers that should affect the file in this context Returns the file content that results from applying the fixers in some order starting with the file's content in the fixctx. Fixers that support line ranges will affect lines that have changed relative to any of the basectxs (i.e. they will only avoid lines that are common to all basectxs). A fixer tool's stdout will become the file's new content if and only if it - exits with code zero. + exits with code zero. The fixer tool's working directory is inherited from + this process. """ metadata = {} newdata = fixctx[path].data() @@ -553,7 +561,7 @@ proc = subprocess.Popen( procutil.tonativestr(command), shell=True, - cwd=procutil.tonativestr(b'/'), + cwd=None, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) To: hooper, #hg-reviewers Cc: mercurial-devel _______________________________________________ Mercurial-devel mailing list Mercurial-devel@mercurial-scm.org https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel