conan 2.16.1__tar.gz → 2.17.0__tar.gz

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.
Files changed (348) hide show
  1. {conan-2.16.1/conan.egg-info → conan-2.17.0}/PKG-INFO +1 -1
  2. {conan-2.16.1 → conan-2.17.0}/conan/__init__.py +1 -1
  3. {conan-2.16.1 → conan-2.17.0}/conan/api/conan_api.py +4 -3
  4. {conan-2.16.1 → conan-2.17.0}/conan/api/model/list.py +6 -3
  5. {conan-2.16.1 → conan-2.17.0}/conan/api/model/refs.py +1 -1
  6. {conan-2.16.1 → conan-2.17.0}/conan/api/subapi/audit.py +1 -1
  7. {conan-2.16.1 → conan-2.17.0}/conan/api/subapi/cache.py +54 -37
  8. {conan-2.16.1 → conan-2.17.0}/conan/api/subapi/config.py +5 -5
  9. {conan-2.16.1 → conan-2.17.0}/conan/api/subapi/export.py +2 -2
  10. {conan-2.16.1 → conan-2.17.0}/conan/api/subapi/graph.py +12 -6
  11. {conan-2.16.1 → conan-2.17.0}/conan/api/subapi/install.py +2 -2
  12. {conan-2.16.1 → conan-2.17.0}/conan/api/subapi/list.py +29 -3
  13. {conan-2.16.1 → conan-2.17.0}/conan/api/subapi/local.py +3 -3
  14. {conan-2.16.1 → conan-2.17.0}/conan/api/subapi/lockfile.py +1 -1
  15. {conan-2.16.1 → conan-2.17.0}/conan/api/subapi/new.py +3 -1
  16. {conan-2.16.1 → conan-2.17.0}/conan/api/subapi/profiles.py +1 -1
  17. {conan-2.16.1 → conan-2.17.0}/conan/api/subapi/remotes.py +4 -4
  18. {conan-2.16.1 → conan-2.17.0}/conan/api/subapi/upload.py +4 -2
  19. {conan-2.16.1 → conan-2.17.0}/conan/api/subapi/workspace.py +53 -32
  20. {conan-2.16.1 → conan-2.17.0}/conan/cli/commands/audit.py +2 -0
  21. {conan-2.16.1 → conan-2.17.0}/conan/cli/commands/cache.py +31 -6
  22. {conan-2.16.1 → conan-2.17.0}/conan/cli/commands/new.py +1 -1
  23. {conan-2.16.1 → conan-2.17.0}/conan/cli/commands/remote.py +5 -1
  24. {conan-2.16.1 → conan-2.17.0}/conan/cli/commands/test.py +0 -6
  25. {conan-2.16.1 → conan-2.17.0}/conan/cli/commands/workspace.py +21 -0
  26. {conan-2.16.1 → conan-2.17.0}/conan/cli/formatters/audit/vulnerabilities.py +2 -2
  27. {conan-2.16.1 → conan-2.17.0}/conan/cli/formatters/graph/info_graph_html.py +1 -1
  28. {conan-2.16.1 → conan-2.17.0}/conan/cps/cps.py +1 -1
  29. {conan-2.16.1 → conan-2.17.0}/conan/internal/api/audit/providers.py +1 -2
  30. {conan-2.16.1 → conan-2.17.0}/conan/internal/api/config/config_installer.py +33 -17
  31. {conan-2.16.1 → conan-2.17.0}/conan/internal/api/detect/detect_api.py +51 -2
  32. {conan-2.16.1 → conan-2.17.0}/conan/internal/api/detect/detect_vs.py +1 -1
  33. {conan-2.16.1 → conan-2.17.0}/conan/internal/api/export.py +1 -1
  34. {conan-2.16.1 → conan-2.17.0}/conan/internal/api/install/generators.py +3 -3
  35. {conan-2.16.1 → conan-2.17.0}/conan/internal/api/local/editable.py +1 -1
  36. {conan-2.16.1/conans/client → conan-2.17.0/conan/internal/api}/migrations.py +3 -3
  37. {conan-2.16.1 → conan-2.17.0}/conan/internal/api/new/autoools_exe.py +15 -4
  38. conan-2.17.0/conan/internal/api/new/header_lib.py +116 -0
  39. {conan-2.16.1 → conan-2.17.0}/conan/internal/api/new/workspace.py +1 -1
  40. {conan-2.16.1 → conan-2.17.0}/conan/internal/api/profile/profile_loader.py +6 -4
  41. conan-2.17.0/conan/internal/api/upload.py +16 -0
  42. {conan-2.16.1 → conan-2.17.0}/conan/internal/api/uploader.py +26 -10
  43. {conan-2.16.1 → conan-2.17.0}/conan/internal/cache/cache.py +2 -2
  44. {conan-2.16.1 → conan-2.17.0}/conan/internal/cache/conan_reference_layout.py +1 -1
  45. {conan-2.16.1 → conan-2.17.0}/conan/internal/cache/db/packages_table.py +1 -1
  46. {conan-2.16.1 → conan-2.17.0}/conan/internal/cache/db/recipes_table.py +1 -1
  47. {conan-2.16.1 → conan-2.17.0}/conan/internal/conan_app.py +6 -6
  48. {conan-2.16.1 → conan-2.17.0}/conan/internal/default_settings.py +4 -4
  49. {conan-2.16.1 → conan-2.17.0}/conan/internal/deploy.py +2 -2
  50. {conan-2.16.1/conans/client → conan-2.17.0/conan/internal}/graph/compatibility.py +4 -4
  51. {conan-2.16.1/conans/client → conan-2.17.0/conan/internal}/graph/graph.py +5 -3
  52. {conan-2.16.1/conans/client → conan-2.17.0/conan/internal}/graph/graph_binaries.py +10 -10
  53. {conan-2.16.1/conans/client → conan-2.17.0/conan/internal}/graph/graph_builder.py +5 -5
  54. {conan-2.16.1/conans/client → conan-2.17.0/conan/internal}/graph/install_graph.py +2 -2
  55. {conan-2.16.1/conans/client → conan-2.17.0/conan/internal/graph}/installer.py +4 -4
  56. {conan-2.16.1/conans/client → conan-2.17.0/conan/internal}/graph/profile_node_definer.py +1 -1
  57. {conan-2.16.1/conans/client → conan-2.17.0/conan/internal}/graph/provides.py +1 -1
  58. {conan-2.16.1/conans/client → conan-2.17.0/conan/internal}/graph/proxy.py +3 -3
  59. {conan-2.16.1/conans/client → conan-2.17.0/conan/internal}/graph/range_resolver.py +1 -1
  60. {conan-2.16.1/conans/client → conan-2.17.0/conan/internal}/hook_manager.py +1 -1
  61. {conan-2.16.1/conans/client → conan-2.17.0/conan/internal}/loader.py +57 -2
  62. {conan-2.16.1 → conan-2.17.0}/conan/internal/methods.py +1 -1
  63. {conan-2.16.1 → conan-2.17.0}/conan/internal/model/conan_file.py +2 -2
  64. {conan-2.16.1 → conan-2.17.0}/conan/internal/model/conanfile_interface.py +1 -1
  65. {conan-2.16.1 → conan-2.17.0}/conan/internal/model/conf.py +4 -0
  66. {conan-2.16.1 → conan-2.17.0}/conan/internal/model/cpp_info.py +1 -1
  67. {conan-2.16.1 → conan-2.17.0}/conan/internal/model/dependencies.py +1 -1
  68. {conan-2.16.1 → conan-2.17.0}/conan/internal/model/info.py +5 -14
  69. {conan-2.16.1 → conan-2.17.0}/conan/internal/model/lockfile.py +2 -2
  70. {conan-2.16.1 → conan-2.17.0}/conan/internal/model/manifest.py +2 -2
  71. {conan-2.16.1 → conan-2.17.0}/conan/internal/model/workspace.py +32 -18
  72. {conan-2.16.1 → conan-2.17.0}/conan/internal/paths.py +15 -11
  73. {conan-2.16.1/conans/client → conan-2.17.0/conan/internal}/rest/auth_manager.py +2 -2
  74. {conan-2.16.1/conans/client/downloaders → conan-2.17.0/conan/internal/rest}/caching_file_downloader.py +3 -3
  75. {conan-2.16.1/conans/client → conan-2.17.0/conan/internal}/rest/client_routes.py +1 -1
  76. {conan-2.16.1/conans/client → conan-2.17.0/conan/internal}/rest/conan_requester.py +2 -2
  77. {conan-2.16.1/conans/client/downloaders → conan-2.17.0/conan/internal/rest}/download_cache.py +5 -4
  78. {conan-2.16.1/conans/client/downloaders → conan-2.17.0/conan/internal/rest}/file_downloader.py +2 -2
  79. {conan-2.16.1/conans/client → conan-2.17.0/conan/internal}/rest/file_uploader.py +2 -2
  80. {conan-2.16.1/conans/client → conan-2.17.0/conan/internal/rest}/pkg_sign.py +2 -2
  81. {conan-2.16.1/conans/client → conan-2.17.0/conan/internal}/rest/remote_credentials.py +2 -2
  82. {conan-2.16.1/conans/client → conan-2.17.0/conan/internal/rest}/remote_manager.py +4 -4
  83. {conan-2.16.1/conans/client → conan-2.17.0/conan/internal}/rest/rest_client.py +1 -1
  84. {conan-2.16.1/conans/client → conan-2.17.0/conan/internal/rest}/rest_client_local_recipe_index.py +3 -3
  85. {conan-2.16.1/conans/client → conan-2.17.0/conan/internal}/rest/rest_client_v2.py +23 -6
  86. {conan-2.16.1 → conan-2.17.0}/conan/internal/runner/wsl.py +2 -3
  87. {conan-2.16.1/conans/client → conan-2.17.0/conan/internal}/source.py +1 -2
  88. {conan-2.16.1/conans → conan-2.17.0/conan/internal}/util/config_parser.py +1 -1
  89. {conan-2.16.1/conans → conan-2.17.0/conan/internal}/util/dates.py +1 -28
  90. {conan-2.16.1/conans → conan-2.17.0/conan/internal}/util/files.py +0 -61
  91. {conan-2.16.1/conans → conan-2.17.0/conan/internal}/util/runners.py +1 -1
  92. {conan-2.16.1 → conan-2.17.0}/conan/test/utils/file_server.py +1 -1
  93. {conan-2.16.1 → conan-2.17.0}/conan/test/utils/profiles.py +1 -1
  94. {conan-2.16.1 → conan-2.17.0}/conan/test/utils/scm.py +2 -2
  95. {conan-2.16.1 → conan-2.17.0}/conan/test/utils/test_files.py +3 -3
  96. {conan-2.16.1 → conan-2.17.0}/conan/test/utils/tools.py +3 -3
  97. {conan-2.16.1 → conan-2.17.0}/conan/tools/apple/apple.py +1 -1
  98. {conan-2.16.1 → conan-2.17.0}/conan/tools/apple/xcodedeps.py +1 -1
  99. {conan-2.16.1 → conan-2.17.0}/conan/tools/apple/xcodetoolchain.py +1 -1
  100. {conan-2.16.1 → conan-2.17.0}/conan/tools/build/__init__.py +1 -1
  101. {conan-2.16.1 → conan-2.17.0}/conan/tools/build/cpu.py +1 -1
  102. {conan-2.16.1 → conan-2.17.0}/conan/tools/build/cstd.py +16 -0
  103. {conan-2.16.1 → conan-2.17.0}/conan/tools/build/flags.py +14 -0
  104. {conan-2.16.1 → conan-2.17.0}/conan/tools/cmake/cmakedeps2/cmakedeps.py +11 -3
  105. {conan-2.16.1 → conan-2.17.0}/conan/tools/cmake/cmakedeps2/config.py +5 -0
  106. {conan-2.16.1 → conan-2.17.0}/conan/tools/cmake/cmakedeps2/target_configuration.py +12 -7
  107. {conan-2.16.1 → conan-2.17.0}/conan/tools/cmake/layout.py +1 -1
  108. {conan-2.16.1 → conan-2.17.0}/conan/tools/cmake/presets.py +15 -3
  109. {conan-2.16.1 → conan-2.17.0}/conan/tools/cmake/toolchain/blocks.py +2 -2
  110. {conan-2.16.1 → conan-2.17.0}/conan/tools/cmake/toolchain/toolchain.py +2 -2
  111. {conan-2.16.1 → conan-2.17.0}/conan/tools/env/environment.py +2 -2
  112. {conan-2.16.1 → conan-2.17.0}/conan/tools/files/conandata.py +1 -1
  113. {conan-2.16.1 → conan-2.17.0}/conan/tools/files/copy_pattern.py +5 -1
  114. {conan-2.16.1 → conan-2.17.0}/conan/tools/files/files.py +4 -4
  115. {conan-2.16.1 → conan-2.17.0}/conan/tools/files/patches.py +1 -1
  116. {conan-2.16.1 → conan-2.17.0}/conan/tools/gnu/autotools.py +1 -1
  117. {conan-2.16.1 → conan-2.17.0}/conan/tools/gnu/autotoolstoolchain.py +17 -2
  118. {conan-2.16.1 → conan-2.17.0}/conan/tools/gnu/gnudeps_flags.py +1 -1
  119. {conan-2.16.1 → conan-2.17.0}/conan/tools/gnu/gnutoolchain.py +17 -2
  120. {conan-2.16.1 → conan-2.17.0}/conan/tools/gnu/pkgconfigdeps.py +211 -268
  121. {conan-2.16.1 → conan-2.17.0}/conan/tools/google/bazeldeps.py +7 -5
  122. {conan-2.16.1 → conan-2.17.0}/conan/tools/meson/helpers.py +8 -23
  123. {conan-2.16.1 → conan-2.17.0}/conan/tools/meson/toolchain.py +1 -1
  124. {conan-2.16.1 → conan-2.17.0}/conan/tools/microsoft/msbuilddeps.py +1 -1
  125. {conan-2.16.1 → conan-2.17.0}/conan/tools/microsoft/subsystems.py +2 -2
  126. {conan-2.16.1 → conan-2.17.0}/conan/tools/microsoft/toolchain.py +1 -1
  127. {conan-2.16.1 → conan-2.17.0}/conan/tools/microsoft/visual.py +1 -1
  128. {conan-2.16.1 → conan-2.17.0}/conan/tools/premake/premakedeps.py +1 -1
  129. {conan-2.16.1 → conan-2.17.0}/conan/tools/qbs/qbsprofile.py +1 -1
  130. {conan-2.16.1 → conan-2.17.0}/conan/tools/sbom/cyclonedx.py +20 -20
  131. conan-2.17.0/conan/tools/sbom/spdx_licenses.py +1368 -0
  132. {conan-2.16.1 → conan-2.17.0}/conan/tools/scm/git.py +5 -5
  133. {conan-2.16.1 → conan-2.17.0}/conan/tools/scons/sconsdeps.py +1 -1
  134. {conan-2.16.1 → conan-2.17.0}/conan/tools/system/package_manager.py +1 -1
  135. {conan-2.16.1 → conan-2.17.0/conan.egg-info}/PKG-INFO +1 -1
  136. {conan-2.16.1 → conan-2.17.0}/conan.egg-info/SOURCES.txt +44 -46
  137. {conan-2.16.1 → conan-2.17.0}/conans/migrations.py +2 -2
  138. conan-2.16.1/conans/client/loader_txt.py +0 -53
  139. conan-2.16.1/conans/model/__init__.py +0 -0
  140. conan-2.16.1/conans/util/__init__.py +0 -0
  141. conan-2.16.1/conans/util/locks.py +0 -24
  142. conan-2.16.1/conans/util/thread.py +0 -17
  143. {conan-2.16.1 → conan-2.17.0}/LICENSE.md +0 -0
  144. {conan-2.16.1 → conan-2.17.0}/MANIFEST.in +0 -0
  145. {conan-2.16.1 → conan-2.17.0}/README.md +0 -0
  146. {conan-2.16.1 → conan-2.17.0}/conan/api/__init__.py +0 -0
  147. {conan-2.16.1 → conan-2.17.0}/conan/api/input.py +0 -0
  148. {conan-2.16.1 → conan-2.17.0}/conan/api/model/__init__.py +0 -0
  149. {conan-2.16.1 → conan-2.17.0}/conan/api/model/remote.py +0 -0
  150. {conan-2.16.1 → conan-2.17.0}/conan/api/output.py +0 -0
  151. {conan-2.16.1 → conan-2.17.0}/conan/api/subapi/__init__.py +0 -0
  152. {conan-2.16.1 → conan-2.17.0}/conan/api/subapi/command.py +0 -0
  153. {conan-2.16.1 → conan-2.17.0}/conan/api/subapi/download.py +0 -0
  154. {conan-2.16.1 → conan-2.17.0}/conan/api/subapi/remove.py +0 -0
  155. {conan-2.16.1 → conan-2.17.0}/conan/api/subapi/search.py +0 -0
  156. {conan-2.16.1 → conan-2.17.0}/conan/cli/__init__.py +0 -0
  157. {conan-2.16.1 → conan-2.17.0}/conan/cli/args.py +0 -0
  158. {conan-2.16.1 → conan-2.17.0}/conan/cli/cli.py +0 -0
  159. {conan-2.16.1 → conan-2.17.0}/conan/cli/command.py +0 -0
  160. {conan-2.16.1 → conan-2.17.0}/conan/cli/commands/__init__.py +0 -0
  161. {conan-2.16.1 → conan-2.17.0}/conan/cli/commands/build.py +0 -0
  162. {conan-2.16.1 → conan-2.17.0}/conan/cli/commands/config.py +0 -0
  163. {conan-2.16.1 → conan-2.17.0}/conan/cli/commands/create.py +0 -0
  164. {conan-2.16.1 → conan-2.17.0}/conan/cli/commands/download.py +0 -0
  165. {conan-2.16.1 → conan-2.17.0}/conan/cli/commands/editable.py +0 -0
  166. {conan-2.16.1 → conan-2.17.0}/conan/cli/commands/export.py +0 -0
  167. {conan-2.16.1 → conan-2.17.0}/conan/cli/commands/export_pkg.py +0 -0
  168. {conan-2.16.1 → conan-2.17.0}/conan/cli/commands/graph.py +0 -0
  169. {conan-2.16.1 → conan-2.17.0}/conan/cli/commands/inspect.py +0 -0
  170. {conan-2.16.1 → conan-2.17.0}/conan/cli/commands/install.py +0 -0
  171. {conan-2.16.1 → conan-2.17.0}/conan/cli/commands/list.py +0 -0
  172. {conan-2.16.1 → conan-2.17.0}/conan/cli/commands/lock.py +0 -0
  173. {conan-2.16.1 → conan-2.17.0}/conan/cli/commands/pkglist.py +0 -0
  174. {conan-2.16.1 → conan-2.17.0}/conan/cli/commands/profile.py +0 -0
  175. {conan-2.16.1 → conan-2.17.0}/conan/cli/commands/remove.py +0 -0
  176. {conan-2.16.1 → conan-2.17.0}/conan/cli/commands/search.py +0 -0
  177. {conan-2.16.1 → conan-2.17.0}/conan/cli/commands/source.py +0 -0
  178. {conan-2.16.1 → conan-2.17.0}/conan/cli/commands/upload.py +0 -0
  179. {conan-2.16.1 → conan-2.17.0}/conan/cli/commands/version.py +0 -0
  180. {conan-2.16.1 → conan-2.17.0}/conan/cli/exit_codes.py +0 -0
  181. {conan-2.16.1 → conan-2.17.0}/conan/cli/formatters/__init__.py +0 -0
  182. {conan-2.16.1 → conan-2.17.0}/conan/cli/formatters/audit/__init__.py +0 -0
  183. {conan-2.16.1 → conan-2.17.0}/conan/cli/formatters/graph/__init__.py +0 -0
  184. {conan-2.16.1 → conan-2.17.0}/conan/cli/formatters/graph/build_order_html.py +0 -0
  185. {conan-2.16.1 → conan-2.17.0}/conan/cli/formatters/graph/graph.py +0 -0
  186. {conan-2.16.1 → conan-2.17.0}/conan/cli/formatters/graph/graph_info_text.py +0 -0
  187. {conan-2.16.1 → conan-2.17.0}/conan/cli/formatters/graph/info_graph_dot.py +0 -0
  188. {conan-2.16.1 → conan-2.17.0}/conan/cli/formatters/list/__init__.py +0 -0
  189. {conan-2.16.1 → conan-2.17.0}/conan/cli/formatters/list/list.py +0 -0
  190. {conan-2.16.1 → conan-2.17.0}/conan/cli/formatters/list/search_table_html.py +0 -0
  191. {conan-2.16.1 → conan-2.17.0}/conan/cli/printers/__init__.py +0 -0
  192. {conan-2.16.1 → conan-2.17.0}/conan/cli/printers/graph.py +0 -0
  193. {conan-2.16.1 → conan-2.17.0}/conan/cps/__init__.py +0 -0
  194. {conan-2.16.1 → conan-2.17.0}/conan/errors.py +0 -0
  195. {conan-2.16.1 → conan-2.17.0}/conan/internal/__init__.py +0 -0
  196. {conan-2.16.1 → conan-2.17.0}/conan/internal/api/__init__.py +0 -0
  197. {conan-2.16.1 → conan-2.17.0}/conan/internal/api/audit/__init__.py +0 -0
  198. {conan-2.16.1 → conan-2.17.0}/conan/internal/api/config/__init__.py +0 -0
  199. {conan-2.16.1 → conan-2.17.0}/conan/internal/api/detect/__init__.py +0 -0
  200. {conan-2.16.1 → conan-2.17.0}/conan/internal/api/install/__init__.py +0 -0
  201. {conan-2.16.1 → conan-2.17.0}/conan/internal/api/list/__init__.py +0 -0
  202. {conan-2.16.1 → conan-2.17.0}/conan/internal/api/list/query_parse.py +0 -0
  203. {conan-2.16.1 → conan-2.17.0}/conan/internal/api/local/__init__.py +0 -0
  204. {conan-2.16.1 → conan-2.17.0}/conan/internal/api/new/__init__.py +0 -0
  205. {conan-2.16.1 → conan-2.17.0}/conan/internal/api/new/alias_new.py +0 -0
  206. {conan-2.16.1 → conan-2.17.0}/conan/internal/api/new/autotools_lib.py +0 -0
  207. {conan-2.16.1 → conan-2.17.0}/conan/internal/api/new/basic.py +0 -0
  208. {conan-2.16.1 → conan-2.17.0}/conan/internal/api/new/bazel_7_exe.py +0 -0
  209. {conan-2.16.1 → conan-2.17.0}/conan/internal/api/new/bazel_7_lib.py +0 -0
  210. {conan-2.16.1 → conan-2.17.0}/conan/internal/api/new/bazel_exe.py +0 -0
  211. {conan-2.16.1 → conan-2.17.0}/conan/internal/api/new/bazel_lib.py +0 -0
  212. {conan-2.16.1 → conan-2.17.0}/conan/internal/api/new/cmake_exe.py +0 -0
  213. {conan-2.16.1 → conan-2.17.0}/conan/internal/api/new/cmake_lib.py +0 -0
  214. {conan-2.16.1 → conan-2.17.0}/conan/internal/api/new/local_recipes_index.py +0 -0
  215. {conan-2.16.1 → conan-2.17.0}/conan/internal/api/new/meson_exe.py +0 -0
  216. {conan-2.16.1 → conan-2.17.0}/conan/internal/api/new/meson_lib.py +0 -0
  217. {conan-2.16.1 → conan-2.17.0}/conan/internal/api/new/msbuild_exe.py +0 -0
  218. {conan-2.16.1 → conan-2.17.0}/conan/internal/api/new/msbuild_lib.py +0 -0
  219. {conan-2.16.1 → conan-2.17.0}/conan/internal/api/new/qbs_lib.py +0 -0
  220. {conan-2.16.1 → conan-2.17.0}/conan/internal/api/profile/__init__.py +0 -0
  221. {conan-2.16.1 → conan-2.17.0}/conan/internal/api/profile/detect.py +0 -0
  222. {conan-2.16.1 → conan-2.17.0}/conan/internal/api/remotes/__init__.py +0 -0
  223. {conan-2.16.1 → conan-2.17.0}/conan/internal/api/remotes/encrypt.py +0 -0
  224. {conan-2.16.1 → conan-2.17.0}/conan/internal/api/remotes/localdb.py +0 -0
  225. {conan-2.16.1 → conan-2.17.0}/conan/internal/cache/__init__.py +0 -0
  226. {conan-2.16.1 → conan-2.17.0}/conan/internal/cache/db/__init__.py +0 -0
  227. {conan-2.16.1 → conan-2.17.0}/conan/internal/cache/db/cache_database.py +0 -0
  228. {conan-2.16.1 → conan-2.17.0}/conan/internal/cache/db/table.py +0 -0
  229. {conan-2.16.1 → conan-2.17.0}/conan/internal/cache/home_paths.py +0 -0
  230. {conan-2.16.1 → conan-2.17.0}/conan/internal/cache/integrity_check.py +0 -0
  231. {conan-2.16.1 → conan-2.17.0}/conan/internal/errors.py +0 -0
  232. {conan-2.16.1/conan/internal/model → conan-2.17.0/conan/internal/graph}/__init__.py +0 -0
  233. {conan-2.16.1/conans/client → conan-2.17.0/conan/internal}/graph/build_mode.py +0 -0
  234. {conan-2.16.1/conans/client → conan-2.17.0/conan/internal}/graph/compute_pid.py +0 -0
  235. {conan-2.16.1/conans/client → conan-2.17.0/conan/internal}/graph/graph_error.py +0 -0
  236. {conan-2.16.1/conans/client → conan-2.17.0/conan/internal}/graph/python_requires.py +0 -0
  237. {conan-2.16.1 → conan-2.17.0}/conan/internal/internal_tools.py +0 -0
  238. {conan-2.16.1/conan/test → conan-2.17.0/conan/internal/model}/__init__.py +0 -0
  239. {conan-2.16.1 → conan-2.17.0}/conan/internal/model/layout.py +0 -0
  240. {conan-2.16.1 → conan-2.17.0}/conan/internal/model/options.py +0 -0
  241. {conan-2.16.1 → conan-2.17.0}/conan/internal/model/pkg_type.py +0 -0
  242. {conan-2.16.1 → conan-2.17.0}/conan/internal/model/profile.py +0 -0
  243. {conan-2.16.1 → conan-2.17.0}/conan/internal/model/recipe_ref.py +0 -0
  244. {conan-2.16.1 → conan-2.17.0}/conan/internal/model/requires.py +0 -0
  245. {conan-2.16.1 → conan-2.17.0}/conan/internal/model/settings.py +0 -0
  246. {conan-2.16.1 → conan-2.17.0}/conan/internal/model/version.py +0 -0
  247. {conan-2.16.1 → conan-2.17.0}/conan/internal/model/version_range.py +0 -0
  248. {conan-2.16.1/conans/client → conan-2.17.0/conan/internal}/rest/__init__.py +0 -0
  249. {conan-2.16.1/conans/client → conan-2.17.0/conan/internal}/rest/rest_routes.py +0 -0
  250. {conan-2.16.1 → conan-2.17.0}/conan/internal/runner/__init__.py +0 -0
  251. {conan-2.16.1 → conan-2.17.0}/conan/internal/runner/docker.py +0 -0
  252. {conan-2.16.1 → conan-2.17.0}/conan/internal/runner/output.py +0 -0
  253. {conan-2.16.1 → conan-2.17.0}/conan/internal/runner/ssh.py +0 -0
  254. {conan-2.16.1/conans/client → conan-2.17.0/conan/internal}/subsystems.py +0 -0
  255. {conan-2.16.1/conan/test/assets → conan-2.17.0/conan/internal/util}/__init__.py +0 -0
  256. {conan-2.16.1/conan/test/utils → conan-2.17.0/conan/test}/__init__.py +0 -0
  257. {conan-2.16.1/conan/tools/cmake/cmakedeps2 → conan-2.17.0/conan/test/assets}/__init__.py +0 -0
  258. {conan-2.16.1 → conan-2.17.0}/conan/test/assets/autotools.py +0 -0
  259. {conan-2.16.1 → conan-2.17.0}/conan/test/assets/cmake.py +0 -0
  260. {conan-2.16.1 → conan-2.17.0}/conan/test/assets/genconanfile.py +0 -0
  261. {conan-2.16.1 → conan-2.17.0}/conan/test/assets/sources.py +0 -0
  262. {conan-2.16.1 → conan-2.17.0}/conan/test/assets/visual_project_files.py +0 -0
  263. {conan-2.16.1/conan/tools/system → conan-2.17.0/conan/test/utils}/__init__.py +0 -0
  264. {conan-2.16.1 → conan-2.17.0}/conan/test/utils/artifactory.py +0 -0
  265. {conan-2.16.1 → conan-2.17.0}/conan/test/utils/env.py +0 -0
  266. {conan-2.16.1 → conan-2.17.0}/conan/test/utils/mocks.py +0 -0
  267. {conan-2.16.1 → conan-2.17.0}/conan/test/utils/server_launcher.py +0 -0
  268. {conan-2.16.1 → conan-2.17.0}/conan/tools/__init__.py +0 -0
  269. {conan-2.16.1 → conan-2.17.0}/conan/tools/android/__init__.py +0 -0
  270. {conan-2.16.1 → conan-2.17.0}/conan/tools/android/utils.py +0 -0
  271. {conan-2.16.1 → conan-2.17.0}/conan/tools/apple/__init__.py +0 -0
  272. {conan-2.16.1 → conan-2.17.0}/conan/tools/apple/xcodebuild.py +0 -0
  273. {conan-2.16.1 → conan-2.17.0}/conan/tools/build/cppstd.py +0 -0
  274. {conan-2.16.1 → conan-2.17.0}/conan/tools/build/cross_building.py +0 -0
  275. {conan-2.16.1 → conan-2.17.0}/conan/tools/build/stdcpp_library.py +0 -0
  276. {conan-2.16.1 → conan-2.17.0}/conan/tools/cmake/__init__.py +0 -0
  277. {conan-2.16.1 → conan-2.17.0}/conan/tools/cmake/cmake.py +0 -0
  278. {conan-2.16.1 → conan-2.17.0}/conan/tools/cmake/cmakedeps/__init__.py +0 -0
  279. {conan-2.16.1 → conan-2.17.0}/conan/tools/cmake/cmakedeps/cmakedeps.py +0 -0
  280. {conan-2.16.1 → conan-2.17.0}/conan/tools/cmake/cmakedeps/templates/__init__.py +0 -0
  281. {conan-2.16.1 → conan-2.17.0}/conan/tools/cmake/cmakedeps/templates/config.py +0 -0
  282. {conan-2.16.1 → conan-2.17.0}/conan/tools/cmake/cmakedeps/templates/config_version.py +0 -0
  283. {conan-2.16.1 → conan-2.17.0}/conan/tools/cmake/cmakedeps/templates/macros.py +0 -0
  284. {conan-2.16.1 → conan-2.17.0}/conan/tools/cmake/cmakedeps/templates/target_configuration.py +0 -0
  285. {conan-2.16.1 → conan-2.17.0}/conan/tools/cmake/cmakedeps/templates/target_data.py +0 -0
  286. {conan-2.16.1 → conan-2.17.0}/conan/tools/cmake/cmakedeps/templates/targets.py +0 -0
  287. {conan-2.16.1/conans → conan-2.17.0/conan/tools/cmake/cmakedeps2}/__init__.py +0 -0
  288. {conan-2.16.1 → conan-2.17.0}/conan/tools/cmake/cmakedeps2/config_version.py +0 -0
  289. {conan-2.16.1 → conan-2.17.0}/conan/tools/cmake/cmakedeps2/targets.py +0 -0
  290. {conan-2.16.1 → conan-2.17.0}/conan/tools/cmake/toolchain/__init__.py +0 -0
  291. {conan-2.16.1 → conan-2.17.0}/conan/tools/cmake/utils.py +0 -0
  292. {conan-2.16.1 → conan-2.17.0}/conan/tools/cps/__init__.py +0 -0
  293. {conan-2.16.1 → conan-2.17.0}/conan/tools/cps/cps_deps.py +0 -0
  294. {conan-2.16.1 → conan-2.17.0}/conan/tools/env/__init__.py +0 -0
  295. {conan-2.16.1 → conan-2.17.0}/conan/tools/env/virtualbuildenv.py +0 -0
  296. {conan-2.16.1 → conan-2.17.0}/conan/tools/env/virtualrunenv.py +0 -0
  297. {conan-2.16.1 → conan-2.17.0}/conan/tools/files/__init__.py +0 -0
  298. {conan-2.16.1 → conan-2.17.0}/conan/tools/files/packager.py +0 -0
  299. {conan-2.16.1 → conan-2.17.0}/conan/tools/files/symlinks/__init__.py +0 -0
  300. {conan-2.16.1 → conan-2.17.0}/conan/tools/files/symlinks/symlinks.py +0 -0
  301. {conan-2.16.1 → conan-2.17.0}/conan/tools/gnu/__init__.py +0 -0
  302. {conan-2.16.1 → conan-2.17.0}/conan/tools/gnu/autotoolsdeps.py +0 -0
  303. {conan-2.16.1 → conan-2.17.0}/conan/tools/gnu/get_gnu_triplet.py +0 -0
  304. {conan-2.16.1 → conan-2.17.0}/conan/tools/gnu/makedeps.py +0 -0
  305. {conan-2.16.1 → conan-2.17.0}/conan/tools/gnu/pkgconfig.py +0 -0
  306. {conan-2.16.1 → conan-2.17.0}/conan/tools/google/__init__.py +0 -0
  307. {conan-2.16.1 → conan-2.17.0}/conan/tools/google/bazel.py +0 -0
  308. {conan-2.16.1 → conan-2.17.0}/conan/tools/google/layout.py +0 -0
  309. {conan-2.16.1 → conan-2.17.0}/conan/tools/google/toolchain.py +0 -0
  310. {conan-2.16.1 → conan-2.17.0}/conan/tools/intel/__init__.py +0 -0
  311. {conan-2.16.1 → conan-2.17.0}/conan/tools/intel/intel_cc.py +0 -0
  312. {conan-2.16.1 → conan-2.17.0}/conan/tools/layout/__init__.py +0 -0
  313. {conan-2.16.1 → conan-2.17.0}/conan/tools/meson/__init__.py +0 -0
  314. {conan-2.16.1 → conan-2.17.0}/conan/tools/meson/meson.py +0 -0
  315. {conan-2.16.1 → conan-2.17.0}/conan/tools/microsoft/__init__.py +0 -0
  316. {conan-2.16.1 → conan-2.17.0}/conan/tools/microsoft/layout.py +0 -0
  317. {conan-2.16.1 → conan-2.17.0}/conan/tools/microsoft/msbuild.py +0 -0
  318. {conan-2.16.1 → conan-2.17.0}/conan/tools/microsoft/nmakedeps.py +0 -0
  319. {conan-2.16.1 → conan-2.17.0}/conan/tools/microsoft/nmaketoolchain.py +0 -0
  320. {conan-2.16.1 → conan-2.17.0}/conan/tools/premake/__init__.py +0 -0
  321. {conan-2.16.1 → conan-2.17.0}/conan/tools/premake/premake.py +0 -0
  322. {conan-2.16.1 → conan-2.17.0}/conan/tools/qbs/__init__.py +0 -0
  323. {conan-2.16.1 → conan-2.17.0}/conan/tools/qbs/common.py +0 -0
  324. {conan-2.16.1 → conan-2.17.0}/conan/tools/qbs/qbs.py +0 -0
  325. {conan-2.16.1 → conan-2.17.0}/conan/tools/qbs/qbsdeps.py +0 -0
  326. {conan-2.16.1 → conan-2.17.0}/conan/tools/ros/__init__.py +0 -0
  327. {conan-2.16.1 → conan-2.17.0}/conan/tools/ros/rosenv.py +0 -0
  328. {conan-2.16.1 → conan-2.17.0}/conan/tools/sbom/__init__.py +0 -0
  329. {conan-2.16.1 → conan-2.17.0}/conan/tools/scm/__init__.py +0 -0
  330. {conan-2.16.1 → conan-2.17.0}/conan/tools/scons/__init__.py +0 -0
  331. {conan-2.16.1/conans/client → conan-2.17.0/conan/tools/system}/__init__.py +0 -0
  332. {conan-2.16.1 → conan-2.17.0}/conan.egg-info/dependency_links.txt +0 -0
  333. {conan-2.16.1 → conan-2.17.0}/conan.egg-info/entry_points.txt +0 -0
  334. {conan-2.16.1 → conan-2.17.0}/conan.egg-info/requires.txt +0 -0
  335. {conan-2.16.1 → conan-2.17.0}/conan.egg-info/top_level.txt +0 -0
  336. {conan-2.16.1/conans/client/downloaders → conan-2.17.0/conans}/__init__.py +0 -0
  337. {conan-2.16.1 → conan-2.17.0}/conans/conan.py +0 -0
  338. {conan-2.16.1 → conan-2.17.0}/conans/conan_server.py +0 -0
  339. {conan-2.16.1/conans/client/graph → conan-2.17.0/conans/model}/__init__.py +0 -0
  340. {conan-2.16.1 → conan-2.17.0}/conans/model/package_ref.py +0 -0
  341. {conan-2.16.1 → conan-2.17.0}/conans/model/recipe_ref.py +0 -0
  342. {conan-2.16.1 → conan-2.17.0}/conans/requirements.txt +0 -0
  343. {conan-2.16.1 → conan-2.17.0}/conans/requirements_dev.txt +0 -0
  344. {conan-2.16.1 → conan-2.17.0}/conans/requirements_runner.txt +0 -0
  345. {conan-2.16.1 → conan-2.17.0}/conans/requirements_server.txt +0 -0
  346. {conan-2.16.1 → conan-2.17.0}/pyproject.toml +0 -0
  347. {conan-2.16.1 → conan-2.17.0}/setup.cfg +0 -0
  348. {conan-2.16.1 → conan-2.17.0}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: conan
