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