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'))