public inbox for gentoo-portage-dev@lists.gentoo.org
 help / color / mirror / Atom feed
* [gentoo-portage-dev] [PATCH] Eliminate the most of explicit py3 conditionals
@ 2020-07-16 12:18 Michał Górny
  2020-07-16 17:42 ` Zac Medico
  0 siblings, 1 reply; 2+ messages in thread
From: Michał Górny @ 2020-07-16 12:18 UTC (permalink / raw
  To: gentoo-portage-dev; +Cc: Michał Górny

Eliminate the most of py2/py3 conditions in the code.  Leave a few
where the relevant code is unclear, they will be addressed later.

Closes: https://github.com/gentoo/portage/pull/574
Signed-off-by: Michał Górny <mgorny@gentoo.org>
---
 bin/check-implicit-pointer-usage.py           | 25 ++--------
 bin/chmod-lite.py                             | 11 ++---
 bin/dohtml.py                                 | 11 ++---
 bin/doins.py                                  |  7 ++-
 bin/ebuild                                    | 15 +-----
 bin/filter-bash-environment.py                | 11 ++---
 bin/install.py                                | 19 ++++---
 bin/pid-ns-init                               | 10 ++--
 bin/xattr-helper.py                           | 32 +++---------
 lib/_emerge/DependencyArg.py                  | 10 ----
 lib/_emerge/JobStatusDisplay.py               |  4 +-
 lib/_emerge/Package.py                        |  8 ---
 lib/_emerge/PackageVirtualDbapi.py            |  3 --
 lib/_emerge/SequentialTaskQueue.py            |  3 --
 lib/_emerge/TaskSequence.py                   |  3 --
 lib/_emerge/UseFlagDisplay.py                 |  8 ---
 lib/_emerge/UserQuery.py                      | 17 +++----
 lib/_emerge/actions.py                        |  2 -
 lib/_emerge/resolver/DbapiProvidesIndex.py    |  3 --
 lib/_emerge/resolver/output_helpers.py        | 16 ------
 lib/_emerge/resolver/slot_collision.py        |  8 ---
 lib/portage/__init__.py                       | 49 +++++++------------
 lib/portage/_emirrordist/Config.py            |  4 --
 lib/portage/_selinux.py                       | 12 -----
 lib/portage/_sets/base.py                     |  3 --
 lib/portage/dbapi/porttree.py                 |  7 +--
 lib/portage/dep/__init__.py                   | 18 +------
 lib/portage/dep/soname/SonameAtom.py          |  8 ---
 lib/portage/elog/mod_save_summary.py          |  2 -
 lib/portage/elog/mod_syslog.py                |  4 --
 lib/portage/exception.py                      | 45 ++++-------------
 lib/portage/mail.py                           | 49 +++----------------
 lib/portage/manifest.py                       |  7 ---
 lib/portage/output.py                         |  4 +-
 lib/portage/process.py                        | 16 +-----
 lib/portage/proxy/objectproxy.py              |  6 ---
 lib/portage/repository/config.py              |  6 ---
 .../tests/unicode/test_string_format.py       | 44 ++++-------------
 lib/portage/util/_ShelveUnicodeWrapper.py     | 45 -----------------
 39 files changed, 102 insertions(+), 453 deletions(-)
 delete mode 100644 lib/portage/util/_ShelveUnicodeWrapper.py

diff --git a/bin/check-implicit-pointer-usage.py b/bin/check-implicit-pointer-usage.py
index a49db8107..868e4b3c8 100755
--- a/bin/check-implicit-pointer-usage.py
+++ b/bin/check-implicit-pointer-usage.py
@@ -33,22 +33,10 @@ pointer_pattern = (
     + r"|"
     + r"cast to pointer from integer of different size)")
 
-if sys.hexversion < 0x3000000:
-    # Use encoded byte strings in python-2.x, since the python ebuilds are
-    # known to remove the encodings module when USE=build is enabled (thus
-    # disabling unicode decoding/encoding). The portage module has a
-    # workaround for this, but currently we don't import that here since we
-    # don't want to trigger potential sandbox violations due to stale pyc
-    # files for the portage module.
-    unicode_quote_open = '\xE2\x80\x98'
-    unicode_quote_close = '\xE2\x80\x99'
-    def write(msg):
-        sys.stdout.write(msg)
-else:
-    unicode_quote_open = '\u2018'
-    unicode_quote_close = '\u2019'
-    def write(msg):
-        sys.stdout.buffer.write(msg.encode('utf_8', 'backslashreplace'))
+unicode_quote_open = '\u2018'
+unicode_quote_close = '\u2019'
+def write(msg):
+    sys.stdout.buffer.write(msg.encode('utf_8', 'backslashreplace'))
 
 pointer_pattern = re.compile(pointer_pattern)
 
@@ -57,10 +45,7 @@ last_implicit_linenum = -1
 last_implicit_func = ""
 
 while True:
-    if sys.hexversion >= 0x3000000:
-        line = sys.stdin.buffer.readline().decode('utf_8', 'replace')
-    else:
-        line = sys.stdin.readline()
+    line = sys.stdin.buffer.readline().decode('utf_8', 'replace')
     if not line:
         break
     # translate unicode open/close quotes to ascii ones
diff --git a/bin/chmod-lite.py b/bin/chmod-lite.py
index 177be7eab..7fe743ed1 100755
--- a/bin/chmod-lite.py
+++ b/bin/chmod-lite.py
@@ -12,12 +12,11 @@ os.chdir(os.environ["__PORTAGE_HELPER_CWD"])
 
 def main(files):
 
-	if sys.hexversion >= 0x3000000:
-		# We can't trust that the filesystem encoding (locale dependent)
-		# correctly matches the arguments, so use surrogateescape to
-		# pass through the original argv bytes for Python 3.
-		fs_encoding = sys.getfilesystemencoding()
-		files = [x.encode(fs_encoding, 'surrogateescape') for x in files]
+	# We can't trust that the filesystem encoding (locale dependent)
+	# correctly matches the arguments, so use surrogateescape to
+	# pass through the original argv bytes for Python 3.
+	fs_encoding = sys.getfilesystemencoding()
+	files = [x.encode(fs_encoding, 'surrogateescape') for x in files]
 
 	for filename in files:
 		# Emulate 'chmod -fR a+rX,u+w,g-w,o-w' with minimal chmod calls.
diff --git a/bin/dohtml.py b/bin/dohtml.py
index df8552b83..67c5eb9d1 100755
--- a/bin/dohtml.py
+++ b/bin/dohtml.py
@@ -163,12 +163,11 @@ def print_help():
 def parse_args():
 	argv = sys.argv[:]
 
-	if sys.hexversion >= 0x3000000:
-		# We can't trust that the filesystem encoding (locale dependent)
-		# correctly matches the arguments, so use surrogateescape to
-		# pass through the original argv bytes for Python 3.
-		fs_encoding = sys.getfilesystemencoding()
-		argv = [x.encode(fs_encoding, 'surrogateescape') for x in argv]
+	# We can't trust that the filesystem encoding (locale dependent)
+	# correctly matches the arguments, so use surrogateescape to
+	# pass through the original argv bytes for Python 3.
+	fs_encoding = sys.getfilesystemencoding()
+	argv = [x.encode(fs_encoding, 'surrogateescape') for x in argv]
 
 	for x, arg in enumerate(argv):
 		try:
diff --git a/bin/doins.py b/bin/doins.py
index 6bc30c90b..98dc4f810 100644
--- a/bin/doins.py
+++ b/bin/doins.py
@@ -514,10 +514,9 @@ def _parse_args(argv):
 
 	# Encode back to the original byte stream. Please see
 	# http://bugs.python.org/issue8776.
-	if sys.version_info.major >= 3:
-		opts.distdir = os.fsencode(opts.distdir) + b'/'
-		opts.dest = os.fsencode(opts.dest)
-		opts.sources = [os.fsencode(source) for source in opts.sources]
+	opts.distdir = os.fsencode(opts.distdir) + b'/'
+	opts.dest = os.fsencode(opts.dest)
+	opts.sources = [os.fsencode(source) for source in opts.sources]
 
 	return opts
 
diff --git a/bin/ebuild b/bin/ebuild
index 460aa0fd1..ea02fa95a 100755
--- a/bin/ebuild
+++ b/bin/ebuild
@@ -144,9 +144,6 @@ if not os.path.isabs(ebuild):
 	# the canonical path returned from os.getcwd() may may be unusable in
 	# cases where the directory stucture is built from symlinks.
 	pwd = os.environ.get('PWD', '')
-	if sys.hexversion < 0x3000000:
-		pwd = _unicode_decode(pwd, encoding=_encodings['content'],
-			errors='strict')
 	if pwd and pwd != mycwd and \
 		os.path.realpath(pwd) == mycwd:
 		mycwd = portage.normalize_path(pwd)
@@ -163,16 +160,8 @@ vdb_path = os.path.realpath(os.path.join(portage.settings['EROOT'], VDB_PATH))
 if ebuild_portdir != vdb_path and \
 	ebuild_portdir not in portage.portdb.porttrees:
 	portdir_overlay = portage.settings.get("PORTDIR_OVERLAY", "")
-	if sys.hexversion >= 0x3000000:
-		os.environ["PORTDIR_OVERLAY"] = \
-			portdir_overlay + \
-			" " + _shell_quote(ebuild_portdir)
-	else:
-		os.environ["PORTDIR_OVERLAY"] = \
-			_unicode_encode(portdir_overlay,
-			encoding=_encodings['content'], errors='strict') + \
-			" " + _unicode_encode(_shell_quote(ebuild_portdir),
-			encoding=_encodings['content'], errors='strict')
+	os.environ["PORTDIR_OVERLAY"] = (
+		portdir_overlay + " " + _shell_quote(ebuild_portdir))
 
 	print("Appending %s to PORTDIR_OVERLAY..." % ebuild_portdir)
 	portage._reset_legacy_globals()
diff --git a/bin/filter-bash-environment.py b/bin/filter-bash-environment.py
index 045ea6f52..5e82fc91c 100755
--- a/bin/filter-bash-environment.py
+++ b/bin/filter-bash-environment.py
@@ -136,14 +136,9 @@ if __name__ == "__main__":
 		sys.stderr.flush()
 		sys.exit(2)
 
-	file_in = sys.stdin
-	file_out = sys.stdout
-	if sys.hexversion >= 0x3000000:
-		file_in = sys.stdin.buffer
-		file_out = sys.stdout.buffer
-		var_pattern = os.fsencode(args[0]).split()
-	else:
-		var_pattern = args[0].split()
+	file_in = sys.stdin.buffer
+	file_out = sys.stdout.buffer
+	var_pattern = os.fsencode(args[0]).split()
 
 	# Filter invalid variable names that are not supported by bash.
 	var_pattern.append(br'\d.*')
diff --git a/bin/install.py b/bin/install.py
index 495534d33..c013f07e5 100755
--- a/bin/install.py
+++ b/bin/install.py
@@ -232,16 +232,15 @@ def main(args):
 	cmdline = [install_binary]
 	cmdline += args
 
-	if sys.hexversion >= 0x3000000:
-		# We can't trust that the filesystem encoding (locale dependent)
-		# correctly matches the arguments, so use surrogateescape to
-		# pass through the original argv bytes for Python 3.
-		fs_encoding = sys.getfilesystemencoding()
-		cmdline = [x.encode(fs_encoding, 'surrogateescape') for x in cmdline]
-		files = [x.encode(fs_encoding, 'surrogateescape') for x in files]
-		if opts.target_directory is not None:
-			opts.target_directory = \
-				opts.target_directory.encode(fs_encoding, 'surrogateescape')
+	# We can't trust that the filesystem encoding (locale dependent)
+	# correctly matches the arguments, so use surrogateescape to
+	# pass through the original argv bytes for Python 3.
+	fs_encoding = sys.getfilesystemencoding()
+	cmdline = [x.encode(fs_encoding, 'surrogateescape') for x in cmdline]
+	files = [x.encode(fs_encoding, 'surrogateescape') for x in files]
+	if opts.target_directory is not None:
+		opts.target_directory = \
+			opts.target_directory.encode(fs_encoding, 'surrogateescape')
 
 	returncode = subprocess.call(cmdline)
 	if returncode == os.EX_OK:
diff --git a/bin/pid-ns-init b/bin/pid-ns-init
index 18c74f799..3a218a5df 100644
--- a/bin/pid-ns-init
+++ b/bin/pid-ns-init
@@ -39,7 +39,7 @@ def preexec_fn(uid, gid, groups, umask):
 		os.umask(umask)
 
 	# CPython >= 3 subprocess.Popen handles this internally.
-	if sys.version_info.major < 3 or platform.python_implementation() != 'CPython':
+	if platform.python_implementation() != 'CPython':
 		for signum in (
 			signal.SIGHUP,
 			signal.SIGINT,
@@ -70,10 +70,10 @@ def main(argv):
 		groups = tuple(int(group) for group in groups.split(',')) if groups else None
 		umask = int(umask) if umask else None
 
-		popen_kwargs = {}
-		popen_kwargs['preexec_fn'] = functools.partial(preexec_fn, uid, gid, groups, umask)
-		if sys.version_info.major > 2:
-			popen_kwargs['pass_fds'] = pass_fds
+		popen_kwargs = {
+			'preexec_fn': functools.partial(preexec_fn, uid, gid, groups, umask),
+			'pass_fds': pass_fds,
+		}
 		# Isolate parent process from process group SIGSTOP (bug 675870)
 		setsid = True
 		os.setsid()
diff --git a/bin/xattr-helper.py b/bin/xattr-helper.py
index 49c981580..7658934a0 100755
--- a/bin/xattr-helper.py
+++ b/bin/xattr-helper.py
@@ -26,24 +26,14 @@ _UNQUOTE_RE = re.compile(br'\\[0-7]{3}')
 _FS_ENCODING = sys.getfilesystemencoding()
 
 
-if sys.hexversion < 0x3000000:
+def octal_quote_byte(b):
+	return ('\\%03o' % ord(b)).encode('ascii')
 
-	def octal_quote_byte(b):
-		return b'\\%03o' % ord(b)
 
-	def unicode_encode(s):
-		if isinstance(s, unicode):
-			s = s.encode(_FS_ENCODING)
-		return s
-else:
-
-	def octal_quote_byte(b):
-		return ('\\%03o' % ord(b)).encode('ascii')
-
-	def unicode_encode(s):
-		if isinstance(s, str):
-			s = s.encode(_FS_ENCODING, 'surrogateescape')
-		return s
+def unicode_encode(s):
+	if isinstance(s, str):
+		s = s.encode(_FS_ENCODING, 'surrogateescape')
+	return s
 
 
 def quote(s, quote_chars):
@@ -157,20 +147,14 @@ def main(argv):
 
 	options = parser.parse_args(argv)
 
-	if sys.hexversion >= 0x3000000:
-		file_in = sys.stdin.buffer.raw
-	else:
-		file_in = sys.stdin
+	file_in = sys.stdin.buffer.raw
 
 	if options.dump:
 		if options.paths:
 			options.paths = [unicode_encode(x) for x in options.paths]
 		else:
 			options.paths = [x for x in file_in.read().split(b'\0') if x]
-		if sys.hexversion >= 0x3000000:
-			file_out = sys.stdout.buffer
-		else:
-			file_out = sys.stdout
+		file_out = sys.stdout.buffer
 		dump_xattrs(options.paths, file_out)
 
 	elif options.restore:
diff --git a/lib/_emerge/DependencyArg.py b/lib/_emerge/DependencyArg.py
index 87f255f10..a997f0f90 100644
--- a/lib/_emerge/DependencyArg.py
+++ b/lib/_emerge/DependencyArg.py
@@ -31,14 +31,4 @@ class DependencyArg(object):
 		return hash((self.arg, self.root_config.root))
 
 	def __str__(self):
-		# Use unicode_literals format string for python-2.x safety,
-		# ensuring that self.arg.__unicode__() is used
-		# when necessary.
 		return "%s" % (self.arg,)
-
-	if sys.hexversion < 0x3000000:
-
-		__unicode__ = __str__
-
-		def __str__(self):
-			return _unicode_encode(self.__unicode__(), encoding=_encodings['content'])
diff --git a/lib/_emerge/JobStatusDisplay.py b/lib/_emerge/JobStatusDisplay.py
index b3160a4cc..2ef3f8465 100644
--- a/lib/_emerge/JobStatusDisplay.py
+++ b/lib/_emerge/JobStatusDisplay.py
@@ -83,9 +83,7 @@ class JobStatusDisplay(object):
 		# avoid potential UnicodeEncodeError
 		s = _unicode_encode(s,
 			encoding=_encodings['stdio'], errors='backslashreplace')
-		out = self.out
-		if sys.hexversion >= 0x3000000:
-			out = out.buffer
+		out = self.out.buffer
 		out.write(s)
 		out.flush()
 
diff --git a/lib/_emerge/Package.py b/lib/_emerge/Package.py
index 76f4066bb..1fb0bb20b 100644
--- a/lib/_emerge/Package.py
+++ b/lib/_emerge/Package.py
@@ -528,14 +528,6 @@ class Package(Task):
 		s += ")"
 		return s
 
-	if sys.hexversion < 0x3000000:
-
-		__unicode__ = __str__
-
-		def __str__(self):
-			return _unicode_encode(self.__unicode__(),
-				encoding=_encodings['content'])
-
 	class _use_class(object):
 
 		__slots__ = ("enabled", "_expand", "_expand_hidden",
diff --git a/lib/_emerge/PackageVirtualDbapi.py b/lib/_emerge/PackageVirtualDbapi.py
index 26293dd98..957eab594 100644
--- a/lib/_emerge/PackageVirtualDbapi.py
+++ b/lib/_emerge/PackageVirtualDbapi.py
@@ -41,9 +41,6 @@ class PackageVirtualDbapi(dbapi):
 	def __bool__(self):
 		return bool(self._cpv_map)
 
-	if sys.hexversion < 0x3000000:
-		__nonzero__ = __bool__
-
 	def __iter__(self):
 		return iter(self._cpv_map.values())
 
diff --git a/lib/_emerge/SequentialTaskQueue.py b/lib/_emerge/SequentialTaskQueue.py
index d2551b1c6..1cadbca41 100644
--- a/lib/_emerge/SequentialTaskQueue.py
+++ b/lib/_emerge/SequentialTaskQueue.py
@@ -85,8 +85,5 @@ class SequentialTaskQueue(SlotObject):
 	def __bool__(self):
 		return bool(self._task_queue or self.running_tasks)
 
-	if sys.hexversion < 0x3000000:
-		__nonzero__ = __bool__
-
 	def __len__(self):
 		return len(self._task_queue) + len(self.running_tasks)
diff --git a/lib/_emerge/TaskSequence.py b/lib/_emerge/TaskSequence.py
index 1f2ba94c2..2fd349810 100644
--- a/lib/_emerge/TaskSequence.py
+++ b/lib/_emerge/TaskSequence.py
@@ -54,8 +54,5 @@ class TaskSequence(CompositeTask):
 	def __bool__(self):
 		return bool(self._task_queue)
 
-	if sys.hexversion < 0x3000000:
-		__nonzero__ = __bool__
-
 	def __len__(self):
 		return len(self._task_queue)
diff --git a/lib/_emerge/UseFlagDisplay.py b/lib/_emerge/UseFlagDisplay.py
index c16e7ba0d..6f6e27fb8 100644
--- a/lib/_emerge/UseFlagDisplay.py
+++ b/lib/_emerge/UseFlagDisplay.py
@@ -30,14 +30,6 @@ class UseFlagDisplay(object):
 			s = '(%s)' % s
 		return s
 
-	if sys.hexversion < 0x3000000:
-
-		__unicode__ = __str__
-
-		def __str__(self):
-			return _unicode_encode(self.__unicode__(),
-				encoding=_encodings['content'])
-
 	def _cmp_combined(a, b):
 		"""
 		Sort by name, combining enabled and disabled flags.
diff --git a/lib/_emerge/UserQuery.py b/lib/_emerge/UserQuery.py
index faa32cf50..a9b3a4865 100644
--- a/lib/_emerge/UserQuery.py
+++ b/lib/_emerge/UserQuery.py
@@ -54,17 +54,12 @@ class UserQuery(object):
 		print(bold(prompt), end=' ')
 		try:
 			while True:
-				if sys.hexversion >= 0x3000000:
-					try:
-						response = input("[%s] " %
-							"/".join([colours[i](responses[i])
-							for i in range(len(responses))]))
-					except UnicodeDecodeError as e:
-						response = _unicode_decode(e.object).rstrip('\n')
-				else:
-					response=raw_input("["+"/".join([colours[i](responses[i])
-									  for i in range(len(responses))])+"] ")
-					response = _unicode_decode(response)
+				try:
+					response = input("[%s] " %
+						"/".join([colours[i](responses[i])
+						for i in range(len(responses))]))
+				except UnicodeDecodeError as e:
+					response = _unicode_decode(e.object).rstrip('\n')
 				if response or not enter_invalid:
 					for key in responses:
 						# An empty response will match the
diff --git a/lib/_emerge/actions.py b/lib/_emerge/actions.py
index dc54372a3..e717bc828 100644
--- a/lib/_emerge/actions.py
+++ b/lib/_emerge/actions.py
@@ -3194,8 +3194,6 @@ def run_action(emerge_config):
 
 	if not "--pretend" in emerge_config.opts:
 		time_fmt = "%b %d, %Y %H:%M:%S"
-		if sys.hexversion < 0x3000000:
-			time_fmt = portage._unicode_encode(time_fmt)
 		time_str = time.strftime(time_fmt, time.localtime(time.time()))
 		# Avoid potential UnicodeDecodeError in Python 2, since strftime
 		# returns bytes in Python 2, and %b may contain non-ascii chars.
diff --git a/lib/_emerge/resolver/DbapiProvidesIndex.py b/lib/_emerge/resolver/DbapiProvidesIndex.py
index 1650edd4e..9d122a7e5 100644
--- a/lib/_emerge/resolver/DbapiProvidesIndex.py
+++ b/lib/_emerge/resolver/DbapiProvidesIndex.py
@@ -73,9 +73,6 @@ class PackageDbapiProvidesIndex(DbapiProvidesIndex):
 	def __bool__(self):
 		return bool(self._db)
 
-	if sys.hexversion < 0x3000000:
-		__nonzero__ = __bool__
-
 	def __iter__(self):
 		return iter(self._db)
 
diff --git a/lib/_emerge/resolver/output_helpers.py b/lib/_emerge/resolver/output_helpers.py
index 4279590dc..0616bb6ac 100644
--- a/lib/_emerge/resolver/output_helpers.py
+++ b/lib/_emerge/resolver/output_helpers.py
@@ -76,14 +76,6 @@ class _RepoDisplay(object):
 				" indicates that the source repository could not be determined\n")
 		return "".join(output)
 
-	if sys.hexversion < 0x3000000:
-
-		__unicode__ = __str__
-
-		def __str__(self):
-			return _unicode_encode(self.__unicode__(),
-				encoding=_encodings['content'])
-
 
 class _PackageCounters(object):
 
@@ -677,11 +669,3 @@ class PkgAttrDisplay(SlotObject):
 			output.append(self.mask)
 
 		return "".join(output)
-
-	if sys.hexversion < 0x3000000:
-
-		__unicode__ = __str__
-
-		def __str__(self):
-			return _unicode_encode(self.__unicode__(),
-				encoding=_encodings['content'])
diff --git a/lib/_emerge/resolver/slot_collision.py b/lib/_emerge/resolver/slot_collision.py
index 0bed08785..e77433fb8 100644
--- a/lib/_emerge/resolver/slot_collision.py
+++ b/lib/_emerge/resolver/slot_collision.py
@@ -1130,14 +1130,6 @@ class _solution_candidate_generator(object):
 		def __str__(self):
 			return "%s" % (self.value,)
 
-		if sys.hexversion < 0x3000000:
-
-			__unicode__ = __str__
-
-			def __str__(self):
-				return _unicode_encode(self.__unicode__(),
-					encoding=_encodings['content'], errors='backslashreplace')
-
 	def __init__(self, all_involved_flags):
 		#A copy of all_involved_flags with all "cond" values
 		#replaced by a _value_helper object.
diff --git a/lib/portage/__init__.py b/lib/portage/__init__.py
index 8ac899f7b..2c44376cb 100644
--- a/lib/portage/__init__.py
+++ b/lib/portage/__init__.py
@@ -163,43 +163,30 @@ _encodings = {
 	'stdio'                  : 'utf_8',
 }
 
-if sys.hexversion >= 0x3000000:
-
-	def _decode_argv(argv):
-		# With Python 3, the surrogateescape encoding error handler makes it
-		# possible to access the original argv bytes, which can be useful
-		# if their actual encoding does no match the filesystem encoding.
-		fs_encoding = sys.getfilesystemencoding()
-		return [_unicode_decode(x.encode(fs_encoding, 'surrogateescape'))
-			for x in argv]
-
-	def _unicode_encode(s, encoding=_encodings['content'], errors='backslashreplace'):
-		if isinstance(s, str):
-			s = s.encode(encoding, errors)
-		return s
 
-	def _unicode_decode(s, encoding=_encodings['content'], errors='replace'):
-		if isinstance(s, bytes):
-			s = str(s, encoding=encoding, errors=errors)
-		return s
+def _decode_argv(argv):
+	# With Python 3, the surrogateescape encoding error handler makes it
+	# possible to access the original argv bytes, which can be useful
+	# if their actual encoding does no match the filesystem encoding.
+	fs_encoding = sys.getfilesystemencoding()
+	return [_unicode_decode(x.encode(fs_encoding, 'surrogateescape'))
+		for x in argv]
 
-	_native_string = _unicode_decode
-else:
 
-	def _decode_argv(argv):
-		return [_unicode_decode(x) for x in argv]
+def _unicode_encode(s, encoding=_encodings['content'], errors='backslashreplace'):
+	if isinstance(s, str):
+		s = s.encode(encoding, errors)
+	return s
 
-	def _unicode_encode(s, encoding=_encodings['content'], errors='backslashreplace'):
-		if isinstance(s, unicode):
-			s = s.encode(encoding, errors)
-		return s
 
-	def _unicode_decode(s, encoding=_encodings['content'], errors='replace'):
-		if isinstance(s, bytes):
-			s = unicode(s, encoding=encoding, errors=errors)
-		return s
+def _unicode_decode(s, encoding=_encodings['content'], errors='replace'):
+	if isinstance(s, bytes):
+		s = str(s, encoding=encoding, errors=errors)
+	return s
+
+
+_native_string = _unicode_decode
 
-	_native_string = _unicode_encode
 
 class _unicode_func_wrapper(object):
 	"""
diff --git a/lib/portage/_emirrordist/Config.py b/lib/portage/_emirrordist/Config.py
index c1f59f725..d5dea7ab4 100644
--- a/lib/portage/_emirrordist/Config.py
+++ b/lib/portage/_emirrordist/Config.py
@@ -12,7 +12,6 @@ import portage
 from portage import os
 from portage.package.ebuild.fetch import MirrorLayoutConfig
 from portage.util import grabdict, grablines
-from portage.util._ShelveUnicodeWrapper import ShelveUnicodeWrapper
 
 class Config(object):
 	def __init__(self, options, portdb, event_loop):
@@ -126,9 +125,6 @@ class Config(object):
 					from bsddb3 import dbshelve
 					db = dbshelve.open(db_file, flags=open_flag)
 
-			if sys.hexversion < 0x3000000:
-				db = ShelveUnicodeWrapper(db)
-
 		if self.options.dry_run:
 			logging.warning("dry-run: %s db opened in readonly mode" % db_desc)
 			if not isinstance(db, dict):
diff --git a/lib/portage/_selinux.py b/lib/portage/_selinux.py
index 49e2e8e58..a64215f27 100644
--- a/lib/portage/_selinux.py
+++ b/lib/portage/_selinux.py
@@ -23,8 +23,6 @@ def copyfile(src, dest):
 	dest = _native_string(dest, encoding=_encodings['fs'], errors='strict')
 	(rc, ctx) = selinux.lgetfilecon(src)
 	if rc < 0:
-		if sys.hexversion < 0x3000000:
-			src = _unicode_decode(src, encoding=_encodings['fs'], errors='replace')
 		raise OSError(_("copyfile: Failed getting context of \"%s\".") % src)
 
 	setfscreate(ctx)
@@ -48,8 +46,6 @@ def mkdir(target, refdir):
 	refdir = _native_string(refdir, encoding=_encodings['fs'], errors='strict')
 	(rc, ctx) = selinux.getfilecon(refdir)
 	if rc < 0:
-		if sys.hexversion < 0x3000000:
-			refdir = _unicode_decode(refdir, encoding=_encodings['fs'], errors='replace')
 		raise OSError(
 			_("mkdir: Failed getting context of reference directory \"%s\".") \
 			% refdir)
@@ -65,8 +61,6 @@ def rename(src, dest):
 	dest = _native_string(dest, encoding=_encodings['fs'], errors='strict')
 	(rc, ctx) = selinux.lgetfilecon(src)
 	if rc < 0:
-		if sys.hexversion < 0x3000000:
-			src = _unicode_decode(src, encoding=_encodings['fs'], errors='replace')
 		raise OSError(_("rename: Failed getting context of \"%s\".") % src)
 
 	setfscreate(ctx)
@@ -98,8 +92,6 @@ def setexec(ctx="\n"):
 			portage.writemsg("!!! %s\n" % msg, noiselevel=-1)
 
 	if rc < 0:
-		if sys.hexversion < 0x3000000:
-			ctx = _unicode_decode(ctx, encoding=_encodings['content'], errors='replace')
 		if selinux.security_getenforce() == 1:
 			raise OSError(_("Failed setting exec() context \"%s\".") % ctx)
 		else:
@@ -110,8 +102,6 @@ def setexec(ctx="\n"):
 def setfscreate(ctx="\n"):
 	ctx = _native_string(ctx, encoding=_encodings['content'], errors='strict')
 	if selinux.setfscreatecon(ctx) < 0:
-		if sys.hexversion < 0x3000000:
-			ctx = _unicode_decode(ctx, encoding=_encodings['content'], errors='replace')
 		raise OSError(
 			_("setfscreate: Failed setting fs create context \"%s\".") % ctx)
 
@@ -148,8 +138,6 @@ def symlink(target, link, reflnk):
 	reflnk = _native_string(reflnk, encoding=_encodings['fs'], errors='strict')
 	(rc, ctx) = selinux.lgetfilecon(reflnk)
 	if rc < 0:
-		if sys.hexversion < 0x3000000:
-			reflnk = _unicode_decode(reflnk, encoding=_encodings['fs'], errors='replace')
 		raise OSError(
 			_("symlink: Failed getting context of reference symlink \"%s\".") \
 			% reflnk)
diff --git a/lib/portage/_sets/base.py b/lib/portage/_sets/base.py
index 4d0a42179..a9c898da7 100644
--- a/lib/portage/_sets/base.py
+++ b/lib/portage/_sets/base.py
@@ -43,9 +43,6 @@ class PackageSet(object):
 		self._load()
 		return bool(self._atoms or self._nonatoms)
 
-	if sys.hexversion < 0x3000000:
-		__nonzero__ = __bool__
-
 	def supportsOperation(self, op):
 		if not op in OPERATIONS:
 			raise ValueError(op)
diff --git a/lib/portage/dbapi/porttree.py b/lib/portage/dbapi/porttree.py
index da337ad0e..4916114cd 100644
--- a/lib/portage/dbapi/porttree.py
+++ b/lib/portage/dbapi/porttree.py
@@ -1455,12 +1455,7 @@ class FetchlistDict(Mapping):
 		infinite recursion in some cases."""
 		return len(self.portdb.cp_list(self.cp, mytree=self.mytree))
 
-	def keys(self):
-		"""Returns keys for all packages within pkgdir"""
-		return self.portdb.cp_list(self.cp, mytree=self.mytree)
-
-	if sys.hexversion >= 0x3000000:
-		keys = __iter__
+	keys = __iter__
 
 
 def _async_manifest_fetchlist(portdb, repo_config, cp, cpv_list=None,
diff --git a/lib/portage/dep/__init__.py b/lib/portage/dep/__init__.py
index baeea4bf7..bfb957d89 100644
--- a/lib/portage/dep/__init__.py
+++ b/lib/portage/dep/__init__.py
@@ -960,22 +960,11 @@ class _use_dep(object):
 	def __bool__(self):
 		return bool(self.tokens)
 
-	if sys.hexversion < 0x3000000:
-		__nonzero__ = __bool__
-
 	def __str__(self):
 		if not self.tokens:
 			return ""
 		return "[%s]" % (",".join(self.tokens),)
 
-	if sys.hexversion < 0x3000000:
-
-		__unicode__ = __str__
-
-		def __str__(self):
-			return _unicode_encode(self.__unicode__(),
-				encoding=_encodings['content'], errors='backslashreplace')
-
 	def __repr__(self):
 		return "portage.dep._use_dep(%s)" % repr(self.tokens)
 
@@ -1715,9 +1704,8 @@ class ExtendedAtomDict(portage.cache.mappings.MutableMapping):
 		else:
 			return self._normal.__delitem__(cp)
 
-	if sys.hexversion >= 0x3000000:
-		keys = __iter__
-		items = iteritems
+	keys = __iter__
+	items = iteritems
 
 	def __len__(self):
 		return len(self._normal) + len(self._extended)
@@ -2575,8 +2563,6 @@ class _RequiredUseBranch(object):
 
 		return " ".join(tokens)
 
-	if sys.hexversion < 0x3000000:
-		__nonzero__ = __bool__
 
 def check_required_use(required_use, use, iuse_match, eapi=None):
 	"""
diff --git a/lib/portage/dep/soname/SonameAtom.py b/lib/portage/dep/soname/SonameAtom.py
index 12d79386b..2dae03c36 100644
--- a/lib/portage/dep/soname/SonameAtom.py
+++ b/lib/portage/dep/soname/SonameAtom.py
@@ -56,14 +56,6 @@ class SonameAtom(object):
 	def __str__(self):
 		return "%s: %s" % (self.multilib_category, self.soname)
 
-	if sys.hexversion < 0x3000000:
-
-		__unicode__ = __str__
-
-		def __str__(self):
-			return _unicode_encode(self.__unicode__(),
-				encoding=_encodings['content'])
-
 	def match(self, pkg):
 		"""
 		Check if the given package instance matches this atom. Unbuilt
diff --git a/lib/portage/elog/mod_save_summary.py b/lib/portage/elog/mod_save_summary.py
index 48c006037..7aa6f2bef 100644
--- a/lib/portage/elog/mod_save_summary.py
+++ b/lib/portage/elog/mod_save_summary.py
@@ -73,8 +73,6 @@ def process(mysettings, key, logentries, fulltext):
 		mode=elogdir_grp_mode, mask=0)
 
 	time_fmt = "%Y-%m-%d %H:%M:%S %Z"
-	if sys.hexversion < 0x3000000:
-		time_fmt = _unicode_encode(time_fmt)
 	time_str = time.strftime(time_fmt, time.localtime(time.time()))
 	# Avoid potential UnicodeDecodeError in Python 2, since strftime
 	# returns bytes in Python 2, and %Z may contain non-ascii chars.
diff --git a/lib/portage/elog/mod_syslog.py b/lib/portage/elog/mod_syslog.py
index d2ad89d65..e5d1bbca8 100644
--- a/lib/portage/elog/mod_syslog.py
+++ b/lib/portage/elog/mod_syslog.py
@@ -26,9 +26,5 @@ def process(mysettings, key, logentries, fulltext):
 				msgcontent = [msgcontent]
 			for line in msgcontent:
 				line = "%s: %s: %s" % (key, phase, line)
-				if sys.hexversion < 0x3000000 and not isinstance(line, bytes):
-					# Avoid TypeError from syslog.syslog()
-					line = line.encode(_encodings['content'],
-						'backslashreplace')
 				syslog.syslog(_pri[msgtype], line.rstrip("\n"))
 	syslog.closelog()
diff --git a/lib/portage/exception.py b/lib/portage/exception.py
index fa59f1f14..e2be95c1e 100644
--- a/lib/portage/exception.py
+++ b/lib/portage/exception.py
@@ -9,35 +9,15 @@ from portage.localization import _
 
 class PortageException(Exception):
 	"""General superclass for portage exceptions"""
-	if sys.hexversion >= 0x3000000:
-		def __init__(self, value):
-			self.value = value[:]
-
-		def __str__(self):
-			if isinstance(self.value, str):
-				return self.value
-			else:
-				return repr(self.value)
-	else:
-		def __init__(self, value):
-			self.value = value[:]
-			if isinstance(self.value, str):
-				self.value = _unicode_decode(self.value,
-					encoding=_encodings['content'], errors='replace')
-
-		def __unicode__(self):
-			if isinstance(self.value, unicode):
-				return self.value
-			else:
-				return _unicode_decode(repr(self.value),
-					encoding=_encodings['content'], errors='replace')
-
-		def __str__(self):
-			if isinstance(self.value, unicode):
-				return _unicode_encode(self.value,
-					encoding=_encodings['content'], errors='backslashreplace')
-			else:
-				return repr(self.value)
+	def __init__(self, value):
+		self.value = value[:]
+
+	def __str__(self):
+		if isinstance(self.value, str):
+			return self.value
+		else:
+			return repr(self.value)
+
 
 class PortageKeyError(KeyError, PortageException):
 	__doc__ = KeyError.__doc__
@@ -187,13 +167,6 @@ class UnsupportedAPIException(PortagePackageException):
 		return _unicode_decode(msg,
 			encoding=_encodings['content'], errors='replace')
 
-	if sys.hexversion < 0x3000000:
-
-		__unicode__ = __str__
-
-		def __str__(self):
-			return _unicode_encode(self.__unicode__(),
-				encoding=_encodings['content'], errors='backslashreplace')
 
 class SignatureException(PortageException):
 	"""Signature was not present in the checked file"""
diff --git a/lib/portage/mail.py b/lib/portage/mail.py
index 6a351aa24..730c9352e 100644
--- a/lib/portage/mail.py
+++ b/lib/portage/mail.py
@@ -19,20 +19,15 @@ from portage import _unicode_decode, _unicode_encode
 from portage.localization import _
 import portage
 
-if sys.hexversion >= 0x3000000:
-	def _force_ascii_if_necessary(s):
-		# Force ascii encoding in order to avoid UnicodeEncodeError
-		# from smtplib.sendmail with python3 (bug #291331).
-		s = _unicode_encode(s,
-			encoding='ascii', errors='backslashreplace')
-		s = _unicode_decode(s,
-			encoding='ascii', errors='replace')
-		return s
+def _force_ascii_if_necessary(s):
+	# Force ascii encoding in order to avoid UnicodeEncodeError
+	# from smtplib.sendmail with python3 (bug #291331).
+	s = _unicode_encode(s,
+		encoding='ascii', errors='backslashreplace')
+	s = _unicode_decode(s,
+		encoding='ascii', errors='replace')
+	return s
 
-else:
-
-	def _force_ascii_if_necessary(s):
-		return s
 
 def TextMessage(_text):
 	from email.mime.text import MIMEText
@@ -47,16 +42,6 @@ def create_message(sender, recipient, subject, body, attachments=None):
 	from email.mime.multipart import MIMEMultipart as MultipartMessage
 	from email.utils import formatdate
 
-	if sys.hexversion < 0x3000000:
-		sender = _unicode_encode(sender,
-			encoding=_encodings['content'], errors='strict')
-		recipient = _unicode_encode(recipient,
-			encoding=_encodings['content'], errors='strict')
-		subject = _unicode_encode(subject,
-			encoding=_encodings['content'], errors='backslashreplace')
-		body = _unicode_encode(body,
-			encoding=_encodings['content'], errors='backslashreplace')
-
 	if attachments == None:
 		mymessage = TextMessage(body)
 	else:
@@ -66,10 +51,6 @@ def create_message(sender, recipient, subject, body, attachments=None):
 			if isinstance(x, BaseMessage):
 				mymessage.attach(x)
 			elif isinstance(x, str):
-				if sys.hexversion < 0x3000000:
-					x = _unicode_encode(x,
-						encoding=_encodings['content'],
-						errors='backslashreplace')
 				mymessage.attach(TextMessage(x))
 			else:
 				raise portage.exception.PortageException(_("Can't handle type of attachment: %s") % type(x))
@@ -129,20 +110,6 @@ def send_mail(mysettings, message):
 
 	myfrom = message.get("From")
 
-	if sys.hexversion < 0x3000000:
-		myrecipient = _unicode_encode(myrecipient,
-			encoding=_encodings['content'], errors='strict')
-		mymailhost = _unicode_encode(mymailhost,
-			encoding=_encodings['content'], errors='strict')
-		mymailport = _unicode_encode(mymailport,
-			encoding=_encodings['content'], errors='strict')
-		myfrom = _unicode_encode(myfrom,
-			encoding=_encodings['content'], errors='strict')
-		mymailuser = _unicode_encode(mymailuser,
-			encoding=_encodings['content'], errors='strict')
-		mymailpasswd = _unicode_encode(mymailpasswd,
-			encoding=_encodings['content'], errors='strict')
-
 	# user wants to use a sendmail binary instead of smtp
 	if mymailhost[0] == os.sep and os.path.exists(mymailhost):
 		fd = os.popen(mymailhost+" -f "+myfrom+" "+myrecipient, "w")
diff --git a/lib/portage/manifest.py b/lib/portage/manifest.py
index b2c3923a1..7671bae34 100644
--- a/lib/portage/manifest.py
+++ b/lib/portage/manifest.py
@@ -107,13 +107,6 @@ class Manifest2Entry(ManifestEntry):
 	def __ne__(self, other):
 		return not self.__eq__(other)
 
-	if sys.hexversion < 0x3000000:
-
-		__unicode__ = __str__
-
-		def __str__(self):
-			return _unicode_encode(self.__unicode__(),
-				encoding=_encodings['repo.content'], errors='strict')
 
 class Manifest(object):
 	parsers = (parseManifest2,)
diff --git a/lib/portage/output.py b/lib/portage/output.py
index 6fbb24f4c..8bfcd91c2 100644
--- a/lib/portage/output.py
+++ b/lib/portage/output.py
@@ -256,9 +256,7 @@ def xtermTitle(mystr, raw=False):
 		# avoid potential UnicodeEncodeError
 		mystr = _unicode_encode(mystr,
 			encoding=_encodings['stdio'], errors='backslashreplace')
-		f = sys.stderr
-		if sys.hexversion >= 0x3000000:
-			f = f.buffer
+		f = sys.stderr.buffer
 		f.write(mystr)
 		f.flush()
 
diff --git a/lib/portage/process.py b/lib/portage/process.py
index bbe8d02f0..f550bcb30 100644
--- a/lib/portage/process.py
+++ b/lib/portage/process.py
@@ -198,10 +198,7 @@ def run_exitfuncs():
 			exc_info = sys.exc_info()
 
 	if exc_info is not None:
-		if sys.hexversion >= 0x3000000:
-			raise exc_info[0](exc_info[1]).with_traceback(exc_info[2])
-		else:
-			exec("raise exc_info[0], exc_info[1], exc_info[2]")
+		raise exc_info[0](exc_info[1]).with_traceback(exc_info[2])
 
 atexit.register(run_exitfuncs)
 
@@ -289,15 +286,6 @@ def spawn(mycommand, env=None, opt_name=None, fd_pipes=None, returnpid=False,
 
 	env = os.environ if env is None else env
 
-	if sys.hexversion < 0x3000000:
-		# Avoid a potential UnicodeEncodeError from os.execve().
-		env_bytes = {}
-		for k, v in env.items():
-			env_bytes[_unicode_encode(k, encoding=_encodings['content'])] = \
-				_unicode_encode(v, encoding=_encodings['content'])
-		env = env_bytes
-		del env_bytes
-
 	# If an absolute path to an executable file isn't given
 	# search for it unless we've been told not to.
 	binary = mycommand[0]
@@ -964,7 +952,7 @@ def find_binary(binary):
 	@return: full path to binary or None if the binary could not be located.
 	"""
 	paths = os.environ.get("PATH", "")
-	if sys.hexversion >= 0x3000000 and isinstance(binary, bytes):
+	if isinstance(binary, bytes):
 		# return bytes when input is bytes
 		paths = paths.encode(sys.getfilesystemencoding(), 'surrogateescape')
 		paths = paths.split(b':')
diff --git a/lib/portage/proxy/objectproxy.py b/lib/portage/proxy/objectproxy.py
index a755774ae..e3bf4f75a 100644
--- a/lib/portage/proxy/objectproxy.py
+++ b/lib/portage/proxy/objectproxy.py
@@ -88,11 +88,5 @@ class ObjectProxy(object):
 	def __bool__(self):
 		return bool(object.__getattribute__(self, '_get_target')())
 
-	if sys.hexversion < 0x3000000:
-		__nonzero__ = __bool__
-
-		def __unicode__(self):
-			return unicode(object.__getattribute__(self, '_get_target')())
-
 	def __int__(self):
 		return int(object.__getattribute__(self, '_get_target')())
diff --git a/lib/portage/repository/config.py b/lib/portage/repository/config.py
index e75b6b543..210ae3aa0 100644
--- a/lib/portage/repository/config.py
+++ b/lib/portage/repository/config.py
@@ -530,12 +530,6 @@ class RepoConfig(object):
 			d[k] = getattr(self, k, None)
 		return "%s" % (d,)
 
-	if sys.hexversion < 0x3000000:
-
-		__unicode__ = __str__
-
-		def __str__(self):
-			return _unicode_encode(self.__unicode__())
 
 class RepoConfigLoader(object):
 	"""Loads and store config of several repositories, loaded from PORTDIR_OVERLAY or repos.conf"""
diff --git a/lib/portage/tests/unicode/test_string_format.py b/lib/portage/tests/unicode/test_string_format.py
index 713aca8ae..561feeea1 100644
--- a/lib/portage/tests/unicode/test_string_format.py
+++ b/lib/portage/tests/unicode/test_string_format.py
@@ -10,8 +10,6 @@ from _emerge.DependencyArg import DependencyArg
 from _emerge.UseFlagDisplay import UseFlagDisplay
 
 
-STR_IS_UNICODE = sys.hexversion >= 0x3000000
-
 class StringFormatTestCase(TestCase):
 	"""
 	Test that string formatting works correctly in the current interpretter,
@@ -39,17 +37,9 @@ class StringFormatTestCase(TestCase):
 			formatted_str = "%s" % (dependency_arg,)
 			self.assertEqual(formatted_str, arg_unicode)
 
-			if STR_IS_UNICODE:
-
-				# Test the __str__ method which returns unicode in python3
-				formatted_str = "%s" % (dependency_arg,)
-				self.assertEqual(formatted_str, arg_unicode)
-
-			else:
-
-				# Test the __str__ method which returns encoded bytes in python2
-				formatted_bytes = b"%s" % (dependency_arg,)
-				self.assertEqual(formatted_bytes, arg_bytes)
+			# Test the __str__ method which returns unicode in python3
+			formatted_str = "%s" % (dependency_arg,)
+			self.assertEqual(formatted_str, arg_unicode)
 
 	def testPortageException(self):
 
@@ -64,17 +54,9 @@ class StringFormatTestCase(TestCase):
 			formatted_str = "%s" % (e,)
 			self.assertEqual(formatted_str, arg_unicode)
 
-			if STR_IS_UNICODE:
-
-				# Test the __str__ method which returns unicode in python3
-				formatted_str = "%s" % (e,)
-				self.assertEqual(formatted_str, arg_unicode)
-
-			else:
-
-				# Test the __str__ method which returns encoded bytes in python2
-				formatted_bytes = b"%s" % (e,)
-				self.assertEqual(formatted_bytes, arg_bytes)
+			# Test the __str__ method which returns unicode in python3
+			formatted_str = "%s" % (e,)
+			self.assertEqual(formatted_str, arg_unicode)
 
 	def testUseFlagDisplay(self):
 
@@ -90,14 +72,6 @@ class StringFormatTestCase(TestCase):
 					formatted_str = "%s" % (e,)
 					self.assertEqual(isinstance(formatted_str, str), True)
 
-					if STR_IS_UNICODE:
-
-						# Test the __str__ method which returns unicode in python3
-						formatted_str = "%s" % (e,)
-						self.assertEqual(isinstance(formatted_str, str), True)
-
-					else:
-
-						# Test the __str__ method which returns encoded bytes in python2
-						formatted_bytes = b"%s" % (e,)
-						self.assertEqual(isinstance(formatted_bytes, bytes), True)
+					# Test the __str__ method which returns unicode in python3
+					formatted_str = "%s" % (e,)
+					self.assertEqual(isinstance(formatted_str, str), True)
diff --git a/lib/portage/util/_ShelveUnicodeWrapper.py b/lib/portage/util/_ShelveUnicodeWrapper.py
deleted file mode 100644
index adbd5199f..000000000
--- a/lib/portage/util/_ShelveUnicodeWrapper.py
+++ /dev/null
@@ -1,45 +0,0 @@
-# Copyright 2013 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-
-class ShelveUnicodeWrapper(object):
-	"""
-	Convert unicode to str and back again, since python-2.x shelve
-	module doesn't support unicode.
-	"""
-	def __init__(self, shelve_instance):
-		self._shelve = shelve_instance
-
-	def _encode(self, s):
-		if isinstance(s, unicode):
-			s = s.encode('utf_8')
-		return s
-
-	def __len__(self):
-		return len(self._shelve)
-
-	def __contains__(self, k):
-		return self._encode(k) in self._shelve
-
-	def __iter__(self):
-		return self._shelve.__iter__()
-
-	def items(self):
-		return self._shelve.iteritems()
-
-	def __setitem__(self, k, v):
-		self._shelve[self._encode(k)] = self._encode(v)
-
-	def __getitem__(self, k):
-		return self._shelve[self._encode(k)]
-
-	def __delitem__(self, k):
-		del self._shelve[self._encode(k)]
-
-	def get(self, k, *args):
-		return self._shelve.get(self._encode(k), *args)
-
-	def close(self):
-		self._shelve.close()
-
-	def clear(self):
-		self._shelve.clear()
-- 
2.27.0



^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [gentoo-portage-dev] [PATCH] Eliminate the most of explicit py3 conditionals
  2020-07-16 12:18 [gentoo-portage-dev] [PATCH] Eliminate the most of explicit py3 conditionals Michał Górny
@ 2020-07-16 17:42 ` Zac Medico
  0 siblings, 0 replies; 2+ messages in thread
