]> git.rkrishnan.org Git - tahoe-lafs/tahoe-lafs.git/commitdiff
Alter CLI utilities to handle nonexistent aliases better
authorKevan Carstensen <kevan@isnotajoke.com>
Thu, 11 Feb 2010 02:43:18 +0000 (18:43 -0800)
committerKevan Carstensen <kevan@isnotajoke.com>
Thu, 11 Feb 2010 02:43:18 +0000 (18:43 -0800)
13 files changed:
src/allmydata/scripts/common.py
src/allmydata/scripts/slow_operation.py
src/allmydata/scripts/tahoe_backup.py
src/allmydata/scripts/tahoe_check.py
src/allmydata/scripts/tahoe_cp.py
src/allmydata/scripts/tahoe_get.py
src/allmydata/scripts/tahoe_ls.py
src/allmydata/scripts/tahoe_manifest.py
src/allmydata/scripts/tahoe_mkdir.py
src/allmydata/scripts/tahoe_mv.py
src/allmydata/scripts/tahoe_put.py
src/allmydata/scripts/tahoe_rm.py
src/allmydata/scripts/tahoe_webopen.py

index 24f9922e49d5eb944a64f7cf81cf118958a24858..7b6f78aafbeb95f16d38046bfb720acfd89fce4d 100644 (file)
@@ -134,6 +134,9 @@ def get_alias(aliases, path, default):
     # DefaultAliasMarker. We special-case strings with a recognized cap URI
     # prefix, to make it easy to access specific files/directories by their
     # caps.
+    # If the transformed alias is either not found in aliases, or is blank
+    # and default is not found in aliases, an UnknownAliasError is
+    # raised.
     path = path.strip()
     if uri.has_uri_prefix(path):
         # The only way to get a sub-path is to use URI:blah:./foo, and we
@@ -147,6 +150,10 @@ def get_alias(aliases, path, default):
         # no 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
     if colon == 1 and default == None and platform_uses_lettercolon_drivename():
         # treat C:\why\must\windows\be\so\weird as a local path, not a tahoe
@@ -158,6 +165,10 @@ def get_alias(aliases, path, default):
         # "foo/bar:7"
         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
     if alias not in aliases:
         raise UnknownAliasError("Unknown alias '%s', please create it with 'tahoe add-alias' or 'tahoe create-alias'." % alias)
index 1f8a99a177222ecb821aec4939866249864e572a..3f0a9c595d1de8e168857d12238c13166d2552c8 100644 (file)
@@ -1,6 +1,7 @@
 
 import os, time
-from allmydata.scripts.common import get_alias, DEFAULT_ALIAS, escape_path
+from allmydata.scripts.common import get_alias, DEFAULT_ALIAS, escape_path, \
+                                     UnknownAliasError
 from allmydata.scripts.common_http import do_http
 from allmydata.util import base32
 import urllib
@@ -17,7 +18,11 @@ class SlowOperationRunner:
             nodeurl += "/"
         self.nodeurl = nodeurl
         where = options.where
-        rootcap, path = get_alias(options.aliases, where, DEFAULT_ALIAS)
+        try:
+            rootcap, path = get_alias(options.aliases, where, DEFAULT_ALIAS)
+        except UnknownAliasError, e:
+            print >>stderr, "error: %s" % e.args[0]
+            return 1
         if path == '/':
             path = ''
         url = nodeurl + "uri/%s" % urllib.quote(rootcap)
index f816eedde1554c5266b0e98a04a68d90d9394239..a7b96b144577d14d3a04a1171a23d29b40281e99 100644 (file)
@@ -4,7 +4,8 @@ import time
 import urllib
 import simplejson
 import datetime
-from allmydata.scripts.common import get_alias, escape_path, DEFAULT_ALIAS
+from allmydata.scripts.common import get_alias, escape_path, DEFAULT_ALIAS, \
+                                     UnknownAliasError
 from allmydata.scripts.common_http import do_http
 from allmydata.util import time_format
 from allmydata.scripts import backupdb
@@ -92,7 +93,11 @@ class BackerUpper:
             print >>stderr, "ERROR: Unable to load backup db."
             return 1
 
-        rootcap, path = get_alias(options.aliases, options.to_dir, DEFAULT_ALIAS)
+        try:
+            rootcap, path = get_alias(options.aliases, options.to_dir, DEFAULT_ALIAS)
+        except UnknownAliasError, e:
+            print >>stderr, "error: %s" % e.args[0]
+            return 1
         to_url = nodeurl + "uri/%s/" % urllib.quote(rootcap)
         if path:
             to_url += escape_path(path)