3
- Version: 2.16.1
3
+ Version: 2.17.0
4
4
  Summary: Conan C/C++ package manager
5
5
  Home-page: https://conan.io
6
6
  Author: JFrog LTD
@@ -2,5 +2,5 @@ from conan.internal.model.conan_file import ConanFile
2
2
  from conan.internal.model.workspace import Workspace
3
3
  from conan.internal.model.version import Version
4
4
 
5
- __version__ = '2.16.1'
5
+ __version__ = '2.17.0'
6
6
  conan_version = Version(__version__)
@@ -22,7 +22,7 @@ from conan.api.subapi.search import SearchAPI
22
22
  from conan.api.subapi.upload import UploadAPI
23
23
  from conan.errors import ConanException
24
24
  from conan.internal.paths import get_conan_user_home
25
- from conans.client.migrations import ClientMigrator
25
+ from conan.internal.api.migrations import ClientMigrator
26
26
  from conan.internal.model.version_range import validate_conan_version
27
27
 
28
28
 
@@ -45,8 +45,7 @@ class ConanAPI:
45
45
  raise ConanException("cache_folder has to be an absolute path")
46
46
 
47
47
  init_colorama(sys.stderr)
48
- self.workspace = WorkspaceAPI(self)
49
- self.cache_folder = self.workspace.home_folder() or cache_folder or get_conan_user_home()
48
+ self.cache_folder = cache_folder or get_conan_user_home()
50
49
  self.home_folder = self.cache_folder # Lets call it home, deprecate "cache"
