Bug #282505 - Fix unicode handling for package moves in binary packages. v2.2_rc40
authorZac Medico <zmedico@gentoo.org>
Mon, 24 Aug 2009 01:27:20 +0000 (01:27 -0000)
committerZac Medico <zmedico@gentoo.org>
Mon, 24 Aug 2009 01:27:20 +0000 (01:27 -0000)
svn path=/main/trunk/; revision=14134

pym/portage/dbapi/bintree.py
pym/portage/update.py
pym/portage/xpak.py

index 322487c31bd46a23dd162507d83ebf848d013922..f40583e0b0582ef6a919bbb662d3c86e179b43ed 100644 (file)
@@ -263,13 +263,21 @@ class binarytree(object):
                        mydata = mytbz2.get_data()
                        updated_items = update_dbentries([mylist], mydata)
                        mydata.update(updated_items)
-                       mydata["PF"] = mynewpkg + "\n"
-                       mydata["CATEGORY"] = mynewcat+"\n"
+                       mydata[_unicode_encode('PF',
+                               encoding=_encodings['repo.content'])] = \
+                               _unicode_encode(mynewpkg + "\n",
+                               encoding=_encodings['repo.content'])
+                       mydata[_unicode_encode('CATEGORY',
+                               encoding=_encodings['repo.content'])] = \
+                               _unicode_encode(mynewcat + "\n",
+                               encoding=_encodings['repo.content'])
                        if mynewpkg != myoldpkg:
-                               ebuild_data = mydata.get(myoldpkg+".ebuild")
+                               ebuild_data = mydata.pop(_unicode_encode(myoldpkg + '.ebuild',
+                                       encoding=_encodings['repo.content']), None)
                                if ebuild_data is not None:
-                                       mydata[mynewpkg+".ebuild"] = ebuild_data
-                                       del mydata[myoldpkg+".ebuild"]
+                                       mydata[_unicode_encode(mynewpkg + '.ebuild',
+                                               encoding=_encodings['repo.content'])] = ebuild_data
+
                        mytbz2.recompose_mem(portage.xpak.xpak_mem(mydata))
 
                        self.dbapi.cpv_remove(mycpv)
index ca67370cd2680d08dba971d11a2a856f26cf2be9..56e6709c0626bd4e1f45c0f647ea60f2e3d26832 100644 (file)
@@ -55,12 +55,18 @@ def update_dbentries(update_iter, mydata):
        dict containing only the updated items."""
        updated_items = {}
        for k, mycontent in mydata.iteritems():
-               if k not in ignored_dbentries:
+               k_unicode = _unicode_decode(k,
+                       encoding=_encodings['repo.content'], errors='replace')
+               if k_unicode not in ignored_dbentries:
+                       mycontent = _unicode_decode(mycontent,
+                               encoding=_encodings['repo.content'], errors='replace')
                        orig_content = mycontent
                        for update_cmd in update_iter:
                                mycontent = update_dbentry(update_cmd, mycontent)
                        if mycontent != orig_content:
-                               updated_items[k] = mycontent
+                               updated_items[k] = _unicode_encode(mycontent,
+                                       encoding=_encodings['repo.content'],
+                                       errors='backslashreplace')
        return updated_items
 
 def fixdbentries(update_iter, dbdir):
@@ -77,7 +83,7 @@ def fixdbentries(update_iter, dbdir):
        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)
+               write_atomic(file_path, mycontent, encoding=_encodings['repo.content'])
        return len(updated_items) > 0
 
 def grab_updates(updpath, prev_mtimes=None):
index 5b08c0a3f8284043e0eddb240314ec0120bbddbf..15a432f519dca3450edab36427d9b4a3500f68f3 100644 (file)
@@ -97,6 +97,17 @@ def xpak(rootdir,outfile=None):
 
 def xpak_mem(mydata):
        """Create an xpack segement from a map object."""
+
+       mydata_encoded = {}
+       for k, v in mydata.iteritems():
+               k = _unicode_encode(k,
+                       encoding=_encodings['repo.content'], errors='backslashreplace')
+               v = _unicode_encode(v,
+                       encoding=_encodings['repo.content'], errors='backslashreplace')
+               mydata_encoded[k] = v
+       mydata = mydata_encoded
+       del mydata_encoded
+
        indexglob = _unicode_encode('')
        indexpos=0
        dataglob = _unicode_encode('')