index 5c1a23870cf4d154e6ff6012e7fc17dd7e81469c..6fdd9013de520fa34311af1e2f217c90dd0c44a8 100644 (file)
@@ -2,7 +2,8 @@
 import urllib
 import simplejson
 from twisted.protocols.basic import LineOnlyReceiver
-from allmydata.scripts.common import get_alias, DEFAULT_ALIAS, escape_path
+from allmydata.scripts.common import get_alias, DEFAULT_ALIAS, escape_path, \
+                                     UnknownAliasError
 from allmydata.scripts.common_http import do_http
 
 class Checker:
@@ -15,7 +16,11 @@ def check(options):
     if not nodeurl.endswith("/"):
         nodeurl += "/"
     where = options.where
-    rootcap, path = get_alias(options.aliases, where, DEFAULT_ALIAS)
+    try:
+        rootcap, path = get_alias(options.aliases, where, DEFAULT_ALIAS)
+    except UnknownAliasError, e:
+        print >>stderr, "error: %s" % e.args[0]
+        return 1
     if path == '/':
         path = ''
     url = nodeurl + "uri/%s" % urllib.quote(rootcap)
@@ -264,7 +269,11 @@ class DeepCheckStreamer(LineOnlyReceiver):
             nodeurl += "/"
         self.nodeurl = nodeurl
         where = options.where
-        rootcap, path = get_alias(options.aliases, where, DEFAULT_ALIAS)
+        try:
+            rootcap, path = get_alias(options.aliases, where, DEFAULT_ALIAS)
+        except UnknownAliasError, e:
+            print >>stderr, "error: %s" % e.args[0]
+            return 1
         if path == '/':
             path = ''
         url = nodeurl + "uri/%s" % urllib.quote(rootcap)
index 0e55d6eb103e0244d55e4371894dc54b43a71650..2b82bb6070ec9883cf16d919fba63afa1b7c3a02 100644 (file)
@@ -4,7 +4,8 @@ import urllib
 import simplejson
 from cStringIO import StringIO
 from twisted.python.failure import Failure
-from allmydata.scripts.common import get_alias, escape_path, DefaultAliasMarker
+from allmydata.scripts.common import get_alias, escape_path, \
+                                     DefaultAliasMarker, UnknownAliasError
 from allmydata.scripts.common_http import do_http
 from allmydata import uri
 
@@ -464,7 +465,11 @@ class Copier:
         destination_spec = self.options.destination
         recursive = self.options["recursive"]
 
-        target = self.get_target_info(destination_spec)
+        try:
+            target = self.get_target_info(destination_spec)
+        except UnknownAliasError, e:
+            self.to_stderr("error: %s" % e.args[0])
+            return 1
 
         try:
             sources = [] # list of (name, source object)
@@ -474,6 +479,9 @@ class Copier:
         except MissingSourceError, e:
             self.to_stderr("No such file or directory %s" % e.args[0])
             return 1
