commit:     a83efe19256bf9d63a5039e7448155531cf56ee3
Author:     Anthony G. Basile <blueness <AT> gentoo <DOT> org>
AuthorDate: Thu Jul  9 23:08:08 2015 +0000
Commit:     Anthony G. Basile <blueness <AT> gentoo <DOT> org>
CommitDate: Thu Jul  9 23:08:08 2015 +0000
URL:        https://gitweb.gentoo.org/proj/grss.git/commit/?id=a83efe19

grs/Rotator.py: document and improve.

 grs/Log.py         |  6 ++----
 grs/PivotChroot.py |  3 +--
 grs/Rotator.py     | 38 ++++++++++++++++++++++++++++++++------
 grs/Seed.py        |  4 +---
 tests/test-log.py  | 31 +++++++++++++++++++++----------
 5 files changed, 57 insertions(+), 25 deletions(-)

diff --git a/grs/Log.py b/grs/Log.py
index 201eeb9..5a87a92 100644
--- a/grs/Log.py
+++ b/grs/Log.py
@@ -26,8 +26,6 @@ class Log(Rotator):
             f.write('%s\n' % msg)
 
 
-    def rotate_logs(self):
-        self.rotate(self.logfile)
-        if os.path.isfile(self.logfile):
-            shutil.move(self.logfile, '%s.0' % self.logfile)
+    def rotate_logs(self, upper_limit = 20):
+        self.full_rotate(self.logfile, upper_limit=upper_limit)
         open('%s' % self.logfile, 'a').close()

diff --git a/grs/PivotChroot.py b/grs/PivotChroot.py
index ff0fb69..cbfb29f 100644
--- a/grs/PivotChroot.py
+++ b/grs/PivotChroot.py
@@ -35,8 +35,7 @@ class PivotChroot(Rotator):
 
         # Move portage_configroot out of the way to system.0,
         # then pivot out the inner chroot to system.
-        self.rotate(self.portage_configroot)
-        shutil.move(self.portage_configroot, '%s.0' % self.portage_configroot)
+        self.full_rotate(self.portage_configroot)
         inner_chroot = os.path.join('%s.0' % self.portage_configroot, 
subchroot)
         shutil.move(inner_chroot, os.path.join(self.tmpdir, 'system'))
 

diff --git a/grs/Rotator.py b/grs/Rotator.py
index d82c9fd..0dccdf8 100644
--- a/grs/Rotator.py
+++ b/grs/Rotator.py
@@ -2,16 +2,29 @@
 
 import glob
 import re
+import os
 import shutil
 
 class Rotator():
-    """ doc here
-        more doc
-    """
+    """ Super class for rotating files or directories.  """
 
-    def rotate(self, obj):
-        """ doc here
-            more doc
+    def rotate(self, obj, upper_limit = 20):
+        """ Does the work of rotating objects fitting the pattern obj.(d+).
+
+            obj -> The absolute path to the objects to be rotated.  The
+            obj's are assumed to have a pattern obj.(d+) and does NOT
+            include a bare obj not followed by a decimal.  (For that,
+            use full_rotate() below).  Note that gaps in numbers are
+            are preserved.  Eg.
+
+                Old Name        New Name
+                log             (untouched)
+                log.0           log.1
+                log.1           log.2
+                log.3           log.4 (Note the gap is preserved.)
+                log.4           log.5
+
+            obj's paste an upper limit are deleted.
         """
         objs = glob.glob('%s.*' % obj)
         indexed_obj = {}
@@ -23,6 +36,19 @@ class Rotator():
         count.reverse()
         for c in count:
             current_obj = indexed_obj[c]
+            if c >= upper_limit:
+                try:
+                    shutil.rmtree(current_obj)
+                except NotADirectoryError:
+                    os.unlink(current_obj)
+                continue
             m = re.search('^(.+)\.\d+$', current_obj)
             next_obj = '%s.%d' % (m.group(1), c+1)
             shutil.move(current_obj, next_obj)
+
+
+    def full_rotate(self, obj, upper_limit = 20):
+        """ Rotate both obj and obj.(d+). """
+        self.rotate(obj, upper_limit = upper_limit)
+        if os.path.exists(obj):
+            shutil.move(obj, '%s.0' % obj)

diff --git a/grs/Seed.py b/grs/Seed.py
index aad5d20..1ce5f48 100644
--- a/grs/Seed.py
+++ b/grs/Seed.py
@@ -35,9 +35,7 @@ class Seed(Rotator):
         """
         # Rotate the old portage_configroot and package out of the way
         for directory in [self.portage_configroot, self.package]:
-            self.rotate(directory)
-            if os.path.isdir(directory):
-                shutil.move(directory, '%s.0' % directory)
+            self.full_rotate(directory)
             os.makedirs(directory, mode=0o755, exist_ok=False)
 
         # Download a stage tarball if we don't have one

diff --git a/tests/test-log.py b/tests/test-log.py
index f132ca0..b419fbb 100755
--- a/tests/test-log.py
+++ b/tests/test-log.py
@@ -10,16 +10,10 @@ from grs import Log
 
 logdir = '/tmp/test-log'
 
-def doit(stamped = False):
-    if os.path.isdir(logdir):
-        shutil.rmtree(logdir)
-    os.makedirs(logdir)
-    logfile = os.path.join(logdir, 'test.log')
-
-    lo = Log(logfile)
+def doit(lo, stamped = False):
+    # Create a log with knowing contents and rotate 3 times.
     for i in range(10):
         lo.log('first %d' % i, stamped)
-
     lo.rotate_logs()
     lo.rotate_logs()
     lo.rotate_logs()
@@ -28,6 +22,7 @@ def doit(stamped = False):
 
 
 def hashtest(expect_pass = True):
+    # Hash up our log and three rotations.  Do we get what we expected?
     m = hashlib.md5()
     for i in [ '', '.0', '.1', '.2']:
         log = os.path.join(logdir, 'test.log%s' % i)
@@ -39,7 +34,23 @@ def hashtest(expect_pass = True):
         assert(m.hexdigest() != '485b8bf3a9e08bd5ccfdff7e1a8fe4e1')
 
 if __name__ == "__main__":
-    doit(stamped=False)
+    if os.path.isdir(logdir):
+        shutil.rmtree(logdir)
+    os.makedirs(logdir)
+    logfile = os.path.join(logdir, 'test.log')
+    lo = Log(logfile)
+
+    doit(lo, stamped=False)
     hashtest(expect_pass=True)
-    doit(stamped=True)
+    doit(lo, stamped=True)
     hashtest(expect_pass=False)
+
+    # Make sure we're dropping past the upper limit.
+    lo.rotate_logs(upper_limit=2)
+    assert(os.path.isfile(logfile))
+    assert(os.path.isfile(logfile+'.0'))
+    assert(os.path.isfile(logfile+'.1'))
+    assert(os.path.isfile(logfile+'.2'))
+    assert(not os.path.isfile(logfile+'.3'))
+    assert(not os.path.isfile(logfile+'.4'))
+    assert(not os.path.isfile(logfile+'.5'))

Reply via email to