Merge pull request #1073 from tahoe-lafs/3718.allmydata-scripts-python-3-part-2

Port allmydata.scripts to Python 3, part 2

Fixes ticket:3718
This commit is contained in:
Itamar Turner-Trauring 2021-06-02 11:32:08 -04:00 committed by GitHub
commit 336ca45c7f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 84 additions and 31 deletions

0
newsfragments/3718.minor Normal file
View File

View File

@ -1,3 +1,15 @@
"""
Ported to Python 3.
"""
from __future__ import unicode_literals
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
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 sys
import six

View File

@ -1,7 +1,15 @@
"""
Ported to Python 3.
"""
from __future__ import unicode_literals
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from future.utils import PY3
from past.builtins import unicode
from future.utils import PY2, PY3
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 six import ensure_str
import os, time
@ -29,7 +37,7 @@ class SlowOperationRunner(object):
except UnknownAliasError as e:
e.display(stderr)
return 1
path = unicode(path, "utf-8")
path = str(path, "utf-8")
if path == '/':
path = ''
url = nodeurl + "uri/%s" % url_quote(rootcap)
@ -58,10 +66,10 @@ class SlowOperationRunner(object):
def wait_for_results(self):
last = 0
for next in self.poll_times():
delay = next - last
for next_item in self.poll_times():
delay = next_item - last
time.sleep(delay)
last = next
last = next_item
if self.poll():
return 0

View File

