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