Commit 9c879d04 by willmcgugan

Command fixes

parent 155f51dc
...@@ -649,6 +649,8 @@ class FS(object): ...@@ -649,6 +649,8 @@ class FS(object):
:rtype: An FS object :rtype: An FS object
""" """
if path in ('', '/'):
return self
from fs.wrapfs.subfs import SubFS from fs.wrapfs.subfs import SubFS
if not self.exists(path): if not self.exists(path):
raise ResourceNotFoundError(path) raise ResourceNotFoundError(path)
......
...@@ -124,7 +124,7 @@ Copy SOURCE to DESTINATION""" ...@@ -124,7 +124,7 @@ Copy SOURCE to DESTINATION"""
self.total_files = len(copy_fs_paths) self.total_files = len(copy_fs_paths)
self.done_files = 0 self.done_files = 0
file_queue = queue.Queue() file_queue = queue.Queue()
threads = [FileOpThread(self.get_action(), threads = [FileOpThread(self.get_action(),
'T%i' % i, 'T%i' % i,
dst_fs, dst_fs,
......
...@@ -13,8 +13,9 @@ Make a directory""" ...@@ -13,8 +13,9 @@ Make a directory"""
def do_run(self, options, args): def do_run(self, options, args):
for fs_url in args: for fs_url in args:
fs, path = self.open_fs(fs_url, create=True) fs, path = self.open_fs(fs_url, create=True)
print fs, path
def run(): def run():
return FSMkdir().run() return FSMkdir().run()
......
...@@ -2,7 +2,7 @@ from fs.utils import movefile, contains_files ...@@ -2,7 +2,7 @@ from fs.utils import movefile, contains_files
from fs.commands import fscp from fs.commands import fscp
import sys import sys
class FSMove(fscp.FSCopy): class FSMove(fscp.FScp):
usage = """fsmv [OPTION]... [SOURCE] [DESTINATION] usage = """fsmv [OPTION]... [SOURCE] [DESTINATION]
Move files from SOURCE to DESTINATION""" Move files from SOURCE to DESTINATION"""
......
...@@ -25,7 +25,7 @@ Remove a file or directory at PATH""" ...@@ -25,7 +25,7 @@ Remove a file or directory at PATH"""
interactive = options.interactive interactive = options.interactive
verbose = options.verbose verbose = options.verbose
for fs, path, is_dir in self.get_resources(args): for fs, path, is_dir in self.get_resources(args):
if interactive: if interactive:
if is_dir: if is_dir:
msg = "remove directory '%s'?" % path msg = "remove directory '%s'?" % path
......
...@@ -29,6 +29,13 @@ Serves the contents of PATH with one of a number of methods""" ...@@ -29,6 +29,13 @@ Serves the contents of PATH with one of a number of methods"""
fs_url = './' fs_url = './'
fs, path = self.open_fs(fs_url) fs, path = self.open_fs(fs_url)
if fs.isdir(path):
fs = fs.opendir(path)
path = '/'
if options.verbose:
print "Serving \"%s\" in %s" % (path, fs)
port = options.port port = options.port
......
...@@ -13,7 +13,7 @@ Recursively display the contents of PATH in an ascii tree""" ...@@ -13,7 +13,7 @@ Recursively display the contents of PATH in an ascii tree"""
def get_optparse(self): def get_optparse(self):
optparse = super(FSTree, self).get_optparse() optparse = super(FSTree, self).get_optparse()
optparse.add_option('-L', '--level', dest='depth', type="int", default=5, optparse.add_option('-l', '--level', dest='depth', type="int", default=5,
help="Descend only LEVEL directories deep", metavar="LEVEL") help="Descend only LEVEL directories deep", metavar="LEVEL")
optparse.add_option('-a', '--all', dest='all', action='store_true', default=False, optparse.add_option('-a', '--all', dest='all', action='store_true', default=False,
help="do not hide dot files") help="do not hide dot files")
......
...@@ -221,13 +221,11 @@ class Command(object): ...@@ -221,13 +221,11 @@ class Command(object):
except KeyboardInterrupt: except KeyboardInterrupt:
if self.is_terminal(): if self.is_terminal():
self.output("\n") self.output("\n")
return 0 return 0
#except ValueError:
# pass
except SystemExit: except SystemExit:
return 0 return 0
except Exception, e: except Exception, e:
self.error(self.wrap_error('Internal Error - %s\n' % unicode(e))) self.error(self.wrap_error('Error - %s\n' % unicode(e)))
return 1 return 1
......
...@@ -79,7 +79,7 @@ class OpenerRegistry(object): ...@@ -79,7 +79,7 @@ class OpenerRegistry(object):
for name in opener.names: for name in opener.names:
self.registry[name] = index self.registry[name] = index
def parse(self, fs_url, default_fs_name=None, writeable=False, create=False): def parse(self, fs_url, default_fs_name=None, open_dir=True, writeable=False, create=False):
orig_url = fs_url orig_url = fs_url
match = self.split_segments(fs_url) match = self.split_segments(fs_url)
...@@ -110,27 +110,27 @@ class OpenerRegistry(object): ...@@ -110,27 +110,27 @@ class OpenerRegistry(object):
if fs_url is None: if fs_url is None:
raise OpenerError("Unable to parse '%s'" % orig_url) raise OpenerError("Unable to parse '%s'" % orig_url)
#wildcard = None
#if iswildcard(fs_url):
# fs_url, wildcard = pathsplit(fs_url)
fs, fs_path = opener.get_fs(self, fs_name, fs_name_params, fs_url, writeable, create) fs, fs_path = opener.get_fs(self, fs_name, fs_name_params, fs_url, writeable, create)
pathname, resourcename = pathsplit(fs_path or '')
if pathname:
fs = fs.opendir(pathname)
fs_path = resourcename
if fs_path and iswildcard(fs_path): if fs_path and iswildcard(fs_path):
return fs, fs_path pathname, resourcename = pathsplit(fs_path or '')
if pathname:
fs = fs.opendir(pathname)
return fs, resourcename
#pathname, resourcename = pathsplit(fs_path or '')
#if pathname and resourcename:
# fs = fs.opendir(pathname)
# fs_path = resourcename
fs_path = join(fs_path, path) fs_path = join(fs_path, path)
pathname, resourcename = pathsplit(fs_path or '') pathname, resourcename = pathsplit(fs_path or '')
if pathname: if pathname and resourcename:
fs = fs.opendir(pathname) fs = fs.opendir(pathname)
fs_path = resourcename fs_path = resourcename
return fs, fs_path return fs, fs_path
def parse_credentials(self, url): def parse_credentials(self, url):
...@@ -180,17 +180,12 @@ class OSFSOpener(Opener): ...@@ -180,17 +180,12 @@ class OSFSOpener(Opener):
from fs.osfs import OSFS from fs.osfs import OSFS
path = _expand_syspath(fs_path) path = _expand_syspath(fs_path)
if create: if create and not os.path.exists(path):
from fs.osfs import _os_makedirs from fs.osfs import _os_makedirs
_os_makedirs(fs_path) _os_makedirs(path)
if os.path.isdir(path): dirname, resourcename = pathsplit(fs_path)
osfs = OSFS(path) osfs = OSFS(dirname)
filepath = None return osfs, resourcename
else:
path, filepath = pathsplit(path)
osfs = OSFS(path, create=create)
return osfs, filepath
class ZipOpener(Opener): class ZipOpener(Opener):
names = ['zip', 'zip64'] names = ['zip', 'zip64']
...@@ -210,8 +205,7 @@ class ZipOpener(Opener): ...@@ -210,8 +205,7 @@ class ZipOpener(Opener):
else: else:
open_mode = 'rb' open_mode = 'rb'
zip_file = zip_fs.open(zip_path, mode=open_mode) zip_file = zip_fs.open(zip_path, mode=open_mode)
username, password, fs_path = registry.parse_credentials(fs_path) username, password, fs_path = registry.parse_credentials(fs_path)
...@@ -251,7 +245,7 @@ class RPCOpener(Opener): ...@@ -251,7 +245,7 @@ class RPCOpener(Opener):
if create and path: if create and path:
rpcfs.makedir(path, recursive=True, allow_recreate=True) rpcfs.makedir(path, recursive=True, allow_recreate=True)
return rpcfs, path or None return rpcfs, path or None
...@@ -387,7 +381,9 @@ opener = OpenerRegistry([OSFSOpener, ...@@ -387,7 +381,9 @@ opener = OpenerRegistry([OSFSOpener,
def main(): def main():
fs, path = opener.parse('zip:zip://~/zips.zip!t.zip!') #fs, path = opener.parse('zip:zip://~/zips.zip!t.zip!')
fs, path = opener.parse('rpc://127.0.0.1/a/*.JPG')
print fs, path print fs, path
if __name__ == "__main__": if __name__ == "__main__":
......
...@@ -230,7 +230,7 @@ class OSFS(OSFSXAttrMixin, OSFSWatchMixin, FS): ...@@ -230,7 +230,7 @@ class OSFS(OSFSXAttrMixin, OSFSWatchMixin, FS):
@convert_os_errors @convert_os_errors
def remove(self, path): def remove(self, path):
sys_path = self.getsyspath(path) sys_path = self.getsyspath(path)
try: try:
os.remove(sys_path) os.remove(sys_path)
except OSError, e: except OSError, e:
if e.errno == errno.EACCES and sys.platform == "win32": if e.errno == errno.EACCES and sys.platform == "win32":
......
...@@ -27,21 +27,18 @@ def re_raise_faults(func): ...@@ -27,21 +27,18 @@ def re_raise_faults(func):
#import traceback #import traceback
#traceback.print_exc() #traceback.print_exc()
# Make sure it's in a form we can handle # Make sure it's in a form we can handle
bits = f.faultString.split(" ") bits = f.faultString.split(" ")
if bits[0] not in ["<type","<class"]: if bits[0] not in ["<type","<class"]:
raise f raise f
# Find the class/type object # Find the class/type object
bits = " ".join(bits[1:]).split(">:") bits = " ".join(bits[1:]).split(">:")
cls = bits[0] cls = bits[0]
msg = ">:".join(bits[1:]) msg = ">:".join(bits[1:])
while cls[0] in ["'",'"']: cls = cls.strip('\'')
cls = cls[1:]
while cls[-1] in ["'",'"']:
cls = cls[:-1]
cls = _object_by_name(cls) cls = _object_by_name(cls)
# Re-raise using the remainder of the fault code as message # Re-raise using the remainder of the fault code as message
if cls: if cls:
raise cls(msg) raise cls(msg=msg)
raise f raise f
except socket.error, e: except socket.error, e:
raise RemoteConnectionError(str(e), details=e) raise RemoteConnectionError(str(e), details=e)
...@@ -210,7 +207,7 @@ class RPCFS(FS): ...@@ -210,7 +207,7 @@ class RPCFS(FS):
path = self.encode_path(path) path = self.encode_path(path)
return self.proxy.isfile(path) return self.proxy.isfile(path)
def listdir(self, path="./", wildcard=None, full=False, absolute=False, dirs_only=False, files_only=False): def listdir(self, path="./", wildcard=None, full=False, absolute=False, dirs_only=False, files_only=False):
path = self.encode_path(path) path = self.encode_path(path)
entries = self.proxy.listdir(path,wildcard,full,absolute,dirs_only,files_only) entries = self.proxy.listdir(path,wildcard,full,absolute,dirs_only,files_only)
return [self.decode_path(e) for e in entries] return [self.decode_path(e) for e in entries]
......
...@@ -56,10 +56,7 @@ def copyfile(src_fs, src_path, dst_fs, dst_path, overwrite=True, chunk_size=64*1 ...@@ -56,10 +56,7 @@ def copyfile(src_fs, src_path, dst_fs, dst_path, overwrite=True, chunk_size=64*1
src = None src = None
try: try:
# Chunk copy # Chunk copy
if src_fs.getsize(src_path) < chunk_size: src = src_fs.open(src_path, 'rb')
src = src_fs.getcontents(src_path)
else:
src = src_fs.open(src_path, 'rb')
dst_fs.setcontents(dst_path, src, chunk_size=chunk_size) dst_fs.setcontents(dst_path, src, chunk_size=chunk_size)
finally: finally:
if src is not None and hasattr(src, 'close'): if src is not None and hasattr(src, 'close'):
...@@ -92,19 +89,15 @@ def movefile(src_fs, src_path, dst_fs, dst_path, overwrite=True, chunk_size=64*1 ...@@ -92,19 +89,15 @@ def movefile(src_fs, src_path, dst_fs, dst_path, overwrite=True, chunk_size=64*1
FS._shutil_movefile(src_syspath, dst_syspath) FS._shutil_movefile(src_syspath, dst_syspath)
return return
src = None src = None
try: try:
# Chunk copy # Chunk copy
if src_fs.getsize(src_path) < chunk_size: src = src_fs.open(src_path, 'rb')
src = src_fs.getcontents(src_path) dst_fs.setcontents(dst_path, src, chunk_size=chunk_size)
else:
src = src_fs.open(src_path, 'rb')
dst_fs.setcontents(dst_path, src, chunk_size=chunk_size)
src_fs.remove(src_path)
finally: finally:
if src is not None and hasattr(src, 'close'): if src is not None and hasattr(src, 'close'):
src.close() src.close()
src_fs.remove(src_path)
def movedir(fs1, fs2, overwrite=False, ignore_errors=False, chunk_size=64*1024): def movedir(fs1, fs2, overwrite=False, ignore_errors=False, chunk_size=64*1024):
"""Moves contents of a directory from one filesystem to another. """Moves contents of a directory from one filesystem to another.
......
...@@ -164,7 +164,12 @@ class WrapFS(FS): ...@@ -164,7 +164,12 @@ class WrapFS(FS):
return self.wrapped_fs.isfile(self._encode(path)) return self.wrapped_fs.isfile(self._encode(path))
@rewrite_errors @rewrite_errors
def listdir(self, path="", **kwds): def listdir(self, path="", wildcard=None, full=False, absolute=False, dirs_only=False, files_only=False):
kwds = dict(wildcard=wildcard,
full=full,
absolute=absolute,
dirs_only=dirs_only,
files_only=files_only)
full = kwds.pop("full",False) full = kwds.pop("full",False)
absolute = kwds.pop("absolute",False) absolute = kwds.pop("absolute",False)
wildcard = kwds.pop("wildcard",None) wildcard = kwds.pop("wildcard",None)
......
...@@ -30,16 +30,16 @@ class SubFS(WrapFS): ...@@ -30,16 +30,16 @@ class SubFS(WrapFS):
return abspath(normpath(path))[len(self.sub_dir):] return abspath(normpath(path))[len(self.sub_dir):]
def __str__(self): def __str__(self):
return "<SubFS: %s in %s>" % (self.sub_dir, self.wrapped_fs) return "%s/%s" % (self.wrapped_fs, self.sub_dir.lstrip('/'))
def __unicode__(self): def __unicode__(self):
return u"<SubFS: %s in %s>" % (self.sub_dir, self.wrapped_fs) return u"%s/%s" % (self.wrapped_fs, self.sub_dir.lstrip('/'))
def __repr__(self): def __repr__(self):
return str(self) return str(self)
def desc(self, path): def desc(self, path):
desc = "%s in sub dir %s of %s" % (path, self.sub_dir, str(self.wrapped_fs)) desc = "%s!%s" % (str(self), path)
return desc return desc
def setcontents(self, path, data, chunk_size=64*1024): def setcontents(self, path, data, chunk_size=64*1024):
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment