From 04f2e28dacae29e181564d856e8b12e4e1f5d1e2 Mon Sep 17 00:00:00 2001 From: Anders Blomdell <anders.blomdell@control.lth.se> Date: Mon, 4 Feb 2008 13:00:51 +0100 Subject: [PATCH] Version 2008-02-04 13:00 --- src/mio.py | 25 +++++++++++++++++-------- src/mio/installer.py | 6 +++--- src/mio/node.py | 41 ++++++++++++++++++++++++++--------------- src/mio/repository.py | 7 ++++++- 4 files changed, 52 insertions(+), 27 deletions(-) diff --git a/src/mio.py b/src/mio.py index 468aec8..bde8a13 100755 --- a/src/mio.py +++ b/src/mio.py @@ -66,21 +66,25 @@ def find_and_parse(target, builder, url=None): if __name__ == '__main__': optParser = VerboseOptionParser(usage="%prog [options] targets*") + optParser.add_option("--backup", + action="store", + metavar="DIR", + help="saved a backup of changed files in DIR") + optParser.add_option("--backup-suffix", + action="store", + metavar="SUFFIX", + help="append SUFFIX to backup files") + optParser.add_option("--dump", + action="store_true", default=False, + help="when listing, dump XML tree") optParser.add_option("--install", action="append", default=[], metavar="TARGET", help="install TARGET") - optParser.add_option("--test", - action="append", default=[], - metavar="TARGET", - help="test TARGET") optParser.add_option("-l","--list", action="append", default=[], metavar="XML", help="list available targets in XML") - optParser.add_option("--dump", - action="store_true", default=False, - help="when listing, dump XML tree") optParser.add_option("--noyum", action="store_true", help="don't run yum (rpms will not be installed)") @@ -96,6 +100,10 @@ if __name__ == '__main__': action="count", default=0, dest="quiet", help="decrease verbosity") + optParser.add_option("--test", + action="append", default=[], + metavar="TARGET", + help="test TARGET") optParser.add_option("-v","--verbose", action="count", dest="verbose", default=0, @@ -147,5 +155,6 @@ if __name__ == '__main__': installer.install_rpms(options.path) log(NORMAL, "Installing files") - installer.install_groups(options.prefix) + installer.install_groups(options.prefix, + (options.backup, options.backup_suffix)) diff --git a/src/mio/installer.py b/src/mio/installer.py index 8d05d5c..9bd4509 100755 --- a/src/mio/installer.py +++ b/src/mio/installer.py @@ -15,7 +15,7 @@ class Installer: self.dir = {} self.file = {} self.symlink = {} - + def add_group(self, name, exclude=[], chain=[]): g = self.repository.get(name) exclude = exclusion_closure(exclude, g._parent) @@ -158,9 +158,9 @@ class Installer: for r in self.rpm: r.new_version = version_db[r.name] - def install_groups(self, prefix): + def install_groups(self, prefix, backup): for g in self.group: - g.install(prefix) + g.install(prefix, backup) def test_rpms(self, path): pass diff --git a/src/mio/node.py b/src/mio/node.py index 25a417c..86d67dc 100755 --- a/src/mio/node.py +++ b/src/mio/node.py @@ -48,10 +48,10 @@ class target_node: mio.exception.Report(e, self.decl) return self.is_trigged - def install(self, prefix): + def install(self, prefix, backup): if self.trigged(prefix) and not self.is_installed: self.is_installed = True - self.do_install(prefix) + self.do_install(prefix, backup) def test(self, prefix): @@ -105,13 +105,13 @@ class group_node(target_node): return True return False - def do_install(self, prefix): + def do_install(self, prefix, backup): for d in self.dependency: - d.install(prefix) + d.install(prefix, backup) for a in self.pre: a.run("pre") for t in self.target: - t.install(prefix) + t.install(prefix, backup) for a in self.post: a.run("post") @@ -137,7 +137,7 @@ class rpm_node(target_node): pass return result - def do_install(self, prefix): + def do_install(self, prefix, backup): pass def do_test(self, prefix): @@ -181,7 +181,7 @@ class dir_node(target_node): return result - def do_install(self, prefix): + def do_install(self, prefix, backup): for a in self.action: try: log(NORMAL, declaration(self), "%s '%s'" % @@ -290,12 +290,12 @@ class file_node(target_node): return result - def do_install(self, prefix): + def do_install(self, prefix, backup): for a in self.action: try: log(NORMAL, declaration(self), "%s '%s'" % (a.im_func.__name__, self.target)) - a() + a(backup) except Exception, e: mio.exception.Report(e, self.decl, a) @@ -307,10 +307,21 @@ class file_node(target_node): except Exception, e: mio.exception.Report(e, self.decl, a) - def unlink(self): + def unlink(self, backup): os.unlink(self.target) - def copy(self): + def copy(self, backup): + if backup[0] and os.path.exists(self.target): + backup_name = "%s/%s" % (backup[0], self.decl.name[0]) + if backup[1]: + backup_name += backup[1] + print "DO backup %s -> %s" % (self.target, backup_name) + dir = os.path.dirname(backup_name) + if not os.path.isdir(dir): + dirmode = mio.util.dirmode(self.decl._parent) + os.makedirs(dir, dirmode) + shutil.copyfile(self.target, backup_name) + dir = os.path.dirname(self.target) if not os.path.isdir(dir): dirmode = mio.util.dirmode(self.decl._parent) @@ -319,14 +330,14 @@ class file_node(target_node): # Copy file shutil.copyfile(self.source, self.target) - def chmod(self): + def chmod(self, backup): os.chmod(self.target, self.mode) - def chown(self): + def chown(self, backup): # Change owner and group os.chown(self.target, self.uid, self.gid) - def mtime(self): + def mtime(self, backup): # Propagate mtime (and atime) stat = os.stat(self.source) os.utime(self.target, (stat.st_atime, stat.st_mtime)) @@ -381,7 +392,7 @@ class symlink_node(target_node): raise Exception("Should never come here") - def do_install(self, prefix): + def do_install(self, prefix, backup): for a in self.action: try: log(NORMAL, declaration(self), "%s '%s'" % diff --git a/src/mio/repository.py b/src/mio/repository.py index ea260f6..ec90316 100755 --- a/src/mio/repository.py +++ b/src/mio/repository.py @@ -70,4 +70,9 @@ class Repository: return result def by_name(a,b): - return a.name[0].__cmp__(b.name[0]) + if a.name[0] < b.name[0]: + return -1 + elif a.name[0] == b.name[0]: + return 0 + else: + return 1 -- GitLab