51
50
  self.migrate()
52
51
 
@@ -71,6 +70,8 @@ class ConanAPI:
71
70
  self.lockfile = LockfileAPI(self)
72
71
  self.local = LocalAPI(self)
73
72
  self.audit = AuditAPI(self)
73
+ # Now, lazy loading of editables
74
+ self.workspace = WorkspaceAPI(self)
74
75
 
75
76
  _check_conan_version(self)
76
77
 
@@ -4,13 +4,12 @@ import os
4
4
  from json import JSONDecodeError
5
5
 
6
6
  from conan.api.model import RecipeReference, PkgReference
7
- from conan.cli import make_abs_path
8
7
  from conan.errors import ConanException
9
8
  from conan.internal.errors import NotFoundException
10
9
  from conan.internal.model.version_range import VersionRange
11
- from conans.client.graph.graph import RECIPE_EDITABLE, RECIPE_CONSUMER, RECIPE_PLATFORM, \
10
+ from conan.internal.graph.graph import RECIPE_EDITABLE, RECIPE_CONSUMER, RECIPE_PLATFORM, \
12
11
  RECIPE_VIRTUAL, BINARY_SKIP, BINARY_MISSING, BINARY_INVALID
13
- from conans.util.files import load
12
+ from conan.internal.util.files import load
14
13
 
