From: Daira Hopwood Date: Mon, 8 Apr 2013 22:16:56 +0000 (+0100) Subject: Changes to fileutil. X-Git-Url: https://git.rkrishnan.org/components/%3C?a=commitdiff_plain;h=a79d3d69fb3859b0009c7bd94e60b2fe184277c5;p=tahoe-lafs%2Ftahoe-lafs.git Changes to fileutil. Signed-off-by: David-Sarah Hopwood --- diff --git a/src/allmydata/node.py b/src/allmydata/node.py index 4dccf965..af0429c3 100644 --- a/src/allmydata/node.py +++ b/src/allmydata/node.py @@ -287,11 +287,11 @@ class Node(service.MultiService): fileutil.write(privpath, value, mode="") return value - def write_config(self, name, value, mode="w"): + def write_config(self, name, value, mode=""): """Write a string to a config file.""" fn = os.path.join(self.basedir, name) try: - fileutil.write(fn, value, mode) + fileutil.write(fn, value, mode=mode) except EnvironmentError, e: self.log("Unable to write config file '%s'" % fn) self.log(e) diff --git a/src/allmydata/util/fileutil.py b/src/allmydata/util/fileutil.py index 56aa419b..804ddb4f 100644 --- a/src/allmydata/util/fileutil.py +++ b/src/allmydata/util/fileutil.py @@ -2,7 +2,7 @@ Futz with files like a pro. """ -import sys, exceptions, os, stat, tempfile, time, binascii +import errno, sys, exceptions, os, re, stat, tempfile, time, binascii from twisted.python import log @@ -202,10 +202,12 @@ def rm_dir(dirname): else: remove(fullname) os.rmdir(dirname) - except Exception, le: - # Ignore "No such file or directory" - if (not isinstance(le, OSError)) or le.args[0] != 2: + except EnvironmentError, le: + # Ignore "No such file or directory", collect any other exception. + if (le.args[0] != 2 and le.args[0] != 3) or (le.args[0] != errno.ENOENT): excs.append(le) + except Exception, le: + excs.append(le) # Okay, now we've recursively removed everything, ignoring any "No # such file or directory" errors, and collecting any other errors. @@ -217,13 +219,33 @@ def rm_dir(dirname): raise OSError, "Failed to remove dir for unknown reason." raise OSError, excs - def remove_if_possible(f): try: remove(f) except: pass +def rmdir_if_empty(path): + """ Remove the directory if it is empty. """ + try: + os.rmdir(path) + except OSError, e: + if e.errno != errno.ENOTEMPTY: + raise + + +ASCII = re.compile(r'^[\x00-\x7F]*$') + +def listdir(path, filter=ASCII): + try: + children = os.listdir(path) + except OSError, e: + if e.errno != errno.ENOENT: + raise + return [] + else: + return [str(child) for child in children if filter.match(child)] + def open_or_create(fname, binarymode=True): try: return open(fname, binarymode and "r+b" or "r+") @@ -255,8 +277,8 @@ def write_atomically(target, contents, mode="b"): f.close() move_into_place(target+".tmp", target) -def write(path, data, mode="wb"): - wf = open(path, mode) +def write(path, data, mode="b"): + wf = open(path, "w"+mode) try: wf.write(data) finally: @@ -453,8 +475,8 @@ def get_used_space(path): # [in] 512-byte units." It is also defined that way on MacOS X. Python does # not set the attribute on Windows. # - # We consider platforms that define st_blocks but give it a wrong value, or - # measure it in a unit other than 512 bytes, to be broken. See also + # This code relies on the underlying platform to either define st_blocks in + # units of 512 bytes or else leave st_blocks undefined. See also # . if hasattr(s, 'st_blocks'):