@ -1,7 +1,14 @@
from __future__ import print_function
"""
Ported to Python 3.
"""
from __future__ import unicode_literals
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from past.builtins import unicode
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 os.path
import codecs
@ -37,7 +44,7 @@ def add_line_to_aliasfile(aliasfile, alias, cap):
def add_alias(options):
nodedir = options['node-directory']
alias = options.alias
precondition(isinstance(alias, unicode), alias=alias)
precondition(isinstance(alias, str), alias=alias)
cap = options.cap
stdout = options.stdout
stderr = options.stderr
@ -54,7 +61,7 @@ def add_alias(options):
show_output(stderr, "Alias {alias} already exists!", alias=alias)
return 1
aliasfile = os.path.join(nodedir, "private", "aliases")
cap = unicode(uri.from_string_dirnode(cap).to_string(), 'utf-8')
cap = str(uri.from_string_dirnode(cap).to_string(), 'utf-8')
add_line_to_aliasfile(aliasfile, alias, cap)
show_output(stdout, "Alias {alias} added", alias=alias)
@ -64,7 +71,7 @@ def create_alias(options):
# mkdir+add_alias
nodedir = options['node-directory']
alias = options.alias
precondition(isinstance(alias, unicode), alias=alias)
precondition(isinstance(alias, str), alias=alias)
stdout = options.stdout
stderr = options.stderr
if u":" in alias:
@ -94,7 +101,7 @@ def create_alias(options):
# probably check for others..
add_line_to_aliasfile(aliasfile, alias, unicode(new_uri, "utf-8"))
add_line_to_aliasfile(aliasfile, alias, str(new_uri, "utf-8"))
show_output(stdout, "Alias {alias} created", alias=alias)
return 0
@ -114,7 +121,7 @@ def show_output(fp, template, **kwargs):
``encoding`` attribute at all (eg StringIO.StringIO) by writing
utf-8-encoded bytes.
"""
assert isinstance(template, unicode)
assert isinstance(template, str)
# On Python 3 fp has an encoding attribute under all real usage. On
# Python 2, the encoding attribute is None if stdio is not a tty. The

View File

@ -1,6 +1,14 @@
"""
Ported to Python 3.
"""
from __future__ import unicode_literals
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from past.builtins import unicode
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 os.path
import time
@ -293,7 +301,7 @@ def collect_backup_targets(root, listdir, filter_children):
yield FilenameUndecodableTarget(root, isdir=True)
else:
for child in filter_children(children):
assert isinstance(child, unicode), child
assert isinstance(child, str), child
childpath = os.path.join(root, child)
if os.path.islink(childpath):
yield LinkTarget(childpath, isdir=False)
@ -498,10 +506,10 @@ class BackupProgress(object):
)
def _format_elapsed(self, elapsed):
seconds = elapsed.total_seconds()
hours = int(seconds / 3600)
minutes = int(seconds / 60 % 60)
seconds = int(seconds % 60)
seconds = int(elapsed.total_seconds())
hours = seconds // 3600
minutes = (seconds // 60) % 60
seconds = seconds % 60
return "{}h {}m {}s".format(
hours,
minutes,
@ -526,12 +534,12 @@ class BackupProgress(object):
return self, {
os.path.basename(create_path): create_value
for (create_path, create_value)
in self._create_contents.items()
in list(self._create_contents.items())
if os.path.dirname(create_path) == dirpath
}, {
os.path.basename(compare_path): compare_value
for (compare_path, compare_value)
in self._compare_contents.items()
in list(self._compare_contents.items())
if os.path.dirname(compare_path) == dirpath
}

View File

@ -1,19 +1,26 @@
"""
Ported to Python 3.
"""
from __future__ import unicode_literals
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
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
from six import ensure_str, ensure_text
from urllib.parse import quote as url_quote
import json
# Python 2 compatibility
from future.utils import PY2
if PY2:
from future.builtins import str # noqa: F401
from twisted.protocols.basic import LineOnlyReceiver
from allmydata.scripts.common import get_alias, DEFAULT_ALIAS, escape_path, \
UnknownAliasError
from allmydata.scripts.common_http import do_http, format_http_error
from allmydata.util.encodingutil import quote_output, quote_path
from allmydata.util.encodingutil import quote_output, quote_path, get_io_encoding
class Checker(object):
pass
@ -168,7 +175,9 @@ class DeepCheckOutput(LineOnlyReceiver, object):
# LIT files and directories do not have a "summary" field.
summary = cr.get("summary", "Healthy (LIT)")
print("%s: %s" % (quote_path(path), quote_output(summary, quotemarks=False)), file=stdout)
# When Python 2 is dropped the ensure_text()/ensure_str() will be unnecessary.
print(ensure_text(ensure_str("%s: %s") % (quote_path(path), quote_output(summary, quotemarks=False)),
encoding=get_io_encoding()), file=stdout)
# always print out corrupt shares
for shareloc in cr["results"].get("list-corrupt-shares", []):
@ -245,11 +254,14 @@ class DeepCheckAndRepairOutput(LineOnlyReceiver, object):
if not path:
path = ["<root>"]
# we don't seem to have a summary available, so build one
# When Python 2 is dropped the ensure_text/ensure_str crap can be
# dropped.
if was_healthy:
summary = "healthy"
summary = ensure_str("healthy")
else:
summary = "not healthy"
print("%s: %s" % (quote_path(path), summary), file=stdout)
summary = ensure_str("not healthy")
print(ensure_text(ensure_str("%s: %s") % (quote_path(path), summary),
encoding=get_io_encoding()), file=stdout)
# always print out corrupt shares
prr = crr.get("pre-repair-results", {})

View File

@ -16,6 +16,7 @@ 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
PORTED_INTEGRATION_TESTS = [
"integration.test_aaa_aardvark",
"integration.test_servers_of_happiness",
@ -98,7 +99,12 @@ PORTED_MODULES = [
"allmydata.scripts.common",
"allmydata.scripts.create_node",
"allmydata.scripts.debug",
"allmydata.scripts.default_nodedir",
"allmydata.scripts.runner",
"allmydata.scripts.slow_operation",
"allmydata.scripts.tahoe_add_alias",
"allmydata.scripts.tahoe_backup",
"allmydata.scripts.tahoe_check",
"allmydata.scripts.types_",
"allmydata.stats",
"allmydata.storage_client",