--- yum/igroups.py | 134 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 130 insertions(+), 4 deletions(-)
diff --git a/yum/igroups.py b/yum/igroups.py index 625ee66..6a04f3a 100644 --- a/yum/igroups.py +++ b/yum/igroups.py @@ -13,7 +13,7 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # -# Copyright 2010 Red Hat +# Copyright 2010, 2012 Red Hat # # James Antill <ja...@fedoraproject.org> @@ -25,6 +25,7 @@ class InstalledGroup(object): def __init__(self, gid): self.gid = gid self.pkg_names = set() + self.environment = None def __cmp__(self, other): if other is None: @@ -40,12 +41,36 @@ class InstalledGroup(object): return sorted(pkg_names.difference(self.pkg_names)) +class InstalledEnvironment(object): + def __init__(self, evgid): + self.evgid = evgid + self.grp_names = set() + + def __cmp__(self, other): + if other is None: + return 1 + return cmp(self.evgid, other.evgid) + + def _additions(self, grp_names): + grp_names = set(grp_names) + return sorted(grp_names.difference(self.grp_names)) + + def _removals(self, grp_names): + grp_names = set(grp_names) + return sorted(grp_names.difference(self.grp_names)) + + class InstalledGroups(object): def __init__(self, db_path): - self.filename = db_path + "/installed" self.groups = {} self.changed = False + self.environments = {} + + self._read_pkg_grps(db_path) + self._read_grp_grps(db_path) + def _read_pkg_grps(self, db_path): + self.filename = db_path + "/installed" if not os.access(self.filename, os.R_OK): return @@ -69,6 +94,38 @@ class InstalledGroups(object): num -= 1 grp.pkg_names.add(_read_str(fo)) + def _read_grp_grps(self, db_path): + self.grp_filename = db_path + "/environment" + if not os.access(self.grp_filename, os.R_OK): + return + + def _read_str(fo): + return fo.readline()[:-1] + + fo = open(self.grp_filename) + ver = int(_read_str(fo)) + if ver != 1: + return + + groups_num = int(_read_str(fo)) + while groups_num > 0: + groups_num -= 1 + + evgrp = InstalledEnvironment(_read_str(fo)) + self.environments[evgrp.evgid] = evgrp + + num = int(_read_str(fo)) + while num > 0: + num -= 1 + grpname = _read_str(fo) + memb = _read_str(fo) + evgrp.grp_names.add(grpname) + assert memb in ('true', 'false') + if memb == 'true': + assert grpname in self.groups + if grpname in self.groups: + self.groups[grpname].environment = evgrp.evgid + def close(self): pass @@ -87,6 +144,12 @@ class InstalledGroups(object): if not os.access(db_path, os.W_OK): return False + self._write_pkg_grps() + self._write_grp_grps() + + self.changed = False + + def _write_pkg_grps(self): fo = open(self.filename + '.tmp', 'w') fo.write("1\n") # version @@ -98,9 +161,26 @@ class InstalledGroups(object): fo.write("%s\n" % pkgname) fo.close() os.rename(self.filename + '.tmp', self.filename) - self.changed = False - def add_group(self, groupid, pkg_names): + def _write_grp_grps(self): + fo = open(self.grp_filename + '.tmp', 'w') + + fo.write("1\n") # version + fo.write("%u\n" % len(self.environments)) + for evgrp in sorted(self.environments.values()): + fo.write("%s\n" % evgrp.evgid) + fo.write("%u\n" % len(evgrp.grp_names)) + for grpname in sorted(evgrp.grp_names): + fo.write("%s\n" % grpname) + if self.groups[grpname].environment == evgrp.evgid: + fo.write("%s\n" % "true") + else: + fo.write("%s\n" % "false") + + fo.close() + os.rename(self.grp_filename + '.tmp', self.grp_filename) + + def add_group(self, groupid, pkg_names, ievgrp=None): self.changed = True if groupid not in self.groups: @@ -110,6 +190,11 @@ class InstalledGroups(object): for pkg_name in pkg_names: grp.pkg_names.add(pkg_name) + if ievgrp is not None: + grp.environment = ievgrp.evgid + ievgrp.grp_names.add(groupid) + return grp + def del_group(self, groupid): self.changed = True @@ -139,3 +224,44 @@ class InstalledGroups(object): break return returns.values() + + def add_environment(self, evgroupid, grp_names): + self.changed = True + + if evgroupid not in self.environments: + self.environments[evgroupid] = InstalledEnvironment(evgroupid) + grp = self.environments[evgroupid] + + for grp_name in grp_names: + grp.grp_names.add(grp_name) + return grp + + def del_environment(self, evgroupid): + self.changed = True + + if evgroupid in self.environments: + del self.environments[evgroupid] + + def return_environments(self, evgroup_pattern, case_sensitive=False): + returns = {} + + for item in evgroup_pattern.split(','): + item = item.strip() + if item in self.environments: + thisgroup = self.environments[item] + returns[thisgroup.evgid] = thisgroup + continue + + if case_sensitive: + match = re.compile(fnmatch.translate(item)).match + else: + match = re.compile(fnmatch.translate(item), flags=re.I).match + + done = False + for group in self.environments.values(): + if match(group.evgid): + done = True + returns[group.evgid] = group + break + + return returns.values() -- 1.7.6.5 _______________________________________________ Yum-devel mailing list Yum-devel@lists.baseurl.org http://lists.baseurl.org/mailman/listinfo/yum-devel