Ver código fonte

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>
Shawn O. Pearce 17 anos atrás
pai
commit
c95583bf4f
6 arquivos alterados com 22 adições e 9 exclusões
  1. 5 0
      command.py
  2. 9 1
      main.py
  3. 2 2
      subcmds/help.py
  4. 2 2
      subcmds/init.py
  5. 2 2
      subcmds/sync.py
  6. 2 2
      subcmds/version.py

+ 5 - 0
command.py

@@ -114,3 +114,8 @@ class PagedCommand(Command):
   """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.
+  """

+ 9 - 1
main.py

@@ -27,7 +27,9 @@ import os
 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 @@ class _Repo(object):
     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:

+ 2 - 2
subcmds/help.py

@@ -17,9 +17,9 @@ import sys
 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 = """

+ 2 - 2
subcmds/init.py

@@ -17,12 +17,12 @@ import os
 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 = """

+ 2 - 2
subcmds/sync.py

@@ -19,11 +19,11 @@ import subprocess
 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 = """

+ 2 - 2
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 = """