---
 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

Reply via email to