From 6578435efff54d6460c091f99a5489f9237a43ca Mon Sep 17 00:00:00 2001 From: Nicholas Shahan Date: Fri, 2 Aug 2019 18:05:08 +0000 Subject: [PATCH] [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 Reviewed-by: Bob Nystrom --- tools/copy_tree.py | 73 ++++++++++++++++++++++++++-------------------- 1 file changed, 41 insertions(+), 32 deletions(-) diff --git a/tools/copy_tree.py b/tools/copy_tree.py index d175b1491a0..bd6fd289b97 100755 --- a/tools/copy_tree.py +++ b/tools/copy_tree.py @@ -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)