From: Greg Ward Date: Sat, 17 Jun 2000 01:58:14 +0000 (+0000) Subject: Bastian Kleineidam: added 'remove_tree()' function. Needed so that X-Git-Tag: v2.0b1~1497 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=039accfb2caafdaa6d792f09b217ff0f5935df42;p=python Bastian Kleineidam: added 'remove_tree()' function. Needed so that 'remove_tree()' can cooperate with 'mkpath()' in the maintenance of the PATH_CREATED cache: specifically, if a directory is created with 'mkpath()', later removed with 'remove_tree()', and 'mkpath()' is again requested to create it, then it would erroneously think the directory already existed, because it was in the PATH_CREATED cache. The patch (slightly tweaked by me) fixes that. --- diff --git a/Lib/distutils/dir_util.py b/Lib/distutils/dir_util.py index 194183ae25..e5b24fe475 100644 --- a/Lib/distutils/dir_util.py +++ b/Lib/distutils/dir_util.py @@ -180,23 +180,38 @@ def copy_tree (src, dst, # copy_tree () +# Helper for remove_tree() +def _build_cmdtuple(path, cmdtuples): + for f in os.listdir(path): + real_f = os.path.join(path,f) + if os.path.isdir(real_f) and not os.path.islink(real_f): + _build_cmdtuple(real_f, cmdtuples) + else: + cmdtuples.append((os.remove, real_f)) + cmdtuples.append((os.rmdir, path)) + def remove_tree (directory, verbose=0, dry_run=0): """Recursively remove an entire directory tree. Any errors are ignored (apart from being reported to stdout if 'verbose' is true).""" - from shutil import rmtree - + global PATH_CREATED if verbose: print "removing '%s' (and everything under it)" % directory if dry_run: return - try: - rmtree(directory,1) - except (IOError, OSError), exc: - if verbose: - if exc.filename: - print "error removing %s: %s (%s)" % \ + cmdtuples = [] + _build_cmdtuple(directory, cmdtuples) + for cmd in cmdtuples: + try: + apply(cmd[0], (cmd[1],)) + # remove dir from cache if it's already there + if PATH_CREATED.has_key(cmd[1]): + del PATH_CREATED[cmd[1]] + except (IOError, OSError), exc: + if verbose: + if exc.filename: + print "error removing %s: %s (%s)" % \ (directory, exc.strerror, exc.filename) - else: - print "error removing %s: %s" % (directory, exc.strerror) + else: + print "error removing %s: %s" % (directory, exc.strerror)