Index: recipe_engine/third_party/setuptools/command/rotate.py |
diff --git a/recipe_engine/third_party/setuptools/command/rotate.py b/recipe_engine/third_party/setuptools/command/rotate.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..1b073620ea4b9bcfa383f558fb14bcba2a771d7f |
--- /dev/null |
+++ b/recipe_engine/third_party/setuptools/command/rotate.py |
@@ -0,0 +1,61 @@ |
+from distutils.util import convert_path |
+from distutils import log |
+from distutils.errors import DistutilsOptionError |
+import os |
+ |
+from setuptools import Command |
+from setuptools.compat import basestring |
+ |
+ |
+class rotate(Command): |
+ """Delete older distributions""" |
+ |
+ description = "delete older distributions, keeping N newest files" |
+ user_options = [ |
+ ('match=', 'm', "patterns to match (required)"), |
+ ('dist-dir=', 'd', "directory where the distributions are"), |
+ ('keep=', 'k', "number of matching distributions to keep"), |
+ ] |
+ |
+ boolean_options = [] |
+ |
+ def initialize_options(self): |
+ self.match = None |
+ self.dist_dir = None |
+ self.keep = None |
+ |
+ def finalize_options(self): |
+ if self.match is None: |
+ raise DistutilsOptionError( |
+ "Must specify one or more (comma-separated) match patterns " |
+ "(e.g. '.zip' or '.egg')" |
+ ) |
+ if self.keep is None: |
+ raise DistutilsOptionError("Must specify number of files to keep") |
+ try: |
+ self.keep = int(self.keep) |
+ except ValueError: |
+ raise DistutilsOptionError("--keep must be an integer") |
+ if isinstance(self.match, basestring): |
+ self.match = [ |
+ convert_path(p.strip()) for p in self.match.split(',') |
+ ] |
+ self.set_undefined_options('bdist', ('dist_dir', 'dist_dir')) |
+ |
+ def run(self): |
+ self.run_command("egg_info") |
+ from glob import glob |
+ |
+ for pattern in self.match: |
+ pattern = self.distribution.get_name() + '*' + pattern |
+ files = glob(os.path.join(self.dist_dir, pattern)) |
+ files = [(os.path.getmtime(f), f) for f in files] |
+ files.sort() |
+ files.reverse() |
+ |
+ log.info("%d file(s) matching %s", len(files), pattern) |
+ files = files[self.keep:] |
+ for (t, f) in files: |
+ log.info("Deleting %s", f) |
+ if not self.dry_run: |
+ os.unlink(f) |