15
14
 
16
15
  class MultiPackagesList:
@@ -95,6 +94,10 @@ class MultiPackagesList:
95
94
  return mpkglist
96
95
  except JSONDecodeError as e:
97
96
  raise ConanException(f"Graph file invalid JSON: {graphfile}\n{e}")
97
+ except KeyError as e:
98
+ raise ConanException(f'Graph file {graphfile} is missing the required "{e}" key in its contents.\n'
99
+ "Note that the graph file should not be filtered "
100
+ "if you expect to use it with the list command.")
98
101
  except ConanException as e:
99
102
  raise e
100
103
  except Exception as e:
@@ -5,7 +5,7 @@ from functools import total_ordering
5
5
 
6
6
  from conan.errors import ConanException
7
7
  from conan.internal.model.version import Version
8
- from conans.util.dates import timestamp_to_str
8
+ from conan.internal.util.dates import timestamp_to_str
9
9
 
10
10
 
11
11
  @total_ordering
@@ -7,7 +7,7 @@ from conan.internal.api.audit.providers import ConanCenterProvider, PrivateProvi
7
7
  from conan.errors import ConanException
8
8
  from conan.internal.api.remotes.encrypt import encode, decode
9
9
  from conan.internal.model.recipe_ref import RecipeReference
10
- from conans.util.files import save, load
10
+ from conan.internal.util.files import save, load
11
11
 
