Index: Makefile =================================================================== --- Makefile (revision 555198) +++ Makefile (working copy) @@ -3,6 +3,7 @@ PORTNAME= mongodb DISTVERSIONPREFIX= r DISTVERSION= 4.0.19 +PORTREVISION= 1 CATEGORIES= databases net MASTER_SITES= https://fastdl.mongodb.org/src/ \ http://fastdl.mongodb.org/src/ @@ -21,7 +22,7 @@ ONLY_FOR_ARCHS= aarch64 amd64 ONLY_FOR_ARCHS_REASON= "Only supported on amd64 and aarch64 (i386 deprecated in v3)" -BUILD_DEPENDS= ${PYTHON_PKGNAMEPREFIX}cheetah>=2.4.4:devel/py-cheetah@${PY_FLAVOR} \ +BUILD_DEPENDS= ${PYTHON_PKGNAMEPREFIX}cheetah3>0:devel/py-cheetah3@${PY_FLAVOR} \ ${PY_TYPING} \ ${PYTHON_PKGNAMEPREFIX}yaml>=3.11:devel/py-yaml@${PY_FLAVOR} \ ${LOCALBASE}/bin/ar:devel/binutils @@ -30,7 +31,7 @@ libcurl.so:ftp/curl \ libsnappy.so:archivers/snappy -USES= compiler:c++14-lang cpe python:2.7,build scons:python2 shebangfix +USES= compiler:c++14-lang cpe python:3.5+,build scons shebangfix USE_RC_SUBR= mongod CONFLICTS_BUILD= mongo-cxx-driver Index: files/patch-python3 =================================================================== --- files/patch-python3 (nonexistent) +++ files/patch-python3 (working copy) @@ -0,0 +1,1397 @@ +diff -ru /data/ports-build/mongodb-src-r4.0.21/SConstruct ./SConstruct +--- /data/ports-build/mongodb-src-r4.0.21/SConstruct 2020-11-15 22:50:25.001942000 +0100 ++++ ./SConstruct 2020-11-16 20:09:38.793885000 +0100 +@@ -28,8 +28,8 @@ + import mongo.toolchain as mongo_toolchain + import mongo.generators as mongo_generators + +-EnsurePythonVersion(2, 7) +-EnsureSConsVersion(2, 5) ++EnsurePythonVersion(3, 5) ++EnsureSConsVersion(3, 0, 4) + + from buildscripts import utils + from buildscripts import moduleconfig +@@ -435,7 +435,7 @@ + } + + add_option('win-version-min', +- choices=win_version_min_choices.keys(), ++ choices=list(win_version_min_choices.keys()), + default=None, + help='minimum Windows version to support', + type='choice', +@@ -547,7 +547,7 @@ + except IOError as e: + # If the file error wasn't because the file is missing, error out + if e.errno != errno.ENOENT: +- print("Error opening version.json: {0}".format(e.strerror)) ++ print(("Error opening version.json: {0}".format(e.strerror))) + Exit(1) + + version_data = { +@@ -556,14 +556,14 @@ + } + + except ValueError as e: +- print("Error decoding version.json: {0}".format(e)) ++ print(("Error decoding version.json: {0}".format(e))) + Exit(1) + + # Setup the command-line variables + def variable_shlex_converter(val): + # If the argument is something other than a string, propogate + # it literally. +- if not isinstance(val, basestring): ++ if not isinstance(val, str): + return val + parse_mode = get_option('variable-parse-mode') + if parse_mode == 'auto': +@@ -627,7 +627,7 @@ + + variables_files = variable_shlex_converter(get_option('variables-files')) + for file in variables_files: +- print("Using variable customization file %s" % file) ++ print(("Using variable customization file %s" % file)) + + env_vars = Variables( + files=variables_files, +@@ -636,7 +636,7 @@ + + sconsflags = os.environ.get('SCONSFLAGS', None) + if sconsflags: +- print("Using SCONSFLAGS environment variable arguments: %s" % sconsflags) ++ print(("Using SCONSFLAGS environment variable arguments: %s" % sconsflags)) + + env_vars.Add('ABIDW', + help="Configures the path to the 'abidw' (a libabigail) utility") +@@ -770,7 +770,7 @@ + def validate_mongo_version(key, val, env): + regex = r'^(\d+)\.(\d+)\.(\d+)-?((?:(rc)(\d+))?.*)?' + if not re.match(regex, val): +- print("Invalid MONGO_VERSION '{}', or could not derive from version.json or git metadata. Please add a conforming MONGO_VERSION=x.y.z[-extra] as an argument to SCons".format(val)) ++ print(("Invalid MONGO_VERSION '{}', or could not derive from version.json or git metadata. Please add a conforming MONGO_VERSION=x.y.z[-extra] as an argument to SCons".format(val))) + Exit(1) + + env_vars.Add('MONGO_VERSION', +@@ -901,12 +901,12 @@ + Exit(1) + + sconsDataDir = Dir(buildDir).Dir('scons') +-SConsignFile(str(sconsDataDir.File('sconsign'))) ++SConsignFile(str(sconsDataDir.File('sconsign.py3'))) + + def printLocalInfo(): + import sys, SCons +- print( "scons version: " + SCons.__version__ ) +- print( "python version: " + " ".join( [ `i` for i in sys.version_info ] ) ) ++ print(( "scons version: " + SCons.__version__ )) ++ print(( "python version: " + " ".join( [ repr(i) for i in sys.version_info ] ) )) + + printLocalInfo() + +@@ -986,12 +986,12 @@ + env.AddMethod(mongo_platform.env_get_os_name_wrapper, 'GetTargetOSName') + + def fatal_error(env, msg, *args): +- print(msg.format(*args)) ++ print((msg.format(*args))) + Exit(1) + + def conf_error(env, msg, *args): +- print(msg.format(*args)) +- print("See {0} for details".format(env.File('$CONFIGURELOG').abspath)) ++ print((msg.format(*args))) ++ print(("See {0} for details".format(env.File('$CONFIGURELOG').abspath))) + Exit(1) + + env.AddMethod(fatal_error, 'FatalError') +@@ -1010,12 +1010,12 @@ + env.AddMethod(lambda env: env['VERBOSE'], 'Verbose') + + if has_option('variables-help'): +- print(env_vars.GenerateHelpText(env)) ++ print((env_vars.GenerateHelpText(env))) + Exit(0) + + #unknown_vars = env_vars.UnknownVariables() + #if unknown_vars: +-# env.FatalError("Unknown variables specified: {0}", ", ".join(unknown_vars.keys())) ++# env.FatalError("Unknown variables specified: {0}", ", ".join(list(unknown_vars.keys()))) + + def set_config_header_define(env, varname, varval = 1): + env['CONFIG_HEADER_DEFINES'][varname] = varval +@@ -1100,7 +1100,7 @@ + context.Result(ret) + return ret; + +- for k in processor_macros.keys(): ++ for k in list(processor_macros.keys()): + ret = run_compile_check(k) + if ret: + context.Result('Detected a %s processor' % k) +@@ -1222,7 +1222,7 @@ + env['TARGET_ARCH'] = detected_processor + + if env['TARGET_OS'] not in os_macros: +- print("No special config for [{0}] which probably means it won't work".format(env['TARGET_OS'])) ++ print(("No special config for [{0}] which probably means it won't work".format(env['TARGET_OS']))) + elif not detectConf.CheckForOS(env['TARGET_OS']): + env.ConfError("TARGET_OS ({0}) is not supported by compiler", env['TARGET_OS']) + +@@ -2081,7 +2081,7 @@ + # form -Wno-xxx (but not -Wno-error=xxx), we also add -Wxxx to the flags. GCC does + # warn on unknown -Wxxx style flags, so this lets us probe for availablity of + # -Wno-xxx. +- for kw in test_mutation.keys(): ++ for kw in list(test_mutation.keys()): + test_flags = test_mutation[kw] + for test_flag in test_flags: + if test_flag.startswith("-Wno-") and not test_flag.startswith("-Wno-error="): +@@ -2095,7 +2095,7 @@ + # to make them real errors. + cloned.Append(CCFLAGS=['-Werror']) + conf = Configure(cloned, help=False, custom_tests = { +- 'CheckFlag' : lambda(ctx) : CheckFlagTest(ctx, tool, extension, flag) ++ 'CheckFlag' : lambda ctx : CheckFlagTest(ctx, tool, extension, flag) + }) + available = conf.CheckFlag() + conf.Finish() +@@ -2611,7 +2611,7 @@ + llvm_symbolizer = get_option('llvm-symbolizer') + if os.path.isabs(llvm_symbolizer): + if not myenv.File(llvm_symbolizer).exists(): +- print("WARNING: Specified symbolizer '%s' not found" % llvm_symbolizer) ++ print(("WARNING: Specified symbolizer '%s' not found" % llvm_symbolizer)) + llvm_symbolizer = None + else: + llvm_symbolizer = myenv.WhereIs(llvm_symbolizer) +@@ -2922,7 +2922,7 @@ + # TODO: If we could programmatically extract the paths from the info output + # we could give a better message here, but brew info's machine readable output + # doesn't seem to include the whole 'caveats' section. +- message = subprocess.check_output([brew, "info", "openssl"]) ++ message = subprocess.check_output([brew, "info", "openssl"]).decode('utf-8') + advice = textwrap.dedent( + """\ + NOTE: HomeBrew installed to {0} appears to have OpenSSL installed. +@@ -3082,7 +3082,7 @@ + files = ['ssleay32.dll', 'libeay32.dll'] + for extra_file in files: + if not addOpenSslLibraryToDistArchive(extra_file): +- print("WARNING: Cannot find SSL library '%s'" % extra_file) ++ print(("WARNING: Cannot find SSL library '%s'" % extra_file)) + + + +@@ -3423,7 +3423,7 @@ + + outputIndex = next((idx for idx in [0,1] if conf.CheckAltivecVbpermqOutput(idx)), None) + if outputIndex is not None: +- conf.env.SetConfigHeaderDefine("MONGO_CONFIG_ALTIVEC_VEC_VBPERMQ_OUTPUT_INDEX", outputIndex) ++ conf.env.SetConfigHeaderDefine("MONGO_CONFIG_ALTIVEC_VEC_VBPERMQ_OUTPUT_INDEX", outputIndex) + else: + myenv.ConfError("Running on ppc64le, but can't find a correct vec_vbpermq output index. Compiler or platform not supported") + +@@ -3523,9 +3523,12 @@ + import buildscripts.pylinters + buildscripts.pylinters.lint_all(None, {}, []) + +- import buildscripts.lint +- if not buildscripts.lint.run_lint( [ "src/mongo/" ] ): +- raise Exception( "lint errors" ) ++ env.Command( ++ target="#run_lint", ++ source=["buildscripts/lint.py", "src/mongo"], ++ action="$PYTHON $SOURCES[0] $SOURCES[1]", ++ ) ++ + + env.Alias( "lint" , [] , [ doLint ] ) + env.AlwaysBuild( "lint" ) +Only in .: build +Only in ./buildscripts: __pycache__ +diff -ru /data/ports-build/mongodb-src-r4.0.21/buildscripts/aggregate_tracefiles.py ./buildscripts/aggregate_tracefiles.py +--- /data/ports-build/mongodb-src-r4.0.21/buildscripts/aggregate_tracefiles.py 2020-10-16 18:02:58.000000000 +0200 ++++ ./buildscripts/aggregate_tracefiles.py 2020-11-16 20:09:38.798317000 +0100 +@@ -20,7 +20,7 @@ + + args += ['-o', output] + +- print ' '.join(args) ++ print(' '.join(args)) + + return subprocess.call(args) + +diff -ru /data/ports-build/mongodb-src-r4.0.21/buildscripts/aws_ec2.py ./buildscripts/aws_ec2.py +--- /data/ports-build/mongodb-src-r4.0.21/buildscripts/aws_ec2.py 2020-10-16 18:02:58.000000000 +0200 ++++ ./buildscripts/aws_ec2.py 2020-11-16 20:09:38.801388000 +0100 +@@ -1,8 +1,8 @@ + #!/usr/bin/env python + """AWS EC2 instance launcher and controller.""" + +-from __future__ import print_function + ++ + import base64 + import collections + import datetime +@@ -88,12 +88,13 @@ + if reached_state: + print(" Instance {}!".format(instance.state["Name"]), file=sys.stdout) + else: +- print(" Instance in state '{}', failed to reach state '{}'{}!".format( +- instance.state["Name"], state, client_error), file=sys.stdout) ++ print( ++ " Instance in state '{}', failed to reach state '{}'{}!".format( ++ instance.state["Name"], state, client_error), file=sys.stdout) + sys.stdout.flush() + return 0 if reached_state else 1 + +- def control_instance( #pylint: disable=too-many-arguments,too-many-branches ++ def control_instance( #pylint: disable=too-many-arguments,too-many-branches,too-many-locals + self, mode, image_id, wait_time_secs=0, show_progress=False, console_output_file=None, + console_screenshot_file=None): + """Control an AMI instance. Returns 0 & status information, if successful.""" +@@ -296,14 +297,15 @@ + status_options.add_option("--yamlFile", dest="yaml_file", default=None, + help="Save the status into the specified YAML file.") + +- status_options.add_option("--consoleOutputFile", dest="console_output_file", default=None, +- help="Save the console output into the specified file, if" +- " available.") ++ status_options.add_option( ++ "--consoleOutputFile", dest="console_output_file", default=None, ++ help="Save the console output into the specified file, if" ++ " available.") + +- status_options.add_option("--consoleScreenshotFile", dest="console_screenshot_file", +- default=None, +- help="Save the console screenshot (JPG format) into the specified" +- " file, if available.") ++ status_options.add_option( ++ "--consoleScreenshotFile", dest="console_screenshot_file", default=None, ++ help="Save the console screenshot (JPG format) into the specified" ++ " file, if available.") + + parser.add_option_group(control_options) + parser.add_option_group(create_options) +@@ -328,7 +330,6 @@ + parser.error("Block size must be an integer") + block_devices[device_name] = device_size + +- # The 'expire-on' key is a UTC time. + expire_dt = datetime.datetime.utcnow() + datetime.timedelta(hours=options.tag_expire_hours) + tags = [{"Key": "expire-on", "Value": expire_dt.strftime("%Y-%m-%d %H:%M:%S")}, + {"Key": "Name", +Only in ./buildscripts/idl/idl: __pycache__ +diff -ru /data/ports-build/mongodb-src-r4.0.21/buildscripts/idl/idl/compiler.py ./buildscripts/idl/idl/compiler.py +--- /data/ports-build/mongodb-src-r4.0.21/buildscripts/idl/idl/compiler.py 2020-10-16 18:02:58.000000000 +0200 ++++ ./buildscripts/idl/idl/compiler.py 2020-11-16 20:09:38.804248000 +0100 +@@ -31,8 +31,6 @@ + Orchestrates the 3 passes (parser, binder, and generator) together. + """ + +-from __future__ import absolute_import, print_function, unicode_literals +- + import io + import logging + import os +@@ -70,14 +68,14 @@ + """Class for the IDL compiler to resolve imported files.""" + + def __init__(self, import_directories): +- # type: (List[unicode]) -> None ++ # type: (List[str]) -> None + """Construct a ImportResolver.""" + self._import_directories = import_directories + + super(CompilerImportResolver, self).__init__() + + def resolve(self, base_file, imported_file_name): +- # type: (unicode, unicode) -> unicode ++ # type: (str, str) -> str + """Return the complete path to an imported file name.""" + + logging.debug("Resolving imported file '%s' for file '%s'", imported_file_name, base_file) +@@ -108,7 +106,7 @@ + raise errors.IDLError(msg) + + def open(self, resolved_file_name): +- # type: (unicode) -> Any ++ # type: (str) -> Any + """Return an io.Stream for the requested file.""" + return io.open(resolved_file_name, encoding='utf-8') + +@@ -125,7 +123,7 @@ + + + def _update_import_includes(args, spec, header_file_name): +- # type: (CompilerArgs, syntax.IDLSpec, unicode) -> None ++ # type: (CompilerArgs, syntax.IDLSpec, str) -> None + """Update the list of imports with a list of include files for each import with structs.""" + # This function is fragile: + # In order to try to generate headers with an "include what you use" set of headers, the IDL +diff -ru /data/ports-build/mongodb-src-r4.0.21/buildscripts/idl/idl/syntax.py ./buildscripts/idl/idl/syntax.py +--- /data/ports-build/mongodb-src-r4.0.21/buildscripts/idl/idl/syntax.py 2020-10-16 18:02:58.000000000 +0200 ++++ ./buildscripts/idl/idl/syntax.py 2020-11-16 20:09:38.806128000 +0100 +@@ -33,8 +33,6 @@ + it follows the rules of the IDL, etc. + """ + +-from __future__ import absolute_import, print_function, unicode_literals +- + import itertools + from typing import Any, Dict, Iterator, List, Optional, Tuple, Union + +@@ -70,7 +68,7 @@ + + + def parse_array_type(name): +- # type: (unicode) -> unicode ++ # type: (str) -> str + """Parse a type name of the form 'array' and extract type.""" + if not name.startswith("array<") and not name.endswith(">"): + return None +@@ -95,7 +93,7 @@ + # type: (Dict[Any, List[Any]]) -> Iterator[Tuple[Any, Any]] + """Return an Iterator of (key, value) pairs from a dictionary.""" + return itertools.chain.from_iterable( +- (_zip_scalar(value, key) for (key, value) in dic.viewitems())) ++ (_zip_scalar(value, key) for (key, value) in dic.items())) + + + class SymbolTable(object): +@@ -115,7 +113,7 @@ + self.types = [] # type: List[Type] + + def _is_duplicate(self, ctxt, location, name, duplicate_class_name): +- # type: (errors.ParserContext, common.SourceLocation, unicode, unicode) -> bool ++ # type: (errors.ParserContext, common.SourceLocation, str, str) -> bool + """Return true if the given item already exist in the symbol table.""" + for (item, entity_type) in _item_and_type({ + "command": self.commands, +@@ -179,12 +177,12 @@ + self.add_type(ctxt, idltype) + + def resolve_field_type(self, ctxt, location, field_name, type_name): +- # type: (errors.ParserContext, common.SourceLocation, unicode, unicode) -> Optional[Union[Command, Enum, Struct, Type]] ++ # type: (errors.ParserContext, common.SourceLocation, str, str) -> Optional[Union[Command, Enum, Struct, Type]] + """Find the type or struct a field refers to or log an error.""" + return self._resolve_field_type(ctxt, location, field_name, type_name) + + def _resolve_field_type(self, ctxt, location, field_name, type_name): +- # type: (errors.ParserContext, common.SourceLocation, unicode, unicode) -> Optional[Union[Command, Enum, Struct, Type]] ++ # type: (errors.ParserContext, common.SourceLocation, str, str) -> Optional[Union[Command, Enum, Struct, Type]] + """Find the type or struct a field refers to or log an error.""" + # pylint: disable=too-many-return-statements + +@@ -237,15 +235,15 @@ + """IDL imports object.""" + + def __init__(self, file_name, line, column): +- # type: (unicode, int, int) -> None ++ # type: (str, int, int) -> None + """Construct an Imports section.""" +- self.imports = [] # type: List[unicode] ++ self.imports = [] # type: List[str] + + # These are not part of the IDL syntax but are produced by the parser. + # List of imports with structs. +- self.resolved_imports = [] # type: List[unicode] ++ self.resolved_imports = [] # type: List[str] + # All imports directly or indirectly included +- self.dependencies = [] # type: List[unicode] ++ self.dependencies = [] # type: List[str] + + super(Import, self).__init__(file_name, line, column) + +@@ -262,16 +260,16 @@ + # pylint: disable=too-many-instance-attributes + + def __init__(self, file_name, line, column): +- # type: (unicode, int, int) -> None ++ # type: (str, int, int) -> None + """Construct a Type.""" +- self.name = None # type: unicode +- self.description = None # type: unicode +- self.cpp_type = None # type: unicode +- self.bson_serialization_type = None # type: List[unicode] +- self.bindata_subtype = None # type: unicode +- self.serializer = None # type: unicode +- self.deserializer = None # type: unicode +- self.default = None # type: unicode ++ self.name = None # type: str ++ self.description = None # type: str ++ self.cpp_type = None # type: str ++ self.bson_serialization_type = None # type: List[str] ++ self.bindata_subtype = None # type: str ++ self.serializer = None # type: str ++ self.deserializer = None # type: str ++ self.default = None # type: str + + super(Type, self).__init__(file_name, line, column) + +@@ -288,15 +286,15 @@ + # pylint: disable=too-many-instance-attributes + + def __init__(self, file_name, line, column): +- # type: (unicode, int, int) -> None ++ # type: (str, int, int) -> None + """Construct a Field.""" +- self.name = None # type: unicode +- self.cpp_name = None # type: unicode +- self.description = None # type: unicode +- self.type = None # type: unicode ++ self.name = None # type: str ++ self.cpp_name = None # type: str ++ self.description = None # type: str ++ self.type = None # type: str + self.ignore = False # type: bool + self.optional = False # type: bool +- self.default = None # type: unicode ++ self.default = None # type: str + self.supports_doc_sequence = False # type: bool + self.comparison_order = -1 # type: int + self.non_const_getter = False # type: bool +@@ -316,10 +314,10 @@ + """ + + def __init__(self, file_name, line, column): +- # type: (unicode, int, int) -> None ++ # type: (str, int, int) -> None + """Construct a Type.""" +- self.name = None # type: unicode +- self.cpp_name = None # type: unicode ++ self.name = None # type: str ++ self.cpp_name = None # type: str + + super(ChainedStruct, self).__init__(file_name, line, column) + +@@ -332,10 +330,10 @@ + """ + + def __init__(self, file_name, line, column): +- # type: (unicode, int, int) -> None ++ # type: (str, int, int) -> None + """Construct a Type.""" +- self.name = None # type: unicode +- self.cpp_name = None # type: unicode ++ self.name = None # type: str ++ self.cpp_name = None # type: str + + super(ChainedType, self).__init__(file_name, line, column) + +@@ -350,10 +348,10 @@ + # pylint: disable=too-many-instance-attributes + + def __init__(self, file_name, line, column): +- # type: (unicode, int, int) -> None ++ # type: (str, int, int) -> None + """Construct a Struct.""" +- self.name = None # type: unicode +- self.description = None # type: unicode ++ self.name = None # type: str ++ self.description = None # type: str + self.strict = True # type: bool + self.immutable = False # type: bool + self.inline_chained_structs = True # type: bool +@@ -399,10 +397,10 @@ + """ + + def __init__(self, file_name, line, column): +- # type: (unicode, int, int) -> None ++ # type: (str, int, int) -> None + """Construct an Enum.""" +- self.name = None # type: unicode +- self.value = None # type: unicode ++ self.name = None # type: str ++ self.value = None # type: str + + super(EnumValue, self).__init__(file_name, line, column) + +@@ -415,11 +413,11 @@ + """ + + def __init__(self, file_name, line, column): +- # type: (unicode, int, int) -> None ++ # type: (str, int, int) -> None + """Construct an Enum.""" +- self.name = None # type: unicode +- self.description = None # type: unicode +- self.type = None # type: unicode ++ self.name = None # type: str ++ self.description = None # type: str ++ self.type = None # type: str + self.values = None # type: List[EnumValue] + + # Internal property that is not represented as syntax. An imported enum is read from an +diff -ru /data/ports-build/mongodb-src-r4.0.21/buildscripts/idl/idlc.py ./buildscripts/idl/idlc.py +--- /data/ports-build/mongodb-src-r4.0.21/buildscripts/idl/idlc.py 2020-10-16 18:02:58.000000000 +0200 ++++ ./buildscripts/idl/idlc.py 2020-11-16 20:09:38.807705000 +0100 +@@ -29,8 +29,6 @@ + # + """IDL Compiler Driver Main Entry point.""" + +-from __future__ import absolute_import, print_function +- + import argparse + import logging + import sys +diff -ru /data/ports-build/mongodb-src-r4.0.21/buildscripts/utils.py ./buildscripts/utils.py +--- /data/ports-build/mongodb-src-r4.0.21/buildscripts/utils.py 2020-10-16 18:02:58.000000000 +0200 ++++ ./buildscripts/utils.py 2020-11-16 20:09:38.809660000 +0100 +@@ -99,7 +99,7 @@ + with open(os.devnull, "r+") as devnull: + proc = subprocess.Popen("git describe --abbrev=7", stdout=subprocess.PIPE, stderr=devnull, + stdin=devnull, shell=True) +- return proc.communicate()[0].strip() ++ return proc.communicate()[0].strip().decode('utf-8') + + + def execsys(args): +Only in ./site_scons: __pycache__ +diff -ru /data/ports-build/mongodb-src-r4.0.21/site_scons/libdeps.py ./site_scons/libdeps.py +--- /data/ports-build/mongodb-src-r4.0.21/site_scons/libdeps.py 2020-10-16 18:02:58.000000000 +0200 ++++ ./site_scons/libdeps.py 2020-11-16 20:09:38.813403000 +0100 +@@ -61,7 +61,7 @@ + missing_syslibdep = 'MISSING_LIBDEP_' + + class dependency(object): +- Public, Private, Interface = range(3) ++ Public, Private, Interface = list(range(3)) + + def __init__(self, value, deptype): + self.target_node = value +@@ -85,7 +85,7 @@ + class DependencyCycleError(SCons.Errors.UserError): + """Exception representing a cycle discovered in library dependencies.""" + +- def __init__(self, first_node ): ++ def __init__(self, first_node): + super(DependencyCycleError, self).__init__() + self.cycle_nodes = [first_node] + +@@ -100,8 +100,8 @@ + setattr(node.attributes, "libdeps_direct_sorted", direct_sorted) + return direct_sorted + +-def __get_libdeps(node): + ++def __get_libdeps(node): + """Given a SCons Node, return its library dependencies, topologically sorted. + + Computes the dependencies if they're not already cached. +@@ -133,7 +133,7 @@ + marked.add(n.target_node) + tsorted.append(n.target_node) + +- except DependencyCycleError, e: ++ except DependencyCycleError as e: + if len(e.cycle_nodes) == 1 or e.cycle_nodes[0] != e.cycle_nodes[-1]: + e.cycle_nodes.insert(0, n.target_node) + raise +@@ -150,6 +150,7 @@ + + return tsorted + ++ + def __get_syslibdeps(node): + """ Given a SCons Node, return its system library dependencies. + +@@ -161,11 +162,11 @@ + for lib in __get_libdeps(node): + for syslib in node.get_env().Flatten(lib.get_env().get(syslibdeps_env_var, [])): + if syslib: +- if type(syslib) in (str, unicode) and syslib.startswith(missing_syslibdep): +- print("Target '%s' depends on the availability of a " ++ if type(syslib) is str and syslib.startswith(missing_syslibdep): ++ print(("Target '%s' depends on the availability of a " + "system provided library for '%s', " + "but no suitable library was found during configuration." % +- (str(node), syslib[len(missing_syslibdep):])) ++ (str(node), syslib[len(missing_syslibdep):]))) + node.get_env().Exit(1) + syslibdeps.append(syslib) + setattr(node.attributes, cached_var_name, syslibdeps) +@@ -181,18 +182,21 @@ + + if old_scanner: + path_function = old_scanner.path_function ++ + def new_scanner(node, env, path=()): + result = old_scanner.function(node, env, path) + result.extend(__get_libdeps(node)) + return result + else: + path_function = None ++ + def new_scanner(node, env, path=()): + return __get_libdeps(node) + + builder.target_scanner = SCons.Scanner.Scanner(function=new_scanner, +- path_function=path_function) ++ path_function=path_function) + ++ + def get_libdeps(source, target, env, for_signature): + """Implementation of the special _LIBDEPS environment variable. + +@@ -202,6 +206,7 @@ + target = env.Flatten([target]) + return __get_libdeps(target[0]) + ++ + def get_libdeps_objs(source, target, env, for_signature): + objs = [] + for lib in get_libdeps(source, target, env, for_signature): +@@ -209,6 +214,7 @@ + objs.extend(lib.sources) + return objs + ++ + def get_syslibdeps(source, target, env, for_signature): + deps = __get_syslibdeps(target[0]) + lib_link_prefix = env.subst('$LIBLINKPREFIX') +@@ -220,7 +226,7 @@ + # they're believed to represent library short names, that should be prefixed with -l + # or the compiler-specific equivalent. I.e., 'm' becomes '-lm', but 'File("m.a") is passed + # through whole cloth. +- if type(d) in (str, unicode): ++ if type(d) is str: + result.append('%s%s%s' % (lib_link_prefix, d, lib_link_suffix)) + else: + result.append(d) +@@ -382,6 +388,7 @@ + except KeyError: + pass + ++ + def setup_conftests(conf): + def FindSysLibDep(context, name, libs, **kwargs): + var = "LIBDEPS_" + name.upper() + "_SYSLIBDEP" +@@ -394,4 +401,5 @@ + return context.Result(result) + context.env[var] = __missing_syslib(name) + return context.Result(result) ++ + conf.AddTest('FindSysLibDep', FindSysLibDep) +diff -ru /data/ports-build/mongodb-src-r4.0.21/site_scons/mongo/__init__.py ./site_scons/mongo/__init__.py +--- /data/ports-build/mongodb-src-r4.0.21/site_scons/mongo/__init__.py 2020-10-16 18:02:58.000000000 +0200 ++++ ./site_scons/mongo/__init__.py 2020-11-16 20:09:38.815614000 +0100 +@@ -5,4 +5,4 @@ + def print_build_failures(): + from SCons.Script import GetBuildFailures + for bf in GetBuildFailures(): +- print "%s failed: %s" % (bf.node, bf.errstr) ++ print("%s failed: %s" % (bf.node, bf.errstr)) +Only in ./site_scons/mongo: __pycache__ +diff -ru /data/ports-build/mongodb-src-r4.0.21/site_scons/mongo/generators.py ./site_scons/mongo/generators.py +--- /data/ports-build/mongodb-src-r4.0.21/site_scons/mongo/generators.py 2020-10-16 18:02:58.000000000 +0200 ++++ ./site_scons/mongo/generators.py 2020-11-16 20:09:38.817602000 +0100 +@@ -1,6 +1,6 @@ + # -*- mode: python; -*- + +-import md5 ++import hashlib + + # Default and alternative generator definitions go here. + +@@ -15,22 +15,69 @@ + # want to define them. + def default_buildinfo_environment_data(): + return ( +- ('distmod', '$MONGO_DISTMOD', True, True,), +- ('distarch', '$MONGO_DISTARCH', True, True,), +- ('cc', '$CC_VERSION', True, False,), +- ('ccflags', '$CCFLAGS', True, False,), +- ('cxx', '$CXX_VERSION', True, False,), +- ('cxxflags', '$CXXFLAGS', True, False,), +- ('linkflags', '$LINKFLAGS', True, False,), +- ('target_arch', '$TARGET_ARCH', True, True,), +- ('target_os', '$TARGET_OS', True, False,), ++ ( ++ 'distmod', ++ '$MONGO_DISTMOD', ++ True, ++ True, ++ ), ++ ( ++ 'distarch', ++ '$MONGO_DISTARCH', ++ True, ++ True, ++ ), ++ ( ++ 'cc', ++ '$CC_VERSION', ++ True, ++ False, ++ ), ++ ( ++ 'ccflags', ++ '$CCFLAGS', ++ True, ++ False, ++ ), ++ ( ++ 'cxx', ++ '$CXX_VERSION', ++ True, ++ False, ++ ), ++ ( ++ 'cxxflags', ++ '$CXXFLAGS', ++ True, ++ False, ++ ), ++ ( ++ 'linkflags', ++ '$LINKFLAGS', ++ True, ++ False, ++ ), ++ ( ++ 'target_arch', ++ '$TARGET_ARCH', ++ True, ++ True, ++ ), ++ ( ++ 'target_os', ++ '$TARGET_OS', ++ True, ++ False, ++ ), + ) + ++ + # If you want buildInfo and --version to be relatively empty, set + # MONGO_BUILDINFO_ENVIRONMENT_DATA = empty_buildinfo_environment_data() + def empty_buildinfo_environment_data(): + return () + ++ + def default_variant_dir_generator(target, source, env, for_signature): + + if env.GetOption('cache') != None: +@@ -44,11 +91,11 @@ + + # Hash the named options and their values, and take the first 8 characters of the hash as + # the variant name +- hasher = md5.md5() ++ hasher = hashlib.md5() + for option in variant_options: +- hasher.update(option) +- hasher.update(str(env.GetOption(option))) +- variant_dir = hasher.hexdigest()[0:8] ++ hasher.update(option.encode('utf-8')) ++ hasher.update(str(env.GetOption(option)).encode('utf-8')) ++ variant_dir = str(hasher.hexdigest()[0:8]) + + # If our option hash yields a well known hash, replace it with its name. + known_variant_hashes = { +Only in ./site_scons/site_tools: __pycache__ +diff -ru /data/ports-build/mongodb-src-r4.0.21/site_scons/site_tools/distsrc.py ./site_scons/site_tools/distsrc.py +--- /data/ports-build/mongodb-src-r4.0.21/site_scons/site_tools/distsrc.py 2020-10-16 18:02:58.000000000 +0200 ++++ ./site_scons/site_tools/distsrc.py 2020-11-16 20:09:38.819994000 +0100 +@@ -20,7 +20,7 @@ + import tarfile + import time + import zipfile +-import StringIO ++import io + + from distutils.spawn import find_executable + +@@ -28,7 +28,7 @@ + + class DistSrcFile: + def __init__(self, **kwargs): +- [ setattr(self, key, val) for (key, val) in kwargs.items() ] ++ [ setattr(self, key, val) for (key, val) in list(kwargs.items()) ] + + def __str__(self): + return self.name +@@ -60,6 +60,7 @@ + def close(self): + self.archive_file.close() + ++ + class DistSrcTarArchive(DistSrcArchive): + def __iter__(self): + file_list = self.archive_file.getnames() +@@ -82,7 +83,7 @@ + + def append_file_contents(self, filename, file_contents, + mtime=time.time(), +- mode=0644, ++ mode=0o644, + uname="root", + gname="root"): + file_metadata = tarfile.TarInfo(name=filename) +@@ -91,7 +92,7 @@ + file_metadata.uname = uname + file_metadata.gname = gname + file_metadata.size = len(file_contents) +- file_buf = StringIO.StringIO(file_contents) ++ file_buf = io.BytesIO(file_contents.encode('utf-8')) + if self.archive_mode == 'r': + self.archive_file.close() + self.archive_file = tarfile.open( +@@ -105,6 +106,7 @@ + def append_file(self, filename, localfile): + self.archive_file.add(localfile, arcname=filename) + ++ + class DistSrcZipArchive(DistSrcArchive): + def __iter__(self): + file_list = self.archive_file.namelist() +@@ -119,7 +121,7 @@ + name=key, + size=item_data.file_size, + mtime=time.mktime(fixed_time), +- mode=0775 if is_dir else 0664, ++ mode=0o775 if is_dir else 0o664, + type=tarfile.DIRTYPE if is_dir else tarfile.REGTYPE, + uid=0, + gid=0, +@@ -129,7 +131,7 @@ + + def append_file_contents(self, filename, file_contents, + mtime=time.time(), +- mode=0644, ++ mode=0o644, + uname="root", + gname="root"): + self.archive_file.writestr(filename, file_contents) +@@ -139,7 +141,7 @@ + + def build_error_action(msg): + def error_stub(target=None, source=None, env=None): +- print msg ++ print(msg) + env.Exit(1) + return [ error_stub ] + +@@ -162,7 +164,7 @@ + + target_ext = str(target[0])[-3:] + if not target_ext in [ 'zip', 'tar' ]: +- print "Invalid file format for distsrc. Must be tar or zip file" ++ print("Invalid file format for distsrc. Must be tar or zip file") + env.Exit(1) + + git_cmd = "\"%s\" archive --format %s --output %s --prefix ${MONGO_DIST_SRC_PREFIX} HEAD" % ( +@@ -173,14 +175,14 @@ + SCons.Action.Action(run_distsrc_callbacks, "Running distsrc callbacks for $TARGET") + ] + ++ + def add_callback(env, fn): + __distsrc_callbacks.append(fn) + ++ + def generate(env, **kwargs): + env.AddMethod(add_callback, 'AddDistSrcCallback') +- env['BUILDERS']['__DISTSRC'] = SCons.Builder.Builder( +- generator=distsrc_action_generator, +- ) ++ env['BUILDERS']['__DISTSRC'] = SCons.Builder.Builder(generator=distsrc_action_generator, ) + + def DistSrc(env, target): + result = env.__DISTSRC(target=target, source=[]) +@@ -189,6 +191,7 @@ + return result + + env.AddMethod(DistSrc, 'DistSrc') ++ + + def exists(env): + return True +diff -ru /data/ports-build/mongodb-src-r4.0.21/site_scons/site_tools/idl_tool.py ./site_scons/site_tools/idl_tool.py +--- /data/ports-build/mongodb-src-r4.0.21/site_scons/site_tools/idl_tool.py 2020-10-16 18:02:58.000000000 +0200 ++++ ./site_scons/site_tools/idl_tool.py 2020-11-16 20:09:38.821062000 +0100 +@@ -21,6 +21,7 @@ + + import SCons + ++ + def idlc_emitter(target, source, env): + """For each input IDL file, the tool produces a .cpp and .h file.""" + first_source = str(source[0]) +@@ -43,7 +44,7 @@ + def idl_scanner(node, env, path): + # Use the import scanner mode of the IDL compiler to file imported files + cmd = [sys.executable, "buildscripts/idl/idlc.py", '--include','src', str(node), '--write-dependencies'] +- deps_str = subprocess.check_output(cmd) ++ deps_str = subprocess.check_output(cmd).decode('utf-8') + + deps_list = deps_str.splitlines() + +@@ -57,19 +58,14 @@ + idl_scanner = SCons.Scanner.Scanner(function=idl_scanner, skeys=['.idl']) + + # TODO: create a scanner for imports when imports are implemented +-IDLCBuilder = SCons.Builder.Builder( +- action=IDLCAction, +- emitter=idlc_emitter, +- srcsuffx=".idl", +- suffix=".cpp", +- source_scanner = idl_scanner +- ) ++IDLCBuilder = SCons.Builder.Builder(action=IDLCAction, emitter=idlc_emitter, srcsuffx=".idl", ++ suffix=".cpp", source_scanner=idl_scanner) + + + def generate(env): + bld = IDLCBuilder + +- env.Append(SCANNERS = idl_scanner) ++ env.Append(SCANNERS=idl_scanner) + + env['BUILDERS']['Idlc'] = bld + +diff -ru /data/ports-build/mongodb-src-r4.0.21/site_scons/site_tools/jstoh.py ./site_scons/site_tools/jstoh.py +--- /data/ports-build/mongodb-src-r4.0.21/site_scons/site_tools/jstoh.py 2020-10-16 18:02:58.000000000 +0200 ++++ ./site_scons/site_tools/jstoh.py 2020-11-16 20:30:59.809428000 +0100 +@@ -39,7 +39,7 @@ + + text = '\n'.join(h) + +- with open(outFile, 'wb') as out: ++ with open(outFile, 'w') as out: + try: + out.write(text) + finally: +@@ -48,7 +48,7 @@ + + if __name__ == "__main__": + if len(sys.argv) < 3: +- print "Must specify [target] [source] " ++ print("Must specify [target] [source] ") + sys.exit(1) + + jsToHeader(sys.argv[1], sys.argv[2:]) +diff -ru /data/ports-build/mongodb-src-r4.0.21/site_scons/site_tools/mongo_benchmark.py ./site_scons/site_tools/mongo_benchmark.py +--- /data/ports-build/mongodb-src-r4.0.21/site_scons/site_tools/mongo_benchmark.py 2020-10-16 18:02:58.000000000 +0200 ++++ ./site_scons/site_tools/mongo_benchmark.py 2020-11-16 20:09:38.823525000 +0100 +@@ -11,10 +11,10 @@ + env.Alias('$BENCHMARK_ALIAS', test) + + def benchmark_list_builder_action(env, target, source): +- ofile = open(str(target[0]), 'wb') ++ ofile = open(str(target[0]), 'w') + try: + for s in _benchmarks: +- print '\t' + str(s) ++ print('\t' + str(s)) + ofile.write('%s\n' % s) + finally: + ofile.close() +@@ -40,9 +40,10 @@ + bmEnv.Install("#/build/benchmark/", result[0]) + return result + ++ + def generate(env): + env.Command('$BENCHMARK_LIST', env.Value(_benchmarks), +- Action(benchmark_list_builder_action, "Generating $TARGET")) ++ Action(benchmark_list_builder_action, "Generating $TARGET")) + env.AddMethod(register_benchmark, 'RegisterBenchmark') + env.AddMethod(build_benchmark, 'Benchmark') + env.Alias('$BENCHMARK_ALIAS', '$BENCHMARK_LIST') +diff -ru /data/ports-build/mongodb-src-r4.0.21/site_scons/site_tools/mongo_integrationtest.py ./site_scons/site_tools/mongo_integrationtest.py +--- /data/ports-build/mongodb-src-r4.0.21/site_scons/site_tools/mongo_integrationtest.py 2020-10-16 18:02:58.000000000 +0200 ++++ ./site_scons/site_tools/mongo_integrationtest.py 2020-11-16 20:09:38.824569000 +0100 +@@ -12,10 +12,10 @@ + env.Alias('$INTEGRATION_TEST_ALIAS', installed_test) + + def integration_test_list_builder_action(env, target, source): +- ofile = open(str(target[0]), 'wb') ++ ofile = open(str(target[0]), 'w') + try: + for s in _integration_tests: +- print '\t' + str(s) ++ print('\t' + str(s)) + ofile.write('%s\n' % s) + finally: + ofile.close() +@@ -31,9 +31,10 @@ + env.RegisterIntegrationTest(result[0]) + return result + ++ + def generate(env): + env.Command('$INTEGRATION_TEST_LIST', env.Value(_integration_tests), +- Action(integration_test_list_builder_action, "Generating $TARGET")) ++ Action(integration_test_list_builder_action, "Generating $TARGET")) + env.AddMethod(register_integration_test, 'RegisterIntegrationTest') + env.AddMethod(build_cpp_integration_test, 'CppIntegrationTest') + env.Alias('$INTEGRATION_TEST_ALIAS', '$INTEGRATION_TEST_LIST') +diff -ru /data/ports-build/mongodb-src-r4.0.21/site_scons/site_tools/mongo_unittest.py ./site_scons/site_tools/mongo_unittest.py +--- /data/ports-build/mongodb-src-r4.0.21/site_scons/site_tools/mongo_unittest.py 2020-10-16 18:02:58.000000000 +0200 ++++ ./site_scons/site_tools/mongo_unittest.py 2020-11-16 20:09:38.825577000 +0100 +@@ -11,10 +11,10 @@ + env.Alias('$UNITTEST_ALIAS', test) + + def unit_test_list_builder_action(env, target, source): +- ofile = open(str(target[0]), 'wb') ++ ofile = open(str(target[0]), 'w') + try: + for s in _unittests: +- print '\t' + str(s) ++ print('\t' + str(s)) + ofile.write('%s\n' % s) + finally: + ofile.close() +@@ -33,9 +33,10 @@ + env.Install("#/build/unittests/", result[0]) + return result + ++ + def generate(env): + env.Command('$UNITTEST_LIST', env.Value(_unittests), +- Action(unit_test_list_builder_action, "Generating $TARGET")) ++ Action(unit_test_list_builder_action, "Generating $TARGET")) + env.AddMethod(register_unit_test, 'RegisterUnitTest') + env.AddMethod(build_cpp_unit_test, 'CppUnitTest') + env.Alias('$UNITTEST_ALIAS', '$UNITTEST_LIST') +diff -ru /data/ports-build/mongodb-src-r4.0.21/site_scons/site_tools/split_dwarf.py ./site_scons/site_tools/split_dwarf.py +--- /data/ports-build/mongodb-src-r4.0.21/site_scons/site_tools/split_dwarf.py 2020-10-16 18:02:58.000000000 +0200 ++++ ./site_scons/site_tools/split_dwarf.py 2020-11-16 20:09:38.826716000 +0100 +@@ -26,6 +26,7 @@ + if SCons.Util.case_sensitive_suffixes('.c', '.C'): + _CXXSuffixes.append('.C') + ++ + def _dwo_emitter(target, source, env): + new_targets = [] + for t in target: +@@ -40,6 +41,7 @@ + targets = target + new_targets + return (targets, source) + ++ + def generate(env): + suffixes = [] + if _splitDwarfFlag in env['CCFLAGS']: +@@ -52,7 +54,7 @@ + + for object_builder in SCons.Tool.createObjBuilders(env): + emitterdict = object_builder.builder.emitter +- for suffix in emitterdict.iterkeys(): ++ for suffix in emitterdict.keys(): + if not suffix in suffixes: + continue + base = emitterdict[suffix] +@@ -60,6 +62,7 @@ + base, + _dwo_emitter, + ]) ++ + + def exists(env): + return any(_splitDwarfFlag in env[f] for f in ['CCFLAGS', 'CFLAGS', 'CXXFLAGS']) +diff -ru /data/ports-build/mongodb-src-r4.0.21/site_scons/site_tools/thin_archive.py ./site_scons/site_tools/thin_archive.py +--- /data/ports-build/mongodb-src-r4.0.21/site_scons/site_tools/thin_archive.py 2020-10-16 18:02:58.000000000 +0200 ++++ ./site_scons/site_tools/thin_archive.py 2020-11-16 20:09:38.827857000 +0100 +@@ -17,6 +17,7 @@ + import re + import subprocess + ++ + def exists(env): + if not 'AR' in env: + return False +@@ -30,10 +31,9 @@ + if not "rc" in env['ARFLAGS']: + return False + +- pipe = SCons.Action._subproc(env, SCons.Util.CLVar(ar) + ['--version'], +- stdin = 'devnull', +- stderr = 'devnull', +- stdout = subprocess.PIPE) ++ pipe = SCons.Action._subproc(env, ++ SCons.Util.CLVar(ar) + ['--version'], stdin='devnull', ++ stderr='devnull', stdout=subprocess.PIPE) + if pipe.wait() != 0: + return False + +@@ -41,7 +41,7 @@ + for line in pipe.stdout: + if found: + continue # consume all data +- found = re.search(r'^GNU ar|^LLVM', line) ++ found = re.search(r'^GNU ar|^LLVM', line.decode('utf-8')) + + return bool(found) + +@@ -56,6 +56,7 @@ + new_emitter = SCons.Builder.ListEmitter([base_emitter, new_emitter]) + builder.emitter = new_emitter + ++ + def _add_scanner(builder): + old_scanner = builder.target_scanner + path_function = old_scanner.path_function +@@ -69,13 +70,16 @@ + new_results.extend(base.children()) + return new_results + +- builder.target_scanner = SCons.Scanner.Scanner(function=new_scanner, path_function=path_function) ++ builder.target_scanner = SCons.Scanner.Scanner(function=new_scanner, ++ path_function=path_function) + ++ + def generate(env): + if not exists(env): + return + +- env['ARFLAGS'] = SCons.Util.CLVar([arflag if arflag != "rc" else "rcsTD" for arflag in env['ARFLAGS']]) ++ env['ARFLAGS'] = SCons.Util.CLVar( ++ [arflag if arflag != "rc" else "rcsTD" for arflag in env['ARFLAGS']]) + + def noop_action(env, target, source): + pass +diff -ru /data/ports-build/mongodb-src-r4.0.21/src/mongo/SConscript ./src/mongo/SConscript +--- /data/ports-build/mongodb-src-r4.0.21/src/mongo/SConscript 2020-10-16 18:02:58.000000000 +0200 ++++ ./src/mongo/SConscript 2020-11-16 20:09:38.834118000 +0100 +@@ -155,9 +155,9 @@ + + # On windows, we need to escape the backslashes in the command-line + # so that windows paths look okay. +-cmd_line = " ".join(sys.argv).encode('string-escape') ++cmd_line = " ".join(sys.argv).encode('unicode_escape') + if env.TargetOSIs('windows'): +- cmd_line = cmd_line.replace('\\', r'\\') ++ cmd_line = cmd_line.replace(b'\\', b'\\') + + module_list = '{ %s }' % ', '.join([ '"{0}"'.format(x) for x in env['MONGO_MODULES'] ]) + +@@ -662,7 +662,7 @@ + + # If no module has introduced a file named LICENSE-Enterprise.txt then this + # is a Community build, so inject the Community license +-if sum(itertools.imap(lambda x: x.name == "LICENSE-Enterprise.txt", env['MODULE_BANNERS'])) == 0: ++if sum(map(lambda x: x.name == "LICENSE.txt", env['MODULE_BANNERS'])) == 0: + env.Append(MODULE_BANNERS = [distsrc.File('LICENSE-Community.txt')]) + + # All module banners get staged to the top level of the tarfile, so we +@@ -681,7 +681,7 @@ + # Allow modules to map original file name directories to subdirectories + # within the archive (e.g. { "src/mongo/db/modules/enterprise/docs": "snmp"}) + archive_addition_transforms = [] +-for full_dir, archive_dir in env["ARCHIVE_ADDITION_DIR_MAP"].items(): ++for full_dir, archive_dir in list(env["ARCHIVE_ADDITION_DIR_MAP"].items()): + archive_addition_transforms.append("--transform \"%s=$SERVER_DIST_BASENAME/%s\"" % + (full_dir, archive_dir)) + +diff -ru /data/ports-build/mongodb-src-r4.0.21/src/mongo/base/generate_error_codes.py ./src/mongo/base/generate_error_codes.py +--- /data/ports-build/mongodb-src-r4.0.21/src/mongo/base/generate_error_codes.py 2020-10-16 18:02:58.000000000 +0200 ++++ ./src/mongo/base/generate_error_codes.py 2020-11-16 20:09:38.838467000 +0100 +@@ -26,7 +26,6 @@ + # delete this exception statement from your version. If you delete this + # exception statement from all source files in the program, then also delete + # it in the license file. +- + """Generate error_codes.{h,cpp} from error_codes.err. + + Format of error_codes.err: +@@ -68,11 +67,13 @@ + self.extra = extra + self.categories = [] + ++ + class ErrorClass: + def __init__(self, name, codes): + self.name = name + self.codes = codes + ++ + def main(argv): + # Parse and validate argv. + if len(sys.argv) < 2: +@@ -99,7 +100,7 @@ + categories=error_classes, + ) + +- with open(output, 'wb') as outfile: ++ with open(output, 'w') as outfile: + outfile.write(text) + + def die(message=None): +@@ -131,6 +132,7 @@ + if failed: + die() + ++ + def has_duplicate_error_codes(error_codes): + sorted_by_name = sorted(error_codes, key=lambda x: x.name) + sorted_by_code = sorted(error_codes, key=lambda x: x.code) +@@ -139,21 +141,22 @@ + prev = sorted_by_name[0] + for curr in sorted_by_name[1:]: + if curr.name == prev.name: +- sys.stdout.write('Duplicate name %s with codes %s and %s\n' +- % (curr.name, curr.code, prev.code)) ++ sys.stdout.write( ++ 'Duplicate name %s with codes %s and %s\n' % (curr.name, curr.code, prev.code)) + failed = True + prev = curr + + prev = sorted_by_code[0] + for curr in sorted_by_code[1:]: + if curr.code == prev.code: +- sys.stdout.write('Duplicate code %s with names %s and %s\n' +- % (curr.code, curr.name, prev.name)) ++ sys.stdout.write( ++ 'Duplicate code %s with names %s and %s\n' % (curr.code, curr.name, prev.name)) + failed = True + prev = curr + + return failed + ++ + def has_duplicate_error_classes(error_classes): + names = sorted(ec.name for ec in error_classes) + +@@ -166,6 +169,7 @@ + prev_name = name + return failed + ++ + def has_missing_error_codes(error_codes, error_classes): + code_names = dict((ec.name, ec) for ec in error_codes) + failed = False +@@ -178,6 +182,7 @@ + failed = True + + return failed ++ + + if __name__ == '__main__': + main(sys.argv) +diff -ru /data/ports-build/mongodb-src-r4.0.21/src/mongo/db/auth/generate_action_types.py ./src/mongo/db/auth/generate_action_types.py +--- /data/ports-build/mongodb-src-r4.0.21/src/mongo/db/auth/generate_action_types.py 2020-10-16 18:02:58.000000000 +0200 ++++ ./src/mongo/db/auth/generate_action_types.py 2020-11-16 20:09:38.846414000 +0100 +@@ -26,7 +26,6 @@ + # delete this exception statement from your version. If you delete this + # exception statement from all source files in the program, then also delete + # it in the license file. +- + """Generate action_type.{h,cpp} + + Usage: +@@ -35,7 +34,6 @@ + + import sys + +- + headerFileTemplate = """// AUTO-GENERATED FILE DO NOT EDIT + // See src/mongo/db/auth/generate_action_types.py + /** +@@ -194,14 +192,14 @@ + } // namespace mongo + """ + ++ + def writeSourceFile(actionTypes, sourceOutputFile): + actionTypeConstants = "" + fromStringIfStatements = "" + toStringCaseStatements = "" + for actionType in actionTypes: + actionTypeConstants += (" const ActionType ActionType::%(actionType)s" +- "(%(actionType)sValue);\n" % +- dict(actionType=actionType)) ++ "(%(actionType)sValue);\n" % dict(actionType=actionType)) + fromStringIfStatements += """ if (action == "%(actionType)s") { + *result = %(actionType)s; + return Status::OK(); +@@ -215,6 +213,7 @@ + + pass + ++ + def writeHeaderFile(actionTypes, headerOutputFile): + actionTypeConstants = "" + actionTypeIdentifiers = "" +@@ -225,6 +224,7 @@ + actionTypeIdentifiers=actionTypeIdentifiers) + headerOutputFile.write(formattedHeaderFile) + ++ + def hasDuplicateActionTypes(actionTypes): + sortedActionTypes = sorted(actionTypes) + +@@ -232,7 +232,7 @@ + prevActionType = sortedActionTypes[0] + for actionType in sortedActionTypes[1:]: + if actionType == prevActionType: +- print 'Duplicate actionType %s\n' % actionType ++ print('Duplicate actionType %s\n' % actionType) + didFail = True + prevActionType = actionType + +@@ -245,7 +245,7 @@ + + if __name__ == "__main__": + if len(sys.argv) != 4: +- print "Usage: generate_action_types.py
" ++ print("Usage: generate_action_types.py
") + sys.exit(-1) + + actionTypes = parseActionTypesFromFile(sys.argv[1]) +diff -ru /data/ports-build/mongodb-src-r4.0.21/src/mongo/db/fts/generate_stop_words.py ./src/mongo/db/fts/generate_stop_words.py +--- /data/ports-build/mongodb-src-r4.0.21/src/mongo/db/fts/generate_stop_words.py 2020-10-16 18:02:58.000000000 +0200 ++++ ./src/mongo/db/fts/generate_stop_words.py 2020-11-16 20:09:38.851050000 +0100 +@@ -1,7 +1,7 @@ + import sys + + def generate( header, source, language_files ): +- out = open( header, "wb" ) ++ out = open( header, "w" ) + out.write( """ + #pragma once + #include +@@ -18,8 +18,8 @@ + + + +- out = open( source, "wb" ) +- out.write( '#include "%s"' % header.rpartition( "/" )[2].rpartition( "\\" )[2] ) ++ out = open( source, "w", encoding='utf-8') ++ out.write( '#include "{}"'.format(header.rpartition( "/" )[2].rpartition( "\\" )[2]) ) + out.write( """ + namespace mongo { + namespace fts { +@@ -35,12 +35,13 @@ + out.write( ' {\n' ) + out.write( ' const char* const words[] = {\n' ) + for word in open( l_file, "rb" ): +- out.write( ' "%s",\n' % word.strip() ) ++ out.write( ' "%s",\n' % word.decode('utf-8').strip() ) + out.write( ' };\n' ) + out.write( ' const size_t wordcnt = sizeof(words) / sizeof(words[0]);\n' ) + out.write( ' std::set< std::string >& l = (*m)["%s"];\n' % l ) + out.write( ' l.insert(&words[0], &words[wordcnt]);\n' ) + out.write( ' }\n' ) ++ + out.write( """ + } + } // namespace fts +diff -ru /data/ports-build/mongodb-src-r4.0.21/src/mongo/util/generate_icu_init_cpp.py ./src/mongo/util/generate_icu_init_cpp.py +--- /data/ports-build/mongodb-src-r4.0.21/src/mongo/util/generate_icu_init_cpp.py 2020-10-16 18:02:58.000000000 +0200 ++++ ./src/mongo/util/generate_icu_init_cpp.py 2020-11-16 21:01:59.537644000 +0100 +@@ -112,8 +112,8 @@ + ''' + decimal_encoded_data = '' + with open(data_file_path, 'rb') as data_file: +- decimal_encoded_data = ','.join([str(ord(byte)) for byte in data_file.read()]) +- with open(cpp_file_path, 'wb') as cpp_file: ++ decimal_encoded_data = ','.join([str(byte) for byte in data_file.read()]) ++ with open(cpp_file_path, 'w') as cpp_file: + cpp_file.write(source_template % dict(decimal_encoded_data=decimal_encoded_data)) + + if __name__ == '__main__': Property changes on: files/patch-python3 ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +yes \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property