Bug #282505 - Fix unicode handling for package moves in binary packages.

svn path=/main/trunk/; revision=14134
diff --git a/pym/portage/dbapi/bintree.py b/pym/portage/dbapi/bintree.py
index 322487c..f40583e 100644
--- a/pym/portage/dbapi/bintree.py
+++ b/pym/portage/dbapi/bintree.py
@@ -263,13 +263,21 @@
 			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)
diff --git a/pym/portage/update.py b/pym/portage/update.py
index ca67370..56e6709 100644
--- a/pym/portage/update.py
+++ b/pym/portage/update.py
@@ -55,12 +55,18 @@
 	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 @@
 	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):
diff --git a/pym/portage/xpak.py b/pym/portage/xpak.py
index 5b08c0a..15a432f 100644
--- a/pym/portage/xpak.py
+++ b/pym/portage/xpak.py
@@ -97,6 +97,17 @@
 
 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('')