+        except UnknownAliasError, e:
+            self.to_stderr("error: %s" % e.args[0])
+            return 1
 
         have_source_dirs = bool([s for (name,s) in sources
                                  if isinstance(s, (LocalDirectorySource,
index abcd927cce59c56caa76dfc8189549bf3d384cb6..5b7095691303eac90cb48544eb0f745078aac493 100644 (file)
@@ -1,6 +1,7 @@
 
 import urllib
-from allmydata.scripts.common import get_alias, DEFAULT_ALIAS, escape_path
+from allmydata.scripts.common import get_alias, DEFAULT_ALIAS, escape_path, \
+                                     UnknownAliasError
 from allmydata.scripts.common_http import do_http
 
 def get(options):
@@ -13,7 +14,11 @@ def get(options):
 
     if nodeurl[-1] != "/":
         nodeurl += "/"
-    rootcap, path = get_alias(aliases, from_file, DEFAULT_ALIAS)
+    try:
+        rootcap, path = get_alias(aliases, from_file, DEFAULT_ALIAS)
+    except UnknownAliasError, e:
+        print >>stderr, "error: %s" % e.args[0]
+        return 1
     url = nodeurl + "uri/%s" % urllib.quote(rootcap)
     if path:
         url += "/" + escape_path(path)
index 6d71c713415f997061789097052e3fc2955ae3c7..a169d82b0ecedefb8127c70eab48ead97e89531c 100644 (file)
@@ -1,7 +1,8 @@
 
 import urllib, time
 import simplejson
-from allmydata.scripts.common import get_alias, DEFAULT_ALIAS, escape_path
+from allmydata.scripts.common import get_alias, DEFAULT_ALIAS, escape_path, \
+                                     UnknownAliasError
 from allmydata.scripts.common_http import do_http
 
 def list(options):
@@ -15,7 +16,11 @@ def list(options):
         nodeurl += "/"
     if where.endswith("/"):
         where = where[:-1]
-    rootcap, path = get_alias(aliases, where, DEFAULT_ALIAS)
+    try:
+        rootcap, path = get_alias(aliases, where, DEFAULT_ALIAS)
+    except UnknownAliasError, e:
+        print >>stderr, "error: %s" % e.args[0]
+        return 1
     url = nodeurl + "uri/%s" % urllib.quote(rootcap)
     if path:
         # move where.endswith check here?
index 5131aead90ac3fb3cbbb60bc5dcec45fefd8e7e0..66f05a9ba9a9199e54b6d791d018bcba7402f24c 100644 (file)
@@ -3,7 +3,8 @@ import urllib, simplejson
 from twisted.protocols.basic import LineOnlyReceiver
 from allmydata.util.abbreviate import abbreviate_space_both
 from allmydata.scripts.slow_operation import SlowOperationRunner
-from allmydata.scripts.common import get_alias, DEFAULT_ALIAS, escape_path
+from allmydata.scripts.common import get_alias, DEFAULT_ALIAS, escape_path, \
+                                     UnknownAliasError
 from allmydata.scripts.common_http import do_http
 
 class FakeTransport:
@@ -25,7 +26,11 @@ class ManifestStreamer(LineOnlyReceiver):
             nodeurl += "/"
         self.nodeurl = nodeurl
         where = options.where
-        rootcap, path = get_alias(options.aliases, where, DEFAULT_ALIAS)
+        try:
+            rootcap, path = get_alias(options.aliases, where, DEFAULT_ALIAS)
+        except UnknownAliasError, e:
+            print >>stderr, "error: %s" % e.args[0]
+            return 1
         if path == '/':
             path = ''
         url = nodeurl + "uri/%s" % urllib.quote(rootcap)
index 1c6f31a6ceeafca1f141c4b9a7426e13ce4d5390..50223dc969b7a6e24f60bf09fd4b5ef17aac362c 100644 (file)
@@ -1,7 +1,7 @@
 
 import urllib
 from allmydata.scripts.common_http import do_http, check_http_error
-from allmydata.scripts.common import get_alias, DEFAULT_ALIAS
+from allmydata.scripts.common import get_alias, DEFAULT_ALIAS, UnknownAliasError
 
 def mkdir(options):
     nodeurl = options['node-url']
@@ -12,7 +12,11 @@ def mkdir(options):
     if not nodeurl.endswith("/"):
         nodeurl += "/"
     if where:
-        rootcap, path = get_alias(aliases, where, DEFAULT_ALIAS)
+        try:
+            rootcap, path = get_alias(aliases, where, DEFAULT_ALIAS)
+        except UnknownAliasError, e:
+            print >>stderr, "error: %s" % e.args[0]
+            return 1
 
     if not where or not path:
         # create a new unlinked directory
index abdfd6d7c67b9bf01fdee777f4f02c4a642a4076..208b720eaefd1e1b876c1b73ad7b99898551be05 100644 (file)
@@ -2,7 +2,8 @@
 import re
 import urllib
 import simplejson
-from allmydata.scripts.common import get_alias, DEFAULT_ALIAS, escape_path
+from allmydata.scripts.common import get_alias, DEFAULT_ALIAS, escape_path, \
+                                     UnknownAliasError
 from allmydata.scripts.common_http import do_http
 
 # this script is used for both 'mv' and 'ln'
@@ -17,7 +18,11 @@ def mv(options, mode="move"):
 
     if nodeurl[-1] != "/":
         nodeurl += "/"
-    rootcap, from_path = get_alias(aliases, from_file, DEFAULT_ALIAS)
+    try:
+        rootcap, from_path = get_alias(aliases, from_file, DEFAULT_ALIAS)
+    except UnknownAliasError, e:
+        print >>stderr, "error: %s" % e.args[0]
+        return 1
     from_url = nodeurl + "uri/%s" % urllib.quote(rootcap)
     if from_path:
         from_url += "/" + escape_path(from_path)
@@ -30,7 +35,11 @@ def mv(options, mode="move"):
     cap = str(cap)
 
     # now get the target
-    rootcap, path = get_alias(aliases, to_file, DEFAULT_ALIAS)
+    try:
+        rootcap, path = get_alias(aliases, to_file, DEFAULT_ALIAS)
+    except UnknownAliasError, e:
+        print >>stderr, "error: %s" % e.args[0]
+        return 1
     to_url = nodeurl + "uri/%s" % urllib.quote(rootcap)
     if path:
         to_url += "/" + escape_path(path)
index 13a8306cdac3ce350e7aa01f7ea3488f1613fed4..24a7e3ef3e709674f5393ae47c133c0fe252798e 100644 (file)
@@ -3,7 +3,8 @@ from cStringIO import StringIO
 import os.path
 import urllib
 from allmydata.scripts.common_http import do_http
-from allmydata.scripts.common import get_alias, DEFAULT_ALIAS, escape_path
+from allmydata.scripts.common import get_alias, DEFAULT_ALIAS, escape_path, \
+                                     UnknownAliasError
 
 def put(options):
     """
@@ -34,7 +35,7 @@ def put(options):
         #  /oops/subdir/foo : DISALLOWED
         #  ALIAS:foo  : aliases[ALIAS]/foo
         #  ALIAS:subdir/foo  : aliases[ALIAS]/subdir/foo
-        
+
         #  ALIAS:/oops/subdir/foo : DISALLOWED
         #  DIRCAP:./foo        : DIRCAP/foo
         #  DIRCAP:./subdir/foo : DIRCAP/subdir/foo
@@ -44,7 +45,11 @@ def put(options):
         if to_file.startswith("URI:SSK:"):
             url = nodeurl + "uri/%s" % urllib.quote(to_file)
         else:
-            rootcap, path = get_alias(aliases, to_file, DEFAULT_ALIAS)
+            try:
+                rootcap, path = get_alias(aliases, to_file, DEFAULT_ALIAS)
+            except UnknownAliasError, e:
+                print >>stderr, "error: %s" % e.args[0]
+                return 1
             if path.startswith("/"):
                 suggestion = to_file.replace("/", "", 1)
                 print >>stderr, "ERROR: The remote filename must not start with a slash"
index 3e854e97b7ebe836a63398a6d2d9b8daf8d2a694..ba557b363d080031cc94b7a435ea34ff76b9fc93 100644 (file)
@@ -1,7 +1,8 @@
 
 import urllib
 from allmydata.scripts.common_http import do_http
-from allmydata.scripts.common import get_alias, DEFAULT_ALIAS, escape_path
+from allmydata.scripts.common import get_alias, DEFAULT_ALIAS, escape_path, \
+                                     UnknownAliasError
 
 def rm(options):
     """
@@ -15,7 +16,11 @@ def rm(options):
 
     if nodeurl[-1] != "/":
         nodeurl += "/"
-    rootcap, path = get_alias(aliases, where, DEFAULT_ALIAS)
+    try:
+        rootcap, path = get_alias(aliases, where, DEFAULT_ALIAS)
+    except UnknownAliasError, e:
+        print >>stderr, "error: %s" % e.args[0]
+        return 1
     assert path
     url = nodeurl + "uri/%s" % urllib.quote(rootcap)
     url += "/" + escape_path(path)
index b4e13c1482a89e3f713f21f7cbd780b1a183ea39..37d157b08deb04ba00c8f9e222c58749f10b165f 100644 (file)
@@ -1,14 +1,20 @@
 
-from allmydata.scripts.common import get_alias, DEFAULT_ALIAS, escape_path
+from allmydata.scripts.common import get_alias, DEFAULT_ALIAS, escape_path, \
+                                     UnknownAliasError
 import urllib
 
 def webopen(options, opener=None):
     nodeurl = options['node-url']
+    stderr = options.stderr
     if not nodeurl.endswith("/"):
         nodeurl += "/"
     where = options.where
     if where:
-        rootcap, path = get_alias(options.aliases, where, DEFAULT_ALIAS)
+        try:
+            rootcap, path = get_alias(options.aliases, where, DEFAULT_ALIAS)
+        except UnknownAliasError, e:
+            print >>stderr, "error: %s" % e.args[0]
+            return 1
         if path == '/':
             path = ''
         url = nodeurl + "uri/%s" % urllib.quote(rootcap)