[infra] Fix broken code when raising errors in copy_tree.py
`Error` isn't a recognized name in this script. Updated to `RuntimeError` instead so we can see the errors when they are raised. Change-Id: I55c548c7cd07dc1980a31dc96d22acec326602a3 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/111483 Commit-Queue: Nicholas Shahan <nshahan@google.com> Reviewed-by: Bob Nystrom <rnystrom@google.com>
This commit is contained in:
committed by
commit-bot@chromium.org
parent
6d13a6df94
commit
6578435eff
+41
-32
@@ -59,41 +59,50 @@ def ValidateArgs(args):
|
||||
|
||||
|
||||
def CopyTree(src, dst, ignore=None):
|
||||
names = os.listdir(src)
|
||||
if ignore is not None:
|
||||
ignored_names = ignore(src, names)
|
||||
else:
|
||||
ignored_names = set()
|
||||
# Recusive helper method to collect errors but keep processing.
|
||||
def copy_tree(src, dst, ignore, errors):
|
||||
names = os.listdir(src)
|
||||
if ignore is not None:
|
||||
ignored_names = ignore(src, names)
|
||||
else:
|
||||
ignored_names = set()
|
||||
|
||||
if not os.path.exists(dst):
|
||||
os.makedirs(dst)
|
||||
errors = []
|
||||
for name in names:
|
||||
if name in ignored_names:
|
||||
continue
|
||||
srcname = os.path.join(src, name)
|
||||
dstname = os.path.join(dst, name)
|
||||
if not os.path.exists(dst):
|
||||
os.makedirs(dst)
|
||||
for name in names:
|
||||
if name in ignored_names:
|
||||
continue
|
||||
srcname = os.path.join(src, name)
|
||||
dstname = os.path.join(dst, name)
|
||||
try:
|
||||
if os.path.isdir(srcname):
|
||||
copy_tree(srcname, dstname, ignore, errors)
|
||||
else:
|
||||
shutil.copy(srcname, dstname)
|
||||
except (IOError, os.error) as why:
|
||||
errors.append((srcname, dstname, str(why)))
|
||||
try:
|
||||
if os.path.isdir(srcname):
|
||||
CopyTree(srcname, dstname, ignore)
|
||||
else:
|
||||
shutil.copy(srcname, dstname)
|
||||
except (IOError, os.error) as why:
|
||||
errors.append((srcname, dstname, str(why)))
|
||||
# catch the Error from the recursive CopyTree so that we can
|
||||
# continue with other files
|
||||
except Exception as err:
|
||||
errors.extend(err.args[0])
|
||||
try:
|
||||
shutil.copystat(src, dst)
|
||||
except WindowsError:
|
||||
# can't copy file access times on Windows
|
||||
pass
|
||||
except OSError as why:
|
||||
errors.extend((src, dst, str(why)))
|
||||
if errors:
|
||||
raise Error(errors)
|
||||
shutil.copystat(src, dst)
|
||||
except WindowsError:
|
||||
# Can't copy file access times on Windows.
|
||||
pass
|
||||
except OSError as why:
|
||||
errors.append((src, dst, str(why)))
|
||||
|
||||
# Format errors from file copies.
|
||||
def format_error(error):
|
||||
if len(error) == 1:
|
||||
return "Error: {msg}".format(msg=str(error[0]))
|
||||
return "From: {src}\nTo: {dst}\n{msg}" \
|
||||
.format(src=error[0], dst=error[1], msg=error[2])
|
||||
|
||||
errors = []
|
||||
copy_tree(src,dst,ignore, errors)
|
||||
if errors:
|
||||
failures = "\n\n".join(format_error(error) for error in errors)
|
||||
parts = ("Some file copies failed:", "="*78, failures)
|
||||
msg = '\n'.join(parts)
|
||||
raise RuntimeError(msg)
|
||||
|
||||
def ListTree(src, ignore=None):
|
||||
names = os.listdir(src)
|
||||
|
||||
Reference in New Issue
Block a user