summaryrefslogtreecommitdiffstats
path: root/pym/portage_update.py
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2006-02-19 22:55:47 +0000
committerZac Medico <zmedico@gentoo.org>2006-02-19 22:55:47 +0000
commit1b7593526b974ab1c6acdd39b105a68f5864483a (patch)
tree0dc431d3fd185e000f72ea74a11e06bf4934201f /pym/portage_update.py
parent80b381410e4a6519a01e2cfc218bd77a2e987112 (diff)
downloadportage-1b7593526b974ab1c6acdd39b105a68f5864483a.tar.gz
portage-1b7593526b974ab1c6acdd39b105a68f5864483a.tar.bz2
portage-1b7593526b974ab1c6acdd39b105a68f5864483a.zip
Split out 2 reusable functions from fixdbentries and put them in a new portage_update module.
svn path=/main/trunk/; revision=2750
Diffstat (limited to 'pym/portage_update.py')
-rw-r--r--pym/portage_update.py46
1 files changed, 46 insertions, 0 deletions
diff --git a/pym/portage_update.py b/pym/portage_update.py
new file mode 100644
index 000000000..0aadae1b3
--- /dev/null
+++ b/pym/portage_update.py
@@ -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