Don't permit users to run repo status in a mirror client
If a client was created with "repo init --mirror" then there are
no working directories present, and no files checked out. Using
a command like "repo status" in this context makes no sense, and
actually throws back a Pytyon traceback at the console when the
underlying commands fail out.
We now tag commands with the MirrorSafeCommand type if they are
able to be executed within a mirror directory safely. Using a
command in a mirror which lacks this base class results in a
useful error letting you know the command isn't supported.
Bug: REPO-14
Signed-off-by: Shawn O. Pearce <sop@google.com>
diff --git a/command.py b/command.py
index 516c2d9..c3cad5e 100644
--- a/command.py
+++ b/command.py
@@ -114,3 +114,8 @@
"""Command which defaults to output in a pager, as its
display tends to be larger than one screen full.
"""
+
+class MirrorSafeCommand(object):
+ """Command permits itself to run within a mirror,
+ and does not require a working directory.
+ """
diff --git a/main.py b/main.py
index db4fa0f..0e0a61d 100755
--- a/main.py
+++ b/main.py
@@ -27,7 +27,9 @@
import re
import sys
-from command import InteractiveCommand, PagedCommand
+from command import InteractiveCommand
+from command import MirrorSafeCommand
+from command import PagedCommand
from editor import Editor
from error import ManifestInvalidRevisionError
from error import NoSuchProjectError
@@ -91,6 +93,12 @@
cmd.manifest = Manifest(cmd.repodir)
Editor.globalConfig = cmd.manifest.globalConfig
+ if not isinstance(cmd, MirrorSafeCommand) and cmd.manifest.IsMirror:
+ print >>sys.stderr, \
+ "fatal: '%s' requires a working directory"\
+ % name
+ sys.exit(1)
+
if not gopts.no_pager and not isinstance(cmd, InteractiveCommand):
config = cmd.manifest.globalConfig
if gopts.pager:
diff --git a/subcmds/help.py b/subcmds/help.py
index 6e0238a..a2814e1 100644
--- a/subcmds/help.py
+++ b/subcmds/help.py
@@ -17,9 +17,9 @@
from formatter import AbstractFormatter, DumbWriter
from color import Coloring
-from command import PagedCommand
+from command import PagedCommand, MirrorSafeCommand
-class Help(PagedCommand):
+class Help(PagedCommand, MirrorSafeCommand):
common = False
helpSummary = "Display detailed help on a command"
helpUsage = """
diff --git a/subcmds/init.py b/subcmds/init.py
index ad28a61..d1fb431 100644
--- a/subcmds/init.py
+++ b/subcmds/init.py
@@ -17,12 +17,12 @@
import sys
from color import Coloring
-from command import InteractiveCommand
+from command import InteractiveCommand, MirrorSafeCommand
from error import ManifestParseError
from remote import Remote
from git_command import git, MIN_GIT_VERSION
-class Init(InteractiveCommand):
+class Init(InteractiveCommand, MirrorSafeCommand):
common = True
helpSummary = "Initialize repo in the current directory"
helpUsage = """
diff --git a/subcmds/sync.py b/subcmds/sync.py
index 8050e51..fff1281 100644
--- a/subcmds/sync.py
+++ b/subcmds/sync.py
@@ -19,11 +19,11 @@
import sys
from git_command import GIT
-from command import Command
+from command import Command, MirrorSafeCommand
from error import RepoChangedException, GitError
from project import R_HEADS
-class Sync(Command):
+class Sync(Command, MirrorSafeCommand):
common = True
helpSummary = "Update working tree to the latest revision"
helpUsage = """
diff --git a/subcmds/version.py b/subcmds/version.py
index 4f19a0c..83e77d0 100644
--- a/subcmds/version.py
+++ b/subcmds/version.py
@@ -14,11 +14,11 @@
# limitations under the License.
import sys
-from command import Command
+from command import Command, MirrorSafeCommand
from git_command import git
from project import HEAD
-class Version(Command):
+class Version(Command, MirrorSafeCommand):
common = False
helpSummary = "Display the version of repo"
helpUsage = """