update_dbentry: fix "move" to translate atom[use]
authorZac Medico <zmedico@gentoo.org>
Thu, 20 Sep 2012 04:08:47 +0000 (21:08 -0700)
committerZac Medico <zmedico@gentoo.org>
Thu, 20 Sep 2012 04:08:47 +0000 (21:08 -0700)
pym/portage/tests/update/test_update_dbentry.py
pym/portage/update.py

index 40633180916433bde86627c37840fe7321e67dd6..cb69053f7489738c2bebf5a57f8eda93183df598 100644 (file)
@@ -24,6 +24,9 @@ class UpdateDbentryTestCase(TestCase):
                        (("move", Atom("dev-libs/A"), Atom("dev-libs/B")), "1",
                                "  >=dev-libs/A-1:0  ", "  >=dev-libs/B-1:0  "),
 
+                       (("move", Atom("dev-libs/A"), Atom("dev-libs/B")), "2",
+                               "  dev-libs/A[foo]  ", "  dev-libs/B[foo]  "),
+
                        (("move", Atom("dev-libs/A"), Atom("dev-libs/B")), "5_pre2",
                                "  dev-libs/A:0/1=[foo]  ", "  dev-libs/B:0/1=[foo]  "),
 
index 017f71f62d55134e6526afb189ead8ce1df8449c..fe00b7e35a6a773d1a6043c6fd1c6c83a6ecab19 100644 (file)
@@ -44,18 +44,25 @@ def update_dbentry(update_cmd, mycontent, eapi=None):
                # Use isvalidatom() to check if this move is valid for the
                # EAPI (characters allowed in package names may vary).
                if old_value in mycontent and isvalidatom(new_value, eapi=eapi):
-                       old_value = re.escape(old_value);
-                       mycontent = re.sub(old_value+"(:|$|\\s)", new_value+"\\1", mycontent)
-                       def myreplace(matchobj):
-                               # Strip slot and * operator if necessary
-                               # so that ververify works.
-                               ver = remove_slot(matchobj.group(2))
-                               ver = ver.rstrip("*")
-                               if ververify(ver):
-                                       return "%s-%s" % (new_value, matchobj.group(2))
-                               else:
-                                       return "".join(matchobj.groups())
-                       mycontent = re.sub("(%s-)(\\S*)" % old_value, myreplace, mycontent)
+                       # this split preserves existing whitespace
+                       split_content = re.split(r'(\s+)', mycontent)
+                       modified = False
+                       for i, token in enumerate(split_content):
+                               if old_value not in token:
+                                       continue
+                               try:
+                                       atom = Atom(token, eapi=eapi)
+                               except InvalidAtom:
+                                       continue
+                               if atom.cp != old_value:
+                                       continue
+
+                               split_content[i] = token.replace(old_value, new_value, 1)
+                               modified = True
+
+                       if modified:
+                               mycontent = "".join(split_content)
+
        elif update_cmd[0] == "slotmove" and update_cmd[1].operator is None:
                orig_atom, origslot, newslot = update_cmd[1:]
                orig_cp = orig_atom.cp