From c95583bf4f17b8467f815b6391ffc6c7add08804 Mon Sep 17 00:00:00 2001 From: "Shawn O. Pearce" Date: Tue, 3 Mar 2009 17:47:06 -0800 Subject: [PATCH] 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 --- command.py | 5 +++++ main.py | 10 +++++++++- subcmds/help.py | 4 ++-- subcmds/init.py | 4 ++-- subcmds/sync.py | 4 ++-- subcmds/version.py | 4 ++-- 6 files changed, 22 insertions(+), 9 deletions(-) diff --git a/command.py b/command.py index 516c2d9d..c3cad5ea 100644 --- a/command.py +++ b/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. + """ diff --git a/main.py b/main.py index db4fa0fb..0e0a61de 100755 --- a/main.py +++ b/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: diff --git a/subcmds/help.py b/subcmds/help.py index 6e0238a0..a2814e11 100644 --- a/subcmds/help.py +++ b/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 = """ diff --git a/subcmds/init.py b/subcmds/init.py index ad28a611..d1fb4316 100644 --- a/subcmds/init.py +++ b/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 = """ diff --git a/subcmds/sync.py b/subcmds/sync.py index 8050e515..fff1281a 100644 --- a/subcmds/sync.py +++ b/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 = """ diff --git a/subcmds/version.py b/subcmds/version.py index 4f19a0ca..83e77d0b 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 = """