Split out 2 reusable functions from fixdbentries and put them in a new portage_update...
authorZac Medico <zmedico@gentoo.org>
Sun, 19 Feb 2006 22:55:47 +0000 (22:55 -0000)
committerZac Medico <zmedico@gentoo.org>
Sun, 19 Feb 2006 22:55:47 +0000 (22:55 -0000)
svn path=/main/trunk/; revision=2750

pym/portage.py
pym/portage_update.py [new file with mode: 0644]

index 5f260b133dec33e0bdfa8002839ee4a4e1c57ea3..8b3f289cdb5c18d4795f8a336f68b05fc66fa6c2 100644 (file)
@@ -106,6 +106,7 @@ try:
        from portage_checksum import perform_md5,perform_checksum,prelink_capable
        import eclass_cache
        from portage_localization import _
+       from portage_update import fixdbentries
 
        # Need these functions directly in portage namespace to not break every external tool in existence
        from portage_versions import ververify,vercmp,catsplit,catpkgsplit,pkgsplit,pkgcmp
@@ -3651,32 +3652,6 @@ def getmaskingstatus(mycpv):
                rValue.append(kmask+" keyword")
        return rValue
 
-def fixdbentries(update_iter, dbdir):
-       """Performs update commands which result in search and replace operations
-       for each of the files in dbdir (excluding CONTENTS and environment.bz2).
-       Returns True when actual modifications are necessary and False otherwise."""
-       modified = False
-       for myfile in [f for f in os.listdir(dbdir) if f not in ("CONTENTS", "environment.bz2")]:
-               file_path = os.path.join(dbdir, myfile)
-               f = open(file_path, "r")
-               mycontent = f.read()
-               f.close()
-               orig_content = mycontent
-               for update_cmd in update_iter:
-                       if update_cmd[0] == "move":
-                               old_value, new_value = update_cmd[1], update_cmd[2]
-                               if not mycontent.count(old_value):
-                                       continue
-                               old_value = re.escape(old_value);
-                               mycontent = re.sub(old_value+"$", new_value, mycontent)
-                               mycontent = re.sub(old_value+"(\\s)", new_value+"\\1", mycontent)
-                               mycontent = re.sub(old_value+"(-[^a-zA-Z])", new_value+"\\1", mycontent)
-                               mycontent = re.sub(old_value+"([^a-zA-Z0-9-])", new_value+"\\1", mycontent)
-               if mycontent is not orig_content:
-                       write_atomic(file_path, mycontent)
-                       modified = True
-       return modified
-
 class packagetree:
        def __init__(self,virtual,clone=None):
                if clone:
diff --git a/pym/portage_update.py b/pym/portage_update.py
new file mode 100644 (file)
index 0000000..0aadae1
--- /dev/null
@@ -0,0 +1,46 @@
+
+import os, re
+
+from portage_util import write_atomic
+
+ignored_dbentries = ("CONTENTS", "environment.bz2")
+
+def update_dbentry(update_cmd, mycontent):
+       if update_cmd[0] == "move":
+               old_value, new_value = update_cmd[1], update_cmd[2]
+               if mycontent.count(old_value):
+                       old_value = re.escape(old_value);
+                       mycontent = re.sub(old_value+"$", new_value, mycontent)
+                       mycontent = re.sub(old_value+"(\\s)", new_value+"\\1", mycontent)
+                       mycontent = re.sub(old_value+"(-[^a-zA-Z])", new_value+"\\1", mycontent)
+                       mycontent = re.sub(old_value+"([^a-zA-Z0-9-])", new_value+"\\1", mycontent)
+       return mycontent
+
+def update_dbentries(update_iter, mydata):
+       """Performs update commands and returns a
+       dict containing only the updated items."""
+       updated_items = {}
+       for k, mycontent in mydata.iteritems():
+               if k not in ignored_dbentries:
+                       orig_content = mycontent
+                       for update_cmd in update_iter:
+                               mycontent = update_dbentry(update_cmd, mycontent)
+                       if mycontent is not orig_content:
+                               updated_items[k] = mycontent
+       return updated_items
+
+def fixdbentries(update_iter, dbdir):
+       """Performs update commands which result in search and replace operations
+       for each of the files in dbdir (excluding CONTENTS and environment.bz2).
+       Returns True when actual modifications are necessary and False otherwise."""
+       mydata = {}
+       for myfile in [f for f in os.listdir(dbdir) if f not in ignored_dbentries]:
+               file_path = os.path.join(dbdir, myfile)
+               f = open(file_path, "r")
+               mydata[myfile] = f.read()
+               f.close()
+       updated_items = update_dbentries(update_iter, mydata)
+       for myfile, mycontent in updated_items.iteritems():
+               file_path = os.path.join(dbdir, myfile)
+               write_atomic(file_path, mycontent)
+       return len(updated_items) > 0