12
12
  CONAN_CENTER_AUDIT_PROVIDER_NAME = "conancenter"
13
13
  CYPHER_KEY = "private"
@@ -2,19 +2,22 @@ import json
2
2
  import os
3
3
  import shutil
4
4
  import tarfile
5
- from io import BytesIO
5
+ import tempfile
6
6
 
7
7
  from conan.api.model import PackagesList
8
8
  from conan.api.output import ConanOutput
9
+ from conan.internal.api.uploader import compress_files
9
10
  from conan.internal.cache.cache import PkgCache
11
+ from conan.internal.cache.conan_reference_layout import EXPORT_SRC_FOLDER, EXPORT_FOLDER, SRC_FOLDER, \
12
+ METADATA, DOWNLOAD_EXPORT_FOLDER
10
13
  from conan.internal.cache.home_paths import HomePaths
11
14
  from conan.internal.cache.integrity_check import IntegrityChecker
12
- from conans.client.downloaders.download_cache import DownloadCache
15
+ from conan.internal.rest.download_cache import DownloadCache
13
16
  from conan.errors import ConanException
14
17
  from conan.api.model import PkgReference
15
18
  from conan.api.model import RecipeReference
16
- from conans.util.dates import revision_timestamp_now
17
- from conans.util.files import rmdir, gzopen_without_timestamps, mkdir, remove
19
+ from conan.internal.util.dates import revision_timestamp_now
20
+ from conan.internal.util.files import rmdir, mkdir, remove, save
18
21
 
19
22
 
20
23
  class CacheAPI:
@@ -92,6 +95,7 @@ class CacheAPI:
92
95
  # Clean those build folders that didn't succeed to create a package and wont be in DB
93
96
  builds_folder = cache.builds_folder
94
97
  if os.path.isdir(builds_folder):
98
+ ConanOutput().verbose(f"Cleaning temporary folders")
95
99
  for subdir in os.listdir(builds_folder):
96
100
  folder = os.path.join(builds_folder, subdir)
97
101
  manifest = os.path.join(folder, "p", "conanmanifest.txt")
@@ -100,16 +104,19 @@ class CacheAPI:
100
104
  rmdir(folder)
101
105
  if backup_sources:
102
106
  backup_files = self.conan_api.cache.get_backup_sources(package_list, exclude=False, only_upload=False)
107
+ ConanOutput().verbose(f"Cleaning {len(backup_files)} backup sources")
103
108
  for f in backup_files:
