Nuitka-winsvc 2.7.7__cp313-cp313-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/Builtins.py +259 -0
- nuitka/BytecodeCaching.py +184 -0
- nuitka/Bytecodes.py +109 -0
- nuitka/CacheCleanup.py +54 -0
- nuitka/Constants.py +425 -0
- nuitka/Errors.py +93 -0
- nuitka/HardImportRegistry.py +408 -0
- nuitka/MainControl.py +1201 -0
- nuitka/ModuleRegistry.py +364 -0
- nuitka/OptionParsing.py +2473 -0
- nuitka/Options.py +2948 -0
- nuitka/OutputDirectories.py +201 -0
- nuitka/PostProcessing.py +551 -0
- nuitka/Progress.py +252 -0
- nuitka/PythonFlavors.py +426 -0
- nuitka/PythonOperators.py +146 -0
- nuitka/PythonVersions.py +513 -0
- nuitka/Serialization.py +291 -0
- nuitka/SourceCodeReferences.py +176 -0
- nuitka/Tracing.py +579 -0
- nuitka/TreeXML.py +141 -0
- nuitka/Variables.py +515 -0
- nuitka/Version.py +88 -0
- nuitka/__init__.py +19 -0
- nuitka/__main__.py +224 -0
- nuitka/__past__.py +217 -0
- nuitka/build/Backend.scons +1111 -0
- nuitka/build/CCompilerVersion.scons +281 -0
- nuitka/build/DataComposerInterface.py +116 -0
- nuitka/build/Offsets.scons +626 -0
- nuitka/build/Onefile.scons +564 -0
- nuitka/build/SconsCaching.py +451 -0
- nuitka/build/SconsCompilerSettings.py +1133 -0
- nuitka/build/SconsHacks.py +215 -0
- nuitka/build/SconsInterface.py +664 -0
- nuitka/build/SconsProgress.py +100 -0
- nuitka/build/SconsSpawn.py +436 -0
- nuitka/build/SconsUtils.py +939 -0
- nuitka/build/__init__.py +19 -0
- nuitka/build/include/nuitka/allocator.h +450 -0
- nuitka/build/include/nuitka/builtins.h +97 -0
- nuitka/build/include/nuitka/calling.h +123 -0
- nuitka/build/include/nuitka/checkers.h +39 -0
- nuitka/build/include/nuitka/checksum_tools.h +28 -0
- nuitka/build/include/nuitka/compiled_asyncgen.h +281 -0
- nuitka/build/include/nuitka/compiled_cell.h +64 -0
- nuitka/build/include/nuitka/compiled_coroutine.h +271 -0
- nuitka/build/include/nuitka/compiled_frame.h +502 -0
- nuitka/build/include/nuitka/compiled_function.h +170 -0
- nuitka/build/include/nuitka/compiled_generator.h +287 -0
- nuitka/build/include/nuitka/compiled_method.h +54 -0
- nuitka/build/include/nuitka/constants.h +251 -0
- nuitka/build/include/nuitka/constants_blob.h +34 -0
- 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 +51 -0
- nuitka/build/include/nuitka/exception_groups.h +167 -0
- nuitka/build/include/nuitka/exceptions.h +1458 -0
- nuitka/build/include/nuitka/filesystem_paths.h +117 -0
- nuitka/build/include/nuitka/freelists.h +92 -0
- nuitka/build/include/nuitka/hedley.h +1774 -0
- nuitka/build/include/nuitka/helper/attributes.h +90 -0
- nuitka/build/include/nuitka/helper/boolean.h +86 -0
- nuitka/build/include/nuitka/helper/bytearrays.h +34 -0
- nuitka/build/include/nuitka/helper/bytes.h +28 -0
- nuitka/build/include/nuitka/helper/calling_generated.h +132 -0
- 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 +247 -0
- nuitka/build/include/nuitka/helper/comparisons_ge.h +197 -0
- nuitka/build/include/nuitka/helper/comparisons_gt.h +197 -0
- nuitka/build/include/nuitka/helper/comparisons_le.h +247 -0
- nuitka/build/include/nuitka/helper/comparisons_lt.h +247 -0
- nuitka/build/include/nuitka/helper/comparisons_ne.h +197 -0
- nuitka/build/include/nuitka/helper/complex.h +46 -0
- nuitka/build/include/nuitka/helper/dictionaries.h +481 -0
- nuitka/build/include/nuitka/helper/floats.h +32 -0
- nuitka/build/include/nuitka/helper/import_hard.h +121 -0
- nuitka/build/include/nuitka/helper/indexes.h +47 -0
- nuitka/build/include/nuitka/helper/ints.h +165 -0
- nuitka/build/include/nuitka/helper/iterators.h +376 -0
- nuitka/build/include/nuitka/helper/lists.h +94 -0
- nuitka/build/include/nuitka/helper/lists_generated.h +36 -0
- nuitka/build/include/nuitka/helper/mappings.h +39 -0
- nuitka/build/include/nuitka/helper/operations.h +114 -0
- nuitka/build/include/nuitka/helper/operations_binary_add.h +240 -0
- nuitka/build/include/nuitka/helper/operations_binary_bitand.h +108 -0
- nuitka/build/include/nuitka/helper/operations_binary_bitor.h +108 -0
- nuitka/build/include/nuitka/helper/operations_binary_bitxor.h +108 -0
- nuitka/build/include/nuitka/helper/operations_binary_divmod.h +103 -0
- nuitka/build/include/nuitka/helper/operations_binary_dual_add.h +34 -0
- nuitka/build/include/nuitka/helper/operations_binary_floordiv.h +103 -0
- nuitka/build/include/nuitka/helper/operations_binary_lshift.h +99 -0
- nuitka/build/include/nuitka/helper/operations_binary_matmult.h +60 -0
- nuitka/build/include/nuitka/helper/operations_binary_mod.h +304 -0
- nuitka/build/include/nuitka/helper/operations_binary_mult.h +247 -0
- nuitka/build/include/nuitka/helper/operations_binary_olddiv.h +125 -0
- nuitka/build/include/nuitka/helper/operations_binary_pow.h +90 -0
- nuitka/build/include/nuitka/helper/operations_binary_rshift.h +99 -0
- nuitka/build/include/nuitka/helper/operations_binary_sub.h +117 -0
- nuitka/build/include/nuitka/helper/operations_binary_truediv.h +103 -0
- nuitka/build/include/nuitka/helper/operations_builtin_types.h +247 -0
- nuitka/build/include/nuitka/helper/operations_inplace_add.h +173 -0
- nuitka/build/include/nuitka/helper/operations_inplace_bitand.h +76 -0
- nuitka/build/include/nuitka/helper/operations_inplace_bitor.h +76 -0
- nuitka/build/include/nuitka/helper/operations_inplace_bitxor.h +76 -0
- nuitka/build/include/nuitka/helper/operations_inplace_floordiv.h +95 -0
- nuitka/build/include/nuitka/helper/operations_inplace_lshift.h +62 -0
- nuitka/build/include/nuitka/helper/operations_inplace_matmult.h +60 -0
- nuitka/build/include/nuitka/helper/operations_inplace_mod.h +218 -0
- nuitka/build/include/nuitka/helper/operations_inplace_mult.h +184 -0
- nuitka/build/include/nuitka/helper/operations_inplace_olddiv.h +115 -0
- nuitka/build/include/nuitka/helper/operations_inplace_pow.h +87 -0
- nuitka/build/include/nuitka/helper/operations_inplace_rshift.h +62 -0
- nuitka/build/include/nuitka/helper/operations_inplace_sub.h +102 -0
- nuitka/build/include/nuitka/helper/operations_inplace_truediv.h +95 -0
- nuitka/build/include/nuitka/helper/raising.h +114 -0
- nuitka/build/include/nuitka/helper/rangeobjects.h +66 -0
- nuitka/build/include/nuitka/helper/richcomparisons.h +35 -0
- nuitka/build/include/nuitka/helper/sequences.h +33 -0
- nuitka/build/include/nuitka/helper/sets.h +25 -0
- nuitka/build/include/nuitka/helper/slices.h +314 -0
- nuitka/build/include/nuitka/helper/strings.h +30 -0
- nuitka/build/include/nuitka/helper/subscripts.h +390 -0
- nuitka/build/include/nuitka/helper/tuples.h +187 -0
- nuitka/build/include/nuitka/helpers.h +417 -0
- nuitka/build/include/nuitka/importing.h +149 -0
- nuitka/build/include/nuitka/incbin.h +402 -0
- nuitka/build/include/nuitka/jit_sources.h +25 -0
- nuitka/build/include/nuitka/prelude.h +626 -0
- nuitka/build/include/nuitka/printing.h +84 -0
- nuitka/build/include/nuitka/python_pgo.h +57 -0
- nuitka/build/include/nuitka/safe_string_ops.h +57 -0
- nuitka/build/include/nuitka/threading.h +142 -0
- nuitka/build/include/nuitka/tracing.h +82 -0
- nuitka/build/include/nuitka/type_aliases.h +30 -0
- nuitka/build/include/nuitka/unfreezing.h +91 -0
- nuitka/build/inline_copy/appdirs/LICENSE.txt +23 -0
- nuitka/build/inline_copy/appdirs/appdirs.py +611 -0
- nuitka/build/inline_copy/atomicwrites/LICENSE +19 -0
- nuitka/build/inline_copy/atomicwrites/atomicwrites.py +226 -0
- nuitka/build/inline_copy/bin/scons.py +58 -0
- nuitka/build/inline_copy/clcache/clcache/LICENSE +30 -0
- nuitka/build/inline_copy/clcache/clcache/__init__.py +4 -0
- nuitka/build/inline_copy/clcache/clcache/caching.py +2008 -0
- nuitka/build/inline_copy/colorama/LICENSE.txt +27 -0
- nuitka/build/inline_copy/colorama/colorama/__init__.py +6 -0
- nuitka/build/inline_copy/colorama/colorama/ansi.py +102 -0
- nuitka/build/inline_copy/colorama/colorama/ansitowin32.py +258 -0
- nuitka/build/inline_copy/colorama/colorama/initialise.py +80 -0
- nuitka/build/inline_copy/colorama/colorama/win32.py +152 -0
- nuitka/build/inline_copy/colorama/colorama/winterm.py +169 -0
- nuitka/build/inline_copy/glob2/LICENSE +27 -0
- nuitka/build/inline_copy/glob2/glob2/__init__.py +5 -0
- nuitka/build/inline_copy/glob2/glob2/compat.py +167 -0
- nuitka/build/inline_copy/glob2/glob2/fnmatch.py +141 -0
- nuitka/build/inline_copy/glob2/glob2/impl.py +216 -0
- nuitka/build/inline_copy/jinja2/LICENSE.rst +28 -0
- nuitka/build/inline_copy/jinja2/README.rst +2 -0
- nuitka/build/inline_copy/jinja2/jinja2/__init__.py +72 -0
- nuitka/build/inline_copy/jinja2/jinja2/_compat.py +105 -0
- nuitka/build/inline_copy/jinja2/jinja2/_identifier.py +2 -0
- nuitka/build/inline_copy/jinja2/jinja2/bccache.py +361 -0
- nuitka/build/inline_copy/jinja2/jinja2/compiler.py +1721 -0
- nuitka/build/inline_copy/jinja2/jinja2/constants.py +32 -0
- nuitka/build/inline_copy/jinja2/jinja2/debug.py +378 -0
- nuitka/build/inline_copy/jinja2/jinja2/defaults.py +56 -0
- nuitka/build/inline_copy/jinja2/jinja2/environment.py +1276 -0
- nuitka/build/inline_copy/jinja2/jinja2/exceptions.py +146 -0
- nuitka/build/inline_copy/jinja2/jinja2/ext.py +627 -0
- nuitka/build/inline_copy/jinja2/jinja2/filters.py +1190 -0
- nuitka/build/inline_copy/jinja2/jinja2/idtracking.py +286 -0
- nuitka/build/inline_copy/jinja2/jinja2/lexer.py +739 -0
- nuitka/build/inline_copy/jinja2/jinja2/loaders.py +483 -0
- nuitka/build/inline_copy/jinja2/jinja2/meta.py +106 -0
- nuitka/build/inline_copy/jinja2/jinja2/nativetypes.py +220 -0
- nuitka/build/inline_copy/jinja2/jinja2/nodes.py +999 -0
- nuitka/build/inline_copy/jinja2/jinja2/optimizer.py +49 -0
- nuitka/build/inline_copy/jinja2/jinja2/parser.py +903 -0
- nuitka/build/inline_copy/jinja2/jinja2/runtime.py +808 -0
- nuitka/build/inline_copy/jinja2/jinja2/sandbox.py +488 -0
- nuitka/build/inline_copy/jinja2/jinja2/tests.py +174 -0
- nuitka/build/inline_copy/jinja2/jinja2/utils.py +642 -0
- nuitka/build/inline_copy/jinja2/jinja2/visitor.py +87 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Action.py +1475 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Builder.py +905 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/CacheDir.py +314 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Conftest.py +805 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Debug.py +251 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Defaults.py +646 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Environment.py +2561 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/EnvironmentValues.py +119 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Errors.py +222 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Executor.py +660 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Job.py +439 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Memoize.py +242 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Node/Alias.py +176 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Node/FS.py +3861 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Node/Python.py +195 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Node/__init__.py +1784 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/PathList.py +224 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/__init__.py +341 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/aix.py +81 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/cygwin.py +61 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/darwin.py +70 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/hpux.py +45 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/irix.py +41 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/mingw.py +33 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/os2.py +55 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/posix.py +124 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/sunos.py +47 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/virtualenv.py +115 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/win32.py +429 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/SConf.py +1119 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/SConsign.py +453 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Scanner/C.py +226 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Scanner/Dir.py +131 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Scanner/Prog.py +114 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Scanner/RC.py +57 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Scanner/__init__.py +436 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Script/Interactive.py +372 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Script/Main.py +1469 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Script/SConsOptions.py +1071 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Script/SConscript.py +686 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Script/__init__.py +425 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Subst.py +979 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Taskmaster.py +1062 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/386asm.py +61 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/GettextCommon.py +429 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/MSCommon/__init__.py +52 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/MSCommon/arch.py +66 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/MSCommon/common.py +371 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/MSCommon/netframework.py +83 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/MSCommon/sdk.py +411 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/MSCommon/vc.py +994 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/MSCommon/vs.py +608 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/PharLapCommon.py +116 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/__init__.py +882 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/aixc++.py +43 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/aixcc.py +74 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/aixcxx.py +77 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/aixlink.py +78 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/applelink.py +209 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/ar.py +63 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/as.py +49 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/asm.py +78 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/bcc32.py +81 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/c++.py +44 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/cc.py +105 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/clang.py +91 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/clangCommon/__init__.py +18 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/clangxx.py +99 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/cxx.py +95 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/cyglink.py +212 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/default.py +50 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/filesystem.py +98 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/g++.py +45 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/gas.py +56 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/gcc.py +110 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/gettext_tool.py +69 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/gnulink.py +70 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/gxx.py +78 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/hpc++.py +45 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/hpcc.py +53 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/hpcxx.py +88 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/hplink.py +72 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/icc.py +59 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/icl.py +52 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/ilink.py +55 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/ilink32.py +60 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/install.py +510 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/intelc.py +617 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/link.py +72 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/linkCommon/LoadableModule.py +131 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/linkCommon/SharedLibrary.py +218 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/linkCommon/__init__.py +171 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/linkloc.py +112 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/m4.py +63 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/masm.py +77 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/mingw.py +232 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/msgfmt.py +132 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/msginit.py +137 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/msgmerge.py +125 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/mslib.py +73 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/mslink.py +339 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/mssdk.py +50 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/msvc.py +325 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/msvs.py +2116 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/mwcc.py +207 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/mwld.py +108 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/nasm.py +72 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/rmic.py +139 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/rpcgen.py +70 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/sgiar.py +68 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/sgic++.py +43 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/sgicc.py +53 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/sgicxx.py +61 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/sgilink.py +59 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/sunar.py +64 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/sunc++.py +45 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/suncc.py +58 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/suncxx.py +153 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/sunlink.py +79 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/tar.py +73 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/textfile.py +198 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/tlib.py +53 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/wix.py +104 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/xgettext.py +337 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/zip.py +120 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Util.py +2134 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Utilities/ConfigureCache.py +171 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Utilities/__init__.py +0 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Utilities/sconsign.py +494 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Variables/BoolVariable.py +96 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Variables/EnumVariable.py +110 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Variables/ListVariable.py +152 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Variables/PackageVariable.py +107 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Variables/PathVariable.py +158 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Variables/__init__.py +334 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Warnings.py +238 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/__init__.py +9 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/compat/__init__.py +104 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/compat/_scons_dbm.py +42 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/compat/win32.py +101 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/cpp.py +640 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/dblite.py +295 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/exitfuncs.py +59 -0
- nuitka/build/inline_copy/markupsafe/LICENSE.rst +28 -0
- nuitka/build/inline_copy/markupsafe/markupsafe/__init__.py +327 -0
- nuitka/build/inline_copy/markupsafe/markupsafe/_compat.py +33 -0
- nuitka/build/inline_copy/markupsafe/markupsafe/_constants.py +264 -0
- nuitka/build/inline_copy/markupsafe/markupsafe/_native.py +69 -0
- nuitka/build/inline_copy/pefile/LICENSE.txt +21 -0
- nuitka/build/inline_copy/pefile/ordlookup/__init__.py +41 -0
- nuitka/build/inline_copy/pefile/ordlookup/oleaut32.py +400 -0
- nuitka/build/inline_copy/pefile/ordlookup/ws2_32.py +120 -0
- nuitka/build/inline_copy/pefile/pefile.py +8034 -0
- nuitka/build/inline_copy/pkg_resources/pkg_resources/__init__.py +3272 -0
- nuitka/build/inline_copy/pkg_resources/pkg_resources/py31compat.py +21 -0
- 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 +484 -0
- nuitka/build/inline_copy/tqdm/tqdm/__init__.py +40 -0
- nuitka/build/inline_copy/tqdm/tqdm/_main.py +9 -0
- nuitka/build/inline_copy/tqdm/tqdm/_monitor.py +97 -0
- nuitka/build/inline_copy/tqdm/tqdm/_tqdm.py +9 -0
- nuitka/build/inline_copy/tqdm/tqdm/_tqdm_notebook.py +9 -0
- nuitka/build/inline_copy/tqdm/tqdm/_tqdm_pandas.py +24 -0
- nuitka/build/inline_copy/tqdm/tqdm/_utils.py +12 -0
- nuitka/build/inline_copy/tqdm/tqdm/auto.py +44 -0
- nuitka/build/inline_copy/tqdm/tqdm/autonotebook.py +28 -0
- nuitka/build/inline_copy/tqdm/tqdm/dask.py +46 -0
- nuitka/build/inline_copy/tqdm/tqdm/notebook.py +316 -0
- nuitka/build/inline_copy/tqdm/tqdm/std.py +1524 -0
- nuitka/build/inline_copy/tqdm/tqdm/tk.py +207 -0
- nuitka/build/inline_copy/tqdm/tqdm/utils.py +351 -0
- nuitka/build/inline_copy/tqdm/tqdm/version.py +2 -0
- nuitka/build/inline_copy/yaml/LICENSE +20 -0
- nuitka/build/inline_copy/yaml/yaml/__init__.py +427 -0
- nuitka/build/inline_copy/yaml/yaml/composer.py +139 -0
- nuitka/build/inline_copy/yaml/yaml/constructor.py +748 -0
- nuitka/build/inline_copy/yaml/yaml/cyaml.py +101 -0
- nuitka/build/inline_copy/yaml/yaml/dumper.py +62 -0
- nuitka/build/inline_copy/yaml/yaml/emitter.py +1137 -0
- nuitka/build/inline_copy/yaml/yaml/error.py +75 -0
- nuitka/build/inline_copy/yaml/yaml/events.py +86 -0
- nuitka/build/inline_copy/yaml/yaml/loader.py +63 -0
- nuitka/build/inline_copy/yaml/yaml/nodes.py +49 -0
- nuitka/build/inline_copy/yaml/yaml/parser.py +589 -0
- nuitka/build/inline_copy/yaml/yaml/reader.py +185 -0
- nuitka/build/inline_copy/yaml/yaml/representer.py +389 -0
- nuitka/build/inline_copy/yaml/yaml/resolver.py +227 -0
- nuitka/build/inline_copy/yaml/yaml/scanner.py +1435 -0
- nuitka/build/inline_copy/yaml/yaml/serializer.py +111 -0
- nuitka/build/inline_copy/yaml/yaml/tokens.py +104 -0
- 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/inline_copy/zstd/LICENSE.txt +30 -0
- nuitka/build/inline_copy/zstd/common/bitstream.h +463 -0
- nuitka/build/inline_copy/zstd/common/compiler.h +288 -0
- nuitka/build/inline_copy/zstd/common/cpu.h +213 -0
- nuitka/build/inline_copy/zstd/common/debug.h +107 -0
- nuitka/build/inline_copy/zstd/common/entropy_common.c +360 -0
- nuitka/build/inline_copy/zstd/common/error_private.c +56 -0
- nuitka/build/inline_copy/zstd/common/error_private.h +80 -0
- nuitka/build/inline_copy/zstd/common/fse.h +715 -0
- nuitka/build/inline_copy/zstd/common/fse_decompress.c +393 -0
- nuitka/build/inline_copy/zstd/common/huf.h +361 -0
- nuitka/build/inline_copy/zstd/common/mem.h +426 -0
- nuitka/build/inline_copy/zstd/common/xxhash.c +826 -0
- nuitka/build/inline_copy/zstd/common/xxhash.h +285 -0
- nuitka/build/inline_copy/zstd/common/zstd_common.c +83 -0
- nuitka/build/inline_copy/zstd/common/zstd_deps.h +111 -0
- nuitka/build/inline_copy/zstd/common/zstd_errors.h +95 -0
- nuitka/build/inline_copy/zstd/common/zstd_internal.h +478 -0
- nuitka/build/inline_copy/zstd/decompress/huf_decompress.c +1350 -0
- nuitka/build/inline_copy/zstd/decompress/zstd_ddict.c +244 -0
- nuitka/build/inline_copy/zstd/decompress/zstd_ddict.h +44 -0
- nuitka/build/inline_copy/zstd/decompress/zstd_decompress.c +1930 -0
- nuitka/build/inline_copy/zstd/decompress/zstd_decompress_block.c +1540 -0
- nuitka/build/inline_copy/zstd/decompress/zstd_decompress_block.h +62 -0
- nuitka/build/inline_copy/zstd/decompress/zstd_decompress_internal.h +190 -0
- nuitka/build/inline_copy/zstd/zstd.h +2391 -0
- nuitka/build/static_src/CompiledAsyncgenType.c +2211 -0
- nuitka/build/static_src/CompiledCellType.c +300 -0
- nuitka/build/static_src/CompiledCodeHelpers.c +2160 -0
- nuitka/build/static_src/CompiledCoroutineType.c +1946 -0
- nuitka/build/static_src/CompiledFrameType.c +1337 -0
- nuitka/build/static_src/CompiledFunctionType.c +3320 -0
- nuitka/build/static_src/CompiledGeneratorType.c +1997 -0
- nuitka/build/static_src/CompiledGeneratorTypeUncompiledIntegration.c +2117 -0
- nuitka/build/static_src/CompiledMethodType.c +614 -0
- nuitka/build/static_src/GenerateHeadersMain.c +30 -0
- nuitka/build/static_src/HelpersAllocator.c +939 -0
- nuitka/build/static_src/HelpersAttributes.c +1241 -0
- nuitka/build/static_src/HelpersBuiltin.c +901 -0
- nuitka/build/static_src/HelpersBuiltinTypeMethods.c +3594 -0
- nuitka/build/static_src/HelpersBytes.c +107 -0
- nuitka/build/static_src/HelpersCalling.c +397 -0
- nuitka/build/static_src/HelpersCallingGenerated.c +14361 -0
- nuitka/build/static_src/HelpersChecksumTools.c +59 -0
- nuitka/build/static_src/HelpersClasses.c +91 -0
- 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 +12070 -0
- nuitka/build/static_src/HelpersComparisonEqUtils.c +169 -0
- nuitka/build/static_src/HelpersComparisonGe.c +11871 -0
- nuitka/build/static_src/HelpersComparisonGt.c +11855 -0
- nuitka/build/static_src/HelpersComparisonLe.c +11957 -0
- nuitka/build/static_src/HelpersComparisonLt.c +11941 -0
- nuitka/build/static_src/HelpersComparisonNe.c +11979 -0
- nuitka/build/static_src/HelpersConsole.c +124 -0
- nuitka/build/static_src/HelpersConstantsBlob.c +1487 -0
- nuitka/build/static_src/HelpersDeepcopy.c +636 -0
- nuitka/build/static_src/HelpersDictionaries.c +1739 -0
- nuitka/build/static_src/HelpersDictionariesGenerated.c +738 -0
- nuitka/build/static_src/HelpersDumpBacktraces.c +63 -0
- nuitka/build/static_src/HelpersEnvironmentVariables.c +65 -0
- nuitka/build/static_src/HelpersEnvironmentVariablesSystem.c +97 -0
- nuitka/build/static_src/HelpersExceptions.c +298 -0
- nuitka/build/static_src/HelpersFiles.c +353 -0
- nuitka/build/static_src/HelpersFilesystemPaths.c +1322 -0
- nuitka/build/static_src/HelpersFloats.c +92 -0
- nuitka/build/static_src/HelpersHeapStorage.c +68 -0
- nuitka/build/static_src/HelpersImport.c +506 -0
- nuitka/build/static_src/HelpersImportHard.c +526 -0
- nuitka/build/static_src/HelpersJitSources.c +48 -0
- nuitka/build/static_src/HelpersLists.c +899 -0
- nuitka/build/static_src/HelpersListsGenerated.c +564 -0
- nuitka/build/static_src/HelpersMappings.c +46 -0
- nuitka/build/static_src/HelpersMatching.c +192 -0
- nuitka/build/static_src/HelpersOperationBinaryAdd.c +6477 -0
- nuitka/build/static_src/HelpersOperationBinaryAddUtils.c +703 -0
- nuitka/build/static_src/HelpersOperationBinaryBitand.c +2738 -0
- nuitka/build/static_src/HelpersOperationBinaryBitor.c +2738 -0
- nuitka/build/static_src/HelpersOperationBinaryBitxor.c +2738 -0
- nuitka/build/static_src/HelpersOperationBinaryDivmod.c +2406 -0
- nuitka/build/static_src/HelpersOperationBinaryDivmodUtils.c +33 -0
- nuitka/build/static_src/HelpersOperationBinaryDualAdd.c +172 -0
- nuitka/build/static_src/HelpersOperationBinaryFloordiv.c +2422 -0
- nuitka/build/static_src/HelpersOperationBinaryInplaceAdd.c +220 -0
- nuitka/build/static_src/HelpersOperationBinaryLshift.c +2846 -0
- nuitka/build/static_src/HelpersOperationBinaryMatmult.c +453 -0
- nuitka/build/static_src/HelpersOperationBinaryMod.c +6549 -0
- nuitka/build/static_src/HelpersOperationBinaryMult.c +6438 -0
- nuitka/build/static_src/HelpersOperationBinaryMultUtils.c +125 -0
- nuitka/build/static_src/HelpersOperationBinaryOlddiv.c +2355 -0
- nuitka/build/static_src/HelpersOperationBinaryPow.c +2743 -0
- nuitka/build/static_src/HelpersOperationBinaryPowUtils.c +26 -0
- nuitka/build/static_src/HelpersOperationBinaryRshift.c +2706 -0
- nuitka/build/static_src/HelpersOperationBinarySub.c +2649 -0
- nuitka/build/static_src/HelpersOperationBinaryTruediv.c +2415 -0
- nuitka/build/static_src/HelpersOperationInplaceAdd.c +5211 -0
- nuitka/build/static_src/HelpersOperationInplaceAddUtils.c +144 -0
- nuitka/build/static_src/HelpersOperationInplaceBitand.c +1826 -0
- nuitka/build/static_src/HelpersOperationInplaceBitor.c +1826 -0
- nuitka/build/static_src/HelpersOperationInplaceBitxor.c +1826 -0
- nuitka/build/static_src/HelpersOperationInplaceFloordiv.c +2605 -0
- nuitka/build/static_src/HelpersOperationInplaceLshift.c +1594 -0
- nuitka/build/static_src/HelpersOperationInplaceMatmult.c +603 -0
- nuitka/build/static_src/HelpersOperationInplaceMod.c +4762 -0
- nuitka/build/static_src/HelpersOperationInplaceMult.c +4689 -0
- nuitka/build/static_src/HelpersOperationInplaceOlddiv.c +2553 -0
- nuitka/build/static_src/HelpersOperationInplacePow.c +2807 -0
- nuitka/build/static_src/HelpersOperationInplaceRshift.c +1534 -0
- nuitka/build/static_src/HelpersOperationInplaceSub.c +2894 -0
- nuitka/build/static_src/HelpersOperationInplaceTruediv.c +2612 -0
- nuitka/build/static_src/HelpersProfiling.c +104 -0
- nuitka/build/static_src/HelpersPythonPgo.c +113 -0
- nuitka/build/static_src/HelpersRaising.c +447 -0
- nuitka/build/static_src/HelpersSafeStrings.c +185 -0
- nuitka/build/static_src/HelpersSequences.c +134 -0
- nuitka/build/static_src/HelpersSlices.c +73 -0
- nuitka/build/static_src/HelpersStrings.c +998 -0
- nuitka/build/static_src/HelpersTuples.c +148 -0
- nuitka/build/static_src/HelpersTypes.c +329 -0
- nuitka/build/static_src/InspectPatcher.c +439 -0
- nuitka/build/static_src/MainProgram.c +2060 -0
- nuitka/build/static_src/MetaPathBasedLoader.c +2290 -0
- nuitka/build/static_src/MetaPathBasedLoaderImportlibMetadataDistribution.c +125 -0
- nuitka/build/static_src/MetaPathBasedLoaderResourceReader.c +158 -0
- nuitka/build/static_src/MetaPathBasedLoaderResourceReaderFiles.c +785 -0
- nuitka/build/static_src/OnefileBootstrap.c +1580 -0
- nuitka/build/static_src/OnefileSplashScreen.cpp +275 -0
- nuitka/code_generation/AsyncgenCodes.py +186 -0
- nuitka/code_generation/AttributeCodes.py +357 -0
- nuitka/code_generation/BinaryOperationHelperDefinitions.py +720 -0
- nuitka/code_generation/BranchCodes.py +67 -0
- nuitka/code_generation/BuiltinCodes.py +529 -0
- nuitka/code_generation/CallCodes.py +1186 -0
- nuitka/code_generation/ClassCodes.py +156 -0
- nuitka/code_generation/CodeGeneration.py +1078 -0
- nuitka/code_generation/CodeHelperSelection.py +81 -0
- nuitka/code_generation/CodeHelpers.py +455 -0
- nuitka/code_generation/CodeObjectCodes.py +165 -0
- nuitka/code_generation/ComparisonCodes.py +569 -0
- nuitka/code_generation/ComparisonHelperDefinitions.py +146 -0
- nuitka/code_generation/ConditionalCodes.py +236 -0
- nuitka/code_generation/ConstantCodes.py +243 -0
- nuitka/code_generation/Contexts.py +1248 -0
- nuitka/code_generation/CoroutineCodes.py +253 -0
- nuitka/code_generation/CtypesCodes.py +46 -0
- nuitka/code_generation/DictCodes.py +918 -0
- nuitka/code_generation/Emission.py +75 -0
- nuitka/code_generation/ErrorCodes.py +281 -0
- nuitka/code_generation/EvalCodes.py +444 -0
- nuitka/code_generation/ExceptionCodes.py +337 -0
- nuitka/code_generation/ExpressionCTypeSelectionHelpers.py +227 -0
- nuitka/code_generation/ExpressionCodes.py +61 -0
- nuitka/code_generation/FrameCodes.py +518 -0
- nuitka/code_generation/FunctionCodes.py +858 -0
- nuitka/code_generation/GeneratorCodes.py +218 -0
- nuitka/code_generation/GlobalConstants.py +249 -0
- nuitka/code_generation/GlobalsLocalsCodes.py +211 -0
- nuitka/code_generation/IdCodes.py +53 -0
- nuitka/code_generation/ImportCodes.py +468 -0
- nuitka/code_generation/Indentation.py +45 -0
- nuitka/code_generation/IndexCodes.py +50 -0
- nuitka/code_generation/InjectCCodes.py +28 -0
- nuitka/code_generation/IntegerCodes.py +110 -0
- nuitka/code_generation/IteratorCodes.py +378 -0
- nuitka/code_generation/JitCodes.py +44 -0
- nuitka/code_generation/LabelCodes.py +68 -0
- nuitka/code_generation/LineNumberCodes.py +91 -0
- nuitka/code_generation/ListCodes.py +502 -0
- nuitka/code_generation/LoaderCodes.py +193 -0
- nuitka/code_generation/LocalsDictCodes.py +359 -0
- nuitka/code_generation/LoopCodes.py +88 -0
- nuitka/code_generation/MatchCodes.py +67 -0
- nuitka/code_generation/ModuleCodes.py +247 -0
- nuitka/code_generation/Namify.py +260 -0
- nuitka/code_generation/NetworkxCodes.py +51 -0
- nuitka/code_generation/OperationCodes.py +398 -0
- nuitka/code_generation/PackageResourceCodes.py +986 -0
- nuitka/code_generation/PrintCodes.py +93 -0
- nuitka/code_generation/PythonAPICodes.py +215 -0
- nuitka/code_generation/RaisingCodes.py +481 -0
- nuitka/code_generation/Reports.py +115 -0
- nuitka/code_generation/ReturnCodes.py +143 -0
- nuitka/code_generation/SetCodes.py +196 -0
- nuitka/code_generation/SliceCodes.py +465 -0
- nuitka/code_generation/StringCodes.py +303 -0
- nuitka/code_generation/SubscriptCodes.py +263 -0
- nuitka/code_generation/TensorflowCodes.py +54 -0
- nuitka/code_generation/TryCodes.py +326 -0
- nuitka/code_generation/TupleCodes.py +115 -0
- nuitka/code_generation/TypeAliasCodes.py +120 -0
- nuitka/code_generation/VariableCodes.py +519 -0
- nuitka/code_generation/VariableDeclarations.py +279 -0
- nuitka/code_generation/YieldCodes.py +253 -0
- nuitka/code_generation/__init__.py +19 -0
- nuitka/code_generation/c_types/CTypeBases.py +177 -0
- nuitka/code_generation/c_types/CTypeBooleans.py +104 -0
- nuitka/code_generation/c_types/CTypeCFloats.py +57 -0
- nuitka/code_generation/c_types/CTypeCLongs.py +45 -0
- nuitka/code_generation/c_types/CTypeModuleDictVariables.py +109 -0
- nuitka/code_generation/c_types/CTypeNuitkaBooleans.py +150 -0
- nuitka/code_generation/c_types/CTypeNuitkaInts.py +200 -0
- nuitka/code_generation/c_types/CTypeNuitkaVoids.py +107 -0
- nuitka/code_generation/c_types/CTypePyObjectPointers.py +572 -0
- nuitka/code_generation/c_types/CTypeVoids.py +92 -0
- nuitka/code_generation/c_types/__init__.py +19 -0
- nuitka/code_generation/templates/CodeTemplatesAsyncgens.py +106 -0
- nuitka/code_generation/templates/CodeTemplatesConstants.py +296 -0
- nuitka/code_generation/templates/CodeTemplatesCoroutines.py +109 -0
- nuitka/code_generation/templates/CodeTemplatesExceptions.py +84 -0
- nuitka/code_generation/templates/CodeTemplatesFrames.py +235 -0
- nuitka/code_generation/templates/CodeTemplatesFunction.py +117 -0
- nuitka/code_generation/templates/CodeTemplatesGeneratorFunction.py +130 -0
- nuitka/code_generation/templates/CodeTemplatesIterators.py +40 -0
- nuitka/code_generation/templates/CodeTemplatesLoader.py +180 -0
- nuitka/code_generation/templates/CodeTemplatesModules.py +710 -0
- nuitka/code_generation/templates/CodeTemplatesVariables.py +388 -0
- nuitka/code_generation/templates/TemplateDebugWrapper.py +80 -0
- nuitka/code_generation/templates/__init__.py +19 -0
- nuitka/code_generation/templates_c/CodeTemplateCallsMethodPositional.c.j2 +321 -0
- nuitka/code_generation/templates_c/CodeTemplateCallsMixed.c.j2 +143 -0
- nuitka/code_generation/templates_c/CodeTemplateCallsPositional.c.j2 +677 -0
- nuitka/code_generation/templates_c/CodeTemplateCallsPositionalMethodDescr.c.j2 +165 -0
- nuitka/code_generation/templates_c/CodeTemplateMakeListHinted.c.j2 +38 -0
- nuitka/code_generation/templates_c/CodeTemplateMakeListSmall.c.j2 +41 -0
- nuitka/code_generation/templates_c/HelperBuiltinMethodOperation.c.j2 +53 -0
- nuitka/code_generation/templates_c/HelperDictionaryCopy.c.j2 +364 -0
- nuitka/code_generation/templates_c/HelperImportHard.c.j2 +37 -0
- nuitka/code_generation/templates_c/HelperLongTools.c.j2 +53 -0
- nuitka/code_generation/templates_c/HelperObjectTools.c.j2 +20 -0
- nuitka/code_generation/templates_c/HelperOperationBinary.c.j2 +148 -0
- nuitka/code_generation/templates_c/HelperOperationBinaryDual.c.j2 +115 -0
- nuitka/code_generation/templates_c/HelperOperationComparison.c.j2 +352 -0
- nuitka/code_generation/templates_c/HelperOperationComparisonBytes.c.j2 +115 -0
- nuitka/code_generation/templates_c/HelperOperationComparisonDual.c.j2 +86 -0
- nuitka/code_generation/templates_c/HelperOperationComparisonFloat.c.j2 +31 -0
- nuitka/code_generation/templates_c/HelperOperationComparisonInt.c.j2 +32 -0
- nuitka/code_generation/templates_c/HelperOperationComparisonList.c.j2 +112 -0
- nuitka/code_generation/templates_c/HelperOperationComparisonLong.c.j2 +157 -0
- nuitka/code_generation/templates_c/HelperOperationComparisonStr.c.j2 +115 -0
- nuitka/code_generation/templates_c/HelperOperationComparisonTuple.c.j2 +99 -0
- nuitka/code_generation/templates_c/HelperOperationComparisonUnicode.c.j2 +115 -0
- nuitka/code_generation/templates_c/HelperOperationInplace.c.j2 +281 -0
- nuitka/code_generation/templates_c/HelperSlotsBinary.c.j2 +420 -0
- nuitka/code_generation/templates_c/HelperSlotsBytes.c.j2 +51 -0
- nuitka/code_generation/templates_c/HelperSlotsCommon.c.j2 +71 -0
- nuitka/code_generation/templates_c/HelperSlotsFloat.c.j2 +327 -0
- nuitka/code_generation/templates_c/HelperSlotsInt.c.j2 +411 -0
- nuitka/code_generation/templates_c/HelperSlotsList.c.j2 +59 -0
- nuitka/code_generation/templates_c/HelperSlotsLong.c.j2 +229 -0
- nuitka/code_generation/templates_c/HelperSlotsSet.c.j2 +47 -0
- nuitka/code_generation/templates_c/HelperSlotsStr.c.j2 +55 -0
- nuitka/code_generation/templates_c/HelperSlotsTuple.c.j2 +58 -0
- nuitka/code_generation/templates_c/HelperSlotsUnicode.c.j2 +62 -0
- nuitka/containers/Namedtuples.py +51 -0
- nuitka/containers/OrderedDicts.py +191 -0
- nuitka/containers/OrderedSets.py +123 -0
- nuitka/containers/OrderedSetsFallback.py +139 -0
- nuitka/containers/__init__.py +19 -0
- nuitka/distutils/Build.py +76 -0
- nuitka/distutils/DistutilCommands.py +438 -0
- nuitka/distutils/__init__.py +19 -0
- nuitka/finalizations/Finalization.py +35 -0
- nuitka/finalizations/FinalizeMarkups.py +136 -0
- nuitka/finalizations/__init__.py +19 -0
- nuitka/freezer/DependsExe.py +257 -0
- nuitka/freezer/DllDependenciesCommon.py +97 -0
- nuitka/freezer/DllDependenciesMacOS.py +444 -0
- nuitka/freezer/DllDependenciesPosix.py +242 -0
- nuitka/freezer/DllDependenciesWin32.py +315 -0
- nuitka/freezer/ImportDetection.py +359 -0
- nuitka/freezer/IncludedDataFiles.py +689 -0
- nuitka/freezer/IncludedEntryPoints.py +376 -0
- nuitka/freezer/Onefile.py +296 -0
- nuitka/freezer/Standalone.py +520 -0
- nuitka/freezer/__init__.py +19 -0
- nuitka/importing/IgnoreListing.py +449 -0
- nuitka/importing/ImportCache.py +95 -0
- nuitka/importing/ImportResolving.py +186 -0
- nuitka/importing/Importing.py +1200 -0
- nuitka/importing/PreloadedPackages.py +164 -0
- nuitka/importing/Recursion.py +611 -0
- nuitka/importing/StandardLibrary.py +429 -0
- nuitka/importing/__init__.py +19 -0
- nuitka/nodes/AsyncgenNodes.py +107 -0
- nuitka/nodes/AttributeLookupNodes.py +124 -0
- nuitka/nodes/AttributeNodes.py +386 -0
- nuitka/nodes/AttributeNodesGenerated.py +10734 -0
- nuitka/nodes/BuiltinAllNodes.py +115 -0
- nuitka/nodes/BuiltinAnyNodes.py +124 -0
- nuitka/nodes/BuiltinComplexNodes.py +83 -0
- nuitka/nodes/BuiltinDecodingNodes.py +52 -0
- nuitka/nodes/BuiltinDecoratorNodes.py +85 -0
- nuitka/nodes/BuiltinDictNodes.py +140 -0
- nuitka/nodes/BuiltinFormatNodes.py +159 -0
- nuitka/nodes/BuiltinHashNodes.py +63 -0
- nuitka/nodes/BuiltinInputNodes.py +39 -0
- nuitka/nodes/BuiltinIntegerNodes.py +170 -0
- nuitka/nodes/BuiltinIteratorNodes.py +391 -0
- nuitka/nodes/BuiltinLenNodes.py +61 -0
- nuitka/nodes/BuiltinNextNodes.py +111 -0
- nuitka/nodes/BuiltinOpenNodes.py +148 -0
- nuitka/nodes/BuiltinOperationNodeBasesGenerated.py +7367 -0
- nuitka/nodes/BuiltinRangeNodes.py +690 -0
- nuitka/nodes/BuiltinRefNodes.py +314 -0
- nuitka/nodes/BuiltinSumNodes.py +104 -0
- nuitka/nodes/BuiltinTypeNodes.py +454 -0
- nuitka/nodes/BuiltinVarsNodes.py +44 -0
- nuitka/nodes/BytesNodes.py +829 -0
- nuitka/nodes/CallNodes.py +217 -0
- nuitka/nodes/Checkers.py +55 -0
- nuitka/nodes/ChildrenHavingMixins.py +21576 -0
- nuitka/nodes/ClassNodes.py +286 -0
- nuitka/nodes/CodeObjectSpecs.py +230 -0
- nuitka/nodes/ComparisonNodes.py +687 -0
- nuitka/nodes/ConditionalNodes.py +884 -0
- nuitka/nodes/ConstantRefNodes.py +1717 -0
- nuitka/nodes/ContainerMakingNodes.py +408 -0
- nuitka/nodes/ContainerOperationNodes.py +87 -0
- nuitka/nodes/CoroutineNodes.py +144 -0
- nuitka/nodes/CtypesNodes.py +51 -0
- nuitka/nodes/DictionaryNodes.py +1513 -0
- nuitka/nodes/ExceptionNodes.py +393 -0
- nuitka/nodes/ExecEvalNodes.py +229 -0
- nuitka/nodes/ExpressionBases.py +1301 -0
- nuitka/nodes/ExpressionBasesGenerated.py +2103 -0
- nuitka/nodes/ExpressionShapeMixins.py +886 -0
- nuitka/nodes/FrameNodes.py +413 -0
- nuitka/nodes/FunctionAttributeNodes.py +102 -0
- nuitka/nodes/FunctionNodes.py +1303 -0
- nuitka/nodes/FutureSpecs.py +224 -0
- nuitka/nodes/GeneratorNodes.py +201 -0
- nuitka/nodes/GlobalsLocalsNodes.py +209 -0
- nuitka/nodes/HardImportNodesGenerated.py +3599 -0
- nuitka/nodes/ImportHardNodes.py +185 -0
- nuitka/nodes/ImportNodes.py +1366 -0
- nuitka/nodes/IndicatorMixins.py +79 -0
- nuitka/nodes/InjectCNodes.py +51 -0
- nuitka/nodes/IterationHandles.py +407 -0
- nuitka/nodes/KeyValuePairNodes.py +378 -0
- nuitka/nodes/ListOperationNodes.py +525 -0
- nuitka/nodes/LocalsDictNodes.py +717 -0
- nuitka/nodes/LocalsScopes.py +505 -0
- nuitka/nodes/LoopNodes.py +445 -0
- nuitka/nodes/MatchNodes.py +60 -0
- nuitka/nodes/ModuleAttributeNodes.py +180 -0
- nuitka/nodes/ModuleNodes.py +1137 -0
- nuitka/nodes/NetworkxNodes.py +45 -0
- nuitka/nodes/NodeBases.py +890 -0
- nuitka/nodes/NodeMakingHelpers.py +481 -0
- nuitka/nodes/NodeMetaClasses.py +172 -0
- nuitka/nodes/OperatorNodes.py +944 -0
- nuitka/nodes/OperatorNodesUnary.py +403 -0
- nuitka/nodes/OsSysNodes.py +215 -0
- nuitka/nodes/OutlineNodes.py +372 -0
- nuitka/nodes/PackageMetadataNodes.py +982 -0
- nuitka/nodes/PackageResourceNodes.py +424 -0
- nuitka/nodes/PrintNodes.py +105 -0
- nuitka/nodes/ReturnNodes.py +255 -0
- nuitka/nodes/SideEffectNodes.py +139 -0
- nuitka/nodes/SliceNodes.py +386 -0
- nuitka/nodes/StatementBasesGenerated.py +3419 -0
- nuitka/nodes/StatementNodes.py +316 -0
- nuitka/nodes/StrNodes.py +919 -0
- nuitka/nodes/StringConcatenationNodes.py +103 -0
- nuitka/nodes/SubscriptNodes.py +245 -0
- nuitka/nodes/TensorflowNodes.py +38 -0
- nuitka/nodes/TryNodes.py +519 -0
- nuitka/nodes/TypeMatchNodes.py +65 -0
- nuitka/nodes/TypeNodes.py +390 -0
- nuitka/nodes/VariableAssignNodes.py +1177 -0
- nuitka/nodes/VariableDelNodes.py +320 -0
- nuitka/nodes/VariableNameNodes.py +153 -0
- nuitka/nodes/VariableRefNodes.py +895 -0
- nuitka/nodes/VariableReleaseNodes.py +153 -0
- nuitka/nodes/YieldNodes.py +121 -0
- nuitka/nodes/__init__.py +19 -0
- nuitka/nodes/shapes/BuiltinTypeShapes.py +4290 -0
- nuitka/nodes/shapes/ControlFlowDescriptions.py +199 -0
- nuitka/nodes/shapes/IteratorShapes.py +71 -0
- nuitka/nodes/shapes/ShapeMixins.py +255 -0
- nuitka/nodes/shapes/StandardShapes.py +1384 -0
- nuitka/nodes/shapes/__init__.py +19 -0
- nuitka/optimizations/BytecodeDemotion.py +105 -0
- nuitka/optimizations/FunctionInlining.py +110 -0
- nuitka/optimizations/Graphs.py +70 -0
- nuitka/optimizations/Optimization.py +363 -0
- nuitka/optimizations/OptimizeBuiltinCalls.py +1582 -0
- nuitka/optimizations/Tags.py +76 -0
- nuitka/optimizations/TraceCollections.py +1257 -0
- nuitka/optimizations/ValueTraces.py +980 -0
- nuitka/optimizations/__init__.py +19 -0
- nuitka/pgo/PGO.py +160 -0
- nuitka/pgo/__init__.py +19 -0
- nuitka/plugins/PluginBase.py +1924 -0
- nuitka/plugins/Plugins.py +2007 -0
- nuitka/plugins/YamlPluginBase.py +121 -0
- nuitka/plugins/__init__.py +19 -0
- nuitka/plugins/standard/AntiBloatPlugin.py +1024 -0
- nuitka/plugins/standard/ConsiderPyLintAnnotationsPlugin.py +95 -0
- nuitka/plugins/standard/DataFilesPlugin.py +311 -0
- nuitka/plugins/standard/DelvewheelPlugin.py +150 -0
- nuitka/plugins/standard/DillPlugin/DillPlugin.c +37 -0
- nuitka/plugins/standard/DillPlugin/cloudpickle-postLoad.py +67 -0
- nuitka/plugins/standard/DillPlugin/dill-postLoad.py +223 -0
- nuitka/plugins/standard/DillPlugin.py +137 -0
- nuitka/plugins/standard/DllFilesPlugin.py +527 -0
- nuitka/plugins/standard/EnumPlugin.py +64 -0
- nuitka/plugins/standard/EventletPlugin.py +57 -0
- nuitka/plugins/standard/GeventPlugin.py +64 -0
- nuitka/plugins/standard/GiPlugin.py +118 -0
- nuitka/plugins/standard/GlfwPlugin.py +138 -0
- nuitka/plugins/standard/ImplicitImports.py +845 -0
- nuitka/plugins/standard/KivyPlugin.py +141 -0
- nuitka/plugins/standard/MatplotlibPlugin.py +256 -0
- nuitka/plugins/standard/MultiprocessingPlugin.py +199 -0
- nuitka/plugins/standard/NumpyPlugin.py +35 -0
- nuitka/plugins/standard/OptionsNannyPlugin.py +158 -0
- nuitka/plugins/standard/PbrPlugin.py +62 -0
- nuitka/plugins/standard/PkgResourcesPlugin.py +162 -0
- nuitka/plugins/standard/PlaywrightPlugin.py +179 -0
- nuitka/plugins/standard/PmwPlugin.py +248 -0
- nuitka/plugins/standard/PySidePyQtPlugin.py +1666 -0
- nuitka/plugins/standard/PywebViewPlugin.py +81 -0
- nuitka/plugins/standard/SpacyPlugin.py +137 -0
- nuitka/plugins/standard/TensorflowPlugin.py +35 -0
- nuitka/plugins/standard/TkinterPlugin.py +416 -0
- nuitka/plugins/standard/TorchPlugin.py +35 -0
- nuitka/plugins/standard/TransformersPlugin.py +121 -0
- nuitka/plugins/standard/TrioPlugin.py +33 -0
- nuitka/plugins/standard/UpxPlugin.py +174 -0
- nuitka/plugins/standard/__init__.py +19 -0
- nuitka/plugins/standard/standard.nuitka-package.config.yml +9313 -0
- nuitka/plugins/standard/stdlib2.nuitka-package.config.yml +78 -0
- nuitka/plugins/standard/stdlib3.nuitka-package.config.yml +468 -0
- nuitka/reports/CompilationReportReader.py +83 -0
- nuitka/reports/LicenseReport.rst.j2 +41 -0
- nuitka/reports/Reports.py +961 -0
- nuitka/reports/__init__.py +19 -0
- nuitka/specs/BuiltinBytesOperationSpecs.py +180 -0
- nuitka/specs/BuiltinDictOperationSpecs.py +82 -0
- nuitka/specs/BuiltinListOperationSpecs.py +80 -0
- nuitka/specs/BuiltinParameterSpecs.py +831 -0
- nuitka/specs/BuiltinStrOperationSpecs.py +181 -0
- nuitka/specs/BuiltinTypeOperationSpecs.py +34 -0
- nuitka/specs/BuiltinUnicodeOperationSpecs.py +123 -0
- nuitka/specs/HardImportSpecs.py +236 -0
- nuitka/specs/ParameterSpecs.py +630 -0
- nuitka/specs/__init__.py +19 -0
- nuitka/tools/Basics.py +55 -0
- nuitka/tools/__init__.py +19 -0
- nuitka/tools/commercial/__init__.py +21 -0
- nuitka/tools/data_composer/DataComposer.py +593 -0
- nuitka/tools/data_composer/__init__.py +19 -0
- nuitka/tools/data_composer/__main__.py +41 -0
- nuitka/tools/environments/CreateEnvironment.py +69 -0
- nuitka/tools/environments/Virtualenv.py +158 -0
- nuitka/tools/environments/__init__.py +19 -0
- nuitka/tools/general/__init__.py +19 -0
- nuitka/tools/general/dll_report/__init__.py +19 -0
- nuitka/tools/general/dll_report/__main__.py +83 -0
- nuitka/tools/general/find_module/FindModuleCode.py +127 -0
- nuitka/tools/general/find_module/__init__.py +19 -0
- nuitka/tools/general/generate_header/GenerateHeader.py +73 -0
- nuitka/tools/general/generate_header/__init__.py +19 -0
- nuitka/tools/onefile_compressor/OnefileCompressor.py +390 -0
- nuitka/tools/onefile_compressor/__init__.py +19 -0
- nuitka/tools/onefile_compressor/__main__.py +41 -0
- nuitka/tools/podman/Podman.py +55 -0
- nuitka/tools/podman/__init__.py +19 -0
- nuitka/tools/podman/__main__.py +425 -0
- nuitka/tools/profiler/__init__.py +19 -0
- nuitka/tools/profiler/__main__.py +93 -0
- nuitka/tools/scanning/DisplayDistributions.py +39 -0
- nuitka/tools/scanning/DisplayPackageDLLs.py +151 -0
- nuitka/tools/scanning/DisplayPackageData.py +73 -0
- nuitka/tools/scanning/__init__.py +19 -0
- nuitka/tools/specialize/CTypeDescriptions.py +1928 -0
- nuitka/tools/specialize/Common.py +380 -0
- nuitka/tools/specialize/SpecializeC.py +1483 -0
- nuitka/tools/specialize/SpecializePython.py +1151 -0
- nuitka/tools/specialize/__init__.py +19 -0
- nuitka/tools/testing/Common.py +2007 -0
- nuitka/tools/testing/Constructs.py +53 -0
- nuitka/tools/testing/DocTests.py +156 -0
- nuitka/tools/testing/OutputComparison.py +313 -0
- nuitka/tools/testing/Pythons.py +34 -0
- nuitka/tools/testing/RuntimeTracing.py +260 -0
- nuitka/tools/testing/SearchModes.py +208 -0
- nuitka/tools/testing/Valgrind.py +103 -0
- nuitka/tools/testing/__init__.py +19 -0
- nuitka/tools/testing/check_reference_counts/__init__.py +19 -0
- nuitka/tools/testing/check_reference_counts/__main__.py +107 -0
- nuitka/tools/testing/compare_with_cpython/__init__.py +19 -0
- nuitka/tools/testing/compare_with_cpython/__main__.py +942 -0
- nuitka/tools/testing/find_sxs_modules/__init__.py +19 -0
- nuitka/tools/testing/find_sxs_modules/__main__.py +73 -0
- nuitka/tools/testing/measure_construct_performance/__init__.py +19 -0
- nuitka/tools/testing/measure_construct_performance/__main__.py +288 -0
- nuitka/tools/testing/run_nuitka_tests/__init__.py +19 -0
- nuitka/tools/testing/run_nuitka_tests/__main__.py +1091 -0
- nuitka/tools/watch/AutoStage.py +145 -0
- nuitka/tools/watch/Common.py +55 -0
- nuitka/tools/watch/Conda.py +125 -0
- nuitka/tools/watch/GitHub.py +113 -0
- nuitka/tools/watch/Pacman.py +73 -0
- nuitka/tools/watch/Pipenv.py +145 -0
- nuitka/tools/watch/__init__.py +19 -0
- nuitka/tools/watch/__main__.py +615 -0
- nuitka/tree/Building.py +1459 -0
- nuitka/tree/ComplexCallHelperFunctions.py +2150 -0
- nuitka/tree/Extractions.py +48 -0
- nuitka/tree/FutureSpecState.py +71 -0
- nuitka/tree/InternalModule.py +96 -0
- nuitka/tree/Operations.py +45 -0
- nuitka/tree/ReformulationAssertStatements.py +97 -0
- nuitka/tree/ReformulationAssignmentStatements.py +1260 -0
- nuitka/tree/ReformulationBooleanExpressions.py +97 -0
- nuitka/tree/ReformulationCallExpressions.py +314 -0
- nuitka/tree/ReformulationClasses.py +407 -0
- nuitka/tree/ReformulationClasses3.py +1149 -0
- nuitka/tree/ReformulationComparisonExpressions.py +174 -0
- nuitka/tree/ReformulationContractionExpressions.py +676 -0
- nuitka/tree/ReformulationDictionaryCreation.py +304 -0
- nuitka/tree/ReformulationExecStatements.py +386 -0
- nuitka/tree/ReformulationForLoopStatements.py +215 -0
- nuitka/tree/ReformulationFunctionStatements.py +931 -0
- nuitka/tree/ReformulationImportStatements.py +333 -0
- nuitka/tree/ReformulationLambdaExpressions.py +185 -0
- nuitka/tree/ReformulationMatchStatements.py +797 -0
- nuitka/tree/ReformulationMultidist.py +80 -0
- nuitka/tree/ReformulationNamespacePackages.py +239 -0
- nuitka/tree/ReformulationPrintStatements.py +127 -0
- nuitka/tree/ReformulationSequenceCreation.py +438 -0
- nuitka/tree/ReformulationSubscriptExpressions.py +123 -0
- nuitka/tree/ReformulationTryExceptStatements.py +418 -0
- nuitka/tree/ReformulationTryFinallyStatements.py +239 -0
- nuitka/tree/ReformulationWhileLoopStatements.py +160 -0
- nuitka/tree/ReformulationWithStatements.py +382 -0
- nuitka/tree/ReformulationYieldExpressions.py +133 -0
- nuitka/tree/SourceHandling.py +476 -0
- nuitka/tree/SyntaxErrors.py +143 -0
- nuitka/tree/TreeHelpers.py +720 -0
- nuitka/tree/VariableClosure.py +483 -0
- nuitka/tree/__init__.py +19 -0
- nuitka/utils/AppDirs.py +104 -0
- nuitka/utils/CStrings.py +208 -0
- nuitka/utils/CommandLineOptions.py +207 -0
- nuitka/utils/Distributions.py +728 -0
- nuitka/utils/Download.py +217 -0
- nuitka/utils/Execution.py +517 -0
- nuitka/utils/FileOperations.py +1587 -0
- nuitka/utils/Hashing.py +137 -0
- nuitka/utils/Images.py +79 -0
- nuitka/utils/Importing.py +335 -0
- nuitka/utils/InlineCopies.py +52 -0
- nuitka/utils/InstalledPythons.py +254 -0
- nuitka/utils/InstanceCounters.py +86 -0
- nuitka/utils/Jinja2.py +158 -0
- nuitka/utils/Json.py +40 -0
- nuitka/utils/MacOSApp.py +134 -0
- nuitka/utils/MemoryUsage.py +165 -0
- nuitka/utils/ModuleNames.py +317 -0
- nuitka/utils/PackageResources.py +44 -0
- nuitka/utils/ReExecute.py +152 -0
- nuitka/utils/Rest.py +60 -0
- nuitka/utils/SharedLibraries.py +1014 -0
- nuitka/utils/Shebang.py +113 -0
- nuitka/utils/Signing.py +144 -0
- nuitka/utils/SlotMetaClasses.py +57 -0
- nuitka/utils/StaticLibraries.py +260 -0
- nuitka/utils/ThreadedExecutor.py +87 -0
- nuitka/utils/Timing.py +102 -0
- nuitka/utils/Utils.py +483 -0
- nuitka/utils/WindowsFileUsage.py +337 -0
- nuitka/utils/WindowsResources.py +652 -0
- nuitka/utils/Yaml.py +247 -0
- nuitka/utils/__init__.py +19 -0
- nuitka_winsvc-2.7.7.data/scripts/nuitka-run.cmd +24 -0
- nuitka_winsvc-2.7.7.data/scripts/nuitka.cmd +30 -0
- nuitka_winsvc-2.7.7.dist-info/METADATA +115 -0
- nuitka_winsvc-2.7.7.dist-info/RECORD +995 -0
- nuitka_winsvc-2.7.7.dist-info/WHEEL +5 -0
- nuitka_winsvc-2.7.7.dist-info/entry_points.txt +7 -0
- nuitka_winsvc-2.7.7.dist-info/licenses/LICENSE.txt +202 -0
- nuitka_winsvc-2.7.7.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,1587 @@
|
|
|
1
|
+
# Copyright 2025, Kay Hayen, mailto:kay.hayen@gmail.com find license text at end of file
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
""" Utils for file and directory operations.
|
|
5
|
+
|
|
6
|
+
This provides enhanced and more error resilient forms of standard
|
|
7
|
+
stuff. It will also frequently add sorting for determinism.
|
|
8
|
+
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import print_function
|
|
12
|
+
|
|
13
|
+
import codecs
|
|
14
|
+
import errno
|
|
15
|
+
import fnmatch
|
|
16
|
+
import glob
|
|
17
|
+
import os
|
|
18
|
+
import pickle
|
|
19
|
+
import shutil
|
|
20
|
+
import stat
|
|
21
|
+
import sys
|
|
22
|
+
import tempfile
|
|
23
|
+
import time
|
|
24
|
+
import unicodedata
|
|
25
|
+
from contextlib import contextmanager
|
|
26
|
+
|
|
27
|
+
from nuitka.__past__ import ( # pylint: disable=redefined-builtin
|
|
28
|
+
FileNotFoundError,
|
|
29
|
+
PermissionError,
|
|
30
|
+
basestring,
|
|
31
|
+
unicode,
|
|
32
|
+
)
|
|
33
|
+
from nuitka.PythonVersions import python_version
|
|
34
|
+
from nuitka.Tracing import general, my_print, options_logger, queryUser
|
|
35
|
+
|
|
36
|
+
from .Importing import importFromInlineCopy
|
|
37
|
+
from .ThreadedExecutor import RLock, getThreadIdent
|
|
38
|
+
from .Utils import (
|
|
39
|
+
decoratorRetries,
|
|
40
|
+
isLinux,
|
|
41
|
+
isMacOS,
|
|
42
|
+
isWin32OrPosixWindows,
|
|
43
|
+
isWin32Windows,
|
|
44
|
+
raiseWindowsError,
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
# Locking seems to be only required for Windows mostly, but we can keep
|
|
48
|
+
# it for all.
|
|
49
|
+
file_lock = RLock()
|
|
50
|
+
|
|
51
|
+
# Use this in case of dead locks or even to see file operations being done.
|
|
52
|
+
_lock_tracing = False
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
@contextmanager
|
|
56
|
+
def withFileLock(reason="unknown"):
|
|
57
|
+
"""Acquire file handling lock.
|
|
58
|
+
|
|
59
|
+
Args:
|
|
60
|
+
reason: What is being done.
|
|
61
|
+
|
|
62
|
+
Notes: This is most relevant for Windows, but prevents concurrent access
|
|
63
|
+
from threads generally, which could lead to observing half ready things.
|
|
64
|
+
"""
|
|
65
|
+
|
|
66
|
+
if _lock_tracing:
|
|
67
|
+
my_print(getThreadIdent(), "Want file lock for %s" % reason)
|
|
68
|
+
file_lock.acquire()
|
|
69
|
+
if _lock_tracing:
|
|
70
|
+
my_print(getThreadIdent(), "Acquired file lock for %s" % reason)
|
|
71
|
+
yield
|
|
72
|
+
if _lock_tracing:
|
|
73
|
+
my_print(getThreadIdent(), "Released file lock for %s" % reason)
|
|
74
|
+
file_lock.release()
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def areSamePaths(path1, path2):
|
|
78
|
+
"""Decide if two paths the same.
|
|
79
|
+
|
|
80
|
+
Args:
|
|
81
|
+
path1: First path
|
|
82
|
+
path2: Second path
|
|
83
|
+
|
|
84
|
+
Returns:
|
|
85
|
+
Boolean value indicating if the two paths point to the
|
|
86
|
+
same path.
|
|
87
|
+
|
|
88
|
+
Notes:
|
|
89
|
+
|
|
90
|
+
Case differences ignored on platforms where that is the
|
|
91
|
+
norm, and with it normalized, and turned absolute paths, and
|
|
92
|
+
even short paths, it then becomes a mere string compare after that.
|
|
93
|
+
"""
|
|
94
|
+
|
|
95
|
+
if path1 == path2:
|
|
96
|
+
return True
|
|
97
|
+
|
|
98
|
+
path1 = os.path.abspath(getNormalizedPath(path1))
|
|
99
|
+
path2 = os.path.abspath(getNormalizedPath(path2))
|
|
100
|
+
|
|
101
|
+
if os.path.exists(path1) and os.path.exists(path2):
|
|
102
|
+
path1 = getExternalUsePath(path1)
|
|
103
|
+
path2 = getExternalUsePath(path2)
|
|
104
|
+
|
|
105
|
+
path1 = os.path.normcase(path1)
|
|
106
|
+
path2 = os.path.normcase(path2)
|
|
107
|
+
|
|
108
|
+
return path1 == path2
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def areInSamePaths(path1, path2):
|
|
112
|
+
"""Decide if two paths are in the same directory
|
|
113
|
+
|
|
114
|
+
Args:
|
|
115
|
+
path1: First path
|
|
116
|
+
path2: Second path
|
|
117
|
+
|
|
118
|
+
Returns:
|
|
119
|
+
Boolean value indicating if the two paths point into the
|
|
120
|
+
same directory."""
|
|
121
|
+
return areSamePaths(os.path.dirname(path1), os.path.dirname(path2))
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
def haveSameFileContents(path1, path2):
|
|
125
|
+
# Local import, to avoid this for normal use cases.
|
|
126
|
+
import filecmp
|
|
127
|
+
|
|
128
|
+
return filecmp.cmp(path1, path2)
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
def getFileSize(path):
|
|
132
|
+
return os.path.getsize(path)
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
def relpath(path, start="."):
|
|
136
|
+
"""Make it a relative path, if possible.
|
|
137
|
+
|
|
138
|
+
Args:
|
|
139
|
+
path: path to work on
|
|
140
|
+
start: where to start from, defaults to current directory
|
|
141
|
+
|
|
142
|
+
Returns:
|
|
143
|
+
Changed path, pointing to the same path relative to current
|
|
144
|
+
directory if possible.
|
|
145
|
+
|
|
146
|
+
Notes:
|
|
147
|
+
On Windows, a relative path is not possible across device
|
|
148
|
+
names, therefore it may have to return the absolute path
|
|
149
|
+
instead.
|
|
150
|
+
"""
|
|
151
|
+
if start == ".":
|
|
152
|
+
start = os.curdir
|
|
153
|
+
|
|
154
|
+
try:
|
|
155
|
+
return os.path.relpath(path, start)
|
|
156
|
+
except ValueError:
|
|
157
|
+
# On Windows, paths on different devices prevent it to work. Use that
|
|
158
|
+
# full path then.
|
|
159
|
+
if isWin32OrPosixWindows():
|
|
160
|
+
return os.path.abspath(path)
|
|
161
|
+
raise
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
def isRelativePath(path):
|
|
165
|
+
if os.path.isabs(path):
|
|
166
|
+
return False
|
|
167
|
+
if path.startswith((".." + os.path.sep, "../")):
|
|
168
|
+
return False
|
|
169
|
+
|
|
170
|
+
return True
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
def makePath(path):
|
|
174
|
+
"""Create a directory if it doesn't exist.
|
|
175
|
+
|
|
176
|
+
Args:
|
|
177
|
+
path: path to create as a directory
|
|
178
|
+
|
|
179
|
+
Notes:
|
|
180
|
+
This also is thread safe on Windows, i.e. no race is
|
|
181
|
+
possible.
|
|
182
|
+
|
|
183
|
+
"""
|
|
184
|
+
|
|
185
|
+
with withFileLock("creating directory %s" % path):
|
|
186
|
+
if not os.path.isdir(path):
|
|
187
|
+
try:
|
|
188
|
+
os.makedirs(path)
|
|
189
|
+
except OSError:
|
|
190
|
+
if not os.path.exists(path):
|
|
191
|
+
raise
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
def makeContainingPath(filename):
|
|
195
|
+
target_dir = os.path.dirname(filename)
|
|
196
|
+
|
|
197
|
+
if not os.path.isdir(target_dir):
|
|
198
|
+
makePath(target_dir)
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
def isPathExecutable(path):
|
|
202
|
+
"""Is the given path executable."""
|
|
203
|
+
return os.path.isfile(path) and os.access(path, os.X_OK)
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
# Make sure we don't repeat this too much.
|
|
207
|
+
_real_path_windows_cache = {}
|
|
208
|
+
_powershell_path = None
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
def _getRealPathWindows(path):
|
|
212
|
+
# Slow on Python2, because we are using an external process.
|
|
213
|
+
# Singleton, pylint: disable=global-statement
|
|
214
|
+
global _powershell_path
|
|
215
|
+
if _powershell_path is None:
|
|
216
|
+
from .Execution import getExecutablePath
|
|
217
|
+
|
|
218
|
+
_powershell_path = getExecutablePath("powershell")
|
|
219
|
+
|
|
220
|
+
# Try to find it only once, otherwise ignore its absence, symlinks are not
|
|
221
|
+
# that important.
|
|
222
|
+
if _powershell_path is None:
|
|
223
|
+
_powershell_path = False
|
|
224
|
+
|
|
225
|
+
if path not in _real_path_windows_cache:
|
|
226
|
+
if _powershell_path:
|
|
227
|
+
from .Execution import check_output
|
|
228
|
+
|
|
229
|
+
result = check_output(
|
|
230
|
+
[
|
|
231
|
+
_powershell_path,
|
|
232
|
+
"-NoProfile",
|
|
233
|
+
'Get-Item "%s" | Select-Object -ExpandProperty Target' % path,
|
|
234
|
+
],
|
|
235
|
+
shell=False,
|
|
236
|
+
)
|
|
237
|
+
|
|
238
|
+
if str is not bytes:
|
|
239
|
+
result = result.decode("utf8")
|
|
240
|
+
|
|
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
|
+
)
|
|
249
|
+
else:
|
|
250
|
+
_real_path_windows_cache[path] = path
|
|
251
|
+
|
|
252
|
+
return _real_path_windows_cache[path]
|
|
253
|
+
|
|
254
|
+
|
|
255
|
+
def getDirectoryRealPath(path):
|
|
256
|
+
"""Get os.path.realpath with Python2 and Windows symlink workaround applied.
|
|
257
|
+
|
|
258
|
+
Args:
|
|
259
|
+
path: path to get realpath of
|
|
260
|
+
|
|
261
|
+
Returns:
|
|
262
|
+
path with symlinks resolved
|
|
263
|
+
|
|
264
|
+
Notes:
|
|
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.
|
|
268
|
+
|
|
269
|
+
"""
|
|
270
|
+
path = os.path.realpath(path)
|
|
271
|
+
|
|
272
|
+
# Attempt to resolve Windows symlinks older Python
|
|
273
|
+
if os.name == "nt":
|
|
274
|
+
if os.path.islink(path) or (not os.path.isdir(path) and os.path.exists(path)):
|
|
275
|
+
path = _getRealPathWindows(path)
|
|
276
|
+
|
|
277
|
+
return path
|
|
278
|
+
|
|
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
|
+
|
|
336
|
+
def listDir(path):
|
|
337
|
+
"""Give a sorted listing of a path.
|
|
338
|
+
|
|
339
|
+
Args:
|
|
340
|
+
path: directory to create a listing from
|
|
341
|
+
|
|
342
|
+
Returns:
|
|
343
|
+
Sorted list of tuples of full filename, and basename of
|
|
344
|
+
files in that directory.
|
|
345
|
+
|
|
346
|
+
Notes:
|
|
347
|
+
Typically the full name and the basename are both needed
|
|
348
|
+
so this function simply does both, for ease of use on the
|
|
349
|
+
calling side.
|
|
350
|
+
|
|
351
|
+
This should be used, because it makes sure to resolve the
|
|
352
|
+
symlinks to directories on Windows, that a naive "os.listdir"
|
|
353
|
+
won't do by default.
|
|
354
|
+
"""
|
|
355
|
+
real_path = getDirectoryRealPath(path)
|
|
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
|
+
|
|
376
|
+
return sorted(
|
|
377
|
+
(_tryDecodeToStr(os.path.join(path, filename)), _tryDecodeToStr(filename))
|
|
378
|
+
for filename in os.listdir(real_path)
|
|
379
|
+
)
|
|
380
|
+
|
|
381
|
+
|
|
382
|
+
def getFileList(
|
|
383
|
+
path,
|
|
384
|
+
ignore_dirs=(),
|
|
385
|
+
ignore_filenames=(),
|
|
386
|
+
ignore_suffixes=(),
|
|
387
|
+
only_suffixes=(),
|
|
388
|
+
normalize=True,
|
|
389
|
+
):
|
|
390
|
+
"""Get all files below a given path.
|
|
391
|
+
|
|
392
|
+
Args:
|
|
393
|
+
path: directory to create a recursive listing from
|
|
394
|
+
ignore_dirs: Don't descend into these directory, ignore them
|
|
395
|
+
ignore_filenames: Ignore files named exactly like this
|
|
396
|
+
ignore_suffixes: Don't return files with these suffixes
|
|
397
|
+
only_suffixes: If not empty, limit returned files to these suffixes
|
|
398
|
+
|
|
399
|
+
Returns:
|
|
400
|
+
Sorted list of all filenames below that directory,
|
|
401
|
+
include the path given.
|
|
402
|
+
|
|
403
|
+
Notes:
|
|
404
|
+
This function descends into directories, but does
|
|
405
|
+
not follow symlinks.
|
|
406
|
+
"""
|
|
407
|
+
# We work with a lot of details here
|
|
408
|
+
result = []
|
|
409
|
+
|
|
410
|
+
# Normalize "ignore_dirs" for better matching.
|
|
411
|
+
ignore_dirs = [os.path.normcase(ignore_dir) for ignore_dir in ignore_dirs]
|
|
412
|
+
ignore_filenames = [
|
|
413
|
+
os.path.normcase(ignore_filename) for ignore_filename in ignore_filenames
|
|
414
|
+
]
|
|
415
|
+
|
|
416
|
+
for root, dirnames, filenames in os.walk(path):
|
|
417
|
+
dirnames.sort()
|
|
418
|
+
filenames.sort()
|
|
419
|
+
|
|
420
|
+
# Normalize dirnames for better matching.
|
|
421
|
+
dirnames_normalized = [os.path.normcase(dirname) for dirname in dirnames]
|
|
422
|
+
for ignore_dir in ignore_dirs:
|
|
423
|
+
if ignore_dir in dirnames_normalized:
|
|
424
|
+
dirnames.remove(ignore_dir)
|
|
425
|
+
|
|
426
|
+
# Compare to normalized filenames for better matching.
|
|
427
|
+
filenames = [
|
|
428
|
+
filename
|
|
429
|
+
for filename in filenames
|
|
430
|
+
if os.path.normcase(filename) not in ignore_filenames
|
|
431
|
+
]
|
|
432
|
+
|
|
433
|
+
for filename in filenames:
|
|
434
|
+
if os.path.normcase(filename).endswith(ignore_suffixes):
|
|
435
|
+
continue
|
|
436
|
+
|
|
437
|
+
if only_suffixes and not os.path.normcase(filename).endswith(only_suffixes):
|
|
438
|
+
continue
|
|
439
|
+
|
|
440
|
+
fullname = os.path.join(root, filename)
|
|
441
|
+
|
|
442
|
+
if normalize:
|
|
443
|
+
fullname = getNormalizedPath(fullname)
|
|
444
|
+
|
|
445
|
+
result.append(fullname)
|
|
446
|
+
|
|
447
|
+
return result
|
|
448
|
+
|
|
449
|
+
|
|
450
|
+
def getSubDirectories(path, ignore_dirs=()):
|
|
451
|
+
"""Get all directories below a given path.
|
|
452
|
+
|
|
453
|
+
Args:
|
|
454
|
+
path: directory to create a recursive listing from
|
|
455
|
+
ignore_dirs: directories named that like will be ignored
|
|
456
|
+
|
|
457
|
+
Returns:
|
|
458
|
+
Sorted list of all directories below that directory,
|
|
459
|
+
relative to it.
|
|
460
|
+
|
|
461
|
+
Notes:
|
|
462
|
+
This function descends into directories, but does
|
|
463
|
+
not follow symlinks.
|
|
464
|
+
"""
|
|
465
|
+
|
|
466
|
+
result = []
|
|
467
|
+
|
|
468
|
+
ignore_dirs = [os.path.normcase(ignore_dir) for ignore_dir in ignore_dirs]
|
|
469
|
+
|
|
470
|
+
for root, dirnames, _filenames in os.walk(path):
|
|
471
|
+
# Normalize dirnames for better matching.
|
|
472
|
+
dirnames_normalized = [os.path.normcase(dirname) for dirname in dirnames]
|
|
473
|
+
for ignore_dir in ignore_dirs:
|
|
474
|
+
if ignore_dir in dirnames_normalized:
|
|
475
|
+
dirnames.remove(ignore_dir)
|
|
476
|
+
|
|
477
|
+
dirnames.sort()
|
|
478
|
+
|
|
479
|
+
for dirname in dirnames:
|
|
480
|
+
result.append(os.path.join(root, dirname))
|
|
481
|
+
|
|
482
|
+
result.sort()
|
|
483
|
+
return result
|
|
484
|
+
|
|
485
|
+
|
|
486
|
+
def getDllBasename(path):
|
|
487
|
+
compare_path = os.path.normcase(path)
|
|
488
|
+
|
|
489
|
+
for suffix in (".dll", ".so", ".dylib"):
|
|
490
|
+
if compare_path.endswith(suffix):
|
|
491
|
+
return path[: -len(suffix)]
|
|
492
|
+
|
|
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.
|
|
496
|
+
if ".so." in compare_path:
|
|
497
|
+
return path[: len(compare_path.split(".so.")[0])]
|
|
498
|
+
|
|
499
|
+
return None
|
|
500
|
+
|
|
501
|
+
|
|
502
|
+
def listDllFilesFromDirectory(path, prefix=None, suffixes=None):
|
|
503
|
+
"""Give a sorted listing of DLLs filenames in a path.
|
|
504
|
+
|
|
505
|
+
Args:
|
|
506
|
+
path: directory to create a DLL listing from
|
|
507
|
+
prefix: shell pattern to match filename start against, can be None
|
|
508
|
+
suffixes: shell patch to match filename end against, defaults to all platform ones
|
|
509
|
+
|
|
510
|
+
Returns:
|
|
511
|
+
Sorted list of tuples of full filename, and basename of
|
|
512
|
+
DLLs in that directory.
|
|
513
|
+
|
|
514
|
+
Notes:
|
|
515
|
+
Typically the full name and the basename are both needed
|
|
516
|
+
so this function simply does both, for ease of use on the
|
|
517
|
+
calling side.
|
|
518
|
+
"""
|
|
519
|
+
|
|
520
|
+
# Accept None value as well.
|
|
521
|
+
prefix = prefix or ""
|
|
522
|
+
|
|
523
|
+
suffixes = suffixes or ("dll", "so.*", "so", "dylib")
|
|
524
|
+
|
|
525
|
+
pattern_list = [prefix + "*." + suffix for suffix in suffixes]
|
|
526
|
+
|
|
527
|
+
for fullpath, filename in listDir(path):
|
|
528
|
+
for pattern in pattern_list:
|
|
529
|
+
if fnmatch.fnmatch(filename, pattern):
|
|
530
|
+
yield fullpath, filename
|
|
531
|
+
break
|
|
532
|
+
|
|
533
|
+
|
|
534
|
+
def listExeFilesFromDirectory(path, prefix=None, suffixes=None):
|
|
535
|
+
"""Give a sorted listing of EXE filenames in a path.
|
|
536
|
+
|
|
537
|
+
Args:
|
|
538
|
+
path: directory to create a DLL listing from
|
|
539
|
+
prefix: shell pattern to match filename start against, can be None
|
|
540
|
+
suffixes: shell patch to match filename end against, can be None
|
|
541
|
+
|
|
542
|
+
Returns:
|
|
543
|
+
Sorted list of tuples of full filename, and basename of
|
|
544
|
+
DLLs in that directory.
|
|
545
|
+
|
|
546
|
+
Notes:
|
|
547
|
+
Typically the full name and the basename are both needed
|
|
548
|
+
so this function simply does both, for ease of use on the
|
|
549
|
+
calling side.
|
|
550
|
+
"""
|
|
551
|
+
|
|
552
|
+
# Accept None value as well.
|
|
553
|
+
prefix = prefix or ""
|
|
554
|
+
|
|
555
|
+
# On Windows, we check exe suffixes, on other platforms we shell all filenames,
|
|
556
|
+
# matching the prefix, but they have to the executable bit set.
|
|
557
|
+
if not suffixes and isWin32OrPosixWindows():
|
|
558
|
+
suffixes = ("exe", "bin")
|
|
559
|
+
|
|
560
|
+
if suffixes:
|
|
561
|
+
pattern_list = [prefix + "*." + suffix for suffix in suffixes]
|
|
562
|
+
else:
|
|
563
|
+
pattern_list = [prefix + "*"]
|
|
564
|
+
|
|
565
|
+
for fullpath, filename in listDir(path):
|
|
566
|
+
for pattern in pattern_list:
|
|
567
|
+
if fnmatch.fnmatch(filename, pattern):
|
|
568
|
+
if not isWin32OrPosixWindows() and not os.access(fullpath, os.X_OK):
|
|
569
|
+
continue
|
|
570
|
+
|
|
571
|
+
yield fullpath, filename
|
|
572
|
+
break
|
|
573
|
+
|
|
574
|
+
|
|
575
|
+
def getSubDirectoriesWithDlls(path):
|
|
576
|
+
"""Get all directories below a given path.
|
|
577
|
+
|
|
578
|
+
Args:
|
|
579
|
+
path: directory to create a recursive listing from
|
|
580
|
+
|
|
581
|
+
Returns:
|
|
582
|
+
Sorted tuple of all directories below that directory,
|
|
583
|
+
relative to it, that contain DLL files.
|
|
584
|
+
|
|
585
|
+
Notes:
|
|
586
|
+
This function descends into directories, but does
|
|
587
|
+
not follow symlinks.
|
|
588
|
+
"""
|
|
589
|
+
|
|
590
|
+
result = set()
|
|
591
|
+
|
|
592
|
+
for dll_sub_directory in _getSubDirectoriesWithDlls(path):
|
|
593
|
+
result.add(dll_sub_directory)
|
|
594
|
+
|
|
595
|
+
return tuple(sorted(result))
|
|
596
|
+
|
|
597
|
+
|
|
598
|
+
def _getSubDirectoriesWithDlls(path):
|
|
599
|
+
for sub_directory in getSubDirectories(path=path, ignore_dirs=("__pycache__",)):
|
|
600
|
+
if any(listDllFilesFromDirectory(sub_directory)) or _isMacOSFramework(
|
|
601
|
+
sub_directory
|
|
602
|
+
):
|
|
603
|
+
yield sub_directory
|
|
604
|
+
|
|
605
|
+
candidate = os.path.dirname(sub_directory)
|
|
606
|
+
|
|
607
|
+
# Should be string identical, no normalization in is done in "getSubDirectories"
|
|
608
|
+
while candidate != path:
|
|
609
|
+
yield candidate
|
|
610
|
+
candidate = os.path.dirname(candidate)
|
|
611
|
+
|
|
612
|
+
|
|
613
|
+
def _isMacOSFramework(path):
|
|
614
|
+
"""Decide if a folder is a framework folder."""
|
|
615
|
+
return isMacOS() and os.path.isdir(path) and path.endswith(".framework")
|
|
616
|
+
|
|
617
|
+
|
|
618
|
+
def isLink(path):
|
|
619
|
+
result = os.path.islink(path)
|
|
620
|
+
|
|
621
|
+
# Special handling for Junctions.
|
|
622
|
+
if not result and isWin32Windows():
|
|
623
|
+
import ctypes.wintypes
|
|
624
|
+
|
|
625
|
+
GetFileAttributesW = ctypes.windll.kernel32.GetFileAttributesW
|
|
626
|
+
GetFileAttributesW.restype = ctypes.wintypes.DWORD
|
|
627
|
+
GetFileAttributesW.argtypes = (ctypes.wintypes.LPCWSTR,)
|
|
628
|
+
|
|
629
|
+
INVALID_FILE_ATTRIBUTES = 0xFFFFFFFF
|
|
630
|
+
FILE_ATTRIBUTE_REPARSE_POINT = 0x00400
|
|
631
|
+
|
|
632
|
+
result = GetFileAttributesW(path)
|
|
633
|
+
|
|
634
|
+
if result != INVALID_FILE_ATTRIBUTES:
|
|
635
|
+
result = bool(result & FILE_ATTRIBUTE_REPARSE_POINT)
|
|
636
|
+
|
|
637
|
+
return result
|
|
638
|
+
|
|
639
|
+
|
|
640
|
+
def deleteFile(path, must_exist):
|
|
641
|
+
"""Delete a file, potentially making sure it exists.
|
|
642
|
+
|
|
643
|
+
Args:
|
|
644
|
+
path: file to delete
|
|
645
|
+
|
|
646
|
+
Notes:
|
|
647
|
+
This also is thread safe on Windows, i.e. no race is
|
|
648
|
+
possible.
|
|
649
|
+
"""
|
|
650
|
+
with withFileLock("deleting file %s" % path):
|
|
651
|
+
if isLink(path) or os.path.isfile(path):
|
|
652
|
+
try:
|
|
653
|
+
os.unlink(path)
|
|
654
|
+
except OSError:
|
|
655
|
+
if must_exist:
|
|
656
|
+
raise
|
|
657
|
+
elif must_exist:
|
|
658
|
+
raise OSError("Does not exist", path)
|
|
659
|
+
|
|
660
|
+
|
|
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
|
|
674
|
+
|
|
675
|
+
|
|
676
|
+
def getFilenameExtension(path):
|
|
677
|
+
"""Get the filename extension (dot included)
|
|
678
|
+
|
|
679
|
+
Note: The extension is case normalized, i.e. it may actually be ".TXT"
|
|
680
|
+
rather than ".txt", use "changeFilenameExtension" if you want to replace
|
|
681
|
+
it with something else.
|
|
682
|
+
|
|
683
|
+
Note: For checks on extension, use hasFilenameExtension instead.
|
|
684
|
+
"""
|
|
685
|
+
return os.path.splitext(os.path.normcase(path))[1]
|
|
686
|
+
|
|
687
|
+
|
|
688
|
+
def changeFilenameExtension(path, extension):
|
|
689
|
+
"""Change the filename extension."""
|
|
690
|
+
return os.path.splitext(path)[0] + extension
|
|
691
|
+
|
|
692
|
+
|
|
693
|
+
def switchFilenameExtension(path, old_extension, new_extension):
|
|
694
|
+
"""Switch the filename extension specified to another one."""
|
|
695
|
+
assert path.endswith(old_extension)
|
|
696
|
+
return path[: -len(old_extension)] + new_extension
|
|
697
|
+
|
|
698
|
+
|
|
699
|
+
def hasFilenameExtension(path, extensions):
|
|
700
|
+
"""Has a filename one of the given extensions.
|
|
701
|
+
|
|
702
|
+
Note: The extensions should be normalized, i.e. lower case and will match other
|
|
703
|
+
cases where the file system does that on a platform. Also they include a dot,
|
|
704
|
+
e.g. ".qml" is a good value.
|
|
705
|
+
"""
|
|
706
|
+
|
|
707
|
+
extension = getFilenameExtension(path)
|
|
708
|
+
|
|
709
|
+
if isinstance(extensions, basestring):
|
|
710
|
+
return extension == extensions
|
|
711
|
+
else:
|
|
712
|
+
return extension in extensions
|
|
713
|
+
|
|
714
|
+
|
|
715
|
+
def addFilenameExtension(path, extension):
|
|
716
|
+
if not hasFilenameExtension(path, extension):
|
|
717
|
+
path += extension
|
|
718
|
+
|
|
719
|
+
return path
|
|
720
|
+
|
|
721
|
+
|
|
722
|
+
def removeDirectory(path, logger, ignore_errors, extra_recommendation):
|
|
723
|
+
"""Remove a directory recursively.
|
|
724
|
+
|
|
725
|
+
On Windows, it happens that operations fail, and succeed when retried,
|
|
726
|
+
so added a retry and small delay, then another retry. Should make it
|
|
727
|
+
much more stable during tests.
|
|
728
|
+
|
|
729
|
+
All kinds of programs that scan files might cause this, but they do
|
|
730
|
+
it hopefully only briefly.
|
|
731
|
+
"""
|
|
732
|
+
|
|
733
|
+
with withFileLock("removing directory %s" % path):
|
|
734
|
+
if os.path.exists(path):
|
|
735
|
+
|
|
736
|
+
@decoratorRetries(
|
|
737
|
+
logger=logger,
|
|
738
|
+
purpose="delete '%s'" % path,
|
|
739
|
+
consequence="the path is not fully removed",
|
|
740
|
+
extra_recommendation=extra_recommendation,
|
|
741
|
+
)
|
|
742
|
+
def _removeDirectory():
|
|
743
|
+
def onError(func, path, exc_info):
|
|
744
|
+
# Record what happened what happened, pylint: disable=unused-argument
|
|
745
|
+
last_error.append((func, path))
|
|
746
|
+
|
|
747
|
+
previous_error = []
|
|
748
|
+
|
|
749
|
+
# Try deleting while ignoring errors first.
|
|
750
|
+
while True:
|
|
751
|
+
last_error = []
|
|
752
|
+
shutil.rmtree(path, ignore_errors=False, onerror=onError)
|
|
753
|
+
|
|
754
|
+
# onError as a side effect, modifies last_error
|
|
755
|
+
if previous_error == last_error:
|
|
756
|
+
break
|
|
757
|
+
|
|
758
|
+
previous_error = list(last_error)
|
|
759
|
+
time.sleep(0.2)
|
|
760
|
+
|
|
761
|
+
# If it still exists, try one more time, this time not ignoring errors.
|
|
762
|
+
if os.path.exists(path):
|
|
763
|
+
try:
|
|
764
|
+
shutil.rmtree(path, ignore_errors=ignore_errors)
|
|
765
|
+
except OSError:
|
|
766
|
+
if not ignore_errors:
|
|
767
|
+
raise
|
|
768
|
+
|
|
769
|
+
_removeDirectory()
|
|
770
|
+
|
|
771
|
+
|
|
772
|
+
def resetDirectory(path, logger, ignore_errors, extra_recommendation):
|
|
773
|
+
removeDirectory(
|
|
774
|
+
path=path,
|
|
775
|
+
logger=logger,
|
|
776
|
+
ignore_errors=ignore_errors,
|
|
777
|
+
extra_recommendation=extra_recommendation,
|
|
778
|
+
)
|
|
779
|
+
makePath(path)
|
|
780
|
+
|
|
781
|
+
|
|
782
|
+
@contextmanager
|
|
783
|
+
def withTemporaryFile(prefix="", suffix="", mode="w", delete=True, temp_path=None):
|
|
784
|
+
"""Provide a temporary file opened and potentially deleted."""
|
|
785
|
+
with tempfile.NamedTemporaryFile(
|
|
786
|
+
prefix=prefix, suffix=suffix, mode=mode, delete=delete, dir=temp_path
|
|
787
|
+
) as temp_file:
|
|
788
|
+
yield temp_file
|
|
789
|
+
|
|
790
|
+
|
|
791
|
+
@contextmanager
|
|
792
|
+
def withTemporaryFilename(prefix="", suffix="", temp_path=None):
|
|
793
|
+
"""Provide a temporary filename."""
|
|
794
|
+
with tempfile.NamedTemporaryFile(
|
|
795
|
+
prefix=prefix,
|
|
796
|
+
suffix=suffix,
|
|
797
|
+
mode="wb",
|
|
798
|
+
delete=False,
|
|
799
|
+
dir=temp_path,
|
|
800
|
+
) as temp_file:
|
|
801
|
+
filename = temp_file.name
|
|
802
|
+
temp_file.close()
|
|
803
|
+
deleteFile(filename, must_exist=True)
|
|
804
|
+
|
|
805
|
+
yield filename
|
|
806
|
+
|
|
807
|
+
|
|
808
|
+
def getFileContentByLine(filename, mode="r", encoding=None, errors=None):
|
|
809
|
+
# We read the whole, to keep lock times minimal. We only deal with small
|
|
810
|
+
# files like this normally.
|
|
811
|
+
return getFileContents(
|
|
812
|
+
filename, mode, encoding=encoding, errors=errors
|
|
813
|
+
).splitlines()
|
|
814
|
+
|
|
815
|
+
|
|
816
|
+
def getFileContents(filename, mode="r", encoding=None, errors=None):
|
|
817
|
+
"""Get the contents of a file.
|
|
818
|
+
|
|
819
|
+
Args:
|
|
820
|
+
filename: str with the file to be read
|
|
821
|
+
mode: "r" for str, "rb" for bytes result
|
|
822
|
+
encoding: optional encoding to used when reading the file, e.g. "utf8"
|
|
823
|
+
errors: optional error handler decoding the content, as defined in `codecs`
|
|
824
|
+
|
|
825
|
+
Returns:
|
|
826
|
+
str or bytes - depending on mode.
|
|
827
|
+
|
|
828
|
+
"""
|
|
829
|
+
|
|
830
|
+
with withFileLock("reading file %s" % filename):
|
|
831
|
+
with openTextFile(filename, mode, encoding=encoding, errors=errors) as f:
|
|
832
|
+
return f.read()
|
|
833
|
+
|
|
834
|
+
|
|
835
|
+
def getFileFirstLine(filename, mode="r", encoding=None):
|
|
836
|
+
"""Get the contents of a file.
|
|
837
|
+
|
|
838
|
+
Args:
|
|
839
|
+
filename: str with the file to be read
|
|
840
|
+
mode: "r" for str, "rb" for bytes result
|
|
841
|
+
encoding: optional encoding to used when reading the file, e.g. "utf8"
|
|
842
|
+
|
|
843
|
+
Returns:
|
|
844
|
+
str or bytes - depending on mode.
|
|
845
|
+
|
|
846
|
+
"""
|
|
847
|
+
|
|
848
|
+
with withFileLock("reading file %s" % filename):
|
|
849
|
+
with openTextFile(filename, mode, encoding=encoding) as f:
|
|
850
|
+
return f.readline()
|
|
851
|
+
|
|
852
|
+
|
|
853
|
+
def openTextFile(filename, mode, encoding=None, errors=None):
|
|
854
|
+
if python_version >= 0x370:
|
|
855
|
+
mode = mode.replace("U", "")
|
|
856
|
+
|
|
857
|
+
return codecs.open(filename, mode, encoding=encoding, errors=errors)
|
|
858
|
+
|
|
859
|
+
|
|
860
|
+
def putTextFileContents(filename, contents, encoding=None):
|
|
861
|
+
"""Write a text file from given contents.
|
|
862
|
+
|
|
863
|
+
Args:
|
|
864
|
+
filename: str with the file to be created
|
|
865
|
+
contents: str or iterable of strings with what should be written into the file
|
|
866
|
+
encoding: optional encoding to used when writing the file
|
|
867
|
+
|
|
868
|
+
Returns:
|
|
869
|
+
None
|
|
870
|
+
"""
|
|
871
|
+
|
|
872
|
+
def _writeContents(output_file):
|
|
873
|
+
if isinstance(contents, basestring):
|
|
874
|
+
print(contents, file=output_file, end="")
|
|
875
|
+
else:
|
|
876
|
+
for line in contents:
|
|
877
|
+
print(line, file=output_file)
|
|
878
|
+
|
|
879
|
+
with withFileLock("writing file %s" % filename):
|
|
880
|
+
with openTextFile(filename, "w", encoding=encoding) as output_file:
|
|
881
|
+
_writeContents(output_file)
|
|
882
|
+
|
|
883
|
+
|
|
884
|
+
def putBinaryFileContents(filename, contents):
|
|
885
|
+
"""Write a binary file from given contents.
|
|
886
|
+
|
|
887
|
+
Args:
|
|
888
|
+
filename: str with the file to be created
|
|
889
|
+
contents: bytes that should be written into the file
|
|
890
|
+
|
|
891
|
+
Returns:
|
|
892
|
+
None
|
|
893
|
+
"""
|
|
894
|
+
|
|
895
|
+
with withFileLock("writing file %s" % filename):
|
|
896
|
+
with openTextFile(filename, "wb") as output_file:
|
|
897
|
+
output_file.write(contents)
|
|
898
|
+
|
|
899
|
+
|
|
900
|
+
def changeTextFileContents(filename, contents, encoding=None, compare_only=False):
|
|
901
|
+
"""Write a text file from given contents.
|
|
902
|
+
|
|
903
|
+
Args:
|
|
904
|
+
filename: str with the file to be created or updated
|
|
905
|
+
contents: str
|
|
906
|
+
encoding: optional encoding to used when writing the file
|
|
907
|
+
|
|
908
|
+
Returns:
|
|
909
|
+
change indication for existing file if any
|
|
910
|
+
"""
|
|
911
|
+
|
|
912
|
+
if (
|
|
913
|
+
not os.path.isfile(filename)
|
|
914
|
+
or getFileContents(filename, encoding=encoding) != contents
|
|
915
|
+
):
|
|
916
|
+
if not compare_only:
|
|
917
|
+
putTextFileContents(filename, contents, encoding=encoding)
|
|
918
|
+
|
|
919
|
+
return True
|
|
920
|
+
else:
|
|
921
|
+
return False
|
|
922
|
+
|
|
923
|
+
|
|
924
|
+
@contextmanager
|
|
925
|
+
def withPreserveFileMode(filenames):
|
|
926
|
+
if isinstance(filenames, basestring):
|
|
927
|
+
filenames = [filenames]
|
|
928
|
+
|
|
929
|
+
old_modes = {}
|
|
930
|
+
for filename in filenames:
|
|
931
|
+
old_modes[filename] = os.stat(filename).st_mode
|
|
932
|
+
|
|
933
|
+
yield
|
|
934
|
+
|
|
935
|
+
for filename in filenames:
|
|
936
|
+
os.chmod(filename, old_modes[filename])
|
|
937
|
+
|
|
938
|
+
|
|
939
|
+
@contextmanager
|
|
940
|
+
def withMadeWritableFileMode(filenames):
|
|
941
|
+
if isinstance(filenames, basestring):
|
|
942
|
+
filenames = [filenames]
|
|
943
|
+
|
|
944
|
+
with withPreserveFileMode(filenames):
|
|
945
|
+
for filename in filenames:
|
|
946
|
+
os.chmod(filename, int("644", 8))
|
|
947
|
+
|
|
948
|
+
yield
|
|
949
|
+
|
|
950
|
+
|
|
951
|
+
def removeFileExecutablePermission(filename):
|
|
952
|
+
old_stat = os.stat(filename)
|
|
953
|
+
|
|
954
|
+
mode = old_stat.st_mode
|
|
955
|
+
mode &= ~(stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH)
|
|
956
|
+
|
|
957
|
+
if mode != old_stat.st_mode:
|
|
958
|
+
os.chmod(filename, mode)
|
|
959
|
+
|
|
960
|
+
|
|
961
|
+
def addFileExecutablePermission(filename):
|
|
962
|
+
old_stat = os.stat(filename)
|
|
963
|
+
|
|
964
|
+
mode = old_stat.st_mode
|
|
965
|
+
mode |= stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH
|
|
966
|
+
|
|
967
|
+
if mode != old_stat.st_mode:
|
|
968
|
+
os.chmod(filename, mode)
|
|
969
|
+
|
|
970
|
+
|
|
971
|
+
def renameFile(source_filename, dest_filename):
|
|
972
|
+
# There is no way to safely update a file on Windows, but lets
|
|
973
|
+
# try on Linux at least.
|
|
974
|
+
old_stat = os.stat(source_filename)
|
|
975
|
+
|
|
976
|
+
try:
|
|
977
|
+
os.rename(source_filename, dest_filename)
|
|
978
|
+
except OSError:
|
|
979
|
+
copyFile(source_filename, dest_filename)
|
|
980
|
+
os.unlink(source_filename)
|
|
981
|
+
|
|
982
|
+
os.chmod(dest_filename, old_stat.st_mode)
|
|
983
|
+
|
|
984
|
+
|
|
985
|
+
def copyTree(source_path, dest_path):
|
|
986
|
+
"""Copy whole directory tree, preserving attributes.
|
|
987
|
+
|
|
988
|
+
Args:
|
|
989
|
+
source_path: where to copy from
|
|
990
|
+
dest_path: where to copy to, may already exist
|
|
991
|
+
|
|
992
|
+
Notes:
|
|
993
|
+
This must be used over `shutil.copytree` which has troubles
|
|
994
|
+
with existing directories on some Python versions.
|
|
995
|
+
"""
|
|
996
|
+
if python_version >= 0x380:
|
|
997
|
+
# Python 3.8+ has dirs_exist_ok
|
|
998
|
+
return shutil.copytree(source_path, dest_path, dirs_exist_ok=True)
|
|
999
|
+
else:
|
|
1000
|
+
|
|
1001
|
+
from distutils.dir_util import ( # Older Python only, pylint: disable=I0021,import-error
|
|
1002
|
+
copy_tree,
|
|
1003
|
+
)
|
|
1004
|
+
|
|
1005
|
+
return copy_tree(source_path, dest_path)
|
|
1006
|
+
|
|
1007
|
+
|
|
1008
|
+
def resolveSymlink(path):
|
|
1009
|
+
"""Resolve a symlink, to a relative path."""
|
|
1010
|
+
link_source_abs = os.path.abspath(path)
|
|
1011
|
+
link_target_abs = os.path.abspath(
|
|
1012
|
+
os.path.join(os.path.dirname(path), os.readlink(path))
|
|
1013
|
+
)
|
|
1014
|
+
link_target_rel = relpath(link_target_abs, os.path.dirname(link_source_abs))
|
|
1015
|
+
|
|
1016
|
+
return link_target_rel
|
|
1017
|
+
|
|
1018
|
+
|
|
1019
|
+
def copyFileWithPermissions(source_path, dest_path, dist_dir):
|
|
1020
|
+
"""Improved version of shutil.copy2 for putting things to dist folder
|
|
1021
|
+
|
|
1022
|
+
File systems might not allow to transfer extended attributes, which we then ignore
|
|
1023
|
+
and only copy permissions.
|
|
1024
|
+
"""
|
|
1025
|
+
|
|
1026
|
+
if os.path.islink(source_path) and not isWin32Windows():
|
|
1027
|
+
link_target_rel = resolveSymlink(source_path)
|
|
1028
|
+
|
|
1029
|
+
if isFilenameBelowPath(
|
|
1030
|
+
path=dist_dir,
|
|
1031
|
+
filename=os.path.join(os.path.dirname(dest_path), link_target_rel),
|
|
1032
|
+
):
|
|
1033
|
+
os.symlink(link_target_rel, dest_path)
|
|
1034
|
+
return
|
|
1035
|
+
|
|
1036
|
+
try:
|
|
1037
|
+
shutil.copy2(
|
|
1038
|
+
source_path,
|
|
1039
|
+
dest_path,
|
|
1040
|
+
)
|
|
1041
|
+
except PermissionError as e:
|
|
1042
|
+
if e.errno != errno.EACCES:
|
|
1043
|
+
raise
|
|
1044
|
+
|
|
1045
|
+
source_mode = os.stat(source_path).st_mode
|
|
1046
|
+
shutil.copy(source_path, dest_path)
|
|
1047
|
+
os.chmod(dest_path, source_mode)
|
|
1048
|
+
|
|
1049
|
+
|
|
1050
|
+
def copyFile(source_path, dest_path):
|
|
1051
|
+
"""Improved version of shutil.copy
|
|
1052
|
+
|
|
1053
|
+
This handles errors with a chance to correct them, e.g. on Windows, files might be
|
|
1054
|
+
locked by running program or virus checkers.
|
|
1055
|
+
"""
|
|
1056
|
+
|
|
1057
|
+
while 1:
|
|
1058
|
+
try:
|
|
1059
|
+
shutil.copyfile(source_path, dest_path)
|
|
1060
|
+
except PermissionError as e:
|
|
1061
|
+
if e.errno != errno.EACCES:
|
|
1062
|
+
raise
|
|
1063
|
+
|
|
1064
|
+
general.warning("Problem copying file %s:" % e)
|
|
1065
|
+
|
|
1066
|
+
if (
|
|
1067
|
+
queryUser(
|
|
1068
|
+
"Retry?",
|
|
1069
|
+
choices=("yes", "no"),
|
|
1070
|
+
default="yes",
|
|
1071
|
+
default_non_interactive="no",
|
|
1072
|
+
)
|
|
1073
|
+
== "yes"
|
|
1074
|
+
):
|
|
1075
|
+
continue
|
|
1076
|
+
|
|
1077
|
+
raise
|
|
1078
|
+
|
|
1079
|
+
break
|
|
1080
|
+
|
|
1081
|
+
|
|
1082
|
+
def getWindowsDrive(path):
|
|
1083
|
+
"""Windows drive for a given path."""
|
|
1084
|
+
|
|
1085
|
+
drive, _ = os.path.splitdrive(os.path.abspath(path))
|
|
1086
|
+
return os.path.normcase(drive)
|
|
1087
|
+
|
|
1088
|
+
|
|
1089
|
+
def isFilenameBelowPath(path, filename, consider_short=True):
|
|
1090
|
+
"""Is a filename inside of a given directory path
|
|
1091
|
+
|
|
1092
|
+
Args:
|
|
1093
|
+
path: location to be below
|
|
1094
|
+
filename: candidate being checked
|
|
1095
|
+
"""
|
|
1096
|
+
if type(path) in (tuple, list):
|
|
1097
|
+
for p in path:
|
|
1098
|
+
if isFilenameBelowPath(
|
|
1099
|
+
path=p, filename=filename, consider_short=consider_short
|
|
1100
|
+
):
|
|
1101
|
+
return True
|
|
1102
|
+
|
|
1103
|
+
return False
|
|
1104
|
+
|
|
1105
|
+
path = os.path.abspath(path)
|
|
1106
|
+
filename = os.path.abspath(filename)
|
|
1107
|
+
|
|
1108
|
+
if isWin32Windows():
|
|
1109
|
+
if getWindowsDrive(path) != getWindowsDrive(filename):
|
|
1110
|
+
return False
|
|
1111
|
+
|
|
1112
|
+
result = os.path.relpath(filename, path).split(os.path.sep, 1)[0] != ".."
|
|
1113
|
+
|
|
1114
|
+
if not result and consider_short:
|
|
1115
|
+
if os.path.exists(filename) and os.path.exists(path):
|
|
1116
|
+
filename = getExternalUsePath(filename)
|
|
1117
|
+
path = getExternalUsePath(path)
|
|
1118
|
+
|
|
1119
|
+
if isWin32Windows():
|
|
1120
|
+
if getWindowsDrive(path) != getWindowsDrive(filename):
|
|
1121
|
+
return False
|
|
1122
|
+
|
|
1123
|
+
result = os.path.relpath(filename, path).split(os.path.sep, 1)[0] != ".."
|
|
1124
|
+
|
|
1125
|
+
return result
|
|
1126
|
+
|
|
1127
|
+
|
|
1128
|
+
def isFilenameSameAsOrBelowPath(path, filename):
|
|
1129
|
+
"""Is a filename inside of a given directory path or the same path as that directory."""
|
|
1130
|
+
if type(path) in (tuple, list):
|
|
1131
|
+
return any(isFilenameSameAsOrBelowPath(path=p, filename=filename) for p in path)
|
|
1132
|
+
|
|
1133
|
+
return isFilenameBelowPath(path, filename) or areSamePaths(path, filename)
|
|
1134
|
+
|
|
1135
|
+
|
|
1136
|
+
def getWindowsShortPathName(filename):
|
|
1137
|
+
"""Gets the short path name of a given long path.
|
|
1138
|
+
|
|
1139
|
+
Args:
|
|
1140
|
+
filename - long Windows filename
|
|
1141
|
+
Returns:
|
|
1142
|
+
Path that is a short filename pointing at the same file.
|
|
1143
|
+
Notes:
|
|
1144
|
+
Originally from http://stackoverflow.com/a/23598461/200291
|
|
1145
|
+
"""
|
|
1146
|
+
import ctypes.wintypes
|
|
1147
|
+
|
|
1148
|
+
GetShortPathNameW = ctypes.windll.kernel32.GetShortPathNameW
|
|
1149
|
+
GetShortPathNameW.argtypes = (
|
|
1150
|
+
ctypes.wintypes.LPCWSTR,
|
|
1151
|
+
ctypes.wintypes.LPWSTR,
|
|
1152
|
+
ctypes.wintypes.DWORD,
|
|
1153
|
+
)
|
|
1154
|
+
GetShortPathNameW.restype = ctypes.wintypes.DWORD
|
|
1155
|
+
|
|
1156
|
+
output_buf_size = 0
|
|
1157
|
+
while True:
|
|
1158
|
+
output_buf = ctypes.create_unicode_buffer(output_buf_size)
|
|
1159
|
+
needed = GetShortPathNameW(
|
|
1160
|
+
os.path.abspath(filename), output_buf, output_buf_size
|
|
1161
|
+
)
|
|
1162
|
+
|
|
1163
|
+
if needed == 0:
|
|
1164
|
+
# Windows only code, pylint: disable=I0021,undefined-variable
|
|
1165
|
+
|
|
1166
|
+
# Permission denied.
|
|
1167
|
+
if ctypes.GetLastError() == 5:
|
|
1168
|
+
return filename
|
|
1169
|
+
|
|
1170
|
+
raiseWindowsError("getWindowsShortPathName for %s" % filename)
|
|
1171
|
+
if output_buf_size >= needed:
|
|
1172
|
+
# Short paths should be ASCII. Don't return unicode without a need,
|
|
1173
|
+
# as e.g. Scons hates that in environment variables.
|
|
1174
|
+
if str is bytes:
|
|
1175
|
+
return output_buf.value.encode("utf8")
|
|
1176
|
+
else:
|
|
1177
|
+
return output_buf.value
|
|
1178
|
+
else:
|
|
1179
|
+
output_buf_size = needed
|
|
1180
|
+
|
|
1181
|
+
|
|
1182
|
+
def getWindowsLongPathName(filename):
|
|
1183
|
+
"""Gets the long path name of a given long path.
|
|
1184
|
+
|
|
1185
|
+
Args:
|
|
1186
|
+
filename - short Windows filename
|
|
1187
|
+
Returns:
|
|
1188
|
+
Path that is a long filename pointing at the same file.
|
|
1189
|
+
"""
|
|
1190
|
+
import ctypes.wintypes
|
|
1191
|
+
|
|
1192
|
+
GetLongPathNameW = ctypes.windll.kernel32.GetLongPathNameW
|
|
1193
|
+
GetLongPathNameW.argtypes = (
|
|
1194
|
+
ctypes.wintypes.LPCWSTR,
|
|
1195
|
+
ctypes.wintypes.LPWSTR,
|
|
1196
|
+
ctypes.wintypes.DWORD,
|
|
1197
|
+
)
|
|
1198
|
+
GetLongPathNameW.restype = ctypes.wintypes.DWORD
|
|
1199
|
+
|
|
1200
|
+
output_buf_size = 0
|
|
1201
|
+
while True:
|
|
1202
|
+
output_buf = ctypes.create_unicode_buffer(output_buf_size)
|
|
1203
|
+
needed = GetLongPathNameW(
|
|
1204
|
+
getNormalizedPath(os.path.abspath(filename)), output_buf, output_buf_size
|
|
1205
|
+
)
|
|
1206
|
+
|
|
1207
|
+
if needed == 0:
|
|
1208
|
+
# Windows only code, pylint: disable=I0021,undefined-variable
|
|
1209
|
+
|
|
1210
|
+
# Permission denied.
|
|
1211
|
+
if ctypes.GetLastError() == 5:
|
|
1212
|
+
return filename
|
|
1213
|
+
|
|
1214
|
+
raiseWindowsError("getWindowsLongPathName for %s" % filename)
|
|
1215
|
+
if output_buf_size >= needed:
|
|
1216
|
+
return output_buf.value
|
|
1217
|
+
else:
|
|
1218
|
+
output_buf_size = needed
|
|
1219
|
+
|
|
1220
|
+
|
|
1221
|
+
_external_use_path_cache = {}
|
|
1222
|
+
|
|
1223
|
+
|
|
1224
|
+
def getExternalUsePath(filename, only_dirname=False):
|
|
1225
|
+
"""Gets the externally usable absolute path for a given relative path.
|
|
1226
|
+
|
|
1227
|
+
Args:
|
|
1228
|
+
filename - filename, potentially relative
|
|
1229
|
+
Returns:
|
|
1230
|
+
Path that is a absolute and (on Windows) short filename pointing at the same file.
|
|
1231
|
+
Notes:
|
|
1232
|
+
This is only "os.path.abspath" except on Windows, where is converts
|
|
1233
|
+
to a short path too.
|
|
1234
|
+
"""
|
|
1235
|
+
|
|
1236
|
+
filename = os.path.abspath(filename)
|
|
1237
|
+
|
|
1238
|
+
if os.name == "nt":
|
|
1239
|
+
key = filename, only_dirname
|
|
1240
|
+
|
|
1241
|
+
if filename not in _external_use_path_cache:
|
|
1242
|
+
filename = getFilenameRealPath(filename)
|
|
1243
|
+
|
|
1244
|
+
if only_dirname:
|
|
1245
|
+
dirname = getWindowsShortPathName(os.path.dirname(filename))
|
|
1246
|
+
assert os.path.exists(dirname)
|
|
1247
|
+
filename = os.path.join(dirname, os.path.basename(filename))
|
|
1248
|
+
else:
|
|
1249
|
+
filename = getWindowsShortPathName(filename)
|
|
1250
|
+
|
|
1251
|
+
_external_use_path_cache[key] = filename
|
|
1252
|
+
|
|
1253
|
+
# Looking up again should give same result immediately.
|
|
1254
|
+
key = filename, only_dirname
|
|
1255
|
+
_external_use_path_cache[key] = filename
|
|
1256
|
+
|
|
1257
|
+
return _external_use_path_cache[key]
|
|
1258
|
+
else:
|
|
1259
|
+
return filename
|
|
1260
|
+
|
|
1261
|
+
|
|
1262
|
+
_report_path_cache = {}
|
|
1263
|
+
|
|
1264
|
+
|
|
1265
|
+
def getReportSourceReference(source_ref):
|
|
1266
|
+
"""Convert a source ref into a path suitable for user output."""
|
|
1267
|
+
return "%s:%s" % (
|
|
1268
|
+
getReportPath(source_ref.getFilename()),
|
|
1269
|
+
source_ref.getLineNumber(),
|
|
1270
|
+
)
|
|
1271
|
+
|
|
1272
|
+
|
|
1273
|
+
def getReportPath(filename, prefixes=()):
|
|
1274
|
+
"""Convert filename into a path suitable for reporting, avoiding home directory paths."""
|
|
1275
|
+
key = filename, tuple(prefixes)
|
|
1276
|
+
|
|
1277
|
+
if key not in _report_path_cache:
|
|
1278
|
+
_report_path_cache[key] = _getReportPath(filename, prefixes)
|
|
1279
|
+
|
|
1280
|
+
return _report_path_cache[key]
|
|
1281
|
+
|
|
1282
|
+
|
|
1283
|
+
def isNonLocalPath(path):
|
|
1284
|
+
"""Tell if a path is potentially outside of current directory.
|
|
1285
|
+
|
|
1286
|
+
This is not reliable and mainly for reporting purposes to identify paths
|
|
1287
|
+
work looking to abbreviate.
|
|
1288
|
+
"""
|
|
1289
|
+
return path.startswith("..") or os.path.isabs(path)
|
|
1290
|
+
|
|
1291
|
+
|
|
1292
|
+
def _getReportPath(filename, prefixes):
|
|
1293
|
+
if os.path.isabs(os.path.expanduser(filename)):
|
|
1294
|
+
prefixes = list(prefixes)
|
|
1295
|
+
prefixes.append(
|
|
1296
|
+
("~", os.path.expanduser("~")),
|
|
1297
|
+
)
|
|
1298
|
+
|
|
1299
|
+
abs_filename = os.path.abspath(os.path.expanduser(filename))
|
|
1300
|
+
|
|
1301
|
+
for prefix_name, prefix_path in prefixes:
|
|
1302
|
+
if isFilenameBelowPath(
|
|
1303
|
+
path=prefix_path, filename=abs_filename, consider_short=False
|
|
1304
|
+
):
|
|
1305
|
+
return os.path.normpath(
|
|
1306
|
+
os.path.join(
|
|
1307
|
+
prefix_name, relpath(path=abs_filename, start=prefix_path)
|
|
1308
|
+
)
|
|
1309
|
+
)
|
|
1310
|
+
|
|
1311
|
+
if isFilenameBelowPath(
|
|
1312
|
+
path=prefix_path, filename=abs_filename, consider_short=True
|
|
1313
|
+
):
|
|
1314
|
+
return os.path.normpath(
|
|
1315
|
+
os.path.join(
|
|
1316
|
+
prefix_name,
|
|
1317
|
+
relpath(
|
|
1318
|
+
path=abs_filename, start=getExternalUsePath(prefix_path)
|
|
1319
|
+
),
|
|
1320
|
+
)
|
|
1321
|
+
)
|
|
1322
|
+
|
|
1323
|
+
if isWin32Windows():
|
|
1324
|
+
try:
|
|
1325
|
+
old_filename = filename
|
|
1326
|
+
|
|
1327
|
+
filename = getWindowsLongPathName(filename)
|
|
1328
|
+
except FileNotFoundError:
|
|
1329
|
+
dirname = os.path.dirname(filename)
|
|
1330
|
+
|
|
1331
|
+
if dirname:
|
|
1332
|
+
try:
|
|
1333
|
+
dirname = getWindowsLongPathName(dirname)
|
|
1334
|
+
except FileNotFoundError:
|
|
1335
|
+
pass
|
|
1336
|
+
else:
|
|
1337
|
+
filename = os.path.join(dirname, os.path.basename(filename))
|
|
1338
|
+
else:
|
|
1339
|
+
if old_filename != filename:
|
|
1340
|
+
return _getReportPath(filename, prefixes)
|
|
1341
|
+
|
|
1342
|
+
return filename
|
|
1343
|
+
|
|
1344
|
+
|
|
1345
|
+
def getLinkTarget(filename):
|
|
1346
|
+
"""Return the path a link is pointing too, if any.
|
|
1347
|
+
|
|
1348
|
+
Args:
|
|
1349
|
+
filename - check this path, need not be a filename
|
|
1350
|
+
|
|
1351
|
+
Returns:
|
|
1352
|
+
(bool, link_target) - first value indicates if it is a link, second the link target
|
|
1353
|
+
|
|
1354
|
+
Notes:
|
|
1355
|
+
This follows symlinks to the very end.
|
|
1356
|
+
"""
|
|
1357
|
+
is_link = False
|
|
1358
|
+
while os.path.exists(filename) and os.path.islink(filename):
|
|
1359
|
+
link_target = os.readlink(filename)
|
|
1360
|
+
|
|
1361
|
+
filename = os.path.join(os.path.dirname(filename), link_target)
|
|
1362
|
+
is_link = True
|
|
1363
|
+
|
|
1364
|
+
return is_link, filename
|
|
1365
|
+
|
|
1366
|
+
|
|
1367
|
+
# Late import and optional to be there.
|
|
1368
|
+
atomicwrites = None
|
|
1369
|
+
|
|
1370
|
+
|
|
1371
|
+
def replaceFileAtomic(source_path, dest_path):
|
|
1372
|
+
"""
|
|
1373
|
+
Move ``src`` to ``dst``. If ``dst`` exists, it will be silently
|
|
1374
|
+
overwritten.
|
|
1375
|
+
|
|
1376
|
+
Both paths must reside on the same filesystem for the operation to be
|
|
1377
|
+
atomic.
|
|
1378
|
+
|
|
1379
|
+
spellchecker: ignore atomicwrites
|
|
1380
|
+
"""
|
|
1381
|
+
|
|
1382
|
+
if python_version >= 0x300:
|
|
1383
|
+
os.replace(source_path, dest_path)
|
|
1384
|
+
else:
|
|
1385
|
+
global atomicwrites # singleton, pylint: disable=global-statement
|
|
1386
|
+
|
|
1387
|
+
if atomicwrites is None:
|
|
1388
|
+
atomicwrites = importFromInlineCopy("atomicwrites", must_exist=True)
|
|
1389
|
+
|
|
1390
|
+
atomicwrites.replace_atomic(source_path, dest_path)
|
|
1391
|
+
|
|
1392
|
+
|
|
1393
|
+
def resolveShellPatternToFilenames(pattern):
|
|
1394
|
+
"""Resolve shell pattern to filenames.
|
|
1395
|
+
|
|
1396
|
+
Args:
|
|
1397
|
+
pattern - str
|
|
1398
|
+
|
|
1399
|
+
Returns:
|
|
1400
|
+
list - filenames that matched.
|
|
1401
|
+
"""
|
|
1402
|
+
|
|
1403
|
+
if "**" in pattern:
|
|
1404
|
+
if python_version >= 0x350:
|
|
1405
|
+
result = glob.glob(pattern, recursive=True)
|
|
1406
|
+
else:
|
|
1407
|
+
glob2 = importFromInlineCopy("glob2", must_exist=False)
|
|
1408
|
+
|
|
1409
|
+
if glob2 is None:
|
|
1410
|
+
options_logger.sysexit(
|
|
1411
|
+
"Using pattern with '**' is not supported before Python 3.5 unless glob2 is installed."
|
|
1412
|
+
)
|
|
1413
|
+
|
|
1414
|
+
result = glob2.glob(pattern)
|
|
1415
|
+
else:
|
|
1416
|
+
result = glob.glob(pattern)
|
|
1417
|
+
|
|
1418
|
+
result = [os.path.normpath(filename) for filename in result]
|
|
1419
|
+
result.sort()
|
|
1420
|
+
return result
|
|
1421
|
+
|
|
1422
|
+
|
|
1423
|
+
@contextmanager
|
|
1424
|
+
def withDirectoryChange(path, allow_none=False):
|
|
1425
|
+
"""Change current directory temporarily in a context."""
|
|
1426
|
+
|
|
1427
|
+
# spell-checker: ignore chdir
|
|
1428
|
+
|
|
1429
|
+
if path is not None or not allow_none:
|
|
1430
|
+
old_cwd = os.getcwd()
|
|
1431
|
+
os.chdir(path)
|
|
1432
|
+
|
|
1433
|
+
yield
|
|
1434
|
+
|
|
1435
|
+
if path is not None or not allow_none:
|
|
1436
|
+
os.chdir(old_cwd)
|
|
1437
|
+
|
|
1438
|
+
|
|
1439
|
+
def containsPathElements(path, elements):
|
|
1440
|
+
"""Test if a path contains any unwanted elements."""
|
|
1441
|
+
|
|
1442
|
+
elements = tuple(os.path.normcase(element) for element in elements)
|
|
1443
|
+
path = os.path.normpath(path)
|
|
1444
|
+
|
|
1445
|
+
parts = os.path.normpath(path).split(os.path.sep)
|
|
1446
|
+
|
|
1447
|
+
return any(element in parts for element in elements)
|
|
1448
|
+
|
|
1449
|
+
|
|
1450
|
+
def syncFileOutput(file_handle):
|
|
1451
|
+
"""Synchronize a file contents to disk
|
|
1452
|
+
|
|
1453
|
+
On this, this not only flushes, but calls "syncfs" to make sure things work
|
|
1454
|
+
properly.
|
|
1455
|
+
|
|
1456
|
+
# spell-checker: ignore syncfs
|
|
1457
|
+
"""
|
|
1458
|
+
|
|
1459
|
+
file_handle.flush()
|
|
1460
|
+
|
|
1461
|
+
if isLinux():
|
|
1462
|
+
import ctypes
|
|
1463
|
+
|
|
1464
|
+
try:
|
|
1465
|
+
libc = ctypes.CDLL("libc.so.6")
|
|
1466
|
+
except OSError:
|
|
1467
|
+
# We cannot do it easily for this Linux apparently.
|
|
1468
|
+
return
|
|
1469
|
+
|
|
1470
|
+
try:
|
|
1471
|
+
libc.syncfs(file_handle.fileno())
|
|
1472
|
+
except AttributeError:
|
|
1473
|
+
# Too old to have "syncfs" available.
|
|
1474
|
+
return
|
|
1475
|
+
|
|
1476
|
+
|
|
1477
|
+
def isFilesystemEncodable(filename):
|
|
1478
|
+
"""Decide if a filename is safe for use as a file system path with tools."""
|
|
1479
|
+
if os.name == "nt" and type(filename) is unicode:
|
|
1480
|
+
value = (
|
|
1481
|
+
unicodedata.normalize("NFKD", filename)
|
|
1482
|
+
.encode("ascii", "ignore")
|
|
1483
|
+
.decode("ascii")
|
|
1484
|
+
)
|
|
1485
|
+
|
|
1486
|
+
return value == filename
|
|
1487
|
+
else:
|
|
1488
|
+
return True
|
|
1489
|
+
|
|
1490
|
+
|
|
1491
|
+
def makeFilesystemEncodable(filename):
|
|
1492
|
+
if not os.path.isabs(filename):
|
|
1493
|
+
filename = os.path.abspath(filename)
|
|
1494
|
+
|
|
1495
|
+
if not isFilesystemEncodable(filename):
|
|
1496
|
+
filename = getExternalUsePath(filename)
|
|
1497
|
+
|
|
1498
|
+
return filename
|
|
1499
|
+
|
|
1500
|
+
|
|
1501
|
+
def openPickleFile(filename, mode, protocol=-1):
|
|
1502
|
+
file_handle = openTextFile(filename, mode)
|
|
1503
|
+
|
|
1504
|
+
if python_version < 0x300:
|
|
1505
|
+
return file_handle, pickle.Pickler(file_handle, protocol)
|
|
1506
|
+
else:
|
|
1507
|
+
return file_handle, pickle._Pickler( # pylint: disable=protected-access
|
|
1508
|
+
file_handle, protocol
|
|
1509
|
+
)
|
|
1510
|
+
|
|
1511
|
+
|
|
1512
|
+
def isLegalPath(path):
|
|
1513
|
+
illegal_suffixes = "/\\"
|
|
1514
|
+
illegal_chars = "\0"
|
|
1515
|
+
|
|
1516
|
+
if isWin32Windows():
|
|
1517
|
+
illegal_chars += r'*"/<>:|?'
|
|
1518
|
+
|
|
1519
|
+
illegal_chars += "".join(chr(x) for x in range(1, 32))
|
|
1520
|
+
illegal_suffixes += " ."
|
|
1521
|
+
|
|
1522
|
+
if isMacOS():
|
|
1523
|
+
illegal_chars += ":"
|
|
1524
|
+
|
|
1525
|
+
for c in path:
|
|
1526
|
+
if c in illegal_chars:
|
|
1527
|
+
return False, "contains illegal character %r" % c
|
|
1528
|
+
|
|
1529
|
+
for illegal_suffix in illegal_suffixes:
|
|
1530
|
+
if path.endswith(illegal_suffix):
|
|
1531
|
+
return False, "contains illegal suffix %r" % illegal_suffix
|
|
1532
|
+
|
|
1533
|
+
for part in path.split(os.path.sep):
|
|
1534
|
+
if part == ".":
|
|
1535
|
+
continue
|
|
1536
|
+
|
|
1537
|
+
if part.endswith(illegal_suffix):
|
|
1538
|
+
return False, "contains illegal suffix %r in path part %r" % (
|
|
1539
|
+
part,
|
|
1540
|
+
illegal_suffix,
|
|
1541
|
+
)
|
|
1542
|
+
|
|
1543
|
+
return True, None
|
|
1544
|
+
|
|
1545
|
+
|
|
1546
|
+
def getParentDirectories(path):
|
|
1547
|
+
"""Get all parent directories of a path in descending order."""
|
|
1548
|
+
|
|
1549
|
+
while 1:
|
|
1550
|
+
old_path = path
|
|
1551
|
+
path = os.path.dirname(path)
|
|
1552
|
+
|
|
1553
|
+
if not path or path == old_path:
|
|
1554
|
+
return
|
|
1555
|
+
|
|
1556
|
+
yield path
|
|
1557
|
+
|
|
1558
|
+
|
|
1559
|
+
def getNormalizedPath(path):
|
|
1560
|
+
"""Return normalized path that is also a native path, i.e. only legal characters.
|
|
1561
|
+
|
|
1562
|
+
Needed, because MSYS2 likes to keep "/" in normalized paths.
|
|
1563
|
+
"""
|
|
1564
|
+
path = os.path.normpath(path)
|
|
1565
|
+
if isWin32Windows():
|
|
1566
|
+
path = path.replace("/", "\\")
|
|
1567
|
+
|
|
1568
|
+
if isMacOS():
|
|
1569
|
+
path = os.path.expanduser(path)
|
|
1570
|
+
|
|
1571
|
+
return path
|
|
1572
|
+
|
|
1573
|
+
|
|
1574
|
+
# Part of "Nuitka", an optimizing Python compiler that is compatible and
|
|
1575
|
+
# integrates with CPython, but also works on its own.
|
|
1576
|
+
#
|
|
1577
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
1578
|
+
# you may not use this file except in compliance with the License.
|
|
1579
|
+
# You may obtain a copy of the License at
|
|
1580
|
+
#
|
|
1581
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
1582
|
+
#
|
|
1583
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
1584
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
1585
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
1586
|
+
# See the License for the specific language governing permissions and
|
|
1587
|
+
# limitations under the License.
|