mirror of
https://github.com/tahoe-lafs/tahoe-lafs.git
synced 2025-01-08 22:12:43 +00:00
Clean up some more Python 2 remnants
This commit is contained in:
parent
6b58b66677
commit
a58d8a567a
@ -1,14 +1,7 @@
|
|||||||
"""
|
"""
|
||||||
Ported to Python 3.
|
Ported to Python 3.
|
||||||
"""
|
"""
|
||||||
from __future__ import absolute_import
|
from __future__ import annotations
|
||||||
from __future__ import division
|
|
||||||
from __future__ import print_function
|
|
||||||
from __future__ import unicode_literals
|
|
||||||
|
|
||||||
from future.utils import PY2
|
|
||||||
if PY2:
|
|
||||||
from future.builtins import filter, map, zip, ascii, chr, hex, input, next, oct, open, pow, round, super, bytes, dict, list, object, range, str, max, min # noqa: F401
|
|
||||||
|
|
||||||
MODE_CHECK = "MODE_CHECK" # query all peers
|
MODE_CHECK = "MODE_CHECK" # query all peers
|
||||||
MODE_ANYTHING = "MODE_ANYTHING" # one recoverable version
|
MODE_ANYTHING = "MODE_ANYTHING" # one recoverable version
|
||||||
|
@ -1,14 +1,7 @@
|
|||||||
"""
|
"""
|
||||||
Ported to Python 3.
|
Ported to Python 3.
|
||||||
"""
|
"""
|
||||||
from __future__ import absolute_import
|
from __future__ import annotations
|
||||||
from __future__ import division
|
|
||||||
from __future__ import print_function
|
|
||||||
from __future__ import unicode_literals
|
|
||||||
|
|
||||||
from future.utils import PY2
|
|
||||||
if PY2:
|
|
||||||
from future.builtins import filter, map, zip, ascii, chr, hex, input, next, oct, open, pow, round, super, bytes, dict, list, object, range, str, max, min # noqa: F401
|
|
||||||
|
|
||||||
import random
|
import random
|
||||||
|
|
||||||
|
@ -1,15 +1,7 @@
|
|||||||
"""
|
"""
|
||||||
Ported to Python 3.
|
Ported to Python 3.
|
||||||
"""
|
"""
|
||||||
from __future__ import absolute_import
|
from __future__ import annotations
|
||||||
from __future__ import division
|
|
||||||
from __future__ import print_function
|
|
||||||
from __future__ import unicode_literals
|
|
||||||
|
|
||||||
from future.utils import PY2
|
|
||||||
if PY2:
|
|
||||||
# Don't import bytes and str, to prevent API leakage
|
|
||||||
from future.builtins import filter, map, zip, ascii, chr, hex, input, next, oct, open, pow, round, super, dict, list, object, range, max, min # noqa: F401
|
|
||||||
|
|
||||||
import time
|
import time
|
||||||
|
|
||||||
|
@ -1,16 +1,8 @@
|
|||||||
"""
|
"""
|
||||||
Ported to Python 3.
|
Ported to Python 3.
|
||||||
"""
|
"""
|
||||||
from __future__ import print_function
|
from __future__ import annotations
|
||||||
from __future__ import absolute_import
|
|
||||||
from __future__ import division
|
|
||||||
from __future__ import unicode_literals
|
|
||||||
|
|
||||||
from future.utils import PY2
|
|
||||||
if PY2:
|
|
||||||
# Doesn't import str to prevent API leakage on Python 2
|
|
||||||
from future.builtins import filter, map, zip, ascii, chr, hex, input, next, oct, open, pow, round, super, bytes, dict, list, object, range, max, min # noqa: F401
|
|
||||||
from past.builtins import unicode
|
|
||||||
from six import ensure_str
|
from six import ensure_str
|
||||||
|
|
||||||
import sys, time, copy
|
import sys, time, copy
|
||||||
@ -203,8 +195,8 @@ class ServerMap(object):
|
|||||||
(seqnum, root_hash, IV, segsize, datalength, k, N, prefix,
|
(seqnum, root_hash, IV, segsize, datalength, k, N, prefix,
|
||||||
offsets_tuple) = verinfo
|
offsets_tuple) = verinfo
|
||||||
print("[%s]: sh#%d seq%d-%s %d-of-%d len%d" %
|
print("[%s]: sh#%d seq%d-%s %d-of-%d len%d" %
|
||||||
(unicode(server.get_name(), "utf-8"), shnum,
|
(str(server.get_name(), "utf-8"), shnum,
|
||||||
seqnum, unicode(base32.b2a(root_hash)[:4], "utf-8"), k, N,
|
seqnum, str(base32.b2a(root_hash)[:4], "utf-8"), k, N,
|
||||||
datalength), file=out)
|
datalength), file=out)
|
||||||
if self._problems:
|
if self._problems:
|
||||||
print("%d PROBLEMS" % len(self._problems), file=out)
|
print("%d PROBLEMS" % len(self._problems), file=out)
|
||||||
@ -276,7 +268,7 @@ class ServerMap(object):
|
|||||||
"""Take a versionid, return a string that describes it."""
|
"""Take a versionid, return a string that describes it."""
|
||||||
(seqnum, root_hash, IV, segsize, datalength, k, N, prefix,
|
(seqnum, root_hash, IV, segsize, datalength, k, N, prefix,
|
||||||
offsets_tuple) = verinfo
|
offsets_tuple) = verinfo
|
||||||
return "seq%d-%s" % (seqnum, unicode(base32.b2a(root_hash)[:4], "utf-8"))
|
return "seq%d-%s" % (seqnum, str(base32.b2a(root_hash)[:4], "utf-8"))
|
||||||
|
|
||||||
def summarize_versions(self):
|
def summarize_versions(self):
|
||||||
"""Return a string describing which versions we know about."""
|
"""Return a string describing which versions we know about."""
|
||||||
@ -824,7 +816,7 @@ class ServermapUpdater(object):
|
|||||||
|
|
||||||
|
|
||||||
def notify_server_corruption(self, server, shnum, reason):
|
def notify_server_corruption(self, server, shnum, reason):
|
||||||
if isinstance(reason, unicode):
|
if isinstance(reason, str):
|
||||||
reason = reason.encode("utf-8")
|
reason = reason.encode("utf-8")
|
||||||
ss = server.get_storage_server()
|
ss = server.get_storage_server()
|
||||||
ss.advise_corrupt_share(
|
ss.advise_corrupt_share(
|
||||||
@ -879,7 +871,7 @@ class ServermapUpdater(object):
|
|||||||
# ok, it's a valid verinfo. Add it to the list of validated
|
# ok, it's a valid verinfo. Add it to the list of validated
|
||||||
# versions.
|
# versions.
|
||||||
self.log(" found valid version %d-%s from %s-sh%d: %d-%d/%d/%d"
|
self.log(" found valid version %d-%s from %s-sh%d: %d-%d/%d/%d"
|
||||||
% (seqnum, unicode(base32.b2a(root_hash)[:4], "utf-8"),
|
% (seqnum, str(base32.b2a(root_hash)[:4], "utf-8"),
|
||||||
ensure_str(server.get_name()), shnum,
|
ensure_str(server.get_name()), shnum,
|
||||||
k, n, segsize, datalen),
|
k, n, segsize, datalen),
|
||||||
parent=lp)
|
parent=lp)
|
||||||
|
@ -1,210 +0,0 @@
|
|||||||
"""
|
|
||||||
This module is only necessary on Python 2. Once Python 2 code is dropped, it
|
|
||||||
can be deleted.
|
|
||||||
"""
|
|
||||||
|
|
||||||
from future.utils import PY3
|
|
||||||
if PY3:
|
|
||||||
raise RuntimeError("Just use subprocess.Popen")
|
|
||||||
|
|
||||||
# This is necessary to pacify flake8 on Python 3, while we're still supporting
|
|
||||||
# Python 2.
|
|
||||||
from past.builtins import unicode
|
|
||||||
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
|
|
||||||
## Copyright (C) 2021 Valentin Lab
|
|
||||||
##
|
|
||||||
## Redistribution and use in source and binary forms, with or without
|
|
||||||
## modification, are permitted provided that the following conditions
|
|
||||||
## are met:
|
|
||||||
##
|
|
||||||
## 1. Redistributions of source code must retain the above copyright
|
|
||||||
## notice, this list of conditions and the following disclaimer.
|
|
||||||
##
|
|
||||||
## 2. Redistributions in binary form must reproduce the above
|
|
||||||
## copyright notice, this list of conditions and the following
|
|
||||||
## disclaimer in the documentation and/or other materials provided
|
|
||||||
## with the distribution.
|
|
||||||
##
|
|
||||||
## 3. Neither the name of the copyright holder nor the names of its
|
|
||||||
## contributors may be used to endorse or promote products derived
|
|
||||||
## from this software without specific prior written permission.
|
|
||||||
##
|
|
||||||
## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
|
||||||
## FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
||||||
## COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
|
||||||
## INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
## (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
## SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
## HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
||||||
## STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
## ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
|
||||||
## OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
##
|
|
||||||
|
|
||||||
## issue: https://bugs.python.org/issue19264
|
|
||||||
|
|
||||||
# See allmydata/windows/fixups.py
|
|
||||||
import sys
|
|
||||||
assert sys.platform == "win32"
|
|
||||||
|
|
||||||
import os
|
|
||||||
import ctypes
|
|
||||||
import subprocess
|
|
||||||
import _subprocess
|
|
||||||
from ctypes import byref, windll, c_char_p, c_wchar_p, c_void_p, \
|
|
||||||
Structure, sizeof, c_wchar, WinError
|
|
||||||
from ctypes.wintypes import BYTE, WORD, LPWSTR, BOOL, DWORD, LPVOID, \
|
|
||||||
HANDLE
|
|
||||||
|
|
||||||
|
|
||||||
##
|
|
||||||
## Types
|
|
||||||
##
|
|
||||||
|
|
||||||
CREATE_UNICODE_ENVIRONMENT = 0x00000400
|
|
||||||
LPCTSTR = c_char_p
|
|
||||||
LPTSTR = c_wchar_p
|
|
||||||
LPSECURITY_ATTRIBUTES = c_void_p
|
|
||||||
LPBYTE = ctypes.POINTER(BYTE)
|
|
||||||
|
|
||||||
class STARTUPINFOW(Structure):
|
|
||||||
_fields_ = [
|
|
||||||
("cb", DWORD), ("lpReserved", LPWSTR),
|
|
||||||
("lpDesktop", LPWSTR), ("lpTitle", LPWSTR),
|
|
||||||
("dwX", DWORD), ("dwY", DWORD),
|
|
||||||
("dwXSize", DWORD), ("dwYSize", DWORD),
|
|
||||||
("dwXCountChars", DWORD), ("dwYCountChars", DWORD),
|
|
||||||
("dwFillAtrribute", DWORD), ("dwFlags", DWORD),
|
|
||||||
("wShowWindow", WORD), ("cbReserved2", WORD),
|
|
||||||
("lpReserved2", LPBYTE), ("hStdInput", HANDLE),
|
|
||||||
("hStdOutput", HANDLE), ("hStdError", HANDLE),
|
|
||||||
]
|
|
||||||
|
|
||||||
LPSTARTUPINFOW = ctypes.POINTER(STARTUPINFOW)
|
|
||||||
|
|
||||||
|
|
||||||
class PROCESS_INFORMATION(Structure):
|
|
||||||
_fields_ = [
|
|
||||||
("hProcess", HANDLE), ("hThread", HANDLE),
|
|
||||||
("dwProcessId", DWORD), ("dwThreadId", DWORD),
|
|
||||||
]
|
|
||||||
|
|
||||||
LPPROCESS_INFORMATION = ctypes.POINTER(PROCESS_INFORMATION)
|
|
||||||
|
|
||||||
|
|
||||||
class DUMMY_HANDLE(ctypes.c_void_p):
|
|
||||||
|
|
||||||
def __init__(self, *a, **kw):
|
|
||||||
super(DUMMY_HANDLE, self).__init__(*a, **kw)
|
|
||||||
self.closed = False
|
|
||||||
|
|
||||||
def Close(self):
|
|
||||||
if not self.closed:
|
|
||||||
windll.kernel32.CloseHandle(self)
|
|
||||||
self.closed = True
|
|
||||||
|
|
||||||
def __int__(self):
|
|
||||||
return self.value
|
|
||||||
|
|
||||||
|
|
||||||
CreateProcessW = windll.kernel32.CreateProcessW
|
|
||||||
CreateProcessW.argtypes = [
|
|
||||||
LPCTSTR, LPTSTR, LPSECURITY_ATTRIBUTES,
|
|
||||||
LPSECURITY_ATTRIBUTES, BOOL, DWORD, LPVOID, LPCTSTR,
|
|
||||||
LPSTARTUPINFOW, LPPROCESS_INFORMATION,
|
|
||||||
]
|
|
||||||
CreateProcessW.restype = BOOL
|
|
||||||
|
|
||||||
|
|
||||||
##
|
|
||||||
## Patched functions/classes
|
|
||||||
##
|
|
||||||
|
|
||||||
def CreateProcess(executable, args, _p_attr, _t_attr,
|
|
||||||
inherit_handles, creation_flags, env, cwd,
|
|
||||||
startup_info):
|
|
||||||
"""Create a process supporting unicode executable and args for win32
|
|
||||||
|
|
||||||
Python implementation of CreateProcess using CreateProcessW for Win32
|
|
||||||
|
|
||||||
"""
|
|
||||||
|
|
||||||
si = STARTUPINFOW(
|
|
||||||
dwFlags=startup_info.dwFlags,
|
|
||||||
wShowWindow=startup_info.wShowWindow,
|
|
||||||
cb=sizeof(STARTUPINFOW),
|
|
||||||
## XXXvlab: not sure of the casting here to ints.
|
|
||||||
hStdInput=int(startup_info.hStdInput),
|
|
||||||
hStdOutput=int(startup_info.hStdOutput),
|
|
||||||
hStdError=int(startup_info.hStdError),
|
|
||||||
)
|
|
||||||
|
|
||||||
wenv = None
|
|
||||||
if env is not None:
|
|
||||||
## LPCWSTR seems to be c_wchar_p, so let's say CWSTR is c_wchar
|
|
||||||
env = (unicode("").join([
|
|
||||||
unicode("%s=%s\0") % (k, v)
|
|
||||||
for k, v in env.items()])) + unicode("\0")
|
|
||||||
wenv = (c_wchar * len(env))()
|
|
||||||
wenv.value = env
|
|
||||||
|
|
||||||
pi = PROCESS_INFORMATION()
|
|
||||||
creation_flags |= CREATE_UNICODE_ENVIRONMENT
|
|
||||||
|
|
||||||
if CreateProcessW(executable, args, None, None,
|
|
||||||
inherit_handles, creation_flags,
|
|
||||||
wenv, cwd, byref(si), byref(pi)):
|
|
||||||
return (DUMMY_HANDLE(pi.hProcess), DUMMY_HANDLE(pi.hThread),
|
|
||||||
pi.dwProcessId, pi.dwThreadId)
|
|
||||||
raise WinError()
|
|
||||||
|
|
||||||
|
|
||||||
class Popen(subprocess.Popen):
|
|
||||||
"""This superseeds Popen and corrects a bug in cPython 2.7 implem"""
|
|
||||||
|
|
||||||
def _execute_child(self, args, executable, preexec_fn, close_fds,
|
|
||||||
cwd, env, universal_newlines,
|
|
||||||
startupinfo, creationflags, shell, to_close,
|
|
||||||
p2cread, p2cwrite,
|
|
||||||
c2pread, c2pwrite,
|
|
||||||
errread, errwrite):
|
|
||||||
"""Code from part of _execute_child from Python 2.7 (9fbb65e)
|
|
||||||
|
|
||||||
There are only 2 little changes concerning the construction of
|
|
||||||
the the final string in shell mode: we preempt the creation of
|
|
||||||
the command string when shell is True, because original function
|
|
||||||
will try to encode unicode args which we want to avoid to be able to
|
|
||||||
sending it as-is to ``CreateProcess``.
|
|
||||||
|
|
||||||
"""
|
|
||||||
if not isinstance(args, subprocess.types.StringTypes):
|
|
||||||
args = subprocess.list2cmdline(args)
|
|
||||||
|
|
||||||
if startupinfo is None:
|
|
||||||
startupinfo = subprocess.STARTUPINFO()
|
|
||||||
if shell:
|
|
||||||
startupinfo.dwFlags |= _subprocess.STARTF_USESHOWWINDOW
|
|
||||||
startupinfo.wShowWindow = _subprocess.SW_HIDE
|
|
||||||
comspec = os.environ.get("COMSPEC", unicode("cmd.exe"))
|
|
||||||
args = unicode('{} /c "{}"').format(comspec, args)
|
|
||||||
if (_subprocess.GetVersion() >= 0x80000000 or
|
|
||||||
os.path.basename(comspec).lower() == "command.com"):
|
|
||||||
w9xpopen = self._find_w9xpopen()
|
|
||||||
args = unicode('"%s" %s') % (w9xpopen, args)
|
|
||||||
creationflags |= _subprocess.CREATE_NEW_CONSOLE
|
|
||||||
|
|
||||||
cp = _subprocess.CreateProcess
|
|
||||||
_subprocess.CreateProcess = CreateProcess
|
|
||||||
try:
|
|
||||||
super(Popen, self)._execute_child(
|
|
||||||
args, executable,
|
|
||||||
preexec_fn, close_fds, cwd, env, universal_newlines,
|
|
||||||
startupinfo, creationflags, False, to_close, p2cread,
|
|
||||||
p2cwrite, c2pread, c2pwrite, errread, errwrite,
|
|
||||||
)
|
|
||||||
finally:
|
|
||||||
_subprocess.CreateProcess = cp
|
|
@ -1,14 +1,8 @@
|
|||||||
"""
|
"""
|
||||||
Ported to Python 3.
|
Functionality related to a lot of the test suite.
|
||||||
"""
|
"""
|
||||||
from __future__ import print_function
|
from __future__ import annotations
|
||||||
from __future__ import absolute_import
|
|
||||||
from __future__ import division
|
|
||||||
from __future__ import unicode_literals
|
|
||||||
|
|
||||||
from future.utils import PY2, native_str
|
|
||||||
if PY2:
|
|
||||||
from future.builtins import filter, map, zip, ascii, chr, hex, input, next, oct, open, pow, round, super, bytes, dict, list, object, range, str, max, min # noqa: F401
|
|
||||||
from past.builtins import chr as byteschr
|
from past.builtins import chr as byteschr
|
||||||
|
|
||||||
__all__ = [
|
__all__ = [
|
||||||
@ -117,19 +111,8 @@ from .eliotutil import (
|
|||||||
)
|
)
|
||||||
from .common_util import ShouldFailMixin # noqa: F401
|
from .common_util import ShouldFailMixin # noqa: F401
|
||||||
|
|
||||||
if sys.platform == "win32" and PY2:
|
|
||||||
# Python 2.7 doesn't have good options for launching a process with
|
|
||||||
# non-ASCII in its command line. So use this alternative that does a
|
|
||||||
# better job. However, only use it on Windows because it doesn't work
|
|
||||||
# anywhere else.
|
|
||||||
from ._win_subprocess import (
|
|
||||||
Popen,
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
from subprocess import (
|
|
||||||
Popen,
|
|
||||||
)
|
|
||||||
from subprocess import (
|
from subprocess import (
|
||||||
|
Popen,
|
||||||
PIPE,
|
PIPE,
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -298,7 +281,7 @@ class UseNode(object):
|
|||||||
plugin_config = attr.ib()
|
plugin_config = attr.ib()
|
||||||
storage_plugin = attr.ib()
|
storage_plugin = attr.ib()
|
||||||
basedir = attr.ib(validator=attr.validators.instance_of(FilePath))
|
basedir = attr.ib(validator=attr.validators.instance_of(FilePath))
|
||||||
introducer_furl = attr.ib(validator=attr.validators.instance_of(native_str),
|
introducer_furl = attr.ib(validator=attr.validators.instance_of(str),
|
||||||
converter=six.ensure_str)
|
converter=six.ensure_str)
|
||||||
node_config = attr.ib(default=attr.Factory(dict))
|
node_config = attr.ib(default=attr.Factory(dict))
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user