From afdea1fb9ebf3207ba9751928f10a07e31706e52 Mon Sep 17 00:00:00 2001 From: stan Date: Wed, 26 Feb 2025 21:18:30 +0000 Subject: [PATCH 1/2] Initial addition based on zipfile's implementation --- Lib/{shutil.py => shutil/__init__.py} | 36 +++++++++++++++++++++++++++ Lib/shutil/__main__.py | 4 +++ 2 files changed, 40 insertions(+) rename Lib/{shutil.py => shutil/__init__.py} (97%) create mode 100644 Lib/shutil/__main__.py diff --git a/Lib/shutil.py b/Lib/shutil/__init__.py similarity index 97% rename from Lib/shutil.py rename to Lib/shutil/__init__.py index 510ae8c6f22d59..4e661432efae67 100644 --- a/Lib/shutil.py +++ b/Lib/shutil/__init__.py @@ -1648,3 +1648,39 @@ def __getattr__(name): ) return RuntimeError raise AttributeError(f"module {__name__!r} has no attribute {name!r}") + +def main(): + import argparse + + description = 'A simple command-line interface for the shutil module.' + parser = argparse.ArgumentParser(description=description) + + group = parser.add_mutually_exclusive_group(required=True) + group.add_argument('-c', '--copy2', nargs=2, metavar=('', ''), help="Copy a file, preserving metadata") + group.add_argument('-m', '--move', nargs=2, metavar=('', ''), help="Move a file or directory") + group.add_argument('-r', '--rmtree', metavar='', help="Remove a directory tree") + group.add_argument('-C', '--copytree', nargs=2, metavar=('', ''), help="Recursively copy a directory") + group.add_argument('-a', '--make-archive', nargs=3, metavar=('', '', ''), help="Create an archive (zip/tar)") + group.add_argument('-x', '--unpack-archive', nargs=2, metavar=('', ''), help="Extract an archive") + group.add_argument('-d', '--disk-usage', metavar='', help="Show disk usage for a directory") + group.add_argument('-w', '--which', metavar='', help="Locate an executable in PATH") + + args = parser.parse_args() + + if args.copy2: + copy2(*args.copy2) + elif args.move: + move(*args.move) + elif args.rmtree: + rmtree(args.rmtree) + elif args.copytree: + copytree(*args.copytree) + elif args.make_archive: + make_archive(*args.make_archive) + elif args.unpack_archive: + unpack_archive(*args.unpack_archive) + elif args.disk_usage: + usage = disk_usage(args.disk_usage) + print(f"Total: {usage.total}, Used: {usage.used}, Free: {usage.free}") + elif args.which: + print(which(args.which)) \ No newline at end of file diff --git a/Lib/shutil/__main__.py b/Lib/shutil/__main__.py new file mode 100644 index 00000000000000..878197ea700cc8 --- /dev/null +++ b/Lib/shutil/__main__.py @@ -0,0 +1,4 @@ +from . import main + +if __name__ == "__main__": + main() \ No newline at end of file From 5611711ed3d22f2925e1af60fcafb4b7b17a39f4 Mon Sep 17 00:00:00 2001 From: stan Date: Wed, 26 Feb 2025 21:25:16 +0000 Subject: [PATCH 2/2] 80 chars and add a few more --- Lib/shutil/__init__.py | 39 ++++++++++++++++++++++++++++++--------- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/Lib/shutil/__init__.py b/Lib/shutil/__init__.py index 4e661432efae67..f41e4474654b61 100644 --- a/Lib/shutil/__init__.py +++ b/Lib/shutil/__init__.py @@ -1656,18 +1656,39 @@ def main(): parser = argparse.ArgumentParser(description=description) group = parser.add_mutually_exclusive_group(required=True) - group.add_argument('-c', '--copy2', nargs=2, metavar=('', ''), help="Copy a file, preserving metadata") - group.add_argument('-m', '--move', nargs=2, metavar=('', ''), help="Move a file or directory") - group.add_argument('-r', '--rmtree', metavar='', help="Remove a directory tree") - group.add_argument('-C', '--copytree', nargs=2, metavar=('', ''), help="Recursively copy a directory") - group.add_argument('-a', '--make-archive', nargs=3, metavar=('', '', ''), help="Create an archive (zip/tar)") - group.add_argument('-x', '--unpack-archive', nargs=2, metavar=('', ''), help="Extract an archive") - group.add_argument('-d', '--disk-usage', metavar='', help="Show disk usage for a directory") - group.add_argument('-w', '--which', metavar='', help="Locate an executable in PATH") + group.add_argument('-c', '--copy', nargs=2, + metavar=('', ''), + help="Copy a file") + group.add_argument('-c', '--copy2', nargs=2, + metavar=('', ''), + help="Copy a file, preserving metadata") + group.add_argument('-m', '--move', nargs=2, + metavar=('', ''), + help="Move a file or directory") + group.add_argument('-r', '--rmtree', + metavar='', + help="Remove a directory tree") + group.add_argument('-C', '--copytree', nargs=2, + metavar=('', ''), + help="Recursively copy a directory") + group.add_argument('-a', '--make-archive', nargs=3, + metavar=('', '', ''), + help="Create an archive (zip/tar)") + group.add_argument('-x', '--unpack-archive', nargs=2, + metavar=('', ''), + help="Extract an archive") + group.add_argument('-d', '--disk-usage', + metavar='', + help="Show disk usage for a directory") + group.add_argument('-w', '--which', + metavar='', + help="Locate an executable in PATH") args = parser.parse_args() - if args.copy2: + if args.copy: + copy(*args.copy) + elif args.copy2: copy2(*args.copy2) elif args.move: move(*args.move)