From dbcccc191d38464a75ea5f8b95d124d9ee6159ad Mon Sep 17 00:00:00 2001 From: Matthias Koeppe Date: Sat, 28 Jan 2023 17:00:01 -0800 Subject: [PATCH] src/sage/misc/replace_dot_all.py: Replace -l with positional argument, handle multiple files/dirs, do not use directory prefix --- src/sage/misc/replace_dot_all.py | 59 +++++++++++++++++--------------- 1 file changed, 32 insertions(+), 27 deletions(-) diff --git a/src/sage/misc/replace_dot_all.py b/src/sage/misc/replace_dot_all.py index 9a62534c714..0ea979ec152 100644 --- a/src/sage/misc/replace_dot_all.py +++ b/src/sage/misc/replace_dot_all.py @@ -69,9 +69,11 @@ def parse_arguments(): parser = argparse.ArgumentParser() # Optional arguments parser.add_argument( - "-l", "--location", - help=("Location of directory or file (root set at src/sage so input path from here). " - "If no argument given, walks through all files in src/sage."), + "location", + metavar='files or directories', + nargs='*', + help=("Names of source directory or source file. " + "If none given, walks through all files in src/sage."), type=str) parser.add_argument( "-v", "--verbose", @@ -413,24 +415,18 @@ def walkdir_replace_dot_all(dir, fileRegex, package_regex, verbose=False): sage: regex = r"from\s+sage(|[.](arith|categories|combinat|ext|graphs(|[.]decompositions)|interfaces|libs|matrix|misc|numerical(|[.]backends)|rings|sets))[.]all\s+import" sage: walkdir_replace_dot_all(dir, fileRegex, regex) """ - global numberFiles, numberFilesMatchingRegex, numberFilesChanged, numberStatementsReplaced, log_messages + global numberFiles, numberFilesMatchingRegex pattern = re.compile(fileRegex) - for root, dirs, files in os.walk(".", topdown=False): + for root, dirs, files in os.walk(dir, topdown=False): for name in files: numberFiles += 1 if pattern.search(name): numberFilesMatchingRegex += 1 - location = os.path.join(root, name)[1:] + location = os.path.join(root, name) if location.find('replace_dot_all') == -1: # to avoid changing anything in this file itself - make_replacements_in_file(dir + location, package_regex, verbose) - if verbosity: - print_log_messages() - report = (f'REPORT:\n' - f'Number of files checked: {numberFiles}\n' - f'Number of files matching regex: {numberFilesMatchingRegex}\n' - f'Number of files changed: {numberFilesChanged}\n' - f'Number of import statements replaced: {numberStatementsReplaced}') - print('*'*100 + '\n' + report + '\n' + '*'*100) + make_replacements_in_file(location, package_regex, verbose) + + def print_log_messages(): @@ -465,16 +461,25 @@ def print_log_messages(): fileRegex = r'.*[.](py|pyx|pxi)$' package_regex = None # Execute the main function based on the specified location and verbosity - if args.location is None: - os.chdir(sage.env.SAGE_SRC + '/sage') # change to sage directory - dir = os.getcwd() # Get the current working directory - walkdir_replace_dot_all(dir, fileRegex, package_regex, verbose=verbosity) - elif not (args.location.endswith('.py') or args.location.endswith('.pxi')): - # Assume directory - os.chdir(sage.env.SAGE_SRC + '/sage/' + args.location) # change to directory specified by location argument - dir = os.getcwd() # Get the current working directory - walkdir_replace_dot_all(dir, fileRegex, package_regex, verbose=verbosity) - else: - # make replacements in file specified by location argument - make_replacements_in_file(sage.env.SAGE_SRC + '/sage/' + args.location, package_regex, verbose=verbosity) + if not args.location: + args.location = [sage.env.SAGE_SRC + '/sage'] + try: + for location in args.location: + if not (location.endswith('.py') or location.endswith('.pxi')): + # Assume directory + walkdir_replace_dot_all(location, fileRegex, package_regex, verbose=verbosity) + else: + # make replacements in file specified by location argument + make_replacements_in_file(location, package_regex, verbose=verbosity) + finally: + # Print report also when interrupted + if verbosity: + print_log_messages() + report = 'REPORT:\n' + report += f'Number of files checked: {numberFiles}\n' + report += f'Number of files matching regex: {numberFilesMatchingRegex}\n' + report += f'Number of files changed: {numberFilesChanged}\n' + report += f'Number of import statements replaced: {numberStatementsReplaced}' + print('*'*100 + '\n' + report + '\n' + '*'*100) + # ************************************************************************************************************************************************************************