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.

Files changed (995) hide show
  1. nuitka/Builtins.py +259 -0
  2. nuitka/BytecodeCaching.py +184 -0
  3. nuitka/Bytecodes.py +109 -0
  4. nuitka/CacheCleanup.py +54 -0
  5. nuitka/Constants.py +425 -0
  6. nuitka/Errors.py +93 -0
  7. nuitka/HardImportRegistry.py +408 -0
  8. nuitka/MainControl.py +1201 -0
  9. nuitka/ModuleRegistry.py +364 -0
  10. nuitka/OptionParsing.py +2473 -0
  11. nuitka/Options.py +2948 -0
  12. nuitka/OutputDirectories.py +201 -0
  13. nuitka/PostProcessing.py +551 -0
  14. nuitka/Progress.py +252 -0
  15. nuitka/PythonFlavors.py +426 -0
  16. nuitka/PythonOperators.py +146 -0
  17. nuitka/PythonVersions.py +513 -0
  18. nuitka/Serialization.py +291 -0
  19. nuitka/SourceCodeReferences.py +176 -0
  20. nuitka/Tracing.py +579 -0
  21. nuitka/TreeXML.py +141 -0
  22. nuitka/Variables.py +515 -0
  23. nuitka/Version.py +88 -0
  24. nuitka/__init__.py +19 -0
  25. nuitka/__main__.py +224 -0
  26. nuitka/__past__.py +217 -0
  27. nuitka/build/Backend.scons +1111 -0
  28. nuitka/build/CCompilerVersion.scons +281 -0
  29. nuitka/build/DataComposerInterface.py +116 -0
  30. nuitka/build/Offsets.scons +626 -0
  31. nuitka/build/Onefile.scons +564 -0
  32. nuitka/build/SconsCaching.py +451 -0
  33. nuitka/build/SconsCompilerSettings.py +1133 -0
  34. nuitka/build/SconsHacks.py +215 -0
  35. nuitka/build/SconsInterface.py +664 -0
  36. nuitka/build/SconsProgress.py +100 -0
  37. nuitka/build/SconsSpawn.py +436 -0
  38. nuitka/build/SconsUtils.py +939 -0
  39. nuitka/build/__init__.py +19 -0
  40. nuitka/build/include/nuitka/allocator.h +450 -0
  41. nuitka/build/include/nuitka/builtins.h +97 -0
  42. nuitka/build/include/nuitka/calling.h +123 -0
  43. nuitka/build/include/nuitka/checkers.h +39 -0
  44. nuitka/build/include/nuitka/checksum_tools.h +28 -0
  45. nuitka/build/include/nuitka/compiled_asyncgen.h +281 -0
  46. nuitka/build/include/nuitka/compiled_cell.h +64 -0
  47. nuitka/build/include/nuitka/compiled_coroutine.h +271 -0
  48. nuitka/build/include/nuitka/compiled_frame.h +502 -0
  49. nuitka/build/include/nuitka/compiled_function.h +170 -0
  50. nuitka/build/include/nuitka/compiled_generator.h +287 -0
  51. nuitka/build/include/nuitka/compiled_method.h +54 -0
  52. nuitka/build/include/nuitka/constants.h +251 -0
  53. nuitka/build/include/nuitka/constants_blob.h +34 -0
  54. nuitka/build/include/nuitka/debug_settings.h +60 -0
  55. nuitka/build/include/nuitka/environment_variables.h +30 -0
  56. nuitka/build/include/nuitka/environment_variables_system.h +51 -0
  57. nuitka/build/include/nuitka/exception_groups.h +167 -0
  58. nuitka/build/include/nuitka/exceptions.h +1458 -0
  59. nuitka/build/include/nuitka/filesystem_paths.h +117 -0
  60. nuitka/build/include/nuitka/freelists.h +92 -0
  61. nuitka/build/include/nuitka/hedley.h +1774 -0
  62. nuitka/build/include/nuitka/helper/attributes.h +90 -0
  63. nuitka/build/include/nuitka/helper/boolean.h +86 -0
  64. nuitka/build/include/nuitka/helper/bytearrays.h +34 -0
  65. nuitka/build/include/nuitka/helper/bytes.h +28 -0
  66. nuitka/build/include/nuitka/helper/calling_generated.h +132 -0
  67. nuitka/build/include/nuitka/helper/comparisons_dual_eq.h +47 -0
  68. nuitka/build/include/nuitka/helper/comparisons_dual_ge.h +39 -0
  69. nuitka/build/include/nuitka/helper/comparisons_dual_gt.h +39 -0
  70. nuitka/build/include/nuitka/helper/comparisons_dual_le.h +47 -0
  71. nuitka/build/include/nuitka/helper/comparisons_dual_lt.h +47 -0
  72. nuitka/build/include/nuitka/helper/comparisons_dual_ne.h +39 -0
  73. nuitka/build/include/nuitka/helper/comparisons_eq.h +247 -0
  74. nuitka/build/include/nuitka/helper/comparisons_ge.h +197 -0
  75. nuitka/build/include/nuitka/helper/comparisons_gt.h +197 -0
  76. nuitka/build/include/nuitka/helper/comparisons_le.h +247 -0
  77. nuitka/build/include/nuitka/helper/comparisons_lt.h +247 -0
  78. nuitka/build/include/nuitka/helper/comparisons_ne.h +197 -0
  79. nuitka/build/include/nuitka/helper/complex.h +46 -0
  80. nuitka/build/include/nuitka/helper/dictionaries.h +481 -0
  81. nuitka/build/include/nuitka/helper/floats.h +32 -0
  82. nuitka/build/include/nuitka/helper/import_hard.h +121 -0
  83. nuitka/build/include/nuitka/helper/indexes.h +47 -0
  84. nuitka/build/include/nuitka/helper/ints.h +165 -0
  85. nuitka/build/include/nuitka/helper/iterators.h +376 -0
  86. nuitka/build/include/nuitka/helper/lists.h +94 -0
  87. nuitka/build/include/nuitka/helper/lists_generated.h +36 -0
  88. nuitka/build/include/nuitka/helper/mappings.h +39 -0
  89. nuitka/build/include/nuitka/helper/operations.h +114 -0
  90. nuitka/build/include/nuitka/helper/operations_binary_add.h +240 -0
  91. nuitka/build/include/nuitka/helper/operations_binary_bitand.h +108 -0
  92. nuitka/build/include/nuitka/helper/operations_binary_bitor.h +108 -0
  93. nuitka/build/include/nuitka/helper/operations_binary_bitxor.h +108 -0
  94. nuitka/build/include/nuitka/helper/operations_binary_divmod.h +103 -0
  95. nuitka/build/include/nuitka/helper/operations_binary_dual_add.h +34 -0
  96. nuitka/build/include/nuitka/helper/operations_binary_floordiv.h +103 -0
  97. nuitka/build/include/nuitka/helper/operations_binary_lshift.h +99 -0
  98. nuitka/build/include/nuitka/helper/operations_binary_matmult.h +60 -0
  99. nuitka/build/include/nuitka/helper/operations_binary_mod.h +304 -0
  100. nuitka/build/include/nuitka/helper/operations_binary_mult.h +247 -0
  101. nuitka/build/include/nuitka/helper/operations_binary_olddiv.h +125 -0
  102. nuitka/build/include/nuitka/helper/operations_binary_pow.h +90 -0
  103. nuitka/build/include/nuitka/helper/operations_binary_rshift.h +99 -0
  104. nuitka/build/include/nuitka/helper/operations_binary_sub.h +117 -0
  105. nuitka/build/include/nuitka/helper/operations_binary_truediv.h +103 -0
  106. nuitka/build/include/nuitka/helper/operations_builtin_types.h +247 -0
  107. nuitka/build/include/nuitka/helper/operations_inplace_add.h +173 -0
  108. nuitka/build/include/nuitka/helper/operations_inplace_bitand.h +76 -0
  109. nuitka/build/include/nuitka/helper/operations_inplace_bitor.h +76 -0
  110. nuitka/build/include/nuitka/helper/operations_inplace_bitxor.h +76 -0
  111. nuitka/build/include/nuitka/helper/operations_inplace_floordiv.h +95 -0
  112. nuitka/build/include/nuitka/helper/operations_inplace_lshift.h +62 -0
  113. nuitka/build/include/nuitka/helper/operations_inplace_matmult.h +60 -0
  114. nuitka/build/include/nuitka/helper/operations_inplace_mod.h +218 -0
  115. nuitka/build/include/nuitka/helper/operations_inplace_mult.h +184 -0
  116. nuitka/build/include/nuitka/helper/operations_inplace_olddiv.h +115 -0
  117. nuitka/build/include/nuitka/helper/operations_inplace_pow.h +87 -0
  118. nuitka/build/include/nuitka/helper/operations_inplace_rshift.h +62 -0
  119. nuitka/build/include/nuitka/helper/operations_inplace_sub.h +102 -0
  120. nuitka/build/include/nuitka/helper/operations_inplace_truediv.h +95 -0
  121. nuitka/build/include/nuitka/helper/raising.h +114 -0
  122. nuitka/build/include/nuitka/helper/rangeobjects.h +66 -0
  123. nuitka/build/include/nuitka/helper/richcomparisons.h +35 -0
  124. nuitka/build/include/nuitka/helper/sequences.h +33 -0
  125. nuitka/build/include/nuitka/helper/sets.h +25 -0
  126. nuitka/build/include/nuitka/helper/slices.h +314 -0
  127. nuitka/build/include/nuitka/helper/strings.h +30 -0
  128. nuitka/build/include/nuitka/helper/subscripts.h +390 -0
  129. nuitka/build/include/nuitka/helper/tuples.h +187 -0
  130. nuitka/build/include/nuitka/helpers.h +417 -0
  131. nuitka/build/include/nuitka/importing.h +149 -0
  132. nuitka/build/include/nuitka/incbin.h +402 -0
  133. nuitka/build/include/nuitka/jit_sources.h +25 -0
  134. nuitka/build/include/nuitka/prelude.h +626 -0
  135. nuitka/build/include/nuitka/printing.h +84 -0
  136. nuitka/build/include/nuitka/python_pgo.h +57 -0
  137. nuitka/build/include/nuitka/safe_string_ops.h +57 -0
  138. nuitka/build/include/nuitka/threading.h +142 -0
  139. nuitka/build/include/nuitka/tracing.h +82 -0
  140. nuitka/build/include/nuitka/type_aliases.h +30 -0
  141. nuitka/build/include/nuitka/unfreezing.h +91 -0
  142. nuitka/build/inline_copy/appdirs/LICENSE.txt +23 -0
  143. nuitka/build/inline_copy/appdirs/appdirs.py +611 -0
  144. nuitka/build/inline_copy/atomicwrites/LICENSE +19 -0
  145. nuitka/build/inline_copy/atomicwrites/atomicwrites.py +226 -0
  146. nuitka/build/inline_copy/bin/scons.py +58 -0
  147. nuitka/build/inline_copy/clcache/clcache/LICENSE +30 -0
  148. nuitka/build/inline_copy/clcache/clcache/__init__.py +4 -0
  149. nuitka/build/inline_copy/clcache/clcache/caching.py +2008 -0
  150. nuitka/build/inline_copy/colorama/LICENSE.txt +27 -0
  151. nuitka/build/inline_copy/colorama/colorama/__init__.py +6 -0
  152. nuitka/build/inline_copy/colorama/colorama/ansi.py +102 -0
  153. nuitka/build/inline_copy/colorama/colorama/ansitowin32.py +258 -0
  154. nuitka/build/inline_copy/colorama/colorama/initialise.py +80 -0
  155. nuitka/build/inline_copy/colorama/colorama/win32.py +152 -0
  156. nuitka/build/inline_copy/colorama/colorama/winterm.py +169 -0
  157. nuitka/build/inline_copy/glob2/LICENSE +27 -0
  158. nuitka/build/inline_copy/glob2/glob2/__init__.py +5 -0
  159. nuitka/build/inline_copy/glob2/glob2/compat.py +167 -0
  160. nuitka/build/inline_copy/glob2/glob2/fnmatch.py +141 -0
  161. nuitka/build/inline_copy/glob2/glob2/impl.py +216 -0
  162. nuitka/build/inline_copy/jinja2/LICENSE.rst +28 -0
  163. nuitka/build/inline_copy/jinja2/README.rst +2 -0
  164. nuitka/build/inline_copy/jinja2/jinja2/__init__.py +72 -0
  165. nuitka/build/inline_copy/jinja2/jinja2/_compat.py +105 -0
  166. nuitka/build/inline_copy/jinja2/jinja2/_identifier.py +2 -0
  167. nuitka/build/inline_copy/jinja2/jinja2/bccache.py +361 -0
  168. nuitka/build/inline_copy/jinja2/jinja2/compiler.py +1721 -0
  169. nuitka/build/inline_copy/jinja2/jinja2/constants.py +32 -0
  170. nuitka/build/inline_copy/jinja2/jinja2/debug.py +378 -0
  171. nuitka/build/inline_copy/jinja2/jinja2/defaults.py +56 -0
  172. nuitka/build/inline_copy/jinja2/jinja2/environment.py +1276 -0
  173. nuitka/build/inline_copy/jinja2/jinja2/exceptions.py +146 -0
  174. nuitka/build/inline_copy/jinja2/jinja2/ext.py +627 -0
  175. nuitka/build/inline_copy/jinja2/jinja2/filters.py +1190 -0
  176. nuitka/build/inline_copy/jinja2/jinja2/idtracking.py +286 -0
  177. nuitka/build/inline_copy/jinja2/jinja2/lexer.py +739 -0
  178. nuitka/build/inline_copy/jinja2/jinja2/loaders.py +483 -0
  179. nuitka/build/inline_copy/jinja2/jinja2/meta.py +106 -0
  180. nuitka/build/inline_copy/jinja2/jinja2/nativetypes.py +220 -0
  181. nuitka/build/inline_copy/jinja2/jinja2/nodes.py +999 -0
  182. nuitka/build/inline_copy/jinja2/jinja2/optimizer.py +49 -0
  183. nuitka/build/inline_copy/jinja2/jinja2/parser.py +903 -0
  184. nuitka/build/inline_copy/jinja2/jinja2/runtime.py +808 -0
  185. nuitka/build/inline_copy/jinja2/jinja2/sandbox.py +488 -0
  186. nuitka/build/inline_copy/jinja2/jinja2/tests.py +174 -0
  187. nuitka/build/inline_copy/jinja2/jinja2/utils.py +642 -0
  188. nuitka/build/inline_copy/jinja2/jinja2/visitor.py +87 -0
  189. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Action.py +1475 -0
  190. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Builder.py +905 -0
  191. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/CacheDir.py +314 -0
  192. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Conftest.py +805 -0
  193. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Debug.py +251 -0
  194. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Defaults.py +646 -0
  195. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Environment.py +2561 -0
  196. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/EnvironmentValues.py +119 -0
  197. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Errors.py +222 -0
  198. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Executor.py +660 -0
  199. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Job.py +439 -0
  200. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Memoize.py +242 -0
  201. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Node/Alias.py +176 -0
  202. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Node/FS.py +3861 -0
  203. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Node/Python.py +195 -0
  204. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Node/__init__.py +1784 -0
  205. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/PathList.py +224 -0
  206. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/__init__.py +341 -0
  207. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/aix.py +81 -0
  208. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/cygwin.py +61 -0
  209. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/darwin.py +70 -0
  210. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/hpux.py +45 -0
  211. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/irix.py +41 -0
  212. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/mingw.py +33 -0
  213. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/os2.py +55 -0
  214. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/posix.py +124 -0
  215. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/sunos.py +47 -0
  216. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/virtualenv.py +115 -0
  217. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/win32.py +429 -0
  218. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/SConf.py +1119 -0
  219. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/SConsign.py +453 -0
  220. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Scanner/C.py +226 -0
  221. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Scanner/Dir.py +131 -0
  222. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Scanner/Prog.py +114 -0
  223. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Scanner/RC.py +57 -0
  224. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Scanner/__init__.py +436 -0
  225. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Script/Interactive.py +372 -0
  226. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Script/Main.py +1469 -0
  227. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Script/SConsOptions.py +1071 -0
  228. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Script/SConscript.py +686 -0
  229. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Script/__init__.py +425 -0
  230. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Subst.py +979 -0
  231. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Taskmaster.py +1062 -0
  232. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/386asm.py +61 -0
  233. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/GettextCommon.py +429 -0
  234. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/MSCommon/__init__.py +52 -0
  235. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/MSCommon/arch.py +66 -0
  236. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/MSCommon/common.py +371 -0
  237. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/MSCommon/netframework.py +83 -0
  238. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/MSCommon/sdk.py +411 -0
  239. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/MSCommon/vc.py +994 -0
  240. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/MSCommon/vs.py +608 -0
  241. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/PharLapCommon.py +116 -0
  242. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/__init__.py +882 -0
  243. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/aixc++.py +43 -0
  244. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/aixcc.py +74 -0
  245. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/aixcxx.py +77 -0
  246. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/aixlink.py +78 -0
  247. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/applelink.py +209 -0
  248. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/ar.py +63 -0
  249. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/as.py +49 -0
  250. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/asm.py +78 -0
  251. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/bcc32.py +81 -0
  252. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/c++.py +44 -0
  253. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/cc.py +105 -0
  254. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/clang.py +91 -0
  255. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/clangCommon/__init__.py +18 -0
  256. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/clangxx.py +99 -0
  257. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/cxx.py +95 -0
  258. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/cyglink.py +212 -0
  259. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/default.py +50 -0
  260. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/filesystem.py +98 -0
  261. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/g++.py +45 -0
  262. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/gas.py +56 -0
  263. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/gcc.py +110 -0
  264. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/gettext_tool.py +69 -0
  265. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/gnulink.py +70 -0
  266. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/gxx.py +78 -0
  267. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/hpc++.py +45 -0
  268. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/hpcc.py +53 -0
  269. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/hpcxx.py +88 -0
  270. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/hplink.py +72 -0
  271. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/icc.py +59 -0
  272. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/icl.py +52 -0
  273. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/ilink.py +55 -0
  274. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/ilink32.py +60 -0
  275. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/install.py +510 -0
  276. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/intelc.py +617 -0
  277. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/link.py +72 -0
  278. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/linkCommon/LoadableModule.py +131 -0
  279. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/linkCommon/SharedLibrary.py +218 -0
  280. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/linkCommon/__init__.py +171 -0
  281. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/linkloc.py +112 -0
  282. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/m4.py +63 -0
  283. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/masm.py +77 -0
  284. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/mingw.py +232 -0
  285. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/msgfmt.py +132 -0
  286. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/msginit.py +137 -0
  287. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/msgmerge.py +125 -0
  288. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/mslib.py +73 -0
  289. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/mslink.py +339 -0
  290. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/mssdk.py +50 -0
  291. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/msvc.py +325 -0
  292. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/msvs.py +2116 -0
  293. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/mwcc.py +207 -0
  294. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/mwld.py +108 -0
  295. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/nasm.py +72 -0
  296. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/rmic.py +139 -0
  297. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/rpcgen.py +70 -0
  298. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/sgiar.py +68 -0
  299. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/sgic++.py +43 -0
  300. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/sgicc.py +53 -0
  301. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/sgicxx.py +61 -0
  302. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/sgilink.py +59 -0
  303. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/sunar.py +64 -0
  304. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/sunc++.py +45 -0
  305. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/suncc.py +58 -0
  306. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/suncxx.py +153 -0
  307. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/sunlink.py +79 -0
  308. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/tar.py +73 -0
  309. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/textfile.py +198 -0
  310. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/tlib.py +53 -0
  311. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/wix.py +104 -0
  312. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/xgettext.py +337 -0
  313. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/zip.py +120 -0
  314. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Util.py +2134 -0
  315. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Utilities/ConfigureCache.py +171 -0
  316. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Utilities/__init__.py +0 -0
  317. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Utilities/sconsign.py +494 -0
  318. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Variables/BoolVariable.py +96 -0
  319. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Variables/EnumVariable.py +110 -0
  320. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Variables/ListVariable.py +152 -0
  321. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Variables/PackageVariable.py +107 -0
  322. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Variables/PathVariable.py +158 -0
  323. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Variables/__init__.py +334 -0
  324. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Warnings.py +238 -0
  325. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/__init__.py +9 -0
  326. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/compat/__init__.py +104 -0
  327. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/compat/_scons_dbm.py +42 -0
  328. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/compat/win32.py +101 -0
  329. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/cpp.py +640 -0
  330. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/dblite.py +295 -0
  331. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/exitfuncs.py +59 -0
  332. nuitka/build/inline_copy/markupsafe/LICENSE.rst +28 -0
  333. nuitka/build/inline_copy/markupsafe/markupsafe/__init__.py +327 -0
  334. nuitka/build/inline_copy/markupsafe/markupsafe/_compat.py +33 -0
  335. nuitka/build/inline_copy/markupsafe/markupsafe/_constants.py +264 -0
  336. nuitka/build/inline_copy/markupsafe/markupsafe/_native.py +69 -0
  337. nuitka/build/inline_copy/pefile/LICENSE.txt +21 -0
  338. nuitka/build/inline_copy/pefile/ordlookup/__init__.py +41 -0
  339. nuitka/build/inline_copy/pefile/ordlookup/oleaut32.py +400 -0
  340. nuitka/build/inline_copy/pefile/ordlookup/ws2_32.py +120 -0
  341. nuitka/build/inline_copy/pefile/pefile.py +8034 -0
  342. nuitka/build/inline_copy/pkg_resources/pkg_resources/__init__.py +3272 -0
  343. nuitka/build/inline_copy/pkg_resources/pkg_resources/py31compat.py +21 -0
  344. nuitka/build/inline_copy/python_hacl/LICENSE.txt +201 -0
  345. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_MD5.c +1430 -0
  346. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_MD5.h +66 -0
  347. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA1.c +463 -0
  348. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA1.h +66 -0
  349. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA2.c +1273 -0
  350. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA2.h +204 -0
  351. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA3.c +734 -0
  352. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA3.h +131 -0
  353. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Streaming_Types.h +83 -0
  354. nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/FStar_UInt128_Verified.h +346 -0
  355. nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/FStar_UInt_8_16_32_64.h +107 -0
  356. nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/fstar_uint128_struct_endianness.h +68 -0
  357. nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/internal/target.h +293 -0
  358. nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/lowstar_endianness.h +231 -0
  359. nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/types.h +14 -0
  360. nuitka/build/inline_copy/python_hacl/hacl_312/internal/Hacl_Hash_MD5.h +56 -0
  361. nuitka/build/inline_copy/python_hacl/hacl_312/internal/Hacl_Hash_SHA1.h +56 -0
  362. nuitka/build/inline_copy/python_hacl/hacl_312/internal/Hacl_Hash_SHA2.h +164 -0
  363. nuitka/build/inline_copy/python_hacl/hacl_312/internal/Hacl_Hash_SHA3.h +65 -0
  364. nuitka/build/inline_copy/python_hacl/hacl_312/python_hacl_namespaces.h +89 -0
  365. nuitka/build/inline_copy/stubgen/astunparse.py +938 -0
  366. nuitka/build/inline_copy/stubgen/six.py +998 -0
  367. nuitka/build/inline_copy/stubgen/stubgen.py +484 -0
  368. nuitka/build/inline_copy/tqdm/tqdm/__init__.py +40 -0
  369. nuitka/build/inline_copy/tqdm/tqdm/_main.py +9 -0
  370. nuitka/build/inline_copy/tqdm/tqdm/_monitor.py +97 -0
  371. nuitka/build/inline_copy/tqdm/tqdm/_tqdm.py +9 -0
  372. nuitka/build/inline_copy/tqdm/tqdm/_tqdm_notebook.py +9 -0
  373. nuitka/build/inline_copy/tqdm/tqdm/_tqdm_pandas.py +24 -0
  374. nuitka/build/inline_copy/tqdm/tqdm/_utils.py +12 -0
  375. nuitka/build/inline_copy/tqdm/tqdm/auto.py +44 -0
  376. nuitka/build/inline_copy/tqdm/tqdm/autonotebook.py +28 -0
  377. nuitka/build/inline_copy/tqdm/tqdm/dask.py +46 -0
  378. nuitka/build/inline_copy/tqdm/tqdm/notebook.py +316 -0
  379. nuitka/build/inline_copy/tqdm/tqdm/std.py +1524 -0
  380. nuitka/build/inline_copy/tqdm/tqdm/tk.py +207 -0
  381. nuitka/build/inline_copy/tqdm/tqdm/utils.py +351 -0
  382. nuitka/build/inline_copy/tqdm/tqdm/version.py +2 -0
  383. nuitka/build/inline_copy/yaml/LICENSE +20 -0
  384. nuitka/build/inline_copy/yaml/yaml/__init__.py +427 -0
  385. nuitka/build/inline_copy/yaml/yaml/composer.py +139 -0
  386. nuitka/build/inline_copy/yaml/yaml/constructor.py +748 -0
  387. nuitka/build/inline_copy/yaml/yaml/cyaml.py +101 -0
  388. nuitka/build/inline_copy/yaml/yaml/dumper.py +62 -0
  389. nuitka/build/inline_copy/yaml/yaml/emitter.py +1137 -0
  390. nuitka/build/inline_copy/yaml/yaml/error.py +75 -0
  391. nuitka/build/inline_copy/yaml/yaml/events.py +86 -0
  392. nuitka/build/inline_copy/yaml/yaml/loader.py +63 -0
  393. nuitka/build/inline_copy/yaml/yaml/nodes.py +49 -0
  394. nuitka/build/inline_copy/yaml/yaml/parser.py +589 -0
  395. nuitka/build/inline_copy/yaml/yaml/reader.py +185 -0
  396. nuitka/build/inline_copy/yaml/yaml/representer.py +389 -0
  397. nuitka/build/inline_copy/yaml/yaml/resolver.py +227 -0
  398. nuitka/build/inline_copy/yaml/yaml/scanner.py +1435 -0
  399. nuitka/build/inline_copy/yaml/yaml/serializer.py +111 -0
  400. nuitka/build/inline_copy/yaml/yaml/tokens.py +104 -0
  401. nuitka/build/inline_copy/zlib/LICENSE +22 -0
  402. nuitka/build/inline_copy/zlib/crc32.c +1049 -0
  403. nuitka/build/inline_copy/zlib/crc32.h +9446 -0
  404. nuitka/build/inline_copy/zlib/zconf.h +551 -0
  405. nuitka/build/inline_copy/zlib/zlib.h +1938 -0
  406. nuitka/build/inline_copy/zlib/zutil.h +275 -0
  407. nuitka/build/inline_copy/zstd/LICENSE.txt +30 -0
  408. nuitka/build/inline_copy/zstd/common/bitstream.h +463 -0
  409. nuitka/build/inline_copy/zstd/common/compiler.h +288 -0
  410. nuitka/build/inline_copy/zstd/common/cpu.h +213 -0
  411. nuitka/build/inline_copy/zstd/common/debug.h +107 -0
  412. nuitka/build/inline_copy/zstd/common/entropy_common.c +360 -0
  413. nuitka/build/inline_copy/zstd/common/error_private.c +56 -0
  414. nuitka/build/inline_copy/zstd/common/error_private.h +80 -0
  415. nuitka/build/inline_copy/zstd/common/fse.h +715 -0
  416. nuitka/build/inline_copy/zstd/common/fse_decompress.c +393 -0
  417. nuitka/build/inline_copy/zstd/common/huf.h +361 -0
  418. nuitka/build/inline_copy/zstd/common/mem.h +426 -0
  419. nuitka/build/inline_copy/zstd/common/xxhash.c +826 -0
  420. nuitka/build/inline_copy/zstd/common/xxhash.h +285 -0
  421. nuitka/build/inline_copy/zstd/common/zstd_common.c +83 -0
  422. nuitka/build/inline_copy/zstd/common/zstd_deps.h +111 -0
  423. nuitka/build/inline_copy/zstd/common/zstd_errors.h +95 -0
  424. nuitka/build/inline_copy/zstd/common/zstd_internal.h +478 -0
  425. nuitka/build/inline_copy/zstd/decompress/huf_decompress.c +1350 -0
  426. nuitka/build/inline_copy/zstd/decompress/zstd_ddict.c +244 -0
  427. nuitka/build/inline_copy/zstd/decompress/zstd_ddict.h +44 -0
  428. nuitka/build/inline_copy/zstd/decompress/zstd_decompress.c +1930 -0
  429. nuitka/build/inline_copy/zstd/decompress/zstd_decompress_block.c +1540 -0
  430. nuitka/build/inline_copy/zstd/decompress/zstd_decompress_block.h +62 -0
  431. nuitka/build/inline_copy/zstd/decompress/zstd_decompress_internal.h +190 -0
  432. nuitka/build/inline_copy/zstd/zstd.h +2391 -0
  433. nuitka/build/static_src/CompiledAsyncgenType.c +2211 -0
  434. nuitka/build/static_src/CompiledCellType.c +300 -0
  435. nuitka/build/static_src/CompiledCodeHelpers.c +2160 -0
  436. nuitka/build/static_src/CompiledCoroutineType.c +1946 -0
  437. nuitka/build/static_src/CompiledFrameType.c +1337 -0
  438. nuitka/build/static_src/CompiledFunctionType.c +3320 -0
  439. nuitka/build/static_src/CompiledGeneratorType.c +1997 -0
  440. nuitka/build/static_src/CompiledGeneratorTypeUncompiledIntegration.c +2117 -0
  441. nuitka/build/static_src/CompiledMethodType.c +614 -0
  442. nuitka/build/static_src/GenerateHeadersMain.c +30 -0
  443. nuitka/build/static_src/HelpersAllocator.c +939 -0
  444. nuitka/build/static_src/HelpersAttributes.c +1241 -0
  445. nuitka/build/static_src/HelpersBuiltin.c +901 -0
  446. nuitka/build/static_src/HelpersBuiltinTypeMethods.c +3594 -0
  447. nuitka/build/static_src/HelpersBytes.c +107 -0
  448. nuitka/build/static_src/HelpersCalling.c +397 -0
  449. nuitka/build/static_src/HelpersCallingGenerated.c +14361 -0
  450. nuitka/build/static_src/HelpersChecksumTools.c +59 -0
  451. nuitka/build/static_src/HelpersClasses.c +91 -0
  452. nuitka/build/static_src/HelpersComparisonDualEq.c +183 -0
  453. nuitka/build/static_src/HelpersComparisonDualGe.c +121 -0
  454. nuitka/build/static_src/HelpersComparisonDualGt.c +121 -0
  455. nuitka/build/static_src/HelpersComparisonDualLe.c +183 -0
  456. nuitka/build/static_src/HelpersComparisonDualLt.c +183 -0
  457. nuitka/build/static_src/HelpersComparisonDualNe.c +121 -0
  458. nuitka/build/static_src/HelpersComparisonEq.c +12070 -0
  459. nuitka/build/static_src/HelpersComparisonEqUtils.c +169 -0
  460. nuitka/build/static_src/HelpersComparisonGe.c +11871 -0
  461. nuitka/build/static_src/HelpersComparisonGt.c +11855 -0
  462. nuitka/build/static_src/HelpersComparisonLe.c +11957 -0
  463. nuitka/build/static_src/HelpersComparisonLt.c +11941 -0
  464. nuitka/build/static_src/HelpersComparisonNe.c +11979 -0
  465. nuitka/build/static_src/HelpersConsole.c +124 -0
  466. nuitka/build/static_src/HelpersConstantsBlob.c +1487 -0
  467. nuitka/build/static_src/HelpersDeepcopy.c +636 -0
  468. nuitka/build/static_src/HelpersDictionaries.c +1739 -0
  469. nuitka/build/static_src/HelpersDictionariesGenerated.c +738 -0
  470. nuitka/build/static_src/HelpersDumpBacktraces.c +63 -0
  471. nuitka/build/static_src/HelpersEnvironmentVariables.c +65 -0
  472. nuitka/build/static_src/HelpersEnvironmentVariablesSystem.c +97 -0
  473. nuitka/build/static_src/HelpersExceptions.c +298 -0
  474. nuitka/build/static_src/HelpersFiles.c +353 -0
  475. nuitka/build/static_src/HelpersFilesystemPaths.c +1322 -0
  476. nuitka/build/static_src/HelpersFloats.c +92 -0
  477. nuitka/build/static_src/HelpersHeapStorage.c +68 -0
  478. nuitka/build/static_src/HelpersImport.c +506 -0
  479. nuitka/build/static_src/HelpersImportHard.c +526 -0
  480. nuitka/build/static_src/HelpersJitSources.c +48 -0
  481. nuitka/build/static_src/HelpersLists.c +899 -0
  482. nuitka/build/static_src/HelpersListsGenerated.c +564 -0
  483. nuitka/build/static_src/HelpersMappings.c +46 -0
  484. nuitka/build/static_src/HelpersMatching.c +192 -0
  485. nuitka/build/static_src/HelpersOperationBinaryAdd.c +6477 -0
  486. nuitka/build/static_src/HelpersOperationBinaryAddUtils.c +703 -0
  487. nuitka/build/static_src/HelpersOperationBinaryBitand.c +2738 -0
  488. nuitka/build/static_src/HelpersOperationBinaryBitor.c +2738 -0
  489. nuitka/build/static_src/HelpersOperationBinaryBitxor.c +2738 -0
  490. nuitka/build/static_src/HelpersOperationBinaryDivmod.c +2406 -0
  491. nuitka/build/static_src/HelpersOperationBinaryDivmodUtils.c +33 -0
  492. nuitka/build/static_src/HelpersOperationBinaryDualAdd.c +172 -0
  493. nuitka/build/static_src/HelpersOperationBinaryFloordiv.c +2422 -0
  494. nuitka/build/static_src/HelpersOperationBinaryInplaceAdd.c +220 -0
  495. nuitka/build/static_src/HelpersOperationBinaryLshift.c +2846 -0
  496. nuitka/build/static_src/HelpersOperationBinaryMatmult.c +453 -0
  497. nuitka/build/static_src/HelpersOperationBinaryMod.c +6549 -0
  498. nuitka/build/static_src/HelpersOperationBinaryMult.c +6438 -0
  499. nuitka/build/static_src/HelpersOperationBinaryMultUtils.c +125 -0
  500. nuitka/build/static_src/HelpersOperationBinaryOlddiv.c +2355 -0
  501. nuitka/build/static_src/HelpersOperationBinaryPow.c +2743 -0
  502. nuitka/build/static_src/HelpersOperationBinaryPowUtils.c +26 -0
  503. nuitka/build/static_src/HelpersOperationBinaryRshift.c +2706 -0
  504. nuitka/build/static_src/HelpersOperationBinarySub.c +2649 -0
  505. nuitka/build/static_src/HelpersOperationBinaryTruediv.c +2415 -0
  506. nuitka/build/static_src/HelpersOperationInplaceAdd.c +5211 -0
  507. nuitka/build/static_src/HelpersOperationInplaceAddUtils.c +144 -0
  508. nuitka/build/static_src/HelpersOperationInplaceBitand.c +1826 -0
  509. nuitka/build/static_src/HelpersOperationInplaceBitor.c +1826 -0
  510. nuitka/build/static_src/HelpersOperationInplaceBitxor.c +1826 -0
  511. nuitka/build/static_src/HelpersOperationInplaceFloordiv.c +2605 -0
  512. nuitka/build/static_src/HelpersOperationInplaceLshift.c +1594 -0
  513. nuitka/build/static_src/HelpersOperationInplaceMatmult.c +603 -0
  514. nuitka/build/static_src/HelpersOperationInplaceMod.c +4762 -0
  515. nuitka/build/static_src/HelpersOperationInplaceMult.c +4689 -0
  516. nuitka/build/static_src/HelpersOperationInplaceOlddiv.c +2553 -0
  517. nuitka/build/static_src/HelpersOperationInplacePow.c +2807 -0
  518. nuitka/build/static_src/HelpersOperationInplaceRshift.c +1534 -0
  519. nuitka/build/static_src/HelpersOperationInplaceSub.c +2894 -0
  520. nuitka/build/static_src/HelpersOperationInplaceTruediv.c +2612 -0
  521. nuitka/build/static_src/HelpersProfiling.c +104 -0
  522. nuitka/build/static_src/HelpersPythonPgo.c +113 -0
  523. nuitka/build/static_src/HelpersRaising.c +447 -0
  524. nuitka/build/static_src/HelpersSafeStrings.c +185 -0
  525. nuitka/build/static_src/HelpersSequences.c +134 -0
  526. nuitka/build/static_src/HelpersSlices.c +73 -0
  527. nuitka/build/static_src/HelpersStrings.c +998 -0
  528. nuitka/build/static_src/HelpersTuples.c +148 -0
  529. nuitka/build/static_src/HelpersTypes.c +329 -0
  530. nuitka/build/static_src/InspectPatcher.c +439 -0
  531. nuitka/build/static_src/MainProgram.c +2060 -0
  532. nuitka/build/static_src/MetaPathBasedLoader.c +2290 -0
  533. nuitka/build/static_src/MetaPathBasedLoaderImportlibMetadataDistribution.c +125 -0
  534. nuitka/build/static_src/MetaPathBasedLoaderResourceReader.c +158 -0
  535. nuitka/build/static_src/MetaPathBasedLoaderResourceReaderFiles.c +785 -0
  536. nuitka/build/static_src/OnefileBootstrap.c +1580 -0
  537. nuitka/build/static_src/OnefileSplashScreen.cpp +275 -0
  538. nuitka/code_generation/AsyncgenCodes.py +186 -0
  539. nuitka/code_generation/AttributeCodes.py +357 -0
  540. nuitka/code_generation/BinaryOperationHelperDefinitions.py +720 -0
  541. nuitka/code_generation/BranchCodes.py +67 -0
  542. nuitka/code_generation/BuiltinCodes.py +529 -0
  543. nuitka/code_generation/CallCodes.py +1186 -0
  544. nuitka/code_generation/ClassCodes.py +156 -0
  545. nuitka/code_generation/CodeGeneration.py +1078 -0
  546. nuitka/code_generation/CodeHelperSelection.py +81 -0
  547. nuitka/code_generation/CodeHelpers.py +455 -0
  548. nuitka/code_generation/CodeObjectCodes.py +165 -0
  549. nuitka/code_generation/ComparisonCodes.py +569 -0
  550. nuitka/code_generation/ComparisonHelperDefinitions.py +146 -0
  551. nuitka/code_generation/ConditionalCodes.py +236 -0
  552. nuitka/code_generation/ConstantCodes.py +243 -0
  553. nuitka/code_generation/Contexts.py +1248 -0
  554. nuitka/code_generation/CoroutineCodes.py +253 -0
  555. nuitka/code_generation/CtypesCodes.py +46 -0
  556. nuitka/code_generation/DictCodes.py +918 -0
  557. nuitka/code_generation/Emission.py +75 -0
  558. nuitka/code_generation/ErrorCodes.py +281 -0
  559. nuitka/code_generation/EvalCodes.py +444 -0
  560. nuitka/code_generation/ExceptionCodes.py +337 -0
  561. nuitka/code_generation/ExpressionCTypeSelectionHelpers.py +227 -0
  562. nuitka/code_generation/ExpressionCodes.py +61 -0
  563. nuitka/code_generation/FrameCodes.py +518 -0
  564. nuitka/code_generation/FunctionCodes.py +858 -0
  565. nuitka/code_generation/GeneratorCodes.py +218 -0
  566. nuitka/code_generation/GlobalConstants.py +249 -0
  567. nuitka/code_generation/GlobalsLocalsCodes.py +211 -0
  568. nuitka/code_generation/IdCodes.py +53 -0
  569. nuitka/code_generation/ImportCodes.py +468 -0
  570. nuitka/code_generation/Indentation.py +45 -0
  571. nuitka/code_generation/IndexCodes.py +50 -0
  572. nuitka/code_generation/InjectCCodes.py +28 -0
  573. nuitka/code_generation/IntegerCodes.py +110 -0
  574. nuitka/code_generation/IteratorCodes.py +378 -0
  575. nuitka/code_generation/JitCodes.py +44 -0
  576. nuitka/code_generation/LabelCodes.py +68 -0
  577. nuitka/code_generation/LineNumberCodes.py +91 -0
  578. nuitka/code_generation/ListCodes.py +502 -0
  579. nuitka/code_generation/LoaderCodes.py +193 -0
  580. nuitka/code_generation/LocalsDictCodes.py +359 -0
  581. nuitka/code_generation/LoopCodes.py +88 -0
  582. nuitka/code_generation/MatchCodes.py +67 -0
  583. nuitka/code_generation/ModuleCodes.py +247 -0
  584. nuitka/code_generation/Namify.py +260 -0
  585. nuitka/code_generation/NetworkxCodes.py +51 -0
  586. nuitka/code_generation/OperationCodes.py +398 -0
  587. nuitka/code_generation/PackageResourceCodes.py +986 -0
  588. nuitka/code_generation/PrintCodes.py +93 -0
  589. nuitka/code_generation/PythonAPICodes.py +215 -0
  590. nuitka/code_generation/RaisingCodes.py +481 -0
  591. nuitka/code_generation/Reports.py +115 -0
  592. nuitka/code_generation/ReturnCodes.py +143 -0
  593. nuitka/code_generation/SetCodes.py +196 -0
  594. nuitka/code_generation/SliceCodes.py +465 -0
  595. nuitka/code_generation/StringCodes.py +303 -0
  596. nuitka/code_generation/SubscriptCodes.py +263 -0
  597. nuitka/code_generation/TensorflowCodes.py +54 -0
  598. nuitka/code_generation/TryCodes.py +326 -0
  599. nuitka/code_generation/TupleCodes.py +115 -0
  600. nuitka/code_generation/TypeAliasCodes.py +120 -0
  601. nuitka/code_generation/VariableCodes.py +519 -0
  602. nuitka/code_generation/VariableDeclarations.py +279 -0
  603. nuitka/code_generation/YieldCodes.py +253 -0
  604. nuitka/code_generation/__init__.py +19 -0
  605. nuitka/code_generation/c_types/CTypeBases.py +177 -0
  606. nuitka/code_generation/c_types/CTypeBooleans.py +104 -0
  607. nuitka/code_generation/c_types/CTypeCFloats.py +57 -0
  608. nuitka/code_generation/c_types/CTypeCLongs.py +45 -0
  609. nuitka/code_generation/c_types/CTypeModuleDictVariables.py +109 -0
  610. nuitka/code_generation/c_types/CTypeNuitkaBooleans.py +150 -0
  611. nuitka/code_generation/c_types/CTypeNuitkaInts.py +200 -0
  612. nuitka/code_generation/c_types/CTypeNuitkaVoids.py +107 -0
  613. nuitka/code_generation/c_types/CTypePyObjectPointers.py +572 -0
  614. nuitka/code_generation/c_types/CTypeVoids.py +92 -0
  615. nuitka/code_generation/c_types/__init__.py +19 -0
  616. nuitka/code_generation/templates/CodeTemplatesAsyncgens.py +106 -0
  617. nuitka/code_generation/templates/CodeTemplatesConstants.py +296 -0
  618. nuitka/code_generation/templates/CodeTemplatesCoroutines.py +109 -0
  619. nuitka/code_generation/templates/CodeTemplatesExceptions.py +84 -0
  620. nuitka/code_generation/templates/CodeTemplatesFrames.py +235 -0
  621. nuitka/code_generation/templates/CodeTemplatesFunction.py +117 -0
  622. nuitka/code_generation/templates/CodeTemplatesGeneratorFunction.py +130 -0
  623. nuitka/code_generation/templates/CodeTemplatesIterators.py +40 -0
  624. nuitka/code_generation/templates/CodeTemplatesLoader.py +180 -0
  625. nuitka/code_generation/templates/CodeTemplatesModules.py +710 -0
  626. nuitka/code_generation/templates/CodeTemplatesVariables.py +388 -0
  627. nuitka/code_generation/templates/TemplateDebugWrapper.py +80 -0
  628. nuitka/code_generation/templates/__init__.py +19 -0
  629. nuitka/code_generation/templates_c/CodeTemplateCallsMethodPositional.c.j2 +321 -0
  630. nuitka/code_generation/templates_c/CodeTemplateCallsMixed.c.j2 +143 -0
  631. nuitka/code_generation/templates_c/CodeTemplateCallsPositional.c.j2 +677 -0
  632. nuitka/code_generation/templates_c/CodeTemplateCallsPositionalMethodDescr.c.j2 +165 -0
  633. nuitka/code_generation/templates_c/CodeTemplateMakeListHinted.c.j2 +38 -0
  634. nuitka/code_generation/templates_c/CodeTemplateMakeListSmall.c.j2 +41 -0
  635. nuitka/code_generation/templates_c/HelperBuiltinMethodOperation.c.j2 +53 -0
  636. nuitka/code_generation/templates_c/HelperDictionaryCopy.c.j2 +364 -0
  637. nuitka/code_generation/templates_c/HelperImportHard.c.j2 +37 -0
  638. nuitka/code_generation/templates_c/HelperLongTools.c.j2 +53 -0
  639. nuitka/code_generation/templates_c/HelperObjectTools.c.j2 +20 -0
  640. nuitka/code_generation/templates_c/HelperOperationBinary.c.j2 +148 -0
  641. nuitka/code_generation/templates_c/HelperOperationBinaryDual.c.j2 +115 -0
  642. nuitka/code_generation/templates_c/HelperOperationComparison.c.j2 +352 -0
  643. nuitka/code_generation/templates_c/HelperOperationComparisonBytes.c.j2 +115 -0
  644. nuitka/code_generation/templates_c/HelperOperationComparisonDual.c.j2 +86 -0
  645. nuitka/code_generation/templates_c/HelperOperationComparisonFloat.c.j2 +31 -0
  646. nuitka/code_generation/templates_c/HelperOperationComparisonInt.c.j2 +32 -0
  647. nuitka/code_generation/templates_c/HelperOperationComparisonList.c.j2 +112 -0
  648. nuitka/code_generation/templates_c/HelperOperationComparisonLong.c.j2 +157 -0
  649. nuitka/code_generation/templates_c/HelperOperationComparisonStr.c.j2 +115 -0
  650. nuitka/code_generation/templates_c/HelperOperationComparisonTuple.c.j2 +99 -0
  651. nuitka/code_generation/templates_c/HelperOperationComparisonUnicode.c.j2 +115 -0
  652. nuitka/code_generation/templates_c/HelperOperationInplace.c.j2 +281 -0
  653. nuitka/code_generation/templates_c/HelperSlotsBinary.c.j2 +420 -0
  654. nuitka/code_generation/templates_c/HelperSlotsBytes.c.j2 +51 -0
  655. nuitka/code_generation/templates_c/HelperSlotsCommon.c.j2 +71 -0
  656. nuitka/code_generation/templates_c/HelperSlotsFloat.c.j2 +327 -0
  657. nuitka/code_generation/templates_c/HelperSlotsInt.c.j2 +411 -0
  658. nuitka/code_generation/templates_c/HelperSlotsList.c.j2 +59 -0
  659. nuitka/code_generation/templates_c/HelperSlotsLong.c.j2 +229 -0
  660. nuitka/code_generation/templates_c/HelperSlotsSet.c.j2 +47 -0
  661. nuitka/code_generation/templates_c/HelperSlotsStr.c.j2 +55 -0
  662. nuitka/code_generation/templates_c/HelperSlotsTuple.c.j2 +58 -0
  663. nuitka/code_generation/templates_c/HelperSlotsUnicode.c.j2 +62 -0
  664. nuitka/containers/Namedtuples.py +51 -0
  665. nuitka/containers/OrderedDicts.py +191 -0
  666. nuitka/containers/OrderedSets.py +123 -0
  667. nuitka/containers/OrderedSetsFallback.py +139 -0
  668. nuitka/containers/__init__.py +19 -0
  669. nuitka/distutils/Build.py +76 -0
  670. nuitka/distutils/DistutilCommands.py +438 -0
  671. nuitka/distutils/__init__.py +19 -0
  672. nuitka/finalizations/Finalization.py +35 -0
  673. nuitka/finalizations/FinalizeMarkups.py +136 -0
  674. nuitka/finalizations/__init__.py +19 -0
  675. nuitka/freezer/DependsExe.py +257 -0
  676. nuitka/freezer/DllDependenciesCommon.py +97 -0
  677. nuitka/freezer/DllDependenciesMacOS.py +444 -0
  678. nuitka/freezer/DllDependenciesPosix.py +242 -0
  679. nuitka/freezer/DllDependenciesWin32.py +315 -0
  680. nuitka/freezer/ImportDetection.py +359 -0
  681. nuitka/freezer/IncludedDataFiles.py +689 -0
  682. nuitka/freezer/IncludedEntryPoints.py +376 -0
  683. nuitka/freezer/Onefile.py +296 -0
  684. nuitka/freezer/Standalone.py +520 -0
  685. nuitka/freezer/__init__.py +19 -0
  686. nuitka/importing/IgnoreListing.py +449 -0
  687. nuitka/importing/ImportCache.py +95 -0
  688. nuitka/importing/ImportResolving.py +186 -0
  689. nuitka/importing/Importing.py +1200 -0
  690. nuitka/importing/PreloadedPackages.py +164 -0
  691. nuitka/importing/Recursion.py +611 -0
  692. nuitka/importing/StandardLibrary.py +429 -0
  693. nuitka/importing/__init__.py +19 -0
  694. nuitka/nodes/AsyncgenNodes.py +107 -0
  695. nuitka/nodes/AttributeLookupNodes.py +124 -0
  696. nuitka/nodes/AttributeNodes.py +386 -0
  697. nuitka/nodes/AttributeNodesGenerated.py +10734 -0
  698. nuitka/nodes/BuiltinAllNodes.py +115 -0
  699. nuitka/nodes/BuiltinAnyNodes.py +124 -0
  700. nuitka/nodes/BuiltinComplexNodes.py +83 -0
  701. nuitka/nodes/BuiltinDecodingNodes.py +52 -0
  702. nuitka/nodes/BuiltinDecoratorNodes.py +85 -0
  703. nuitka/nodes/BuiltinDictNodes.py +140 -0
  704. nuitka/nodes/BuiltinFormatNodes.py +159 -0
  705. nuitka/nodes/BuiltinHashNodes.py +63 -0
  706. nuitka/nodes/BuiltinInputNodes.py +39 -0
  707. nuitka/nodes/BuiltinIntegerNodes.py +170 -0
  708. nuitka/nodes/BuiltinIteratorNodes.py +391 -0
  709. nuitka/nodes/BuiltinLenNodes.py +61 -0
  710. nuitka/nodes/BuiltinNextNodes.py +111 -0
  711. nuitka/nodes/BuiltinOpenNodes.py +148 -0
  712. nuitka/nodes/BuiltinOperationNodeBasesGenerated.py +7367 -0
  713. nuitka/nodes/BuiltinRangeNodes.py +690 -0
  714. nuitka/nodes/BuiltinRefNodes.py +314 -0
  715. nuitka/nodes/BuiltinSumNodes.py +104 -0
  716. nuitka/nodes/BuiltinTypeNodes.py +454 -0
  717. nuitka/nodes/BuiltinVarsNodes.py +44 -0
  718. nuitka/nodes/BytesNodes.py +829 -0
  719. nuitka/nodes/CallNodes.py +217 -0
  720. nuitka/nodes/Checkers.py +55 -0
  721. nuitka/nodes/ChildrenHavingMixins.py +21576 -0
  722. nuitka/nodes/ClassNodes.py +286 -0
  723. nuitka/nodes/CodeObjectSpecs.py +230 -0
  724. nuitka/nodes/ComparisonNodes.py +687 -0
  725. nuitka/nodes/ConditionalNodes.py +884 -0
  726. nuitka/nodes/ConstantRefNodes.py +1717 -0
  727. nuitka/nodes/ContainerMakingNodes.py +408 -0
  728. nuitka/nodes/ContainerOperationNodes.py +87 -0
  729. nuitka/nodes/CoroutineNodes.py +144 -0
  730. nuitka/nodes/CtypesNodes.py +51 -0
  731. nuitka/nodes/DictionaryNodes.py +1513 -0
  732. nuitka/nodes/ExceptionNodes.py +393 -0
  733. nuitka/nodes/ExecEvalNodes.py +229 -0
  734. nuitka/nodes/ExpressionBases.py +1301 -0
  735. nuitka/nodes/ExpressionBasesGenerated.py +2103 -0
  736. nuitka/nodes/ExpressionShapeMixins.py +886 -0
  737. nuitka/nodes/FrameNodes.py +413 -0
  738. nuitka/nodes/FunctionAttributeNodes.py +102 -0
  739. nuitka/nodes/FunctionNodes.py +1303 -0
  740. nuitka/nodes/FutureSpecs.py +224 -0
  741. nuitka/nodes/GeneratorNodes.py +201 -0
  742. nuitka/nodes/GlobalsLocalsNodes.py +209 -0
  743. nuitka/nodes/HardImportNodesGenerated.py +3599 -0
  744. nuitka/nodes/ImportHardNodes.py +185 -0
  745. nuitka/nodes/ImportNodes.py +1366 -0
  746. nuitka/nodes/IndicatorMixins.py +79 -0
  747. nuitka/nodes/InjectCNodes.py +51 -0
  748. nuitka/nodes/IterationHandles.py +407 -0
  749. nuitka/nodes/KeyValuePairNodes.py +378 -0
  750. nuitka/nodes/ListOperationNodes.py +525 -0
  751. nuitka/nodes/LocalsDictNodes.py +717 -0
  752. nuitka/nodes/LocalsScopes.py +505 -0
  753. nuitka/nodes/LoopNodes.py +445 -0
  754. nuitka/nodes/MatchNodes.py +60 -0
  755. nuitka/nodes/ModuleAttributeNodes.py +180 -0
  756. nuitka/nodes/ModuleNodes.py +1137 -0
  757. nuitka/nodes/NetworkxNodes.py +45 -0
  758. nuitka/nodes/NodeBases.py +890 -0
  759. nuitka/nodes/NodeMakingHelpers.py +481 -0
  760. nuitka/nodes/NodeMetaClasses.py +172 -0
  761. nuitka/nodes/OperatorNodes.py +944 -0
  762. nuitka/nodes/OperatorNodesUnary.py +403 -0
  763. nuitka/nodes/OsSysNodes.py +215 -0
  764. nuitka/nodes/OutlineNodes.py +372 -0
  765. nuitka/nodes/PackageMetadataNodes.py +982 -0
  766. nuitka/nodes/PackageResourceNodes.py +424 -0
  767. nuitka/nodes/PrintNodes.py +105 -0
  768. nuitka/nodes/ReturnNodes.py +255 -0
  769. nuitka/nodes/SideEffectNodes.py +139 -0
  770. nuitka/nodes/SliceNodes.py +386 -0
  771. nuitka/nodes/StatementBasesGenerated.py +3419 -0
  772. nuitka/nodes/StatementNodes.py +316 -0
  773. nuitka/nodes/StrNodes.py +919 -0
  774. nuitka/nodes/StringConcatenationNodes.py +103 -0
  775. nuitka/nodes/SubscriptNodes.py +245 -0
  776. nuitka/nodes/TensorflowNodes.py +38 -0
  777. nuitka/nodes/TryNodes.py +519 -0
  778. nuitka/nodes/TypeMatchNodes.py +65 -0
  779. nuitka/nodes/TypeNodes.py +390 -0
  780. nuitka/nodes/VariableAssignNodes.py +1177 -0
  781. nuitka/nodes/VariableDelNodes.py +320 -0
  782. nuitka/nodes/VariableNameNodes.py +153 -0
  783. nuitka/nodes/VariableRefNodes.py +895 -0
  784. nuitka/nodes/VariableReleaseNodes.py +153 -0
  785. nuitka/nodes/YieldNodes.py +121 -0
  786. nuitka/nodes/__init__.py +19 -0
  787. nuitka/nodes/shapes/BuiltinTypeShapes.py +4290 -0
  788. nuitka/nodes/shapes/ControlFlowDescriptions.py +199 -0
  789. nuitka/nodes/shapes/IteratorShapes.py +71 -0
  790. nuitka/nodes/shapes/ShapeMixins.py +255 -0
  791. nuitka/nodes/shapes/StandardShapes.py +1384 -0
  792. nuitka/nodes/shapes/__init__.py +19 -0
  793. nuitka/optimizations/BytecodeDemotion.py +105 -0
  794. nuitka/optimizations/FunctionInlining.py +110 -0
  795. nuitka/optimizations/Graphs.py +70 -0
  796. nuitka/optimizations/Optimization.py +363 -0
  797. nuitka/optimizations/OptimizeBuiltinCalls.py +1582 -0
  798. nuitka/optimizations/Tags.py +76 -0
  799. nuitka/optimizations/TraceCollections.py +1257 -0
  800. nuitka/optimizations/ValueTraces.py +980 -0
  801. nuitka/optimizations/__init__.py +19 -0
  802. nuitka/pgo/PGO.py +160 -0
  803. nuitka/pgo/__init__.py +19 -0
  804. nuitka/plugins/PluginBase.py +1924 -0
  805. nuitka/plugins/Plugins.py +2007 -0
  806. nuitka/plugins/YamlPluginBase.py +121 -0
  807. nuitka/plugins/__init__.py +19 -0
  808. nuitka/plugins/standard/AntiBloatPlugin.py +1024 -0
  809. nuitka/plugins/standard/ConsiderPyLintAnnotationsPlugin.py +95 -0
  810. nuitka/plugins/standard/DataFilesPlugin.py +311 -0
  811. nuitka/plugins/standard/DelvewheelPlugin.py +150 -0
  812. nuitka/plugins/standard/DillPlugin/DillPlugin.c +37 -0
  813. nuitka/plugins/standard/DillPlugin/cloudpickle-postLoad.py +67 -0
  814. nuitka/plugins/standard/DillPlugin/dill-postLoad.py +223 -0
  815. nuitka/plugins/standard/DillPlugin.py +137 -0
  816. nuitka/plugins/standard/DllFilesPlugin.py +527 -0
  817. nuitka/plugins/standard/EnumPlugin.py +64 -0
  818. nuitka/plugins/standard/EventletPlugin.py +57 -0
  819. nuitka/plugins/standard/GeventPlugin.py +64 -0
  820. nuitka/plugins/standard/GiPlugin.py +118 -0
  821. nuitka/plugins/standard/GlfwPlugin.py +138 -0
  822. nuitka/plugins/standard/ImplicitImports.py +845 -0
  823. nuitka/plugins/standard/KivyPlugin.py +141 -0
  824. nuitka/plugins/standard/MatplotlibPlugin.py +256 -0
  825. nuitka/plugins/standard/MultiprocessingPlugin.py +199 -0
  826. nuitka/plugins/standard/NumpyPlugin.py +35 -0
  827. nuitka/plugins/standard/OptionsNannyPlugin.py +158 -0
  828. nuitka/plugins/standard/PbrPlugin.py +62 -0
  829. nuitka/plugins/standard/PkgResourcesPlugin.py +162 -0
  830. nuitka/plugins/standard/PlaywrightPlugin.py +179 -0
  831. nuitka/plugins/standard/PmwPlugin.py +248 -0
  832. nuitka/plugins/standard/PySidePyQtPlugin.py +1666 -0
  833. nuitka/plugins/standard/PywebViewPlugin.py +81 -0
  834. nuitka/plugins/standard/SpacyPlugin.py +137 -0
  835. nuitka/plugins/standard/TensorflowPlugin.py +35 -0
  836. nuitka/plugins/standard/TkinterPlugin.py +416 -0
  837. nuitka/plugins/standard/TorchPlugin.py +35 -0
  838. nuitka/plugins/standard/TransformersPlugin.py +121 -0
  839. nuitka/plugins/standard/TrioPlugin.py +33 -0
  840. nuitka/plugins/standard/UpxPlugin.py +174 -0
  841. nuitka/plugins/standard/__init__.py +19 -0
  842. nuitka/plugins/standard/standard.nuitka-package.config.yml +9313 -0
  843. nuitka/plugins/standard/stdlib2.nuitka-package.config.yml +78 -0
  844. nuitka/plugins/standard/stdlib3.nuitka-package.config.yml +468 -0
  845. nuitka/reports/CompilationReportReader.py +83 -0
  846. nuitka/reports/LicenseReport.rst.j2 +41 -0
  847. nuitka/reports/Reports.py +961 -0
  848. nuitka/reports/__init__.py +19 -0
  849. nuitka/specs/BuiltinBytesOperationSpecs.py +180 -0
  850. nuitka/specs/BuiltinDictOperationSpecs.py +82 -0
  851. nuitka/specs/BuiltinListOperationSpecs.py +80 -0
  852. nuitka/specs/BuiltinParameterSpecs.py +831 -0
  853. nuitka/specs/BuiltinStrOperationSpecs.py +181 -0
  854. nuitka/specs/BuiltinTypeOperationSpecs.py +34 -0
  855. nuitka/specs/BuiltinUnicodeOperationSpecs.py +123 -0
  856. nuitka/specs/HardImportSpecs.py +236 -0
  857. nuitka/specs/ParameterSpecs.py +630 -0
  858. nuitka/specs/__init__.py +19 -0
  859. nuitka/tools/Basics.py +55 -0
  860. nuitka/tools/__init__.py +19 -0
  861. nuitka/tools/commercial/__init__.py +21 -0
  862. nuitka/tools/data_composer/DataComposer.py +593 -0
  863. nuitka/tools/data_composer/__init__.py +19 -0
  864. nuitka/tools/data_composer/__main__.py +41 -0
  865. nuitka/tools/environments/CreateEnvironment.py +69 -0
  866. nuitka/tools/environments/Virtualenv.py +158 -0
  867. nuitka/tools/environments/__init__.py +19 -0
  868. nuitka/tools/general/__init__.py +19 -0
  869. nuitka/tools/general/dll_report/__init__.py +19 -0
  870. nuitka/tools/general/dll_report/__main__.py +83 -0
  871. nuitka/tools/general/find_module/FindModuleCode.py +127 -0
  872. nuitka/tools/general/find_module/__init__.py +19 -0
  873. nuitka/tools/general/generate_header/GenerateHeader.py +73 -0
  874. nuitka/tools/general/generate_header/__init__.py +19 -0
  875. nuitka/tools/onefile_compressor/OnefileCompressor.py +390 -0
  876. nuitka/tools/onefile_compressor/__init__.py +19 -0
  877. nuitka/tools/onefile_compressor/__main__.py +41 -0
  878. nuitka/tools/podman/Podman.py +55 -0
  879. nuitka/tools/podman/__init__.py +19 -0
  880. nuitka/tools/podman/__main__.py +425 -0
  881. nuitka/tools/profiler/__init__.py +19 -0
  882. nuitka/tools/profiler/__main__.py +93 -0
  883. nuitka/tools/scanning/DisplayDistributions.py +39 -0
  884. nuitka/tools/scanning/DisplayPackageDLLs.py +151 -0
  885. nuitka/tools/scanning/DisplayPackageData.py +73 -0
  886. nuitka/tools/scanning/__init__.py +19 -0
  887. nuitka/tools/specialize/CTypeDescriptions.py +1928 -0
  888. nuitka/tools/specialize/Common.py +380 -0
  889. nuitka/tools/specialize/SpecializeC.py +1483 -0
  890. nuitka/tools/specialize/SpecializePython.py +1151 -0
  891. nuitka/tools/specialize/__init__.py +19 -0
  892. nuitka/tools/testing/Common.py +2007 -0
  893. nuitka/tools/testing/Constructs.py +53 -0
  894. nuitka/tools/testing/DocTests.py +156 -0
  895. nuitka/tools/testing/OutputComparison.py +313 -0
  896. nuitka/tools/testing/Pythons.py +34 -0
  897. nuitka/tools/testing/RuntimeTracing.py +260 -0
  898. nuitka/tools/testing/SearchModes.py +208 -0
  899. nuitka/tools/testing/Valgrind.py +103 -0
  900. nuitka/tools/testing/__init__.py +19 -0
  901. nuitka/tools/testing/check_reference_counts/__init__.py +19 -0
  902. nuitka/tools/testing/check_reference_counts/__main__.py +107 -0
  903. nuitka/tools/testing/compare_with_cpython/__init__.py +19 -0
  904. nuitka/tools/testing/compare_with_cpython/__main__.py +942 -0
  905. nuitka/tools/testing/find_sxs_modules/__init__.py +19 -0
  906. nuitka/tools/testing/find_sxs_modules/__main__.py +73 -0
  907. nuitka/tools/testing/measure_construct_performance/__init__.py +19 -0
  908. nuitka/tools/testing/measure_construct_performance/__main__.py +288 -0
  909. nuitka/tools/testing/run_nuitka_tests/__init__.py +19 -0
  910. nuitka/tools/testing/run_nuitka_tests/__main__.py +1091 -0
  911. nuitka/tools/watch/AutoStage.py +145 -0
  912. nuitka/tools/watch/Common.py +55 -0
  913. nuitka/tools/watch/Conda.py +125 -0
  914. nuitka/tools/watch/GitHub.py +113 -0
  915. nuitka/tools/watch/Pacman.py +73 -0
  916. nuitka/tools/watch/Pipenv.py +145 -0
  917. nuitka/tools/watch/__init__.py +19 -0
  918. nuitka/tools/watch/__main__.py +615 -0
  919. nuitka/tree/Building.py +1459 -0
  920. nuitka/tree/ComplexCallHelperFunctions.py +2150 -0
  921. nuitka/tree/Extractions.py +48 -0
  922. nuitka/tree/FutureSpecState.py +71 -0
  923. nuitka/tree/InternalModule.py +96 -0
  924. nuitka/tree/Operations.py +45 -0
  925. nuitka/tree/ReformulationAssertStatements.py +97 -0
  926. nuitka/tree/ReformulationAssignmentStatements.py +1260 -0
  927. nuitka/tree/ReformulationBooleanExpressions.py +97 -0
  928. nuitka/tree/ReformulationCallExpressions.py +314 -0
  929. nuitka/tree/ReformulationClasses.py +407 -0
  930. nuitka/tree/ReformulationClasses3.py +1149 -0
  931. nuitka/tree/ReformulationComparisonExpressions.py +174 -0
  932. nuitka/tree/ReformulationContractionExpressions.py +676 -0
  933. nuitka/tree/ReformulationDictionaryCreation.py +304 -0
  934. nuitka/tree/ReformulationExecStatements.py +386 -0
  935. nuitka/tree/ReformulationForLoopStatements.py +215 -0
  936. nuitka/tree/ReformulationFunctionStatements.py +931 -0
  937. nuitka/tree/ReformulationImportStatements.py +333 -0
  938. nuitka/tree/ReformulationLambdaExpressions.py +185 -0
  939. nuitka/tree/ReformulationMatchStatements.py +797 -0
  940. nuitka/tree/ReformulationMultidist.py +80 -0
  941. nuitka/tree/ReformulationNamespacePackages.py +239 -0
  942. nuitka/tree/ReformulationPrintStatements.py +127 -0
  943. nuitka/tree/ReformulationSequenceCreation.py +438 -0
  944. nuitka/tree/ReformulationSubscriptExpressions.py +123 -0
  945. nuitka/tree/ReformulationTryExceptStatements.py +418 -0
  946. nuitka/tree/ReformulationTryFinallyStatements.py +239 -0
  947. nuitka/tree/ReformulationWhileLoopStatements.py +160 -0
  948. nuitka/tree/ReformulationWithStatements.py +382 -0
  949. nuitka/tree/ReformulationYieldExpressions.py +133 -0
  950. nuitka/tree/SourceHandling.py +476 -0
  951. nuitka/tree/SyntaxErrors.py +143 -0
  952. nuitka/tree/TreeHelpers.py +720 -0
  953. nuitka/tree/VariableClosure.py +483 -0
  954. nuitka/tree/__init__.py +19 -0
  955. nuitka/utils/AppDirs.py +104 -0
  956. nuitka/utils/CStrings.py +208 -0
  957. nuitka/utils/CommandLineOptions.py +207 -0
  958. nuitka/utils/Distributions.py +728 -0
  959. nuitka/utils/Download.py +217 -0
  960. nuitka/utils/Execution.py +517 -0
  961. nuitka/utils/FileOperations.py +1587 -0
  962. nuitka/utils/Hashing.py +137 -0
  963. nuitka/utils/Images.py +79 -0
  964. nuitka/utils/Importing.py +335 -0
  965. nuitka/utils/InlineCopies.py +52 -0
  966. nuitka/utils/InstalledPythons.py +254 -0
  967. nuitka/utils/InstanceCounters.py +86 -0
  968. nuitka/utils/Jinja2.py +158 -0
  969. nuitka/utils/Json.py +40 -0
  970. nuitka/utils/MacOSApp.py +134 -0
  971. nuitka/utils/MemoryUsage.py +165 -0
  972. nuitka/utils/ModuleNames.py +317 -0
  973. nuitka/utils/PackageResources.py +44 -0
  974. nuitka/utils/ReExecute.py +152 -0
  975. nuitka/utils/Rest.py +60 -0
  976. nuitka/utils/SharedLibraries.py +1014 -0
  977. nuitka/utils/Shebang.py +113 -0
  978. nuitka/utils/Signing.py +144 -0
  979. nuitka/utils/SlotMetaClasses.py +57 -0
  980. nuitka/utils/StaticLibraries.py +260 -0
  981. nuitka/utils/ThreadedExecutor.py +87 -0
  982. nuitka/utils/Timing.py +102 -0
  983. nuitka/utils/Utils.py +483 -0
  984. nuitka/utils/WindowsFileUsage.py +337 -0
  985. nuitka/utils/WindowsResources.py +652 -0
  986. nuitka/utils/Yaml.py +247 -0
  987. nuitka/utils/__init__.py +19 -0
  988. nuitka_winsvc-2.7.7.data/scripts/nuitka-run.cmd +24 -0
  989. nuitka_winsvc-2.7.7.data/scripts/nuitka.cmd +30 -0
  990. nuitka_winsvc-2.7.7.dist-info/METADATA +115 -0
  991. nuitka_winsvc-2.7.7.dist-info/RECORD +995 -0
  992. nuitka_winsvc-2.7.7.dist-info/WHEEL +5 -0
  993. nuitka_winsvc-2.7.7.dist-info/entry_points.txt +7 -0
  994. nuitka_winsvc-2.7.7.dist-info/licenses/LICENSE.txt +202 -0
  995. 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.