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