D6440: fix: let fixer tools inherit hg's cwd so they can look at the working copy
hooper (Danny Hooper)
phabricator at mercurial-scm.org
Fri Jul 26 17:58:10 UTC 2019
hooper updated this revision to Diff 16083.
REPOSITORY
rHG Mercurial
CHANGES SINCE LAST UPDATE
https://phab.mercurial-scm.org/D6440?vs=15244&id=16083
CHANGES SINCE LAST ACTION
https://phab.mercurial-scm.org/D6440/new/
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
@@ -215,6 +215,13 @@
executions that modified a file. This aggregates the same metadata
previously passed to the "postfixfile" hook.
+ Fixer tools are run the in repository's root directory. 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.
+
list of commands:
fix rewrite file content in changesets or working directory
@@ -1264,3 +1271,38 @@
$ cd ..
+We run fixer tools in the repo root 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 repo's location 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
+ $ cat bar
+ $TESTTMP/subprocesscwd
+
+ $ 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 repository's root directory. 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,7 +537,7 @@
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
@@ -539,7 +546,8 @@
(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 the repository's
+ root.
"""
metadata = {}
newdata = fixctx[path].data()
@@ -553,7 +561,7 @@
proc = subprocess.Popen(
procutil.tonativestr(command),
shell=True,
- cwd=procutil.tonativestr(b'/'),
+ cwd=repo.root,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
To: hooper, #hg-reviewers
Cc: martinvonz, durin42, mercurial-devel
More information about the Mercurial-devel
mailing list