class BaseOptions(usage.Options):
- # unit tests can override these to point at StringIO instances
- stdin = sys.stdin
- stdout = sys.stdout
- stderr = sys.stderr
-
- optFlags = [
- ["quiet", "q", "Operate silently."],
- ["version", "V", "Display version numbers and exit."],
- ["version-and-path", None, "Display version numbers and paths to their locations and exit."],
- ]
- optParameters = [
- ["node-directory", "d", None, "Specify which Tahoe node directory should be used." + (
- _default_nodedir and (" [default for most commands: " + quote_output(_default_nodedir) + "]") or "")],
- ]
+ def __init__(self):
+ super(BaseOptions, self).__init__()
+ self.command_name = os.path.basename(sys.argv[0])
+ if self.command_name == 'trial':
+ self.command_name = 'tahoe'
+ # Only allow "tahoe --version", not e.g. "tahoe start --version"
def opt_version(self):
- import allmydata
- print >>self.stdout, allmydata.get_package_versions_string()
- sys.exit(0)
-
- def opt_version_and_path(self):
- import allmydata
- print >>self.stdout, allmydata.get_package_versions_string(show_paths=True)
- sys.exit(0)
-
+ raise usage.UsageError("--version not allowed on subcommands")
-class BasedirMixin:
+class BasedirOptions(BaseOptions):
default_nodedir = _default_nodedir
- allow_multiple = True
- # startstop_node.py needs os.fork to implement the "-m" option on "tahoe
- # start" option
- can_start_multiple = hasattr(os, "fork")
-
optParameters = [
- ["basedir", "C", None, "Same as --node-directory."],
+ ["basedir", "C", None, "Same as --node-directory (default %s)."
+ % get_default_nodedir()],
]
- optFlags = [ ]
- if can_start_multiple:
- optFlags.append(["multiple", "m",
- "Specify multiple node directories at once."])
-
- def parseArgs(self, *args):
- if self['node-directory'] and self['basedir']:
- raise usage.UsageError("The --node-directory (or -d) and --basedir (or -C) "
- "options cannot both be used.")
-
- if self['node-directory'] or self['basedir']:
- self.basedirs = [argv_to_abspath(self['node-directory'] or self['basedir'])]
- else:
- self.basedirs = []
- if self.allow_multiple and self['multiple']:
- self.basedirs.extend(map(argv_to_abspath, args))
+ def parseArgs(self, basedir=None):
+ if self.parent['node-directory'] and self['basedir']:
+ raise usage.UsageError("The --node-directory (or -d) and --basedir (or -C) options cannot both be used.")
+ if self.parent['node-directory'] and basedir:
+ raise usage.UsageError("The --node-directory (or -d) option and a basedir argument cannot both be used.")
+ if self['basedir'] and basedir:
+ raise usage.UsageError("The --basedir (or -C) option and a basedir argument cannot both be used.")
+
+ if basedir:
+ b = argv_to_abspath(basedir)
+ elif self['basedir']:
+ b = argv_to_abspath(self['basedir'])
+ elif self.parent['node-directory']:
+ b = argv_to_abspath(self.parent['node-directory'])
+ elif self.default_nodedir:
+ b = self.default_nodedir
else:
- if len(args) > 1:
- raise usage.UsageError("I wasn't expecting so many arguments." +
- (self.allow_multiple and
- " Use the --multiple option to specify more than one node directory." or ""))
-
- if len(args) == 0 and self.default_nodedir and not self.basedirs:
- self.basedirs.append(self.default_nodedir)
- elif len(args) > 0:
- self.basedirs.append(argv_to_abspath(args[0]))
+ raise usage.UsageError("No default basedir available, you must provide one with --node-directory, --basedir, or a basedir argument")
+ self['basedir'] = b
def postOptions(self):
- if not self.basedirs:
+ if not self['basedir']:
raise usage.UsageError("A base directory for the node must be provided.")
- del self['basedir']
- self['basedirs'] = self.basedirs
DEFAULT_ALIAS = u"tahoe"
def get_aliases(nodedir):
- from allmydata import uri
aliases = {}
aliasfile = os.path.join(nodedir, "private", "aliases")
rootfile = os.path.join(nodedir, "private", "root_dir.cap")
f = open(rootfile, "r")
rootcap = f.read().strip()
if rootcap:
- aliases[DEFAULT_ALIAS] = uri.from_string_dirnode(rootcap).to_string()
+ aliases[DEFAULT_ALIAS] = rootcap
except EnvironmentError:
pass
try:
name, cap = line.split(u":", 1)
# normalize it: remove http: prefix, urldecode
cap = cap.strip().encode('utf-8')
- aliases[name] = uri.from_string_dirnode(cap).to_string()
+ aliases[name] = cap
except EnvironmentError:
pass
return aliases
if default == None:
return DefaultAliasMarker, path
if default not in aliases:
- raise UnknownAliasError("No alias specified, and the default "
- "'tahoe' alias doesn't exist. To create "
- "it, use 'tahoe create-alias tahoe'.")
- return aliases[default], path
+ raise UnknownAliasError("No alias specified, and the default %s alias doesn't exist. "
+ "To create it, use 'tahoe create-alias %s'."
+ % (quote_output(default), quote_output(default, quotemarks=False)))
+ return uri.from_string_dirnode(aliases[default]).to_string(), path
if colon == 1 and default is None and platform_uses_lettercolon_drivename():
# treat C:\why\must\windows\be\so\weird as a local path, not a tahoe
# file in the "C:" alias
if default == None:
return DefaultAliasMarker, path
if default not in aliases:
- raise UnknownAliasError("No alias specified, and the default "
- "'tahoe' alias doesn't exist. To create "
- "it, use 'tahoe create-alias tahoe'.")
- return aliases[default], path
+ raise UnknownAliasError("No alias specified, and the default %s alias doesn't exist. "
+ "To create it, use 'tahoe create-alias %s'."
+ % (quote_output(default), quote_output(default, quotemarks=False)))
+ return uri.from_string_dirnode(aliases[default]).to_string(), path
if alias not in aliases:
raise UnknownAliasError("Unknown alias %s, please create it with 'tahoe add-alias' or 'tahoe create-alias'." %
quote_output(alias))
- return aliases[alias], path[colon+1:]
+ return uri.from_string_dirnode(aliases[alias]).to_string(), path[colon+1:]
def escape_path(path):
segments = path.split("/")