Allow repo forall -c on a mirror by using GIT_DIR as pwd
We can permit a forall on a mirror, but only if we put
the command into the git repository.
Signed-off-by: Shawn O. Pearce <sop@google.com>
diff --git a/subcmds/forall.py b/subcmds/forall.py
index acbf18b..bc0d455 100644
--- a/subcmds/forall.py
+++ b/subcmds/forall.py
@@ -17,9 +17,9 @@
import os
import sys
import subprocess
-from command import Command
+from command import Command, MirrorSafeCommand
-class Forall(Command):
+class Forall(Command, MirrorSafeCommand):
common = False
helpSummary = "Run a shell command in each project"
helpUsage = """
@@ -30,7 +30,8 @@
Environment
-----------
-pwd is the project's working directory.
+pwd is the project's working directory. If the current client is
+a mirror client, then pwd is the Git repository.
REPO_PROJECT is set to the unique name of the project.
@@ -77,6 +78,7 @@
cmd.append(cmd[0])
cmd.extend(opt.command[1:])
+ mirror = self.manifest.IsMirror
rc = 0
for project in self.GetProjects(args):
env = dict(os.environ.iteritems())
@@ -88,8 +90,14 @@
.ToLocal(project.revision)
env['REPO_RREV'] = project.revision
+ if mirror:
+ env['GIT_DIR'] = project.gitdir
+ cwd = project.gitdir
+ else:
+ cwd = project.worktree
+
p = subprocess.Popen(cmd,
- cwd = project.worktree,
+ cwd = cwd,
shell = shell,
env = env)
r = p.wait()