104
109
  remove(f)
105
110
 
106
111
  for ref, ref_bundle in package_list.refs().items():
112
+ ConanOutput(ref.repr_notime()).verbose("Cleaning recipe cache contents")
107
113
  ref_layout = cache.recipe_layout(ref)
108
114
  if source:
109
115
  rmdir(ref_layout.source())
110
116
  if download:
111
117
  rmdir(ref_layout.download_export())
112
118
  for pref, _ in package_list.prefs(ref, ref_bundle).items():
119
+ ConanOutput(pref).verbose("Cleaning package cache contents")
113
120
  pref_layout = cache.pkg_layout(pref)
114
121
  if build:
115
122
  rmdir(pref_layout.build())
@@ -118,45 +125,55 @@ class CacheAPI:
118
125
  if download:
119
126
  rmdir(pref_layout.download_package())
120
127
 
121
- def save(self, package_list, tgz_path):
128
+ def save(self, package_list, tgz_path, no_source=False):
122
129
  global_conf = self.conan_api.config.global_conf
123
130
  cache = PkgCache(self.conan_api.cache_folder, global_conf)
124
131
  cache_folder = cache.store # Note, this is not the home, but the actual package cache
125
132
  out = ConanOutput()
126
133
  mkdir(os.path.dirname(tgz_path))
127
- name = os.path.basename(tgz_path)
128
134
  compresslevel = global_conf.get("core.gzip:compresslevel", check_type=int)
129
- with open(tgz_path, "wb") as tgz_handle:
130
- tgz = gzopen_without_timestamps(name, mode="w", fileobj=tgz_handle,
131
- compresslevel=compresslevel)
132
- for ref, ref_bundle in package_list.refs().items():
133
- ref_layout = cache.recipe_layout(ref)
134
- recipe_folder = os.path.relpath(ref_layout.base_folder, cache_folder)
135
- recipe_folder = recipe_folder.replace("\\", "/") # make win paths portable
136
- ref_bundle["recipe_folder"] = recipe_folder
137
- out.info(f"Saving {ref}: {recipe_folder}")
138
- tgz.add(os.path.join(cache_folder, recipe_folder), recipe_folder, recursive=True)
139
- for pref, pref_bundle in package_list.prefs(ref, ref_bundle).items():
140
- pref_layout = cache.pkg_layout(pref)
141
- pkg_folder = pref_layout.package()
142
- folder = os.path.relpath(pkg_folder, cache_folder)
143
- folder = folder.replace("\\", "/") # make win paths portable
144
- pref_bundle["package_folder"] = folder
145
- out.info(f"Saving {pref}: {folder}")
146
- tgz.add(os.path.join(cache_folder, folder), folder, recursive=True)
147
- if os.path.exists(pref_layout.metadata()):
148
- metadata_folder = os.path.relpath(pref_layout.metadata(), cache_folder)
149
- metadata_folder = metadata_folder.replace("\\", "/") # make paths portable
150
- pref_bundle["metadata_folder"] = metadata_folder
151
- out.info(f"Saving {pref} metadata: {metadata_folder}")
152
- tgz.add(os.path.join(cache_folder, metadata_folder), metadata_folder,
153
- recursive=True)
154
- serialized = json.dumps(package_list.serialize(), indent=2)
155
- info = tarfile.TarInfo(name="pkglist.json")
156
- data = serialized.encode('utf-8')
157
- info.size = len(data)
158
- tgz.addfile(tarinfo=info, fileobj=BytesIO(data))
159
- tgz.close()
135
+ tar_files: dict[str,str] = {} # {path_in_tar: abs_path}
136
+
137
+ for ref, ref_bundle in package_list.refs().items():
138
+ ref_layout = cache.recipe_layout(ref)
139
+ recipe_folder = os.path.relpath(ref_layout.base_folder, cache_folder)
140
+ recipe_folder = recipe_folder.replace("\\", "/") # make win paths portable
141
+ ref_bundle["recipe_folder"] = recipe_folder
142
+ out.info(f"Saving {ref}: {recipe_folder}")
143
+ # Package only selected folders, not DOWNLOAD one
144
+ for f in (EXPORT_FOLDER, EXPORT_SRC_FOLDER, SRC_FOLDER):
145
+ if f == SRC_FOLDER and no_source:
146
+ continue
147
+ path = os.path.join(cache_folder, recipe_folder, f)
148
+ if os.path.exists(path):
149
+ tar_files[f"{recipe_folder}/{f}"] = path
150
+ path = os.path.join(cache_folder, recipe_folder, DOWNLOAD_EXPORT_FOLDER, METADATA)
151
+ if os.path.exists(path):
152
+ tar_files[f"{recipe_folder}/{DOWNLOAD_EXPORT_FOLDER}/{METADATA}"] = path
153
+
154
+ for pref, pref_bundle in package_list.prefs(ref, ref_bundle).items():
155
+ pref_layout = cache.pkg_layout(pref)
156
+ pkg_folder = pref_layout.package()
157
+ folder = os.path.relpath(pkg_folder, cache_folder)
158
+ folder = folder.replace("\\", "/") # make win paths portable
159
+ pref_bundle["package_folder"] = folder
160
+ out.info(f"Saving {pref}: {folder}")
161
+ tar_files[folder] = os.path.join(cache_folder, folder)
162
+
163
+ if os.path.exists(pref_layout.metadata()):
164
+ metadata_folder = os.path.relpath(pref_layout.metadata(), cache_folder)
165
+ metadata_folder = metadata_folder.replace("\\", "/") # make paths portable
166
+ pref_bundle["metadata_folder"] = metadata_folder
167
+ out.info(f"Saving {pref} metadata: {metadata_folder}")
168
+ tar_files[metadata_folder] = os.path.join(cache_folder, metadata_folder)
169
+
170
+ # Create a temporary file in order to reuse compress_files functionality
171
+ serialized = json.dumps(package_list.serialize(), indent=2)
172
+ pkglist_path = os.path.join(tempfile.gettempdir(), "pkglist.json")
173
+ save(pkglist_path, serialized)
174
+ tar_files["pkglist.json"] = pkglist_path
175
+ compress_files(tar_files, os.path.basename(tgz_path), os.path.dirname(tgz_path), compresslevel, recursive=True)
176
+ remove(pkglist_path)
160
177
 
161
178
  def restore(self, path):
162
179
  if not os.path.isfile(path):
@@ -12,16 +12,16 @@ from conan.internal.api.detect import detect_api
12
12
  from conan.internal.cache.home_paths import HomePaths
13
13
  from conan.internal.conan_app import ConanApp
14
14
  from conan.internal.default_settings import default_settings_yml
15
- from conans.client.graph.graph import CONTEXT_HOST, RECIPE_VIRTUAL, Node
16
- from conans.client.graph.graph_builder import DepsGraphBuilder
17
- from conans.client.graph.profile_node_definer import consumer_definer
15
+ from conan.internal.graph.graph import CONTEXT_HOST, RECIPE_VIRTUAL, Node
16
+ from conan.internal.graph.graph_builder import DepsGraphBuilder
17
+ from conan.internal.graph.profile_node_definer import consumer_definer
18
18
  from conan.errors import ConanException
19
19
  from conan.internal.model.conf import ConfDefinition, BUILT_IN_CONFS, CORE_CONF_PATTERN
20
20
  from conan.internal.model.pkg_type import PackageType
21
21
  from conan.api.model import RecipeReference
22
22
  from conan.internal.model.settings import Settings
23
- from conans.client.hook_manager import HookManager
24
- from conans.util.files import load, save, rmdir, remove
23
+ from conan.internal.hook_manager import HookManager
24
+ from conan.internal.util.files import load, save, rmdir, remove
25
25
 
26
26
 
27
27
  class ConfigAPI:
@@ -3,9 +3,9 @@ from conan.internal.cache.cache import PkgCache
3
3
  from conan.internal.conan_app import ConanApp
4
4
  from conan.internal.api.export import cmd_export
5
5
  from conan.internal.methods import run_package_method
6
- from conans.client.graph.graph import BINARY_BUILD, RECIPE_INCACHE
6
+ from conan.internal.graph.graph import BINARY_BUILD, RECIPE_INCACHE
7
7
  from conan.api.model import PkgReference
8
- from conans.util.files import mkdir
8
+ from conan.internal.util.files import mkdir
9
9
 
10
10
 
11
11
  class ExportAPI:
@@ -1,12 +1,12 @@
1
1
  from conan.api.output import ConanOutput
2
2
  from conan.internal.conan_app import ConanApp, ConanBasicApp
3
3
  from conan.internal.model.recipe_ref import ref_matches