From: Zac Medico @ 2020-07-16 17:42 UTC (permalink / raw
  To: gentoo-portage-dev, Michał Górny


[-- Attachment #1.1: Type: text/plain, Size: 2882 bytes --]

On 7/16/20 5:18 AM, Michał Górny wrote:
> Eliminate the most of py2/py3 conditions in the code.  Leave a few
> where the relevant code is unclear, they will be addressed later.
> 
> Closes: https://github.com/gentoo/portage/pull/574
> Signed-off-by: Michał Górny <mgorny@gentoo.org>
> ---
>  bin/check-implicit-pointer-usage.py           | 25 ++--------
>  bin/chmod-lite.py                             | 11 ++---
>  bin/dohtml.py                                 | 11 ++---
>  bin/doins.py                                  |  7 ++-
>  bin/ebuild                                    | 15 +-----
>  bin/filter-bash-environment.py                | 11 ++---
>  bin/install.py                                | 19 ++++---
>  bin/pid-ns-init                               | 10 ++--
>  bin/xattr-helper.py                           | 32 +++---------
>  lib/_emerge/DependencyArg.py                  | 10 ----
>  lib/_emerge/JobStatusDisplay.py               |  4 +-
>  lib/_emerge/Package.py                        |  8 ---
>  lib/_emerge/PackageVirtualDbapi.py            |  3 --
>  lib/_emerge/SequentialTaskQueue.py            |  3 --
>  lib/_emerge/TaskSequence.py                   |  3 --
>  lib/_emerge/UseFlagDisplay.py                 |  8 ---
>  lib/_emerge/UserQuery.py                      | 17 +++----
>  lib/_emerge/actions.py                        |  2 -
>  lib/_emerge/resolver/DbapiProvidesIndex.py    |  3 --
>  lib/_emerge/resolver/output_helpers.py        | 16 ------
>  lib/_emerge/resolver/slot_collision.py        |  8 ---
>  lib/portage/__init__.py                       | 49 +++++++------------
>  lib/portage/_emirrordist/Config.py            |  4 --
>  lib/portage/_selinux.py                       | 12 -----
>  lib/portage/_sets/base.py                     |  3 --
>  lib/portage/dbapi/porttree.py                 |  7 +--
>  lib/portage/dep/__init__.py                   | 18 +------
>  lib/portage/dep/soname/SonameAtom.py          |  8 ---
>  lib/portage/elog/mod_save_summary.py          |  2 -
>  lib/portage/elog/mod_syslog.py                |  4 --
>  lib/portage/exception.py                      | 45 ++++-------------
>  lib/portage/mail.py                           | 49 +++----------------
>  lib/portage/manifest.py                       |  7 ---
>  lib/portage/output.py                         |  4 +-
>  lib/portage/process.py                        | 16 +-----
>  lib/portage/proxy/objectproxy.py              |  6 ---
>  lib/portage/repository/config.py              |  6 ---
>  .../tests/unicode/test_string_format.py       | 44 ++++-------------
>  lib/portage/util/_ShelveUnicodeWrapper.py     | 45 -----------------
>  39 files changed, 102 insertions(+), 453 deletions(-)
>  delete mode 100644 lib/portage/util/_ShelveUnicodeWrapper.py

Looks good. Please merge.
-- 
Thanks,
Zac


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 981 bytes --]

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2020-07-16 17:42 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-07-16 12:18 [gentoo-portage-dev] [PATCH] Eliminate the most of explicit py3 conditionals Michał Górny
2020-07-16 17:42 ` Zac Medico

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox