From 27cfa96884019b646ca5123d64b5b08e596ceb6b Mon Sep 17 00:00:00 2001
From: Anders Blomdell <anders.blomdell@control.lth.se>
Date: Wed, 22 Sep 2010 10:49:32 +0100
Subject: [PATCH] Version 2010-09-22 11:49

---
 src/mio.py            | 53 +++++++++++++++++++++++++++++++++++++++++++
 src/mio/installer.py  | 50 ++--------------------------------------
 src/mio/repository.py |  8 ++++++-
 3 files changed, 62 insertions(+), 49 deletions(-)

diff --git a/src/mio.py b/src/mio.py
index a0c1a28..74c310e 100755
--- a/src/mio.py
+++ b/src/mio.py
@@ -5,6 +5,7 @@ import mio.log
 import mio.transform
 import mio.parser
 import mio.repository
+import mio.node
 import optparse
 import os
 import os.path
@@ -101,6 +102,10 @@ if __name__ == '__main__':
                          action="count", default=0,
                          dest="quiet", 
                          help="decrease verbosity")
+    optParser.add_option("--reachable-files",
+                         action="append", default=[],
+                         metavar="XML",
+                         help="list files reachable from XML")
     optParser.add_option("--test",
                          action="append", default=[],
                          metavar="TARGET",
@@ -139,6 +144,54 @@ if __name__ == '__main__':
             for r in error[e]:
                 print "  from: '%s' in %s:%s" % (r.name[0], r._url, r._line)
 
+    if options.reachable_files:
+        # List all files reachable from the given source files
+        reachable_rules = mio.repository.Repository(find_and_parse,
+                                                    lambda x:x.startswith('@'))
+        for url in options.reachable_files:
+            parse(url, reachable_rules)
+            pass
+        
+        error = {}
+        log(VERBOSE, "Reachable targets:")
+        files = {}
+        for g in reachable_rules.get_all(error):
+            installer = mio.installer.Installer(reachable_rules)
+            log(VERBOSE, "Scanning: %s" % g.name[0])
+            installer.add_group(g.name[0])
+            for f in installer.file:
+                if f.decl.source[0] == "":
+                    # Exists in target system, used to change protection
+                    continue
+                if mio.node.parse_boolean(f.decl.delete[0]):
+                    # Might exists in target system, but should be deleted
+                    continue
+                source = f.decl.source[0] or f.decl.name[0]
+                path = "%s%s" % (f.decl.files[0:],source)
+                try:
+                    files[path].append(f.name)
+                except KeyError:
+                    files[path] = [ f.name ]
+                pass
+            pass
+        
+        if not error:
+            keys = files.keys()
+            keys.sort()
+            for k in keys:
+                print k
+            pass
+        else:
+            for e in error:
+                print "Unresolved group: '%s'" % e
+                for r in error[e]:
+                    print "  from: '%s' in %s:%s" % (r.name[0],
+                                                     r._url, r._line)
+                    pass
+                pass
+            pass
+        pass
+
     if options.test:
         installer = mio.installer.Installer(rules)
         for g in options.test:
diff --git a/src/mio/installer.py b/src/mio/installer.py
index f83ad4f..7bac095 100755
--- a/src/mio/installer.py
+++ b/src/mio/installer.py
@@ -18,6 +18,8 @@ class Installer:
         
     def add_group(self, name, exclude=[], chain=[]):
         g = self.repository.get(name)
+        if g == None:
+            return
         exclude = exclusion_closure(exclude, g._parent)
         exclude = exclusion_closure(exclude, g)
         group = group_node(g.name[0], g, self)
@@ -83,54 +85,6 @@ class Installer:
 
                 else:
                     raise Exception("unknown tag '%s'" % node._tag)
-            """
-            for a in g._pre_:
-                # Add pre actions
-                if a.command[0]:
-                    group.add_pre(command_node(a))
-                if a.script[0]:
-                    group.add_pre(script_node(a))
-
-            for a in g._post_:
-                # Add post actions
-                if a.command[0]:
-                    group.add_post(command_node(a))
-                if a.script[0]:
-                    group.add_post(script_node(a))
-
-            for target in g._rpm_:
-                # Add rpms
-                rpm = rpm_node(target.name[0], target, group)
-                if rpm in exclude:
-                    mio.log.log(CHATTY, "excluding rpm '%s'" % target.name[0])
-                else:
-                    group.add_rpm(rpm)
-
-            for target in g._dir_:
-                # Add directories
-                dir = dir_node(target.name[0], target, group)
-                if dir in exclude:
-                    mio.log.log(CHATTY, "excluding dir '%s'" % target.name[0])
-                else:
-                    group.add_dir(dir)
-
-            for target in g._symlink_:
-                # Add symlinks
-                symlink = symlink_node(target.name[0], target, group)
-                if symlink in exclude:
-                    mio.log.log(CHATTY, "excluding symlink '%s'" %
-                                target.name[0])
-                else:
-                    group.add_symlink(symlink)
-
-            for target in g._file_:
-                # Add files
-                file = file_node(target.name[0], target, group)
-                if file in exclude:
-                    mio.log.log(CHATTY, "excluding file '%s'" % target.name[0])
-                else:
-                    group.add_file(file)
-            """
                     
             if group in self.group:
                 (old_group, old_chain) = self.group[group][0]
diff --git a/src/mio/repository.py b/src/mio/repository.py
index ec90316..34d6eb1 100755
--- a/src/mio/repository.py
+++ b/src/mio/repository.py
@@ -7,9 +7,11 @@ import sys
 from mio.exception import *
 
 class Repository:
-    def __init__(self, parser):
+    def __init__(self, parser, filter=lambda x: False):
         self.parser = parser
         self.group = {}
+        self.filter = filter
+        
 
     def add(self, group):
         for g in group:
@@ -26,6 +28,8 @@ class Repository:
             g._url = None
             target = g
         name = target.name[0]
+        if self.filter(name):
+            return None
         if not self.group.has_key(name):
             # Try to locate target (look in target and default path)
             self.parser(name, self, target._url)
@@ -55,6 +59,8 @@ class Repository:
             if not t.name[0] in done:
                 done[t.name[0]] = 1
                 g = self.get(t)
+                if g == None:
+                    continue
                 result.append(g)
                 try:
                     d = g._dependency_
-- 
GitLab