4
- from conans.client.graph.graph import Node, RECIPE_CONSUMER, CONTEXT_HOST, RECIPE_VIRTUAL, \
5
- CONTEXT_BUILD, BINARY_MISSING
6
- from conans.client.graph.graph_binaries import GraphBinariesAnalyzer
7
- from conans.client.graph.graph_builder import DepsGraphBuilder
8
- from conans.client.graph.install_graph import InstallGraph, ProfileArgs
9
- from conans.client.graph.profile_node_definer import initialize_conanfile_profile, consumer_definer
4
+ from conan.internal.graph.graph import Node, RECIPE_CONSUMER, CONTEXT_HOST, RECIPE_VIRTUAL, \
5
+ CONTEXT_BUILD, BINARY_MISSING, DepsGraph
6
+ from conan.internal.graph.graph_binaries import GraphBinariesAnalyzer
7
+ from conan.internal.graph.graph_builder import DepsGraphBuilder
8
+ from conan.internal.graph.install_graph import InstallGraph, ProfileArgs
9
+ from conan.internal.graph.profile_node_definer import initialize_conanfile_profile, consumer_definer
10
10
  from conan.errors import ConanException
11
11
  from conan.api.model import RecipeReference
12
12
 
@@ -129,6 +129,12 @@ class GraphAPI:
129
129
  update=update,
130
130
  python_requires=python_requires)
131
131
 
132
+ if not requires and not tool_requires and python_requires is not None:
133
+ # This only happens at `conan create` for python-requires, the graph is not needed
134
+ # in fact, it can cause errors, if tool-requires injected
135
+ dep_graph = DepsGraph()
136
+ dep_graph.add_node(root_node)
137
+ return dep_graph
132
138
  # check_updates = args.check_updates if "check_updates" in args else False
