Nuitka-winsvc 1.8__cp311-cp311-win_amd64.whl → 2.5.1__cp311-cp311-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of Nuitka-winsvc might be problematic. Click here for more details.
- Nuitka_winsvc-1.8.data/scripts/nuitka-run.bat → Nuitka_winsvc-2.5.1.data/scripts/nuitka-run.cmd +9 -9
- Nuitka_winsvc-1.8.data/scripts/nuitka.bat → Nuitka_winsvc-2.5.1.data/scripts/nuitka.cmd +15 -15
- {Nuitka_winsvc-1.8.dist-info → Nuitka_winsvc-2.5.1.dist-info}/METADATA +5 -3
- Nuitka_winsvc-2.5.1.dist-info/RECORD +977 -0
- {Nuitka_winsvc-1.8.dist-info → Nuitka_winsvc-2.5.1.dist-info}/WHEEL +1 -1
- nuitka/Builtins.py +49 -17
- nuitka/BytecodeCaching.py +24 -20
- nuitka/Bytecodes.py +23 -19
- nuitka/CacheCleanup.py +28 -23
- nuitka/Constants.py +19 -17
- nuitka/Errors.py +23 -17
- nuitka/HardImportRegistry.py +408 -0
- nuitka/MainControl.py +209 -116
- nuitka/ModuleRegistry.py +83 -20
- nuitka/OptionParsing.py +467 -221
- nuitka/Options.py +701 -225
- nuitka/OutputDirectories.py +47 -23
- nuitka/PostProcessing.py +133 -79
- nuitka/Progress.py +73 -24
- nuitka/PythonFlavors.py +141 -32
- nuitka/PythonOperators.py +18 -17
- nuitka/PythonVersions.py +107 -19
- nuitka/Serialization.py +70 -55
- nuitka/SourceCodeReferences.py +19 -17
- nuitka/Tracing.py +176 -70
- nuitka/TreeXML.py +31 -26
- nuitka/Variables.py +39 -41
- nuitka/Version.py +22 -8
- nuitka/__init__.py +5 -4
- nuitka/__main__.py +95 -29
- nuitka/__past__.py +44 -34
- nuitka/build/Backend.scons +243 -141
- nuitka/build/CCompilerVersion.scons +45 -31
- nuitka/build/DataComposerInterface.py +20 -17
- nuitka/build/Onefile.scons +56 -54
- nuitka/build/SconsCaching.py +105 -92
- nuitka/build/SconsCompilerSettings.py +167 -68
- nuitka/build/SconsHacks.py +25 -19
- nuitka/build/SconsInterface.py +155 -54
- nuitka/build/SconsProgress.py +19 -18
- nuitka/build/SconsSpawn.py +62 -33
- nuitka/build/SconsUtils.py +152 -55
- nuitka/build/__init__.py +5 -4
- nuitka/build/include/nuitka/allocator.h +228 -22
- nuitka/build/include/nuitka/builtins.h +17 -17
- nuitka/build/include/nuitka/calling.h +24 -24
- nuitka/build/include/nuitka/checkers.h +17 -18
- nuitka/build/include/nuitka/checksum_tools.h +14 -19
- nuitka/build/include/nuitka/compiled_asyncgen.h +28 -25
- nuitka/build/include/nuitka/compiled_cell.h +33 -18
- nuitka/build/include/nuitka/compiled_coroutine.h +18 -18
- nuitka/build/include/nuitka/compiled_frame.h +93 -54
- nuitka/build/include/nuitka/compiled_function.h +42 -20
- nuitka/build/include/nuitka/compiled_generator.h +24 -18
- nuitka/build/include/nuitka/compiled_method.h +17 -18
- nuitka/build/include/nuitka/constants.h +35 -18
- nuitka/build/include/nuitka/constants_blob.h +17 -17
- nuitka/build/include/nuitka/debug_settings.h +60 -0
- nuitka/build/include/nuitka/environment_variables.h +30 -0
- nuitka/build/include/nuitka/environment_variables_system.h +45 -0
- nuitka/build/include/nuitka/exception_groups.h +23 -26
- nuitka/build/include/nuitka/exceptions.h +717 -171
- nuitka/build/include/nuitka/filesystem_paths.h +26 -20
- nuitka/build/include/nuitka/freelists.h +38 -18
- nuitka/build/include/nuitka/helper/attributes.h +24 -22
- nuitka/build/include/nuitka/helper/boolean.h +17 -17
- nuitka/build/include/nuitka/helper/bytearrays.h +17 -17
- nuitka/build/include/nuitka/helper/bytes.h +14 -15
- nuitka/build/include/nuitka/helper/calling_generated.h +69 -69
- nuitka/build/include/nuitka/helper/comparisons_dual_eq.h +47 -0
- nuitka/build/include/nuitka/helper/comparisons_dual_ge.h +39 -0
- nuitka/build/include/nuitka/helper/comparisons_dual_gt.h +39 -0
- nuitka/build/include/nuitka/helper/comparisons_dual_le.h +47 -0
- nuitka/build/include/nuitka/helper/comparisons_dual_lt.h +47 -0
- nuitka/build/include/nuitka/helper/comparisons_dual_ne.h +39 -0
- nuitka/build/include/nuitka/helper/comparisons_eq.h +17 -17
- nuitka/build/include/nuitka/helper/comparisons_ge.h +17 -17
- nuitka/build/include/nuitka/helper/comparisons_gt.h +17 -17
- nuitka/build/include/nuitka/helper/comparisons_le.h +17 -17
- nuitka/build/include/nuitka/helper/comparisons_lt.h +17 -17
- nuitka/build/include/nuitka/helper/comparisons_ne.h +17 -17
- nuitka/build/include/nuitka/helper/complex.h +17 -17
- nuitka/build/include/nuitka/helper/dictionaries.h +89 -51
- nuitka/build/include/nuitka/helper/floats.h +17 -18
- nuitka/build/include/nuitka/helper/import_hard.h +25 -17
- nuitka/build/include/nuitka/helper/indexes.h +17 -18
- nuitka/build/include/nuitka/helper/ints.h +115 -54
- nuitka/build/include/nuitka/helper/iterators.h +99 -51
- nuitka/build/include/nuitka/helper/lists.h +26 -24
- nuitka/build/include/nuitka/helper/lists_generated.h +22 -22
- nuitka/build/include/nuitka/helper/mappings.h +17 -18
- nuitka/build/include/nuitka/helper/operations.h +20 -17
- nuitka/build/include/nuitka/helper/operations_binary_add.h +23 -17
- nuitka/build/include/nuitka/helper/operations_binary_bitand.h +17 -17
- nuitka/build/include/nuitka/helper/operations_binary_bitor.h +17 -17
- nuitka/build/include/nuitka/helper/operations_binary_bitxor.h +17 -17
- nuitka/build/include/nuitka/helper/operations_binary_divmod.h +17 -17
- nuitka/build/include/nuitka/helper/operations_binary_dual_add.h +34 -0
- nuitka/build/include/nuitka/helper/operations_binary_floordiv.h +17 -17
- nuitka/build/include/nuitka/helper/operations_binary_lshift.h +17 -17
- nuitka/build/include/nuitka/helper/operations_binary_matmult.h +17 -17
- nuitka/build/include/nuitka/helper/operations_binary_mod.h +17 -17
- nuitka/build/include/nuitka/helper/operations_binary_mult.h +17 -17
- nuitka/build/include/nuitka/helper/operations_binary_olddiv.h +17 -17
- nuitka/build/include/nuitka/helper/operations_binary_pow.h +17 -17
- nuitka/build/include/nuitka/helper/operations_binary_rshift.h +17 -17
- nuitka/build/include/nuitka/helper/operations_binary_sub.h +23 -17
- nuitka/build/include/nuitka/helper/operations_binary_truediv.h +17 -17
- nuitka/build/include/nuitka/helper/operations_builtin_types.h +17 -17
- nuitka/build/include/nuitka/helper/operations_inplace_add.h +20 -17
- nuitka/build/include/nuitka/helper/operations_inplace_bitand.h +17 -17
- nuitka/build/include/nuitka/helper/operations_inplace_bitor.h +17 -17
- nuitka/build/include/nuitka/helper/operations_inplace_bitxor.h +17 -17
- nuitka/build/include/nuitka/helper/operations_inplace_floordiv.h +17 -17
- nuitka/build/include/nuitka/helper/operations_inplace_lshift.h +17 -17
- nuitka/build/include/nuitka/helper/operations_inplace_matmult.h +17 -17
- nuitka/build/include/nuitka/helper/operations_inplace_mod.h +17 -17
- nuitka/build/include/nuitka/helper/operations_inplace_mult.h +17 -17
- nuitka/build/include/nuitka/helper/operations_inplace_olddiv.h +17 -17
- nuitka/build/include/nuitka/helper/operations_inplace_pow.h +17 -17
- nuitka/build/include/nuitka/helper/operations_inplace_rshift.h +17 -17
- nuitka/build/include/nuitka/helper/operations_inplace_sub.h +20 -17
- nuitka/build/include/nuitka/helper/operations_inplace_truediv.h +17 -17
- nuitka/build/include/nuitka/helper/raising.h +68 -37
- nuitka/build/include/nuitka/helper/rangeobjects.h +17 -17
- nuitka/build/include/nuitka/helper/richcomparisons.h +21 -14
- nuitka/build/include/nuitka/helper/sequences.h +19 -13
- nuitka/build/include/nuitka/helper/sets.h +11 -12
- nuitka/build/include/nuitka/helper/slices.h +31 -25
- nuitka/build/include/nuitka/helper/strings.h +16 -17
- nuitka/build/include/nuitka/helper/subscripts.h +18 -201
- nuitka/build/include/nuitka/helper/tuples.h +64 -52
- nuitka/build/include/nuitka/helpers.h +50 -22
- nuitka/build/include/nuitka/importing.h +28 -21
- nuitka/build/include/nuitka/jit_sources.h +25 -0
- nuitka/build/include/nuitka/prelude.h +163 -71
- nuitka/build/include/nuitka/printing.h +29 -22
- nuitka/build/include/nuitka/python_pgo.h +19 -18
- nuitka/build/include/nuitka/safe_string_ops.h +20 -18
- nuitka/build/include/nuitka/threading.h +45 -32
- nuitka/build/include/nuitka/tracing.h +28 -18
- nuitka/build/include/nuitka/type_aliases.h +30 -0
- nuitka/build/include/nuitka/unfreezing.h +29 -23
- nuitka/build/inline_copy/bin/scons.py +14 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Variables/ListVariable.py +6 -6
- nuitka/build/inline_copy/pkg_resources/pkg_resources/__init__.py +0 -3
- nuitka/build/inline_copy/python_hacl/LICENSE.txt +201 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_MD5.c +1430 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_MD5.h +66 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA1.c +463 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA1.h +66 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA2.c +1273 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA2.h +204 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA3.c +734 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA3.h +131 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Streaming_Types.h +83 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/FStar_UInt128_Verified.h +346 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/FStar_UInt_8_16_32_64.h +107 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/fstar_uint128_struct_endianness.h +68 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/internal/target.h +293 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/lowstar_endianness.h +231 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/types.h +14 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/internal/Hacl_Hash_MD5.h +56 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/internal/Hacl_Hash_SHA1.h +56 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/internal/Hacl_Hash_SHA2.h +164 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/internal/Hacl_Hash_SHA3.h +65 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/python_hacl_namespaces.h +89 -0
- nuitka/build/inline_copy/stubgen/astunparse.py +938 -0
- nuitka/build/inline_copy/stubgen/six.py +998 -0
- nuitka/build/inline_copy/stubgen/stubgen.py +307 -0
- nuitka/build/inline_copy/tqdm/tqdm/__init__.py +2 -2
- nuitka/build/inline_copy/tqdm/tqdm/_monitor.py +4 -1
- nuitka/build/inline_copy/tqdm/tqdm/utils.py +14 -8
- nuitka/build/inline_copy/tqdm/tqdm/version.py +1 -8
- nuitka/build/inline_copy/zlib/LICENSE +22 -0
- nuitka/build/inline_copy/zlib/crc32.c +1049 -0
- nuitka/build/inline_copy/zlib/crc32.h +9446 -0
- nuitka/build/inline_copy/zlib/zconf.h +551 -0
- nuitka/build/inline_copy/zlib/zlib.h +1938 -0
- nuitka/build/inline_copy/zlib/zutil.h +275 -0
- nuitka/build/static_src/CompiledAsyncgenType.c +221 -221
- nuitka/build/static_src/CompiledCellType.c +69 -44
- nuitka/build/static_src/CompiledCodeHelpers.c +276 -159
- nuitka/build/static_src/CompiledCoroutineType.c +229 -226
- nuitka/build/static_src/CompiledFrameType.c +323 -138
- nuitka/build/static_src/CompiledFunctionType.c +547 -231
- nuitka/build/static_src/CompiledGeneratorType.c +416 -290
- nuitka/build/static_src/CompiledGeneratorTypeUncompiledIntegration.c +593 -228
- nuitka/build/static_src/CompiledMethodType.c +91 -82
- nuitka/build/static_src/HelpersAllocator.c +352 -45
- nuitka/build/static_src/HelpersAttributes.c +30 -72
- nuitka/build/static_src/HelpersBuiltin.c +65 -46
- nuitka/build/static_src/HelpersBuiltinTypeMethods.c +17 -17
- nuitka/build/static_src/HelpersBytes.c +19 -20
- nuitka/build/static_src/HelpersCalling.c +40 -37
- nuitka/build/static_src/HelpersCallingGenerated.c +1061 -242
- nuitka/build/static_src/HelpersChecksumTools.c +35 -21
- nuitka/build/static_src/HelpersClasses.c +17 -17
- nuitka/build/static_src/HelpersComparisonDualEq.c +183 -0
- nuitka/build/static_src/HelpersComparisonDualGe.c +121 -0
- nuitka/build/static_src/HelpersComparisonDualGt.c +121 -0
- nuitka/build/static_src/HelpersComparisonDualLe.c +183 -0
- nuitka/build/static_src/HelpersComparisonDualLt.c +183 -0
- nuitka/build/static_src/HelpersComparisonDualNe.c +121 -0
- nuitka/build/static_src/HelpersComparisonEq.c +536 -496
- nuitka/build/static_src/HelpersComparisonEqUtils.c +22 -19
- nuitka/build/static_src/HelpersComparisonGe.c +531 -501
- nuitka/build/static_src/HelpersComparisonGt.c +530 -500
- nuitka/build/static_src/HelpersComparisonLe.c +531 -501
- nuitka/build/static_src/HelpersComparisonLt.c +530 -500
- nuitka/build/static_src/HelpersComparisonNe.c +538 -496
- nuitka/build/static_src/HelpersConsole.c +122 -0
- nuitka/build/static_src/HelpersConstantsBlob.c +550 -521
- nuitka/build/static_src/HelpersDeepcopy.c +33 -33
- nuitka/build/static_src/HelpersDictionaries.c +232 -63
- nuitka/build/static_src/HelpersDictionariesGenerated.c +130 -127
- nuitka/build/static_src/HelpersDumpBacktraces.c +63 -0
- nuitka/build/static_src/HelpersEnvironmentVariables.c +65 -0
- nuitka/build/static_src/HelpersEnvironmentVariablesSystem.c +93 -0
- nuitka/build/static_src/HelpersExceptions.c +147 -62
- nuitka/build/static_src/HelpersFiles.c +116 -22
- nuitka/build/static_src/HelpersFilesystemPaths.c +292 -181
- nuitka/build/static_src/HelpersFloats.c +37 -31
- nuitka/build/static_src/HelpersHeapStorage.c +21 -17
- nuitka/build/static_src/HelpersImport.c +61 -29
- nuitka/build/static_src/HelpersImportHard.c +74 -61
- nuitka/build/static_src/HelpersJitSources.c +46 -0
- nuitka/build/static_src/HelpersLists.c +237 -58
- nuitka/build/static_src/HelpersListsGenerated.c +41 -41
- nuitka/build/static_src/HelpersMappings.c +17 -17
- nuitka/build/static_src/HelpersMatching.c +137 -51
- nuitka/build/static_src/HelpersOperationBinaryAdd.c +397 -152
- nuitka/build/static_src/HelpersOperationBinaryAddUtils.c +102 -52
- nuitka/build/static_src/HelpersOperationBinaryBitand.c +55 -55
- nuitka/build/static_src/HelpersOperationBinaryBitor.c +55 -55
- nuitka/build/static_src/HelpersOperationBinaryBitxor.c +55 -55
- nuitka/build/static_src/HelpersOperationBinaryDivmod.c +49 -43
- nuitka/build/static_src/HelpersOperationBinaryDivmodUtils.c +17 -17
- nuitka/build/static_src/HelpersOperationBinaryDualAdd.c +172 -0
- nuitka/build/static_src/HelpersOperationBinaryFloordiv.c +55 -49
- nuitka/build/static_src/HelpersOperationBinaryInplaceAdd.c +20 -21
- nuitka/build/static_src/HelpersOperationBinaryLshift.c +83 -83
- nuitka/build/static_src/HelpersOperationBinaryMatmult.c +25 -24
- nuitka/build/static_src/HelpersOperationBinaryMod.c +129 -117
- nuitka/build/static_src/HelpersOperationBinaryMult.c +98 -82
- nuitka/build/static_src/HelpersOperationBinaryMultUtils.c +33 -30
- nuitka/build/static_src/HelpersOperationBinaryOlddiv.c +55 -49
- nuitka/build/static_src/HelpersOperationBinaryPow.c +68 -68
- nuitka/build/static_src/HelpersOperationBinaryPowUtils.c +12 -12
- nuitka/build/static_src/HelpersOperationBinaryRshift.c +51 -51
- nuitka/build/static_src/HelpersOperationBinarySub.c +309 -88
- nuitka/build/static_src/HelpersOperationBinaryTruediv.c +49 -43
- nuitka/build/static_src/HelpersOperationInplaceAdd.c +333 -163
- nuitka/build/static_src/HelpersOperationInplaceAddUtils.c +24 -22
- nuitka/build/static_src/HelpersOperationInplaceBitand.c +58 -58
- nuitka/build/static_src/HelpersOperationInplaceBitor.c +58 -58
- nuitka/build/static_src/HelpersOperationInplaceBitxor.c +58 -58
- nuitka/build/static_src/HelpersOperationInplaceFloordiv.c +73 -68
- nuitka/build/static_src/HelpersOperationInplaceLshift.c +64 -64
- nuitka/build/static_src/HelpersOperationInplaceMatmult.c +38 -37
- nuitka/build/static_src/HelpersOperationInplaceMod.c +145 -140
- nuitka/build/static_src/HelpersOperationInplaceMult.c +89 -84
- nuitka/build/static_src/HelpersOperationInplaceOlddiv.c +73 -68
- nuitka/build/static_src/HelpersOperationInplacePow.c +82 -82
- nuitka/build/static_src/HelpersOperationInplaceRshift.c +48 -48
- nuitka/build/static_src/HelpersOperationInplaceSub.c +275 -122
- nuitka/build/static_src/HelpersOperationInplaceTruediv.c +68 -63
- nuitka/build/static_src/HelpersProfiling.c +25 -24
- nuitka/build/static_src/HelpersPythonPgo.c +22 -22
- nuitka/build/static_src/HelpersRaising.c +296 -283
- nuitka/build/static_src/HelpersSafeStrings.c +34 -22
- nuitka/build/static_src/HelpersSequences.c +18 -19
- nuitka/build/static_src/HelpersSlices.c +29 -23
- nuitka/build/static_src/HelpersStrings.c +235 -38
- nuitka/build/static_src/HelpersTuples.c +46 -34
- nuitka/build/static_src/HelpersTypes.c +166 -25
- nuitka/build/static_src/InspectPatcher.c +108 -27
- nuitka/build/static_src/MainProgram.c +464 -280
- nuitka/build/static_src/MetaPathBasedLoader.c +381 -257
- nuitka/build/static_src/MetaPathBasedLoaderImportlibMetadataDistribution.c +39 -26
- nuitka/build/static_src/MetaPathBasedLoaderResourceReader.c +17 -18
- nuitka/build/static_src/MetaPathBasedLoaderResourceReaderFiles.c +227 -29
- nuitka/build/static_src/OnefileBootstrap.c +281 -164
- nuitka/build/static_src/OnefileSplashScreen.cpp +51 -27
- nuitka/code_generation/AsyncgenCodes.py +21 -23
- nuitka/code_generation/AttributeCodes.py +31 -27
- nuitka/code_generation/BinaryOperationHelperDefinitions.py +290 -184
- nuitka/code_generation/BranchCodes.py +19 -17
- nuitka/code_generation/BuiltinCodes.py +29 -18
- nuitka/code_generation/CallCodes.py +35 -33
- nuitka/code_generation/ClassCodes.py +19 -17
- nuitka/code_generation/CodeGeneration.py +61 -28
- nuitka/code_generation/CodeHelperSelection.py +20 -18
- nuitka/code_generation/CodeHelpers.py +28 -21
- nuitka/code_generation/CodeObjectCodes.py +36 -26
- nuitka/code_generation/ComparisonCodes.py +51 -22
- nuitka/code_generation/ComparisonHelperDefinitions.py +42 -25
- nuitka/code_generation/ConditionalCodes.py +19 -17
- nuitka/code_generation/ConstantCodes.py +82 -28
- nuitka/code_generation/Contexts.py +180 -42
- nuitka/code_generation/CoroutineCodes.py +21 -23
- nuitka/code_generation/CtypesCodes.py +19 -17
- nuitka/code_generation/DictCodes.py +28 -26
- nuitka/code_generation/Emission.py +21 -18
- nuitka/code_generation/ErrorCodes.py +57 -79
- nuitka/code_generation/EvalCodes.py +24 -20
- nuitka/code_generation/ExceptionCodes.py +182 -104
- nuitka/code_generation/ExpressionCTypeSelectionHelpers.py +45 -27
- nuitka/code_generation/ExpressionCodes.py +19 -17
- nuitka/code_generation/FrameCodes.py +28 -31
- nuitka/code_generation/FunctionCodes.py +26 -27
- nuitka/code_generation/GeneratorCodes.py +25 -26
- nuitka/code_generation/GlobalConstants.py +51 -25
- nuitka/code_generation/GlobalsLocalsCodes.py +23 -21
- nuitka/code_generation/IdCodes.py +19 -17
- nuitka/code_generation/ImportCodes.py +90 -50
- nuitka/code_generation/Indentation.py +23 -22
- nuitka/code_generation/IndexCodes.py +19 -17
- nuitka/code_generation/InjectCCodes.py +14 -12
- nuitka/code_generation/IntegerCodes.py +19 -17
- nuitka/code_generation/IteratorCodes.py +86 -71
- nuitka/code_generation/JitCodes.py +44 -0
- nuitka/code_generation/LabelCodes.py +19 -17
- nuitka/code_generation/LineNumberCodes.py +20 -20
- nuitka/code_generation/ListCodes.py +32 -36
- nuitka/code_generation/LoaderCodes.py +22 -17
- nuitka/code_generation/LocalsDictCodes.py +56 -32
- nuitka/code_generation/LoopCodes.py +19 -17
- nuitka/code_generation/MatchCodes.py +42 -22
- nuitka/code_generation/ModuleCodes.py +71 -29
- nuitka/code_generation/Namify.py +27 -23
- nuitka/code_generation/NetworkxCodes.py +51 -0
- nuitka/code_generation/OperationCodes.py +80 -51
- nuitka/code_generation/PackageResourceCodes.py +96 -23
- nuitka/code_generation/PrintCodes.py +19 -17
- nuitka/code_generation/PythonAPICodes.py +19 -17
- nuitka/code_generation/RaisingCodes.py +183 -107
- nuitka/code_generation/Reports.py +32 -22
- nuitka/code_generation/ReturnCodes.py +20 -32
- nuitka/code_generation/SetCodes.py +19 -17
- nuitka/code_generation/SliceCodes.py +22 -20
- nuitka/code_generation/StringCodes.py +19 -17
- nuitka/code_generation/SubscriptCodes.py +24 -30
- nuitka/code_generation/TensorflowCodes.py +54 -0
- nuitka/code_generation/TryCodes.py +31 -41
- nuitka/code_generation/TupleCodes.py +20 -18
- nuitka/code_generation/TypeAliasCodes.py +119 -0
- nuitka/code_generation/VariableCodes.py +118 -55
- nuitka/code_generation/VariableDeclarations.py +28 -25
- nuitka/code_generation/YieldCodes.py +23 -21
- nuitka/code_generation/__init__.py +5 -4
- nuitka/code_generation/c_types/CTypeBases.py +29 -19
- nuitka/code_generation/c_types/CTypeBooleans.py +19 -17
- nuitka/code_generation/c_types/CTypeCFloats.py +19 -17
- nuitka/code_generation/c_types/CTypeCLongs.py +19 -18
- nuitka/code_generation/c_types/CTypeModuleDictVariables.py +22 -17
- nuitka/code_generation/c_types/CTypeNuitkaBooleans.py +22 -21
- nuitka/code_generation/c_types/CTypeNuitkaInts.py +89 -43
- nuitka/code_generation/c_types/CTypeNuitkaVoids.py +20 -18
- nuitka/code_generation/c_types/CTypePyObjectPointers.py +43 -31
- nuitka/code_generation/c_types/CTypeVoids.py +20 -17
- nuitka/code_generation/c_types/__init__.py +5 -4
- nuitka/code_generation/templates/CodeTemplatesAsyncgens.py +20 -19
- nuitka/code_generation/templates/CodeTemplatesConstants.py +143 -39
- nuitka/code_generation/templates/CodeTemplatesCoroutines.py +20 -19
- nuitka/code_generation/templates/CodeTemplatesExceptions.py +33 -33
- nuitka/code_generation/templates/CodeTemplatesFrames.py +36 -27
- nuitka/code_generation/templates/CodeTemplatesFunction.py +20 -19
- nuitka/code_generation/templates/CodeTemplatesGeneratorFunction.py +21 -19
- nuitka/code_generation/templates/CodeTemplatesIterators.py +19 -53
- nuitka/code_generation/templates/CodeTemplatesLoader.py +25 -19
- nuitka/code_generation/templates/CodeTemplatesModules.py +278 -169
- nuitka/code_generation/templates/CodeTemplatesVariables.py +115 -27
- nuitka/code_generation/templates/TemplateDebugWrapper.py +19 -18
- nuitka/code_generation/templates/__init__.py +5 -4
- nuitka/code_generation/templates_c/CodeTemplateCallsMethodPositional.c.j2 +19 -19
- nuitka/code_generation/templates_c/CodeTemplateCallsMixed.c.j2 +21 -21
- nuitka/code_generation/templates_c/CodeTemplateCallsPositional.c.j2 +79 -28
- nuitka/code_generation/templates_c/CodeTemplateCallsPositionalMethodDescr.c.j2 +22 -22
- nuitka/code_generation/templates_c/CodeTemplateMakeListHinted.c.j2 +19 -19
- nuitka/code_generation/templates_c/CodeTemplateMakeListSmall.c.j2 +19 -19
- nuitka/code_generation/templates_c/HelperBuiltinMethodOperation.c.j2 +17 -17
- nuitka/code_generation/templates_c/HelperDictionaryCopy.c.j2 +74 -106
- nuitka/code_generation/templates_c/HelperImportHard.c.j2 +19 -20
- nuitka/code_generation/templates_c/HelperLongTools.c.j2 +19 -19
- nuitka/code_generation/templates_c/HelperObjectTools.c.j2 +6 -6
- nuitka/code_generation/templates_c/HelperOperationBinary.c.j2 +23 -23
- nuitka/code_generation/templates_c/HelperOperationBinaryDual.c.j2 +115 -0
- nuitka/code_generation/templates_c/HelperOperationComparison.c.j2 +35 -35
- nuitka/code_generation/templates_c/HelperOperationComparisonBytes.c.j2 +37 -37
- nuitka/code_generation/templates_c/HelperOperationComparisonDual.c.j2 +86 -0
- nuitka/code_generation/templates_c/HelperOperationComparisonFloat.c.j2 +17 -17
- nuitka/code_generation/templates_c/HelperOperationComparisonInt.c.j2 +18 -18
- nuitka/code_generation/templates_c/HelperOperationComparisonList.c.j2 +50 -38
- nuitka/code_generation/templates_c/HelperOperationComparisonLong.c.j2 +27 -27
- nuitka/code_generation/templates_c/HelperOperationComparisonStr.c.j2 +37 -37
- nuitka/code_generation/templates_c/HelperOperationComparisonTuple.c.j2 +31 -31
- nuitka/code_generation/templates_c/HelperOperationComparisonUnicode.c.j2 +35 -31
- nuitka/code_generation/templates_c/HelperOperationInplace.c.j2 +20 -20
- nuitka/code_generation/templates_c/HelperSlotsBinary.c.j2 +28 -28
- nuitka/code_generation/templates_c/HelperSlotsBytes.c.j2 +17 -17
- nuitka/code_generation/templates_c/HelperSlotsCommon.c.j2 +17 -17
- nuitka/code_generation/templates_c/HelperSlotsFloat.c.j2 +17 -17
- nuitka/code_generation/templates_c/HelperSlotsInt.c.j2 +48 -48
- nuitka/code_generation/templates_c/HelperSlotsList.c.j2 +21 -18
- nuitka/code_generation/templates_c/HelperSlotsLong.c.j2 +27 -25
- nuitka/code_generation/templates_c/HelperSlotsSet.c.j2 +17 -17
- nuitka/code_generation/templates_c/HelperSlotsStr.c.j2 +17 -17
- nuitka/code_generation/templates_c/HelperSlotsTuple.c.j2 +21 -18
- nuitka/code_generation/templates_c/HelperSlotsUnicode.c.j2 +17 -17
- nuitka/containers/Namedtuples.py +25 -18
- nuitka/containers/OrderedSets.py +105 -5
- nuitka/containers/OrderedSetsFallback.py +19 -17
- nuitka/containers/__init__.py +5 -4
- nuitka/distutils/Build.py +33 -18
- nuitka/distutils/DistutilCommands.py +84 -33
- nuitka/distutils/__init__.py +5 -4
- nuitka/finalizations/Finalization.py +21 -18
- nuitka/finalizations/FinalizeMarkups.py +31 -55
- nuitka/finalizations/__init__.py +5 -4
- nuitka/freezer/DependsExe.py +60 -30
- nuitka/freezer/DllDependenciesCommon.py +47 -20
- nuitka/freezer/DllDependenciesMacOS.py +165 -58
- nuitka/freezer/DllDependenciesPosix.py +29 -19
- nuitka/freezer/DllDependenciesWin32.py +55 -33
- nuitka/freezer/ImportDetection.py +23 -17
- nuitka/freezer/IncludedDataFiles.py +142 -48
- nuitka/freezer/IncludedEntryPoints.py +104 -39
- nuitka/freezer/Onefile.py +32 -22
- nuitka/freezer/Standalone.py +166 -53
- nuitka/freezer/__init__.py +5 -4
- nuitka/importing/IgnoreListing.py +19 -17
- nuitka/importing/ImportCache.py +24 -21
- nuitka/importing/ImportResolving.py +103 -95
- nuitka/importing/Importing.py +319 -98
- nuitka/importing/PreloadedPackages.py +21 -18
- nuitka/importing/Recursion.py +142 -47
- nuitka/importing/StandardLibrary.py +96 -80
- nuitka/importing/__init__.py +5 -4
- nuitka/nodes/AsyncgenNodes.py +22 -23
- nuitka/nodes/AttributeLookupNodes.py +19 -17
- nuitka/nodes/AttributeNodes.py +19 -17
- nuitka/nodes/AttributeNodesGenerated.py +49 -24
- nuitka/nodes/BuiltinAllNodes.py +19 -17
- nuitka/nodes/BuiltinAnyNodes.py +19 -17
- nuitka/nodes/BuiltinComplexNodes.py +20 -17
- nuitka/nodes/BuiltinDecodingNodes.py +19 -17
- nuitka/nodes/BuiltinDecoratorNodes.py +19 -17
- nuitka/nodes/BuiltinDictNodes.py +19 -17
- nuitka/nodes/BuiltinFormatNodes.py +20 -17
- nuitka/nodes/BuiltinHashNodes.py +19 -17
- nuitka/nodes/BuiltinInputNodes.py +19 -17
- nuitka/nodes/BuiltinIntegerNodes.py +19 -17
- nuitka/nodes/BuiltinIteratorNodes.py +25 -21
- nuitka/nodes/BuiltinLenNodes.py +19 -17
- nuitka/nodes/BuiltinNextNodes.py +19 -17
- nuitka/nodes/BuiltinOpenNodes.py +52 -18
- nuitka/nodes/BuiltinOperationNodeBasesGenerated.py +40 -23
- nuitka/nodes/BuiltinRangeNodes.py +21 -19
- nuitka/nodes/BuiltinRefNodes.py +73 -40
- nuitka/nodes/BuiltinSumNodes.py +20 -18
- nuitka/nodes/BuiltinTypeNodes.py +19 -17
- nuitka/nodes/BuiltinVarsNodes.py +19 -18
- nuitka/nodes/BytesNodes.py +19 -17
- nuitka/nodes/CallNodes.py +19 -17
- nuitka/nodes/Checkers.py +19 -17
- nuitka/nodes/ChildrenHavingMixins.py +1624 -283
- nuitka/nodes/ClassNodes.py +49 -29
- nuitka/nodes/CodeObjectSpecs.py +29 -18
- nuitka/nodes/ComparisonNodes.py +19 -17
- nuitka/nodes/ConditionalNodes.py +24 -25
- nuitka/nodes/ConstantRefNodes.py +57 -17
- nuitka/nodes/ContainerMakingNodes.py +19 -17
- nuitka/nodes/ContainerOperationNodes.py +19 -17
- nuitka/nodes/CoroutineNodes.py +22 -23
- nuitka/nodes/CtypesNodes.py +19 -18
- nuitka/nodes/DictionaryNodes.py +19 -18
- nuitka/nodes/ExceptionNodes.py +131 -43
- nuitka/nodes/ExecEvalNodes.py +19 -17
- nuitka/nodes/ExpressionBases.py +34 -26
- nuitka/nodes/ExpressionBasesGenerated.py +341 -35
- nuitka/nodes/ExpressionShapeMixins.py +19 -17
- nuitka/nodes/FrameNodes.py +41 -28
- nuitka/nodes/FunctionAttributeNodes.py +19 -17
- nuitka/nodes/FunctionNodes.py +84 -38
- nuitka/nodes/FutureSpecs.py +35 -20
- nuitka/nodes/GeneratorNodes.py +24 -25
- nuitka/nodes/GlobalsLocalsNodes.py +22 -17
- nuitka/nodes/HardImportNodesGenerated.py +746 -148
- nuitka/nodes/ImportHardNodes.py +46 -38
- nuitka/nodes/ImportNodes.py +438 -448
- nuitka/nodes/IndicatorMixins.py +19 -17
- nuitka/nodes/InjectCNodes.py +19 -18
- nuitka/nodes/IterationHandles.py +55 -34
- nuitka/nodes/KeyValuePairNodes.py +19 -17
- nuitka/nodes/ListOperationNodes.py +33 -21
- nuitka/nodes/LocalsDictNodes.py +19 -17
- nuitka/nodes/LocalsScopes.py +41 -41
- nuitka/nodes/LoopNodes.py +28 -17
- nuitka/nodes/MatchNodes.py +37 -24
- nuitka/nodes/ModuleAttributeNodes.py +18 -35
- nuitka/nodes/ModuleNodes.py +90 -31
- nuitka/nodes/NetworkxNodes.py +45 -0
- nuitka/nodes/NodeBases.py +73 -44
- nuitka/nodes/NodeMakingHelpers.py +92 -69
- nuitka/nodes/NodeMetaClasses.py +45 -28
- nuitka/nodes/OperatorNodes.py +28 -26
- nuitka/nodes/OperatorNodesUnary.py +148 -20
- nuitka/nodes/OsSysNodes.py +97 -18
- nuitka/nodes/OutlineNodes.py +24 -22
- nuitka/nodes/PackageMetadataNodes.py +37 -27
- nuitka/nodes/PackageResourceNodes.py +29 -23
- nuitka/nodes/PrintNodes.py +19 -17
- nuitka/nodes/ReturnNodes.py +20 -18
- nuitka/nodes/SideEffectNodes.py +19 -17
- nuitka/nodes/SliceNodes.py +20 -18
- nuitka/nodes/StatementBasesGenerated.py +125 -79
- nuitka/nodes/StatementNodes.py +27 -24
- nuitka/nodes/StrNodes.py +19 -17
- nuitka/nodes/StringConcatenationNodes.py +20 -17
- nuitka/nodes/SubscriptNodes.py +27 -25
- nuitka/nodes/TensorflowNodes.py +38 -0
- nuitka/nodes/TryNodes.py +19 -17
- nuitka/nodes/TypeMatchNodes.py +19 -17
- nuitka/nodes/TypeNodes.py +68 -18
- nuitka/nodes/VariableAssignNodes.py +122 -64
- nuitka/nodes/VariableDelNodes.py +19 -17
- nuitka/nodes/VariableNameNodes.py +19 -17
- nuitka/nodes/VariableRefNodes.py +63 -26
- nuitka/nodes/VariableReleaseNodes.py +19 -17
- nuitka/nodes/YieldNodes.py +21 -19
- nuitka/nodes/__init__.py +5 -4
- nuitka/nodes/shapes/BuiltinTypeShapes.py +169 -46
- nuitka/nodes/shapes/ControlFlowDescriptions.py +19 -17
- nuitka/nodes/shapes/ShapeMixins.py +57 -17
- nuitka/nodes/shapes/StandardShapes.py +80 -21
- nuitka/nodes/shapes/__init__.py +5 -4
- nuitka/optimizations/BytecodeDemotion.py +21 -18
- nuitka/optimizations/FunctionInlining.py +22 -23
- nuitka/optimizations/Graphs.py +19 -17
- nuitka/optimizations/Optimization.py +39 -35
- nuitka/optimizations/OptimizeBuiltinCalls.py +31 -27
- nuitka/optimizations/Tags.py +19 -18
- nuitka/optimizations/TraceCollections.py +67 -24
- nuitka/optimizations/ValueTraces.py +92 -25
- nuitka/optimizations/__init__.py +5 -4
- nuitka/pgo/PGO.py +33 -23
- nuitka/pgo/__init__.py +5 -4
- nuitka/plugins/PluginBase.py +655 -112
- nuitka/plugins/Plugins.py +247 -61
- nuitka/plugins/YamlPluginBase.py +121 -0
- nuitka/plugins/__init__.py +5 -4
- nuitka/plugins/standard/AntiBloatPlugin.py +374 -135
- nuitka/plugins/standard/ConsiderPyLintAnnotationsPlugin.py +20 -19
- nuitka/plugins/standard/DataFilesPlugin.py +65 -29
- nuitka/plugins/standard/DelvewheelPlugin.py +32 -24
- nuitka/plugins/standard/DillPlugin/DillPlugin.c +37 -0
- nuitka/plugins/standard/DillPlugin/dill-postLoad.py +256 -0
- nuitka/plugins/standard/DillPlugin.py +42 -134
- nuitka/plugins/standard/DllFilesPlugin.py +125 -42
- nuitka/plugins/standard/EnumPlugin.py +19 -17
- nuitka/plugins/standard/EventletPlugin.py +19 -17
- nuitka/plugins/standard/GeventPlugin.py +19 -17
- nuitka/plugins/standard/GiPlugin.py +44 -28
- nuitka/plugins/standard/GlfwPlugin.py +20 -17
- nuitka/plugins/standard/ImplicitImports.py +403 -54
- nuitka/plugins/standard/KivyPlugin.py +24 -20
- nuitka/plugins/standard/MatplotlibPlugin.py +99 -42
- nuitka/plugins/standard/MultiprocessingPlugin.py +35 -39
- nuitka/plugins/standard/NumpyPlugin.py +19 -17
- nuitka/plugins/standard/OptionsNannyPlugin.py +48 -76
- nuitka/plugins/standard/PbrPlugin.py +21 -19
- nuitka/plugins/standard/PkgResourcesPlugin.py +34 -23
- nuitka/plugins/standard/PlaywrightPlugin.py +184 -0
- nuitka/plugins/standard/PmwPlugin.py +30 -27
- nuitka/plugins/standard/PySidePyQtPlugin.py +82 -80
- nuitka/plugins/standard/PywebViewPlugin.py +19 -17
- nuitka/plugins/standard/SpacyPlugin.py +136 -0
- nuitka/plugins/standard/TensorflowPlugin.py +20 -17
- nuitka/plugins/standard/TkinterPlugin.py +102 -108
- nuitka/plugins/standard/TorchPlugin.py +20 -17
- nuitka/plugins/standard/TransformersPlugin.py +90 -231
- nuitka/plugins/standard/TrioPlugin.py +18 -15
- nuitka/plugins/standard/UpxPlugin.py +21 -19
- nuitka/plugins/standard/__init__.py +5 -4
- nuitka/plugins/standard/standard.nuitka-package.config.yml +3925 -1293
- nuitka/plugins/standard/stdlib2.nuitka-package.config.yml +14 -14
- nuitka/plugins/standard/stdlib3.nuitka-package.config.yml +154 -66
- nuitka/reports/CompilationReportReader.py +79 -0
- nuitka/reports/LicenseReport.rst.j2 +21 -21
- nuitka/reports/Reports.py +363 -76
- nuitka/reports/__init__.py +5 -4
- nuitka/specs/BuiltinBytesOperationSpecs.py +18 -17
- nuitka/specs/BuiltinDictOperationSpecs.py +18 -17
- nuitka/specs/BuiltinListOperationSpecs.py +18 -17
- nuitka/specs/BuiltinParameterSpecs.py +35 -21
- nuitka/specs/BuiltinStrOperationSpecs.py +19 -18
- nuitka/specs/BuiltinTypeOperationSpecs.py +18 -18
- nuitka/specs/BuiltinUnicodeOperationSpecs.py +18 -17
- nuitka/specs/HardImportSpecs.py +74 -22
- nuitka/specs/ParameterSpecs.py +60 -45
- nuitka/specs/__init__.py +5 -4
- nuitka/tools/Basics.py +20 -18
- nuitka/tools/__init__.py +5 -4
- nuitka/tools/commercial/__init__.py +7 -6
- nuitka/tools/data_composer/DataComposer.py +78 -62
- nuitka/tools/data_composer/__init__.py +5 -4
- nuitka/tools/data_composer/__main__.py +18 -17
- nuitka/tools/environments/CreateEnvironment.py +20 -17
- nuitka/tools/environments/Virtualenv.py +60 -32
- nuitka/tools/environments/__init__.py +5 -4
- nuitka/tools/general/__init__.py +5 -4
- nuitka/tools/general/dll_report/__init__.py +5 -4
- nuitka/tools/general/dll_report/__main__.py +29 -22
- nuitka/tools/general/find_module/FindModuleCode.py +35 -22
- nuitka/tools/general/find_module/__init__.py +5 -4
- nuitka/tools/onefile_compressor/OnefileCompressor.py +213 -131
- nuitka/tools/onefile_compressor/__init__.py +5 -4
- nuitka/tools/onefile_compressor/__main__.py +18 -17
- nuitka/tools/podman/Podman.py +19 -17
- nuitka/tools/podman/__init__.py +5 -4
- nuitka/tools/podman/__main__.py +35 -19
- nuitka/tools/profiler/__init__.py +5 -4
- nuitka/tools/profiler/__main__.py +18 -17
- nuitka/tools/scanning/DisplayPackageDLLs.py +47 -22
- nuitka/tools/scanning/DisplayPackageData.py +31 -19
- nuitka/tools/scanning/__init__.py +5 -4
- nuitka/tools/specialize/CTypeDescriptions.py +251 -80
- nuitka/tools/specialize/Common.py +18 -17
- nuitka/tools/specialize/SpecializeC.py +248 -82
- nuitka/tools/specialize/SpecializePython.py +108 -45
- nuitka/tools/specialize/__init__.py +5 -4
- nuitka/tools/testing/Common.py +175 -114
- nuitka/tools/testing/Constructs.py +19 -17
- nuitka/tools/testing/OutputComparison.py +54 -18
- nuitka/tools/testing/Pythons.py +19 -18
- nuitka/tools/testing/RuntimeTracing.py +20 -19
- nuitka/tools/testing/SearchModes.py +26 -20
- nuitka/tools/testing/Valgrind.py +19 -17
- nuitka/tools/testing/__init__.py +5 -4
- nuitka/tools/testing/check_reference_counts/__init__.py +5 -4
- nuitka/tools/testing/check_reference_counts/__main__.py +18 -18
- nuitka/tools/testing/compare_with_cpython/__init__.py +5 -4
- nuitka/tools/testing/compare_with_cpython/__main__.py +39 -30
- nuitka/tools/testing/find_sxs_modules/__init__.py +5 -4
- nuitka/tools/testing/find_sxs_modules/__main__.py +17 -17
- nuitka/tools/testing/measure_construct_performance/__init__.py +5 -4
- nuitka/tools/testing/measure_construct_performance/__main__.py +23 -33
- nuitka/tools/testing/run_nuitka_tests/__init__.py +5 -4
- nuitka/tools/testing/run_nuitka_tests/__main__.py +134 -51
- nuitka/tools/watch/AutoStage.py +145 -0
- nuitka/tools/watch/GitHub.py +113 -0
- nuitka/tools/watch/__init__.py +5 -4
- nuitka/tools/watch/__main__.py +322 -91
- nuitka/tree/Building.py +184 -182
- nuitka/tree/ComplexCallHelperFunctions.py +84 -58
- nuitka/tree/Extractions.py +19 -17
- nuitka/tree/InternalModule.py +29 -20
- nuitka/tree/Operations.py +19 -17
- nuitka/tree/ReformulationAssertStatements.py +51 -31
- nuitka/tree/ReformulationAssignmentStatements.py +96 -91
- nuitka/tree/ReformulationBooleanExpressions.py +19 -17
- nuitka/tree/ReformulationCallExpressions.py +20 -18
- nuitka/tree/ReformulationClasses.py +45 -39
- nuitka/tree/ReformulationClasses3.py +239 -116
- nuitka/tree/ReformulationComparisonExpressions.py +29 -35
- nuitka/tree/ReformulationContractionExpressions.py +58 -55
- nuitka/tree/ReformulationDictionaryCreation.py +41 -35
- nuitka/tree/ReformulationExecStatements.py +42 -39
- nuitka/tree/ReformulationForLoopStatements.py +30 -34
- nuitka/tree/ReformulationFunctionStatements.py +59 -55
- nuitka/tree/ReformulationImportStatements.py +34 -29
- nuitka/tree/ReformulationLambdaExpressions.py +23 -24
- nuitka/tree/ReformulationMatchStatements.py +246 -92
- nuitka/tree/ReformulationMultidist.py +22 -18
- nuitka/tree/ReformulationNamespacePackages.py +55 -46
- nuitka/tree/ReformulationPrintStatements.py +23 -24
- nuitka/tree/ReformulationSequenceCreation.py +50 -49
- nuitka/tree/ReformulationSubscriptExpressions.py +19 -17
- nuitka/tree/ReformulationTryExceptStatements.py +19 -17
- nuitka/tree/ReformulationTryFinallyStatements.py +34 -17
- nuitka/tree/ReformulationWhileLoopStatements.py +19 -17
- nuitka/tree/ReformulationWithStatements.py +39 -41
- nuitka/tree/ReformulationYieldExpressions.py +44 -24
- nuitka/tree/SourceHandling.py +76 -31
- nuitka/tree/SyntaxErrors.py +19 -17
- nuitka/tree/TreeHelpers.py +33 -20
- nuitka/tree/VariableClosure.py +35 -39
- nuitka/tree/__init__.py +5 -4
- nuitka/utils/AppDirs.py +41 -20
- nuitka/utils/CStrings.py +66 -21
- nuitka/utils/CommandLineOptions.py +111 -22
- nuitka/utils/Distributions.py +445 -54
- nuitka/utils/Download.py +89 -57
- nuitka/utils/Execution.py +102 -58
- nuitka/utils/FileOperations.py +357 -128
- nuitka/utils/Hashing.py +55 -33
- nuitka/utils/Images.py +26 -19
- nuitka/utils/Importing.py +119 -37
- nuitka/utils/InlineCopies.py +52 -0
- nuitka/utils/InstalledPythons.py +85 -75
- nuitka/utils/InstanceCounters.py +20 -17
- nuitka/utils/Jinja2.py +30 -22
- nuitka/utils/Json.py +21 -19
- nuitka/utils/MacOSApp.py +26 -18
- nuitka/utils/MemoryUsage.py +20 -18
- nuitka/utils/ModuleNames.py +42 -26
- nuitka/utils/PackageResources.py +44 -0
- nuitka/utils/ReExecute.py +50 -28
- nuitka/utils/Rest.py +20 -17
- nuitka/utils/SharedLibraries.py +161 -75
- nuitka/utils/Shebang.py +20 -17
- nuitka/utils/Signing.py +63 -18
- nuitka/utils/SlotMetaClasses.py +57 -0
- nuitka/utils/StaticLibraries.py +83 -56
- nuitka/utils/ThreadedExecutor.py +18 -17
- nuitka/utils/Timing.py +22 -20
- nuitka/utils/Utils.py +132 -25
- nuitka/utils/WindowsFileUsage.py +22 -20
- nuitka/utils/WindowsResources.py +25 -18
- nuitka/utils/Yaml.py +62 -24
- nuitka/utils/__init__.py +5 -4
- Nuitka_winsvc-1.8.dist-info/RECORD +0 -905
- nuitka/build/inline_copy/tqdm/tqdm/_tqdm_gui.py +0 -9
- nuitka/build/inline_copy/tqdm/tqdm/gui.py +0 -191
- {Nuitka_winsvc-1.8.dist-info → Nuitka_winsvc-2.5.1.dist-info}/LICENSE.txt +0 -0
- {Nuitka_winsvc-1.8.dist-info → Nuitka_winsvc-2.5.1.dist-info}/entry_points.txt +0 -0
- {Nuitka_winsvc-1.8.dist-info → Nuitka_winsvc-2.5.1.dist-info}/top_level.txt +0 -0
nuitka/utils/FileOperations.py
CHANGED
|
@@ -1,20 +1,6 @@
|
|
|
1
|
-
# Copyright
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
# integrates with CPython, but also works on its own.
|
|
5
|
-
#
|
|
6
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
-
# you may not use this file except in compliance with the License.
|
|
8
|
-
# You may obtain a copy of the License at
|
|
9
|
-
#
|
|
10
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
-
#
|
|
12
|
-
# Unless required by applicable law or agreed to in writing, software
|
|
13
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
-
# See the License for the specific language governing permissions and
|
|
16
|
-
# limitations under the License.
|
|
17
|
-
#
|
|
1
|
+
# Copyright 2024, Kay Hayen, mailto:kay.hayen@gmail.com find license text at end of file
|
|
2
|
+
|
|
3
|
+
|
|
18
4
|
""" Utils for file and directory operations.
|
|
19
5
|
|
|
20
6
|
This provides enhanced and more error resilient forms of standard
|
|
@@ -24,34 +10,39 @@ stuff. It will also frequently add sorting for determinism.
|
|
|
24
10
|
|
|
25
11
|
from __future__ import print_function
|
|
26
12
|
|
|
13
|
+
import codecs
|
|
27
14
|
import errno
|
|
28
15
|
import fnmatch
|
|
29
16
|
import glob
|
|
30
17
|
import os
|
|
18
|
+
import pickle
|
|
31
19
|
import shutil
|
|
32
20
|
import stat
|
|
21
|
+
import sys
|
|
33
22
|
import tempfile
|
|
34
23
|
import time
|
|
24
|
+
import unicodedata
|
|
35
25
|
from contextlib import contextmanager
|
|
36
26
|
|
|
37
27
|
from nuitka.__past__ import ( # pylint: disable=redefined-builtin
|
|
28
|
+
FileNotFoundError,
|
|
38
29
|
PermissionError,
|
|
39
|
-
WindowsError,
|
|
40
30
|
basestring,
|
|
41
|
-
|
|
31
|
+
unicode,
|
|
42
32
|
)
|
|
43
33
|
from nuitka.PythonVersions import python_version
|
|
44
|
-
from nuitka.Tracing import
|
|
45
|
-
flushStandardOutputs,
|
|
46
|
-
general,
|
|
47
|
-
my_print,
|
|
48
|
-
options_logger,
|
|
49
|
-
printLine,
|
|
50
|
-
)
|
|
34
|
+
from nuitka.Tracing import general, my_print, options_logger, queryUser
|
|
51
35
|
|
|
52
36
|
from .Importing import importFromInlineCopy
|
|
53
37
|
from .ThreadedExecutor import RLock, getThreadIdent
|
|
54
|
-
from .Utils import
|
|
38
|
+
from .Utils import (
|
|
39
|
+
decoratorRetries,
|
|
40
|
+
isLinux,
|
|
41
|
+
isMacOS,
|
|
42
|
+
isWin32OrPosixWindows,
|
|
43
|
+
isWin32Windows,
|
|
44
|
+
raiseWindowsError,
|
|
45
|
+
)
|
|
55
46
|
|
|
56
47
|
# Locking seems to be only required for Windows mostly, but we can keep
|
|
57
48
|
# it for all.
|
|
@@ -101,8 +92,11 @@ def areSamePaths(path1, path2):
|
|
|
101
92
|
even short paths, it then becomes a mere string compare after that.
|
|
102
93
|
"""
|
|
103
94
|
|
|
104
|
-
path1
|
|
105
|
-
|
|
95
|
+
if path1 == path2:
|
|
96
|
+
return True
|
|
97
|
+
|
|
98
|
+
path1 = os.path.abspath(getNormalizedPath(path1))
|
|
99
|
+
path2 = os.path.abspath(getNormalizedPath(path2))
|
|
106
100
|
|
|
107
101
|
if os.path.exists(path1) and os.path.exists(path2):
|
|
108
102
|
path1 = getExternalUsePath(path1)
|
|
@@ -190,7 +184,11 @@ def makePath(path):
|
|
|
190
184
|
|
|
191
185
|
with withFileLock("creating directory %s" % path):
|
|
192
186
|
if not os.path.isdir(path):
|
|
193
|
-
|
|
187
|
+
try:
|
|
188
|
+
os.makedirs(path)
|
|
189
|
+
except OSError:
|
|
190
|
+
if not os.path.exists(path):
|
|
191
|
+
raise
|
|
194
192
|
|
|
195
193
|
|
|
196
194
|
def makeContainingPath(filename):
|
|
@@ -240,9 +238,14 @@ def _getRealPathWindows(path):
|
|
|
240
238
|
if str is not bytes:
|
|
241
239
|
result = result.decode("utf8")
|
|
242
240
|
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
241
|
+
if result.startswith("UNC\\"):
|
|
242
|
+
# Avoid network mounts being converted to UNC shared paths by newer
|
|
243
|
+
# Python versions, many tools won't work with those.
|
|
244
|
+
_real_path_windows_cache[path] = path
|
|
245
|
+
else:
|
|
246
|
+
_real_path_windows_cache[path] = os.path.join(
|
|
247
|
+
os.path.dirname(path), result.rstrip("\r\n")
|
|
248
|
+
)
|
|
246
249
|
else:
|
|
247
250
|
_real_path_windows_cache[path] = path
|
|
248
251
|
|
|
@@ -259,7 +262,9 @@ def getDirectoryRealPath(path):
|
|
|
259
262
|
path with symlinks resolved
|
|
260
263
|
|
|
261
264
|
Notes:
|
|
262
|
-
Workaround for Windows symlink is applied.
|
|
265
|
+
Workaround for Windows symlink is applied. This function is not recursive
|
|
266
|
+
at all with older Python, i.e. only the last part, the directory itself
|
|
267
|
+
is being resolved there.
|
|
263
268
|
|
|
264
269
|
"""
|
|
265
270
|
path = os.path.realpath(path)
|
|
@@ -272,6 +277,62 @@ def getDirectoryRealPath(path):
|
|
|
272
277
|
return path
|
|
273
278
|
|
|
274
279
|
|
|
280
|
+
def _restoreWindowsPath(orig_path, path):
|
|
281
|
+
if path.startswith("\\\\"):
|
|
282
|
+
drive, _remaining_path = os.path.splitdrive(orig_path)
|
|
283
|
+
|
|
284
|
+
if drive and not drive.startswith("\\\\"):
|
|
285
|
+
drive_real_path = os.path.realpath(drive + "\\")
|
|
286
|
+
assert path.startswith(drive_real_path)
|
|
287
|
+
|
|
288
|
+
path = drive + "\\" + path[len(drive_real_path) :]
|
|
289
|
+
else:
|
|
290
|
+
path = path.strip(os.path.sep)
|
|
291
|
+
|
|
292
|
+
if os.path.sep in path:
|
|
293
|
+
dirname = os.path.dirname(path)
|
|
294
|
+
filename = os.path.basename(path)
|
|
295
|
+
|
|
296
|
+
if dirname:
|
|
297
|
+
dirname = getDirectoryRealPath(dirname)
|
|
298
|
+
|
|
299
|
+
# Drive letters do not get slashes from "os.path.join", so
|
|
300
|
+
# we inject this here and normalize the path afterwards to
|
|
301
|
+
# remove any duplication added.
|
|
302
|
+
if os.path.sep not in dirname:
|
|
303
|
+
dirname = dirname + os.path.sep
|
|
304
|
+
|
|
305
|
+
path = os.path.normpath(os.path.join(dirname, filename))
|
|
306
|
+
|
|
307
|
+
return path
|
|
308
|
+
|
|
309
|
+
|
|
310
|
+
def getFilenameRealPath(path):
|
|
311
|
+
"""Get os.path.realpath with Python2 and Windows symlink workaround applied.
|
|
312
|
+
|
|
313
|
+
Args:
|
|
314
|
+
path: path to get realpath of
|
|
315
|
+
|
|
316
|
+
Returns:
|
|
317
|
+
path with symlinks resolved
|
|
318
|
+
|
|
319
|
+
Notes:
|
|
320
|
+
Workaround for Windows symlinks are applied, this works recursive and
|
|
321
|
+
assumes that the path given itself is a file and not a directory, and
|
|
322
|
+
doesn't handle file symlinks at the end on older Python currently, but
|
|
323
|
+
we shouldn't deal with those.
|
|
324
|
+
"""
|
|
325
|
+
orig_path = path
|
|
326
|
+
path = os.path.realpath(path)
|
|
327
|
+
|
|
328
|
+
# Avoid network mounts being converted to UNC shared paths by newer
|
|
329
|
+
# Python versions, many tools won't work with those.
|
|
330
|
+
if os.name == "nt":
|
|
331
|
+
path = _restoreWindowsPath(orig_path=orig_path, path=path)
|
|
332
|
+
|
|
333
|
+
return path
|
|
334
|
+
|
|
335
|
+
|
|
275
336
|
def listDir(path):
|
|
276
337
|
"""Give a sorted listing of a path.
|
|
277
338
|
|
|
@@ -293,8 +354,28 @@ def listDir(path):
|
|
|
293
354
|
"""
|
|
294
355
|
real_path = getDirectoryRealPath(path)
|
|
295
356
|
|
|
357
|
+
# The "os.listdir" output needs to be unicode paths, or else it can be unusable
|
|
358
|
+
# for Python2 on Windows at least. We try to go back on the result.
|
|
359
|
+
if str is bytes and type(real_path) is str:
|
|
360
|
+
real_path = unicode(real_path)
|
|
361
|
+
|
|
362
|
+
def _tryDecodeToStr(value):
|
|
363
|
+
if str is bytes:
|
|
364
|
+
if type(value) is unicode:
|
|
365
|
+
# File system paths, that should be usable for names of modules,
|
|
366
|
+
# as Python2 code objects will e.g. hate unicode values.
|
|
367
|
+
|
|
368
|
+
# spell-checker: ignore getfilesystemencoding
|
|
369
|
+
try:
|
|
370
|
+
return value.decode(sys.getfilesystemencoding())
|
|
371
|
+
except UnicodeDecodeError:
|
|
372
|
+
return value
|
|
373
|
+
else:
|
|
374
|
+
return value
|
|
375
|
+
|
|
296
376
|
return sorted(
|
|
297
|
-
|
|
377
|
+
(_tryDecodeToStr(os.path.join(path, filename)), _tryDecodeToStr(filename))
|
|
378
|
+
for filename in os.listdir(real_path)
|
|
298
379
|
)
|
|
299
380
|
|
|
300
381
|
|
|
@@ -359,7 +440,7 @@ def getFileList(
|
|
|
359
440
|
fullname = os.path.join(root, filename)
|
|
360
441
|
|
|
361
442
|
if normalize:
|
|
362
|
-
fullname =
|
|
443
|
+
fullname = getNormalizedPath(fullname)
|
|
363
444
|
|
|
364
445
|
result.append(fullname)
|
|
365
446
|
|
|
@@ -409,9 +490,9 @@ def getDllBasename(path):
|
|
|
409
490
|
if compare_path.endswith(suffix):
|
|
410
491
|
return path[: -len(suffix)]
|
|
411
492
|
|
|
412
|
-
# Linux
|
|
413
|
-
#
|
|
414
|
-
#
|
|
493
|
+
# Linux is not case sensitive, but lets still do it properly, sometimes, it
|
|
494
|
+
# is done macOS too. So we split on the normcase, but only to find out what
|
|
495
|
+
# is going on there.
|
|
415
496
|
if ".so." in compare_path:
|
|
416
497
|
return path[: len(compare_path.split(".so.")[0])]
|
|
417
498
|
|
|
@@ -473,7 +554,7 @@ def listExeFilesFromDirectory(path, prefix=None, suffixes=None):
|
|
|
473
554
|
|
|
474
555
|
# On Windows, we check exe suffixes, on other platforms we shell all filenames,
|
|
475
556
|
# matching the prefix, but they have to the executable bit set.
|
|
476
|
-
if suffixes
|
|
557
|
+
if not suffixes and isWin32OrPosixWindows():
|
|
477
558
|
suffixes = "exe", "bin"
|
|
478
559
|
|
|
479
560
|
if suffixes:
|
|
@@ -577,11 +658,19 @@ def deleteFile(path, must_exist):
|
|
|
577
658
|
raise OSError("Does not exist", path)
|
|
578
659
|
|
|
579
660
|
|
|
580
|
-
def
|
|
581
|
-
"""
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
661
|
+
def searchPrefixPath(path, element):
|
|
662
|
+
"""Search element and return prefix in path, if any."""
|
|
663
|
+
|
|
664
|
+
while path:
|
|
665
|
+
if os.path.normcase(os.path.basename(path)) == os.path.normcase(element):
|
|
666
|
+
return path
|
|
667
|
+
|
|
668
|
+
new_path = os.path.dirname(path)
|
|
669
|
+
if new_path == path:
|
|
670
|
+
break
|
|
671
|
+
path = new_path
|
|
672
|
+
|
|
673
|
+
return None
|
|
585
674
|
|
|
586
675
|
|
|
587
676
|
def getFilenameExtension(path):
|
|
@@ -605,7 +694,8 @@ def hasFilenameExtension(path, extensions):
|
|
|
605
694
|
"""Has a filename one of the given extensions.
|
|
606
695
|
|
|
607
696
|
Note: The extensions should be normalized, i.e. lower case and will match other
|
|
608
|
-
cases where the file system does that on a platform.
|
|
697
|
+
cases where the file system does that on a platform. Also they include a dot,
|
|
698
|
+
e.g. ".qml" is a good value.
|
|
609
699
|
"""
|
|
610
700
|
|
|
611
701
|
extension = getFilenameExtension(path)
|
|
@@ -616,7 +706,14 @@ def hasFilenameExtension(path, extensions):
|
|
|
616
706
|
return extension in extensions
|
|
617
707
|
|
|
618
708
|
|
|
619
|
-
def
|
|
709
|
+
def addFilenameExtension(path, extension):
|
|
710
|
+
if not hasFilenameExtension(path, extension):
|
|
711
|
+
path += extension
|
|
712
|
+
|
|
713
|
+
return path
|
|
714
|
+
|
|
715
|
+
|
|
716
|
+
def removeDirectory(path, logger, ignore_errors, extra_recommendation):
|
|
620
717
|
"""Remove a directory recursively.
|
|
621
718
|
|
|
622
719
|
On Windows, it happens that operations fail, and succeed when retried,
|
|
@@ -627,28 +724,52 @@ def removeDirectory(path, ignore_errors):
|
|
|
627
724
|
it hopefully only briefly.
|
|
628
725
|
"""
|
|
629
726
|
|
|
630
|
-
def onError(func, path, exc_info):
|
|
631
|
-
# Try again immediately, ignore what happened, pylint: disable=unused-argument
|
|
632
|
-
try:
|
|
633
|
-
func(path)
|
|
634
|
-
except OSError:
|
|
635
|
-
time.sleep(0.1)
|
|
636
|
-
|
|
637
|
-
func(path)
|
|
638
|
-
|
|
639
727
|
with withFileLock("removing directory %s" % path):
|
|
640
728
|
if os.path.exists(path):
|
|
641
|
-
try:
|
|
642
|
-
shutil.rmtree(path, ignore_errors=False, onerror=onError)
|
|
643
|
-
except OSError:
|
|
644
|
-
if ignore_errors:
|
|
645
|
-
shutil.rmtree(path, ignore_errors=ignore_errors)
|
|
646
|
-
else:
|
|
647
|
-
raise
|
|
648
729
|
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
730
|
+
@decoratorRetries(
|
|
731
|
+
logger=logger,
|
|
732
|
+
purpose="delete '%s'" % path,
|
|
733
|
+
consequence="the path is not fully removed",
|
|
734
|
+
extra_recommendation=extra_recommendation,
|
|
735
|
+
)
|
|
736
|
+
def _removeDirectory():
|
|
737
|
+
def onError(func, path, exc_info):
|
|
738
|
+
# Record what happened what happened, pylint: disable=unused-argument
|
|
739
|
+
last_error.append((func, path))
|
|
740
|
+
|
|
741
|
+
previous_error = []
|
|
742
|
+
|
|
743
|
+
# Try deleting while ignoring errors first.
|
|
744
|
+
while True:
|
|
745
|
+
last_error = []
|
|
746
|
+
shutil.rmtree(path, ignore_errors=False, onerror=onError)
|
|
747
|
+
|
|
748
|
+
# onError as a side effect, modifies last_error
|
|
749
|
+
if previous_error == last_error:
|
|
750
|
+
break
|
|
751
|
+
|
|
752
|
+
previous_error = list(last_error)
|
|
753
|
+
time.sleep(0.2)
|
|
754
|
+
|
|
755
|
+
# If it still exists, try one more time, this time not ignoring errors.
|
|
756
|
+
if os.path.exists(path):
|
|
757
|
+
try:
|
|
758
|
+
shutil.rmtree(path, ignore_errors=ignore_errors)
|
|
759
|
+
except OSError:
|
|
760
|
+
if not ignore_errors:
|
|
761
|
+
raise
|
|
762
|
+
|
|
763
|
+
_removeDirectory()
|
|
764
|
+
|
|
765
|
+
|
|
766
|
+
def resetDirectory(path, logger, ignore_errors, extra_recommendation):
|
|
767
|
+
removeDirectory(
|
|
768
|
+
path=path,
|
|
769
|
+
logger=logger,
|
|
770
|
+
ignore_errors=ignore_errors,
|
|
771
|
+
extra_recommendation=extra_recommendation,
|
|
772
|
+
)
|
|
652
773
|
makePath(path)
|
|
653
774
|
|
|
654
775
|
|
|
@@ -660,19 +781,22 @@ def withTemporaryFile(suffix="", mode="w", delete=True, temp_path=None):
|
|
|
660
781
|
yield temp_file
|
|
661
782
|
|
|
662
783
|
|
|
663
|
-
def getFileContentByLine(filename, mode="r", encoding=None):
|
|
784
|
+
def getFileContentByLine(filename, mode="r", encoding=None, errors=None):
|
|
664
785
|
# We read the whole, to keep lock times minimal. We only deal with small
|
|
665
786
|
# files like this normally.
|
|
666
|
-
return getFileContents(
|
|
787
|
+
return getFileContents(
|
|
788
|
+
filename, mode, encoding=encoding, errors=errors
|
|
789
|
+
).splitlines()
|
|
667
790
|
|
|
668
791
|
|
|
669
|
-
def getFileContents(filename, mode="r", encoding=None):
|
|
792
|
+
def getFileContents(filename, mode="r", encoding=None, errors=None):
|
|
670
793
|
"""Get the contents of a file.
|
|
671
794
|
|
|
672
795
|
Args:
|
|
673
796
|
filename: str with the file to be read
|
|
674
797
|
mode: "r" for str, "rb" for bytes result
|
|
675
798
|
encoding: optional encoding to used when reading the file, e.g. "utf8"
|
|
799
|
+
errors: optional error handler decoding the content, as defined in `codecs`
|
|
676
800
|
|
|
677
801
|
Returns:
|
|
678
802
|
str or bytes - depending on mode.
|
|
@@ -680,7 +804,7 @@ def getFileContents(filename, mode="r", encoding=None):
|
|
|
680
804
|
"""
|
|
681
805
|
|
|
682
806
|
with withFileLock("reading file %s" % filename):
|
|
683
|
-
with openTextFile(filename, mode, encoding=encoding) as f:
|
|
807
|
+
with openTextFile(filename, mode, encoding=encoding, errors=errors) as f:
|
|
684
808
|
return f.read()
|
|
685
809
|
|
|
686
810
|
|
|
@@ -702,18 +826,11 @@ def getFileFirstLine(filename, mode="r", encoding=None):
|
|
|
702
826
|
return f.readline()
|
|
703
827
|
|
|
704
828
|
|
|
705
|
-
def openTextFile(filename, mode, encoding=None):
|
|
706
|
-
if
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
return codecs.open(filename, mode, encoding=encoding)
|
|
710
|
-
else:
|
|
711
|
-
# Avoid deprecation warning, is now the default.
|
|
712
|
-
if python_version >= 0x370:
|
|
713
|
-
mode = mode.replace("U", "")
|
|
829
|
+
def openTextFile(filename, mode, encoding=None, errors=None):
|
|
830
|
+
if python_version >= 0x370:
|
|
831
|
+
mode = mode.replace("U", "")
|
|
714
832
|
|
|
715
|
-
|
|
716
|
-
return open(filename, mode) # pylint: disable=unspecified-encoding
|
|
833
|
+
return codecs.open(filename, mode, encoding=encoding, errors=errors)
|
|
717
834
|
|
|
718
835
|
|
|
719
836
|
def putTextFileContents(filename, contents, encoding=None):
|
|
@@ -740,6 +857,22 @@ def putTextFileContents(filename, contents, encoding=None):
|
|
|
740
857
|
_writeContents(output_file)
|
|
741
858
|
|
|
742
859
|
|
|
860
|
+
def putBinaryFileContents(filename, contents):
|
|
861
|
+
"""Write a binary file from given contents.
|
|
862
|
+
|
|
863
|
+
Args:
|
|
864
|
+
filename: str with the file to be created
|
|
865
|
+
contents: bytes that should be written into the file
|
|
866
|
+
|
|
867
|
+
Returns:
|
|
868
|
+
None
|
|
869
|
+
"""
|
|
870
|
+
|
|
871
|
+
with withFileLock("writing file %s" % filename):
|
|
872
|
+
with openTextFile(filename, "wb") as output_file:
|
|
873
|
+
output_file.write(contents)
|
|
874
|
+
|
|
875
|
+
|
|
743
876
|
def changeTextFileContents(filename, contents, encoding=None, compare_only=False):
|
|
744
877
|
"""Write a text file from given contents.
|
|
745
878
|
|
|
@@ -766,7 +899,7 @@ def changeTextFileContents(filename, contents, encoding=None, compare_only=False
|
|
|
766
899
|
|
|
767
900
|
@contextmanager
|
|
768
901
|
def withPreserveFileMode(filenames):
|
|
769
|
-
if
|
|
902
|
+
if isinstance(filenames, basestring):
|
|
770
903
|
filenames = [filenames]
|
|
771
904
|
|
|
772
905
|
old_modes = {}
|
|
@@ -781,7 +914,7 @@ def withPreserveFileMode(filenames):
|
|
|
781
914
|
|
|
782
915
|
@contextmanager
|
|
783
916
|
def withMadeWritableFileMode(filenames):
|
|
784
|
-
if
|
|
917
|
+
if isinstance(filenames, basestring):
|
|
785
918
|
filenames = [filenames]
|
|
786
919
|
|
|
787
920
|
with withPreserveFileMode(filenames):
|
|
@@ -839,10 +972,13 @@ def copyTree(source_path, dest_path):
|
|
|
839
972
|
if python_version >= 0x380:
|
|
840
973
|
# Python 3.8+ has dirs_exist_ok
|
|
841
974
|
return shutil.copytree(source_path, dest_path, dirs_exist_ok=True)
|
|
975
|
+
else:
|
|
842
976
|
|
|
843
|
-
|
|
977
|
+
from distutils.dir_util import ( # Older Python only, pylint: disable=I0021,import-error
|
|
978
|
+
copy_tree,
|
|
979
|
+
)
|
|
844
980
|
|
|
845
|
-
|
|
981
|
+
return copy_tree(source_path, dest_path)
|
|
846
982
|
|
|
847
983
|
|
|
848
984
|
def copyFileWithPermissions(source_path, dest_path, dist_dir):
|
|
@@ -881,33 +1017,6 @@ def copyFileWithPermissions(source_path, dest_path, dist_dir):
|
|
|
881
1017
|
os.chmod(dest_path, source_mode)
|
|
882
1018
|
|
|
883
1019
|
|
|
884
|
-
def queryUser(question, choices, default, default_non_interactive):
|
|
885
|
-
assert default in choices, (default, choices)
|
|
886
|
-
assert default_non_interactive in choices, (default, choices)
|
|
887
|
-
|
|
888
|
-
prompt = "%s? %s : " % (
|
|
889
|
-
question,
|
|
890
|
-
"/".join(
|
|
891
|
-
"[%s]" % choice.title() if choice == default else choice.title()
|
|
892
|
-
for choice in choices
|
|
893
|
-
),
|
|
894
|
-
)
|
|
895
|
-
|
|
896
|
-
# Integrates with progress bar by closing it.
|
|
897
|
-
printLine(prompt, end="")
|
|
898
|
-
flushStandardOutputs()
|
|
899
|
-
|
|
900
|
-
try:
|
|
901
|
-
reply = raw_input() or default
|
|
902
|
-
except EOFError:
|
|
903
|
-
reply = default_non_interactive
|
|
904
|
-
|
|
905
|
-
if reply == "y":
|
|
906
|
-
reply = "yes"
|
|
907
|
-
|
|
908
|
-
return reply.lower()
|
|
909
|
-
|
|
910
|
-
|
|
911
1020
|
def copyFile(source_path, dest_path):
|
|
912
1021
|
"""Improved version of shutil.copy
|
|
913
1022
|
|
|
@@ -977,6 +1086,10 @@ def isFilenameBelowPath(path, filename, consider_short=True):
|
|
|
977
1086
|
filename = getExternalUsePath(filename)
|
|
978
1087
|
path = getExternalUsePath(path)
|
|
979
1088
|
|
|
1089
|
+
if isWin32Windows():
|
|
1090
|
+
if getWindowsDrive(path) != getWindowsDrive(filename):
|
|
1091
|
+
return False
|
|
1092
|
+
|
|
980
1093
|
result = os.path.relpath(filename, path).split(os.path.sep)[0] != ".."
|
|
981
1094
|
|
|
982
1095
|
return result
|
|
@@ -1021,10 +1134,7 @@ def getWindowsShortPathName(filename):
|
|
|
1021
1134
|
if ctypes.GetLastError() == 5:
|
|
1022
1135
|
return filename
|
|
1023
1136
|
|
|
1024
|
-
|
|
1025
|
-
ctypes.GetLastError(), ctypes.FormatError(ctypes.GetLastError())
|
|
1026
|
-
)
|
|
1027
|
-
|
|
1137
|
+
raiseWindowsError("getWindowsShortPathName for %s" % filename)
|
|
1028
1138
|
if output_buf_size >= needed:
|
|
1029
1139
|
# Short paths should be ASCII. Don't return unicode without a need,
|
|
1030
1140
|
# as e.g. Scons hates that in environment variables.
|
|
@@ -1058,7 +1168,7 @@ def getWindowsLongPathName(filename):
|
|
|
1058
1168
|
while True:
|
|
1059
1169
|
output_buf = ctypes.create_unicode_buffer(output_buf_size)
|
|
1060
1170
|
needed = GetLongPathNameW(
|
|
1061
|
-
os.path.abspath(filename), output_buf, output_buf_size
|
|
1171
|
+
getNormalizedPath(os.path.abspath(filename)), output_buf, output_buf_size
|
|
1062
1172
|
)
|
|
1063
1173
|
|
|
1064
1174
|
if needed == 0:
|
|
@@ -1068,10 +1178,7 @@ def getWindowsLongPathName(filename):
|
|
|
1068
1178
|
if ctypes.GetLastError() == 5:
|
|
1069
1179
|
return filename
|
|
1070
1180
|
|
|
1071
|
-
|
|
1072
|
-
ctypes.GetLastError(), ctypes.FormatError(ctypes.GetLastError())
|
|
1073
|
-
)
|
|
1074
|
-
|
|
1181
|
+
raiseWindowsError("getWindowsLongPathName for %s" % filename)
|
|
1075
1182
|
if output_buf_size >= needed:
|
|
1076
1183
|
return output_buf.value
|
|
1077
1184
|
else:
|
|
@@ -1096,8 +1203,10 @@ def getExternalUsePath(filename, only_dirname=False):
|
|
|
1096
1203
|
filename = os.path.abspath(filename)
|
|
1097
1204
|
|
|
1098
1205
|
if os.name == "nt":
|
|
1206
|
+
key = filename, only_dirname
|
|
1207
|
+
|
|
1099
1208
|
if filename not in _external_use_path_cache:
|
|
1100
|
-
|
|
1209
|
+
filename = getFilenameRealPath(filename)
|
|
1101
1210
|
|
|
1102
1211
|
if only_dirname:
|
|
1103
1212
|
dirname = getWindowsShortPathName(os.path.dirname(filename))
|
|
@@ -1106,10 +1215,13 @@ def getExternalUsePath(filename, only_dirname=False):
|
|
|
1106
1215
|
else:
|
|
1107
1216
|
filename = getWindowsShortPathName(filename)
|
|
1108
1217
|
|
|
1109
|
-
_external_use_path_cache[
|
|
1110
|
-
|
|
1218
|
+
_external_use_path_cache[key] = filename
|
|
1219
|
+
|
|
1220
|
+
# Looking up again should give same result immediately.
|
|
1221
|
+
key = filename, only_dirname
|
|
1222
|
+
_external_use_path_cache[key] = filename
|
|
1111
1223
|
|
|
1112
|
-
return _external_use_path_cache[
|
|
1224
|
+
return _external_use_path_cache[key]
|
|
1113
1225
|
else:
|
|
1114
1226
|
return filename
|
|
1115
1227
|
|
|
@@ -1202,6 +1314,10 @@ def getLinkTarget(filename):
|
|
|
1202
1314
|
return is_link, filename
|
|
1203
1315
|
|
|
1204
1316
|
|
|
1317
|
+
# Late import and optional to be there.
|
|
1318
|
+
atomicwrites = None
|
|
1319
|
+
|
|
1320
|
+
|
|
1205
1321
|
def replaceFileAtomic(source_path, dest_path):
|
|
1206
1322
|
"""
|
|
1207
1323
|
Move ``src`` to ``dst``. If ``dst`` exists, it will be silently
|
|
@@ -1216,9 +1332,12 @@ def replaceFileAtomic(source_path, dest_path):
|
|
|
1216
1332
|
if python_version >= 0x300:
|
|
1217
1333
|
os.replace(source_path, dest_path)
|
|
1218
1334
|
else:
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
1335
|
+
global atomicwrites # singleton, pylint: disable=global-statement
|
|
1336
|
+
|
|
1337
|
+
if atomicwrites is None:
|
|
1338
|
+
atomicwrites = importFromInlineCopy("atomicwrites", must_exist=True)
|
|
1339
|
+
|
|
1340
|
+
atomicwrites.replace_atomic(source_path, dest_path)
|
|
1222
1341
|
|
|
1223
1342
|
|
|
1224
1343
|
def resolveShellPatternToFilenames(pattern):
|
|
@@ -1303,3 +1422,113 @@ def syncFileOutput(file_handle):
|
|
|
1303
1422
|
except AttributeError:
|
|
1304
1423
|
# Too old to have "syncfs" available.
|
|
1305
1424
|
return
|
|
1425
|
+
|
|
1426
|
+
|
|
1427
|
+
def isFilesystemEncodable(filename):
|
|
1428
|
+
"""Decide if a filename is safe for use as a file system path with tools."""
|
|
1429
|
+
if os.name == "nt" and type(filename) is unicode:
|
|
1430
|
+
value = (
|
|
1431
|
+
unicodedata.normalize("NFKD", filename)
|
|
1432
|
+
.encode("ascii", "ignore")
|
|
1433
|
+
.decode("ascii")
|
|
1434
|
+
)
|
|
1435
|
+
|
|
1436
|
+
return value == filename
|
|
1437
|
+
else:
|
|
1438
|
+
return True
|
|
1439
|
+
|
|
1440
|
+
|
|
1441
|
+
def makeFilesystemEncodable(filename):
|
|
1442
|
+
if not os.path.isabs(filename):
|
|
1443
|
+
filename = os.path.abspath(filename)
|
|
1444
|
+
|
|
1445
|
+
if not isFilesystemEncodable(filename):
|
|
1446
|
+
filename = getExternalUsePath(filename)
|
|
1447
|
+
|
|
1448
|
+
return filename
|
|
1449
|
+
|
|
1450
|
+
|
|
1451
|
+
def openPickleFile(filename, mode, protocol=-1):
|
|
1452
|
+
file_handle = openTextFile(filename, mode)
|
|
1453
|
+
|
|
1454
|
+
if python_version < 0x300:
|
|
1455
|
+
return file_handle, pickle.Pickler(file_handle, protocol)
|
|
1456
|
+
else:
|
|
1457
|
+
return file_handle, pickle._Pickler( # pylint: disable=protected-access
|
|
1458
|
+
file_handle, protocol
|
|
1459
|
+
)
|
|
1460
|
+
|
|
1461
|
+
|
|
1462
|
+
def isLegalPath(path):
|
|
1463
|
+
illegal_suffixes = "/\\"
|
|
1464
|
+
illegal_chars = "\0"
|
|
1465
|
+
|
|
1466
|
+
if isWin32Windows():
|
|
1467
|
+
illegal_chars += r'*"/<>:|?'
|
|
1468
|
+
|
|
1469
|
+
illegal_chars += "".join(chr(x) for x in range(1, 32))
|
|
1470
|
+
illegal_suffixes += " ."
|
|
1471
|
+
|
|
1472
|
+
if isMacOS():
|
|
1473
|
+
illegal_chars += ":"
|
|
1474
|
+
|
|
1475
|
+
for c in path:
|
|
1476
|
+
if c in illegal_chars:
|
|
1477
|
+
return False, "contains illegal character %r" % c
|
|
1478
|
+
|
|
1479
|
+
for illegal_suffix in illegal_suffixes:
|
|
1480
|
+
if path.endswith(illegal_suffix):
|
|
1481
|
+
return False, "contains illegal suffix %r" % illegal_suffix
|
|
1482
|
+
|
|
1483
|
+
for part in path.split(os.path.sep):
|
|
1484
|
+
if part == ".":
|
|
1485
|
+
continue
|
|
1486
|
+
|
|
1487
|
+
if part.endswith(illegal_suffix):
|
|
1488
|
+
return False, "contains illegal suffix %r in path part %r" % (
|
|
1489
|
+
part,
|
|
1490
|
+
illegal_suffix,
|
|
1491
|
+
)
|
|
1492
|
+
|
|
1493
|
+
return True, None
|
|
1494
|
+
|
|
1495
|
+
|
|
1496
|
+
def getParentDirectories(path):
|
|
1497
|
+
"""Get all parent directories of a path in descending order."""
|
|
1498
|
+
|
|
1499
|
+
while 1:
|
|
1500
|
+
old_path = path
|
|
1501
|
+
path = os.path.dirname(path)
|
|
1502
|
+
|
|
1503
|
+
if not path or path == old_path:
|
|
1504
|
+
return
|
|
1505
|
+
|
|
1506
|
+
yield path
|
|
1507
|
+
|
|
1508
|
+
|
|
1509
|
+
def getNormalizedPath(path):
|
|
1510
|
+
"""Return normalized path that is also a native path, i.e. only legal characters.
|
|
1511
|
+
|
|
1512
|
+
Needed, because MSYS2 likes to keep "/" in normalized paths.
|
|
1513
|
+
"""
|
|
1514
|
+
path = os.path.normpath(path)
|
|
1515
|
+
if isWin32Windows():
|
|
1516
|
+
path = path.replace("/", "\\")
|
|
1517
|
+
|
|
1518
|
+
return path
|
|
1519
|
+
|
|
1520
|
+
|
|
1521
|
+
# Part of "Nuitka", an optimizing Python compiler that is compatible and
|
|
1522
|
+
# integrates with CPython, but also works on its own.
|
|
1523
|
+
#
|
|
1524
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
1525
|
+
# you may not use this file except in compliance with the License.
|
|
1526
|
+
# You may obtain a copy of the License at
|
|
1527
|
+
#
|
|
1528
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
1529
|
+
#
|
|
1530
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
1531
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
1532
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
1533
|
+
# See the License for the specific language governing permissions and
|
|
1534
|
+
# limitations under the License.
|