133
139
  deps_graph = self.load_graph(root_node, profile_host=profile_host,
134
140
  profile_build=profile_build,
@@ -4,8 +4,8 @@ from conan.internal.api.install.generators import write_generators
4
4
  from conan.internal.conan_app import ConanBasicApp
5
5
  from conan.internal.deploy import do_deploys
6
6
 
7
- from conans.client.graph.install_graph import InstallGraph
8
- from conans.client.installer import BinaryInstaller
7
+ from conan.internal.graph.install_graph import InstallGraph
8
+ from conan.internal.graph.installer import BinaryInstaller
9
9
  from conan.errors import ConanInvalidConfiguration
10
10
 
11
11
 
@@ -14,8 +14,34 @@ from conan.errors import ConanException
14
14
  from conan.internal.model.info import load_binary_info
15
15
  from conan.api.model import PkgReference
16
16
  from conan.api.model import RecipeReference
17
- from conans.util.dates import timelimit
18
- from conans.util.files import load
17
+ from conan.internal.util.dates import timestamp_now
18
+ from conan.internal.util.files import load
19
+
20
+
21
+ def _timelimit(expression):
22
+ """ convert an expression like "2d" (2 days) or "3h" (3 hours) to a timestamp in the past
23
+ with respect to current time
24
+ """
25
+ time_value = expression[:-1]
26
+ try:
27
+ time_value = int(time_value)
28
+ except TypeError:
29
+ raise ConanException(f"Time value '{time_value}' must be an integer")
30
+ time_units = expression[-1]
31
+ units = {"y": 365 * 24 * 60 * 60,
32
+ "M": 30 * 24 * 60 * 60,
33
+ "w": 7 * 24 * 60 * 60,
34
+ "d": 24 * 60 * 60,
35
+ "h": 60 * 60,
36
+ "m": 60,
37
+ "s": 1}
38
+ try:
39
+ lru_value = time_value * units[time_units]
40
+ except KeyError:
41
+ raise ConanException(f"Unrecognized time unit: '{time_units}'. Use: {list(units)}")
42
+
43
+ limit = timestamp_now() - lru_value
44
+ return limit
19
45
 
20
46
 
21
47
  class ListAPI:
@@ -145,7 +171,7 @@ class ListAPI:
145
171
  # Avoid doing a ``search`` of recipes if it is an exact ref and it will be used later
146
172
  search_ref = pattern.search_ref
147
173
  app = ConanBasicApp(self.conan_api)
148
- limit_time = timelimit(lru) if lru else None
174
+ limit_time = _timelimit(lru) if lru else None
149
175
  out = ConanOutput()
150
176
  remote_name = "local cache" if not remote else remote.name
151
177
  if search_ref:
@@ -4,12 +4,12 @@ from conan.cli import make_abs_path
4
4
  from conan.internal.conan_app import ConanApp
5
5
  from conan.internal.api.local.editable import EditablePackages
6
6
  from conan.internal.methods import run_build_method, run_source_method
7
- from conans.client.graph.graph import CONTEXT_HOST
8
- from conans.client.graph.profile_node_definer import initialize_conanfile_profile
7
+ from conan.internal.graph.graph import CONTEXT_HOST
8
+ from conan.internal.graph.profile_node_definer import initialize_conanfile_profile
9
9
  from conan.internal.errors import conanfile_exception_formatter
10
10
  from conan.errors import ConanException
11
11
  from conan.api.model import RecipeReference
12
- from conans.util.files import chdir
12
+ from conan.internal.util.files import chdir
13
13
 
14
14
 
15
15
  class LocalAPI:
@@ -2,7 +2,7 @@ import os
2
2
 
3
3
  from conan.api.output import ConanOutput
4
4
  from conan.cli import make_abs_path
5
- from conans.client.graph.graph import Overrides
5
+ from conan.internal.graph.graph import Overrides
6
6
  from conan.errors import ConanException
7
7
  from conan.internal.model.lockfile import Lockfile, LOCKFILE
8
8
 
@@ -6,7 +6,7 @@ from jinja2 import Template, StrictUndefined, UndefinedError, Environment, meta
6
6
 
7
7
  from conan.api.output import ConanOutput
8
8
  from conan.errors import ConanException
9
- from conans.util.files import load, save
9
+ from conan.internal.util.files import load, save
10
10
  from conan import __version__
11
11
 
12
12
 
@@ -85,6 +85,7 @@ class NewAPI:
85
85
  from conan.internal.api.new.alias_new import alias_file
86
86
  from conan.internal.api.new.cmake_exe import cmake_exe_files
87
87
  from conan.internal.api.new.cmake_lib import cmake_lib_files
88
+ from conan.internal.api.new.header_lib import header_only_lib_files
88
89
  from conan.internal.api.new.meson_lib import meson_lib_files
89
90
  from conan.internal.api.new.meson_exe import meson_exe_files
90
91
  from conan.internal.api.new.msbuild_lib import msbuild_lib_files
@@ -101,6 +102,7 @@ class NewAPI:
101
102
  new_templates = {"basic": basic_file,
102
103
  "cmake_lib": cmake_lib_files,
103
104
  "cmake_exe": cmake_exe_files,
105
+ "header_lib": header_only_lib_files,
104
106
  "meson_lib": meson_lib_files,
105
107
  "meson_exe": meson_exe_files,
106
108
  "msbuild_lib": msbuild_lib_files,
@@ -3,7 +3,7 @@ import os
3
3
  from conan.api.output import ConanOutput
4
4
  from conan.internal.cache.home_paths import HomePaths
5
5
 
6
- from conans.client.loader import load_python_file
6
+ from conan.internal.loader import load_python_file
7
7
  from conan.internal.api.profile.profile_loader import ProfileLoader
8
8
  from conan.internal.errors import scoped_traceback
9
9
  from conan.errors import ConanException
@@ -8,13 +8,13 @@ from conan.api.model import Remote, LOCAL_RECIPES_INDEX
8
8
  from conan.api.output import ConanOutput
9
9
  from conan.internal.cache.home_paths import HomePaths
10
10
  from conan.internal.conan_app import ConanBasicApp
11
- from conans.client.rest.conan_requester import ConanRequester
12
- from conans.client.rest.remote_credentials import RemoteCredentials
13
- from conans.client.rest_client_local_recipe_index import add_local_recipes_index_remote, \
11
+ from conan.internal.rest.conan_requester import ConanRequester
12
+ from conan.internal.rest.remote_credentials import RemoteCredentials
13
+ from conan.internal.rest.rest_client_local_recipe_index import add_local_recipes_index_remote, \
14
14
  remove_local_recipes_index_remote
15
15
  from conan.internal.api.remotes.localdb import LocalDB
16
16
  from conan.errors import ConanException
17
- from conans.util.files import save, load
17
+ from conan.internal.util.files import save, load
18
18
 
19
19
  CONAN_CENTER_REMOTE_NAME = "conancenter"
20
20
 
@@ -3,11 +3,12 @@ import time
3
3
  from multiprocessing.pool import ThreadPool
4
4
 
5
5
  from conan.api.output import ConanOutput
6
+ from conan.internal.api.upload import add_urls
6
7
  from conan.internal.conan_app import ConanApp
7
8
  from conan.internal.api.uploader import PackagePreparator, UploadExecutor, UploadUpstreamChecker, \
8
9
  gather_metadata
9
- from conans.client.pkg_sign import PkgSignaturesPlugin
10
- from conans.client.rest.file_uploader import FileUploader
10
+ from conan.internal.rest.pkg_sign import PkgSignaturesPlugin
11
+ from conan.internal.rest.file_uploader import FileUploader
11
12
  from conan.internal.errors import AuthenticationException, ForbiddenException
12
13
  from conan.errors import ConanException
13
14
 
@@ -99,6 +100,7 @@ class UploadAPI:
99
100
  thread_pool.join()
100
101
  elapsed = time.time() - t
101
102
  ConanOutput().success(f"Upload completed in {int(elapsed)}s\n")
103
+ add_urls(package_list, remote)
102
104
 
103
105
  def upload_backup_sources(self, files):
104
106
  config = self.conan_api.config.global_conf
@@ -1,6 +1,7 @@
1
1
  import inspect
2
2
  import os
3
3
  import shutil
4
+ import textwrap
4
5
  from pathlib import Path
5
6
 
6
7
  from conan import ConanFile
@@ -9,21 +10,24 @@ from conan.api.output import ConanOutput
9
10
  from conan.cli import make_abs_path
10
11
  from conan.errors import ConanException
11
12
  from conan.internal.conan_app import ConanApp
12
- from conan.internal.model.workspace import Workspace
13
+ from conan.internal.model.workspace import Workspace, WORKSPACE_YML, WORKSPACE_PY, WORKSPACE_FOLDER
13
14
  from conan.tools.scm import Git
14
- from conans.client.graph.graph import RECIPE_EDITABLE, DepsGraph, CONTEXT_HOST, RECIPE_VIRTUAL, Node, \
15
+ from conan.internal.graph.graph import RECIPE_EDITABLE, DepsGraph, CONTEXT_HOST, RECIPE_VIRTUAL, Node, \
15
16
  RECIPE_CONSUMER
16
- from conans.client.graph.graph import TransitiveRequirement
17
- from conans.client.graph.profile_node_definer import consumer_definer
18
- from conans.client.loader import load_python_file
19
- from conans.client.source import retrieve_exports_sources
20
- from conans.util.files import merge_directories
17
+ from conan.internal.graph.graph import TransitiveRequirement
18
+ from conan.internal.graph.profile_node_definer import consumer_definer
19
+ from conan.internal.loader import load_python_file
20
+ from conan.internal.source import retrieve_exports_sources
21
+ from conan.internal.util.files import merge_directories, save
21
22
 
22
23
 
23
24
  def _find_ws_folder():
24
25
  path = Path(os.getcwd())
25
- while path.is_dir() and len(path.parts) > 1: # finish at '/'
26
- if (path / "conanws.yml").is_file() or (path / "conanws.py").is_file():
26
+ while path.is_dir() and len(path.parts) > 1: # finish at '/' or 'conanws/'
27
+ if path.name == WORKSPACE_FOLDER:
28
+ if (path / WORKSPACE_YML).is_file() or (path / WORKSPACE_PY).is_file():
29
+ return str(path)
30
+ if (path / WORKSPACE_YML).is_file() or (path / WORKSPACE_PY).is_file():
27
31
  return str(path)
28
32
  else:
29
33
  path = path.parent
@@ -32,10 +36,10 @@ def _find_ws_folder():
32
36
  def _load_workspace(ws_folder, conan_api):
33
37
  """ loads a conanfile basic object without evaluating anything, returns the module too
34
38
  """
35
- wspy = os.path.join(ws_folder, "conanws.py")
39
+ wspy = os.path.join(ws_folder, WORKSPACE_PY)
36
40
  if not os.path.isfile(wspy):
37
- ConanOutput().info(f"conanws.py doesn't exist in {ws_folder}, using default behavior")
38
- assert os.path.exists(os.path.join(ws_folder, "conanws.yml"))
41
+ ConanOutput().info(f"{WORKSPACE_PY} doesn't exist in {ws_folder}, using default behavior")
42
+ assert os.path.exists(os.path.join(ws_folder, WORKSPACE_YML))
39
43
  ws = Workspace(ws_folder, conan_api)
40
44
  else:
41
45
  try:
@@ -43,7 +47,7 @@ def _load_workspace(ws_folder, conan_api):
43
47
  ws = _parse_module(module, module_id)
44
48
  ws = ws(ws_folder, conan_api)
45
49
  except ConanException as e:
46
- raise ConanException(f"Error loading conanws.py at '{wspy}': {e}")
50
+ raise ConanException(f"Error loading {WORKSPACE_PY} at '{wspy}': {e}")
47
51
  return ws
48
52
 
49
53
 
@@ -86,17 +90,6 @@ class WorkspaceAPI:
86
90
  self._check_ws()
87
91
  return self._ws.name()
88
92
 
89
- def home_folder(self):
90
- """
91
- @return: The custom defined Conan home/cache folder if defined, else None
92
- """
93
- if not self._folder:
94
- return
95
- folder = self._ws.home_folder()
96
- if folder is None or os.path.isabs(folder):
97
- return folder
98
- return os.path.normpath(os.path.join(self._folder, folder))
99
-
100
93
  def folder(self):
101
94
  """
102
95
  @return: the current workspace folder where the conanws.yml or conanws.py is located
@@ -110,7 +103,7 @@ class WorkspaceAPI:
110
103
  """
111
104
  if not self._folder:
112
105
  return
113
- editables = self._ws.editables()
106
+ editables = self._ws.packages()
114
107
  editables = {RecipeReference.loads(r): v.copy() for r, v in editables.items()}
115
108
  for v in editables.values():
116
109
  path = os.path.normpath(os.path.join(self._folder, v["path"], "conanfile.py"))
@@ -170,8 +163,8 @@ class WorkspaceAPI:
170
163
 
171
164
  def _check_ws(self):
172
165
  if not self._folder:
173
- raise ConanException("Workspace not defined, please create a "
174
- "'conanws.py' or 'conanws.yml' file")
166
+ raise ConanException(f"Workspace not defined, please create a "
167
+ f"'{WORKSPACE_PY}' or '{WORKSPACE_YML}' file")
175
168
 
176
169
  def add(self, path, name=None, version=None, user=None, channel=None, cwd=None,
177
170
  output_folder=None, remotes=None, product=False):
@@ -201,29 +194,57 @@ class WorkspaceAPI:
201
194
  self._ws.add(ref, full_path, output_folder, product)
202
195
  return ref
203
196
 
197
+ @staticmethod
198
+ def init(path):
199
+ abs_path = make_abs_path(path)
200
+ os.makedirs(abs_path, exist_ok=True)
201
+ ws_yml_file = Path(abs_path, WORKSPACE_YML)
202
+ ws_py_file = Path(abs_path, WORKSPACE_PY)
203
+ if not ws_yml_file.exists():
204
+ ConanOutput().success(f"Created empty {WORKSPACE_YML} in {path}")
205
+ save(ws_yml_file, "")
206
+ if not ws_py_file.exists():
207
+ ConanOutput().success(f"Created minimal {WORKSPACE_PY} in {path}")
208
+ ws_name = os.path.basename(abs_path)
209
+ save(ws_py_file, textwrap.dedent(f'''\
210
+ from conan import Workspace
211
+
212
+ class MyWorkspace(Workspace):
213
+ """
214
+ Minimal Workspace class definition.
215
+ More info: https://docs.conan.io/2/incubating.html#workspaces
216
+ """
217
+ def name(self):
218
+ return "{ws_name}"
219
+ '''))
220
+
204
221
  def remove(self, path):
205
222
  self._check_ws()
206
223
  return self._ws.remove(path)
207
224
 
225
+ def clean(self):
226
+ self._check_ws()
227
+ return self._ws.clean()
228
+
208
229
  def info(self):
209
230
  self._check_ws()
210
231
  return {"name": self.name,
211
232
  "folder": self._folder,
212
233
  "products": self.products,
213
- "editables": self._ws.editables()}
234
+ "packages": self._ws.packages()}
214
235
 
215
236
  def editable_from_path(self, path):
216
- editables = self._ws.editables()
237
+ editables = self._ws.packages()
217
238
  for ref, info in editables.items():
218
239
  if info["path"].replace("\\", "/") == path:
219
240
  return RecipeReference.loads(ref)
220
241
 
221
242
  def collapse_editables(self, deps_graph, profile_host, profile_build):
222
- ConanOutput().title(f"Collapsing workspace editables")
243
+ ConanOutput().title("Collapsing workspace editables")
223
244
 
224
245
  root_class = self._ws.root_conanfile()
225
246
  if root_class is not None:
226
- conanfile = root_class("conanws.py base project Conanfile")
247
+ conanfile = root_class(f"{WORKSPACE_PY} base project Conanfile")
227
248
  consumer_definer(conanfile, profile_host, profile_build)
228
249
  root = Node(None, conanfile, context=CONTEXT_HOST, recipe=RECIPE_CONSUMER,
229
250
  path=self._folder) # path lets use the conanws.py folder
@@ -233,7 +254,7 @@ class WorkspaceAPI:
233
254
  if getattr(conanfile, field, None):
234
255
  raise ConanException(f"Conanfile in conanws.py shouldn't have '{field}'")
235
256
  else:
236
- ConanOutput().info("Workspace conanfilews.py not found in the workspace folder, "
257
+ ConanOutput().info(f"Workspace {WORKSPACE_PY} not found in the workspace folder, "
237
258
  "using default behavior")
238
259
  conanfile = ConanFile(display_name="cli")
239
260
  consumer_definer(conanfile, profile_host, profile_build)