conan 2.11.0__tar.gz → 2.12.1__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 (343) hide show
  1. {conan-2.11.0/conan.egg-info → conan-2.12.1}/PKG-INFO +3 -1
  2. {conan-2.11.0 → conan-2.12.1}/README.md +2 -0
  3. conan-2.12.1/conan/__init__.py +5 -0
  4. {conan-2.11.0 → conan-2.12.1}/conan/api/conan_api.py +36 -12
  5. conan-2.12.1/conan/api/model/__init__.py +3 -0
  6. conan-2.11.0/conan/api/model.py → conan-2.12.1/conan/api/model/list.py +4 -38
  7. conan-2.11.0/conans/model/recipe_ref.py → conan-2.12.1/conan/api/model/refs.py +100 -6
  8. conan-2.12.1/conan/api/model/remote.py +39 -0
  9. {conan-2.11.0 → conan-2.12.1}/conan/api/output.py +10 -6
  10. {conan-2.11.0 → conan-2.12.1}/conan/api/subapi/cache.py +2 -2
  11. {conan-2.11.0 → conan-2.12.1}/conan/api/subapi/config.py +56 -10
  12. {conan-2.11.0 → conan-2.12.1}/conan/api/subapi/download.py +2 -2
  13. {conan-2.11.0 → conan-2.12.1}/conan/api/subapi/export.py +1 -1
  14. {conan-2.11.0 → conan-2.12.1}/conan/api/subapi/graph.py +16 -4
  15. {conan-2.11.0 → conan-2.12.1}/conan/api/subapi/install.py +5 -1
  16. {conan-2.11.0 → conan-2.12.1}/conan/api/subapi/list.py +12 -7
  17. {conan-2.11.0 → conan-2.12.1}/conan/api/subapi/local.py +4 -1
  18. {conan-2.11.0 → conan-2.12.1}/conan/api/subapi/lockfile.py +10 -1
  19. {conan-2.11.0 → conan-2.12.1}/conan/api/subapi/new.py +3 -1
  20. {conan-2.11.0 → conan-2.12.1}/conan/api/subapi/profiles.py +1 -1
  21. {conan-2.11.0 → conan-2.12.1}/conan/api/subapi/remotes.py +29 -17
  22. {conan-2.11.0 → conan-2.12.1}/conan/api/subapi/remove.py +11 -9
  23. {conan-2.11.0 → conan-2.12.1}/conan/api/subapi/search.py +2 -2
  24. {conan-2.11.0 → conan-2.12.1}/conan/api/subapi/upload.py +2 -3
  25. {conan-2.11.0 → conan-2.12.1}/conan/api/subapi/workspace.py +33 -7
  26. {conan-2.11.0 → conan-2.12.1}/conan/cli/args.py +6 -2
  27. {conan-2.11.0 → conan-2.12.1}/conan/cli/command.py +14 -15
  28. {conan-2.11.0 → conan-2.12.1}/conan/cli/commands/cache.py +2 -2
  29. {conan-2.11.0 → conan-2.12.1}/conan/cli/commands/config.py +10 -0
  30. {conan-2.11.0 → conan-2.12.1}/conan/cli/commands/graph.py +4 -15
  31. {conan-2.11.0 → conan-2.12.1}/conan/cli/commands/lock.py +6 -13
  32. {conan-2.11.0 → conan-2.12.1}/conan/cli/commands/new.py +1 -1
  33. {conan-2.11.0 → conan-2.12.1}/conan/cli/commands/profile.py +22 -13
  34. {conan-2.11.0 → conan-2.12.1}/conan/cli/commands/test.py +1 -1
  35. {conan-2.11.0 → conan-2.12.1}/conan/cli/commands/workspace.py +65 -2
  36. {conan-2.11.0 → conan-2.12.1}/conan/cps/cps.py +1 -1
  37. {conan-2.11.0 → conan-2.12.1}/conan/internal/api/config/config_installer.py +1 -3
  38. {conan-2.11.0 → conan-2.12.1}/conan/internal/api/detect/detect_api.py +1 -1
  39. {conan-2.11.0 → conan-2.12.1}/conan/internal/api/export.py +2 -2
  40. {conan-2.11.0 → conan-2.12.1}/conan/internal/api/local/editable.py +1 -1
  41. conan-2.12.1/conan/internal/api/new/workspace.py +33 -0
  42. {conan-2.11.0 → conan-2.12.1}/conan/internal/api/profile/profile_loader.py +4 -4
  43. {conan-2.11.0 → conan-2.12.1}/conan/internal/cache/cache.py +2 -2
  44. {conan-2.11.0 → conan-2.12.1}/conan/internal/cache/conan_reference_layout.py +1 -1
  45. {conan-2.11.0 → conan-2.12.1}/conan/internal/cache/db/cache_database.py +3 -3
  46. {conan-2.11.0 → conan-2.12.1}/conan/internal/cache/db/packages_table.py +2 -2
  47. {conan-2.11.0 → conan-2.12.1}/conan/internal/cache/db/recipes_table.py +1 -1
  48. {conan-2.11.0 → conan-2.12.1}/conan/internal/cache/db/table.py +2 -2
  49. {conan-2.11.0 → conan-2.12.1}/conan/internal/cache/integrity_check.py +12 -4
  50. {conan-2.11.0 → conan-2.12.1}/conan/internal/conan_app.py +3 -7
  51. {conan-2.11.0 → conan-2.12.1}/conan/internal/deploy.py +2 -2
  52. {conan-2.11.0 → conan-2.12.1}/conan/internal/methods.py +4 -4
  53. {conan-2.11.0/conans → conan-2.12.1/conan/internal}/model/conan_file.py +13 -7
  54. {conan-2.11.0/conans → conan-2.12.1/conan/internal}/model/conf.py +6 -1
  55. conan-2.11.0/conans/model/build_info.py → conan-2.12.1/conan/internal/model/cpp_info.py +61 -33
  56. {conan-2.11.0/conans → conan-2.12.1/conan/internal}/model/dependencies.py +7 -5
  57. {conan-2.11.0/conans → conan-2.12.1/conan/internal}/model/info.py +4 -4
  58. {conan-2.11.0/conans → conan-2.12.1/conan/internal}/model/layout.py +2 -2
  59. conan-2.11.0/conans/model/graph_lock.py → conan-2.12.1/conan/internal/model/lockfile.py +2 -2
  60. {conan-2.11.0/conans → conan-2.12.1/conan/internal}/model/options.py +1 -1
  61. {conan-2.11.0/conans → conan-2.12.1/conan/internal}/model/profile.py +3 -3
  62. conan-2.12.1/conan/internal/model/recipe_ref.py +8 -0
  63. {conan-2.11.0/conans → conan-2.12.1/conan/internal}/model/requires.py +6 -4
  64. {conan-2.11.0/conans → conan-2.12.1/conan/internal}/model/version_range.py +1 -1
  65. {conan-2.11.0 → conan-2.12.1}/conan/internal/runner/docker.py +1 -3
  66. {conan-2.11.0 → conan-2.12.1}/conan/internal/workspace.py +36 -9
  67. {conan-2.11.0 → conan-2.12.1}/conan/test/assets/genconanfile.py +1 -1
  68. {conan-2.11.0 → conan-2.12.1}/conan/test/assets/pkg_cmake.py +1 -1
  69. {conan-2.11.0 → conan-2.12.1}/conan/test/utils/mocks.py +3 -3
  70. {conan-2.11.0 → conan-2.12.1}/conan/test/utils/profiles.py +2 -2
  71. {conan-2.11.0 → conan-2.12.1}/conan/test/utils/tools.py +15 -5
  72. {conan-2.11.0 → conan-2.12.1}/conan/tools/__init__.py +1 -1
  73. {conan-2.11.0 → conan-2.12.1}/conan/tools/apple/xcodedeps.py +1 -1
  74. {conan-2.11.0 → conan-2.12.1}/conan/tools/build/cppstd.py +1 -1
  75. {conan-2.11.0 → conan-2.12.1}/conan/tools/build/cstd.py +1 -1
  76. {conan-2.11.0 → conan-2.12.1}/conan/tools/build/flags.py +1 -1
  77. {conan-2.11.0 → conan-2.12.1}/conan/tools/cmake/__init__.py +1 -1
  78. {conan-2.11.0 → conan-2.12.1}/conan/tools/cmake/cmakedeps/cmakedeps.py +1 -1
  79. {conan-2.11.0 → conan-2.12.1}/conan/tools/cmake/cmakedeps2/cmakedeps.py +7 -2
  80. {conan-2.11.0 → conan-2.12.1}/conan/tools/cmake/cmakedeps2/target_configuration.py +9 -10
  81. {conan-2.11.0 → conan-2.12.1}/conan/tools/cmake/presets.py +2 -1
  82. {conan-2.11.0 → conan-2.12.1}/conan/tools/cmake/toolchain/blocks.py +6 -2
  83. {conan-2.11.0 → conan-2.12.1}/conan/tools/cmake/toolchain/toolchain.py +12 -2
  84. {conan-2.11.0 → conan-2.12.1}/conan/tools/env/environment.py +2 -3
  85. {conan-2.11.0 → conan-2.12.1}/conan/tools/files/conandata.py +3 -0
  86. {conan-2.11.0 → conan-2.12.1}/conan/tools/files/files.py +12 -25
  87. {conan-2.11.0 → conan-2.12.1}/conan/tools/files/patches.py +58 -23
  88. {conan-2.11.0 → conan-2.12.1}/conan/tools/gnu/autotoolstoolchain.py +2 -2
  89. {conan-2.11.0 → conan-2.12.1}/conan/tools/gnu/gnutoolchain.py +3 -3
  90. {conan-2.11.0 → conan-2.12.1}/conan/tools/gnu/pkgconfigdeps.py +53 -49
  91. {conan-2.11.0 → conan-2.12.1}/conan/tools/google/bazeldeps.py +2 -2
  92. {conan-2.11.0 → conan-2.12.1}/conan/tools/meson/helpers.py +1 -1
  93. {conan-2.11.0 → conan-2.12.1}/conan/tools/meson/toolchain.py +6 -4
  94. {conan-2.11.0 → conan-2.12.1}/conan/tools/microsoft/msbuilddeps.py +1 -1
  95. {conan-2.11.0 → conan-2.12.1}/conan/tools/qbs/qbsdeps.py +1 -1
  96. conan-2.12.1/conan/tools/sbom/cyclonedx.py +76 -0
  97. conan-2.12.1/conan/tools/scm/__init__.py +2 -0
  98. {conan-2.11.0 → conan-2.12.1}/conan/tools/scm/git.py +4 -2
  99. {conan-2.11.0 → conan-2.12.1/conan.egg-info}/PKG-INFO +3 -1
  100. {conan-2.11.0 → conan-2.12.1}/conan.egg-info/SOURCES.txt +26 -19
  101. {conan-2.11.0 → conan-2.12.1}/conan.egg-info/requires.txt +2 -2
  102. {conan-2.11.0 → conan-2.12.1}/conans/client/graph/build_mode.py +1 -1
  103. {conan-2.11.0 → conan-2.12.1}/conans/client/graph/compatibility.py +38 -20
  104. {conan-2.11.0 → conan-2.12.1}/conans/client/graph/compute_pid.py +1 -1
  105. {conan-2.11.0 → conan-2.12.1}/conans/client/graph/graph.py +24 -3
  106. {conan-2.11.0 → conan-2.12.1}/conans/client/graph/graph_binaries.py +3 -3
  107. {conan-2.11.0 → conan-2.12.1}/conans/client/graph/graph_builder.py +8 -6
  108. {conan-2.11.0 → conan-2.12.1}/conans/client/graph/install_graph.py +4 -5
  109. {conan-2.11.0 → conan-2.12.1}/conans/client/graph/profile_node_definer.py +1 -1
  110. {conan-2.11.0 → conan-2.12.1}/conans/client/graph/provides.py +1 -1
  111. {conan-2.11.0 → conan-2.12.1}/conans/client/graph/python_requires.py +2 -2
  112. {conan-2.11.0 → conan-2.12.1}/conans/client/graph/range_resolver.py +2 -2
  113. {conan-2.11.0 → conan-2.12.1}/conans/client/installer.py +2 -2
  114. {conan-2.11.0 → conan-2.12.1}/conans/client/loader.py +4 -4
  115. {conan-2.11.0 → conan-2.12.1}/conans/client/migrations.py +1 -1
  116. {conan-2.11.0 → conan-2.12.1}/conans/client/remote_manager.py +18 -5
  117. {conan-2.11.0 → conan-2.12.1}/conans/client/rest/auth_manager.py +5 -2
  118. {conan-2.11.0 → conan-2.12.1}/conans/client/rest/client_routes.py +2 -2
  119. {conan-2.11.0 → conan-2.12.1}/conans/client/rest/conan_requester.py +9 -13
  120. {conan-2.11.0 → conan-2.12.1}/conans/client/rest/file_uploader.py +21 -21
  121. {conan-2.11.0 → conan-2.12.1}/conans/client/rest/rest_client_v2.py +2 -2
  122. {conan-2.11.0 → conan-2.12.1}/conans/client/rest_client_local_recipe_index.py +2 -2
  123. {conan-2.11.0 → conan-2.12.1}/conans/migrations.py +1 -1
  124. conan-2.12.1/conans/model/__init__.py +0 -0
  125. conan-2.12.1/conans/model/package_ref.py +30 -0
  126. conan-2.12.1/conans/model/recipe_ref.py +31 -0
  127. {conan-2.11.0 → conan-2.12.1}/conans/requirements_dev.txt +2 -2
  128. {conan-2.11.0 → conan-2.12.1}/conans/requirements_server.txt +1 -1
  129. conan-2.12.1/conans/util/__init__.py +0 -0
  130. conan-2.11.0/conan/__init__.py +0 -5
  131. conan-2.11.0/conan/cli/formatters/list/binary_html_table.py +0 -141
  132. conan-2.11.0/conan/tools/scm/__init__.py +0 -2
  133. conan-2.11.0/conans/model/package_ref.py +0 -104
  134. {conan-2.11.0 → conan-2.12.1}/LICENSE.md +0 -0
  135. {conan-2.11.0 → conan-2.12.1}/MANIFEST.in +0 -0
  136. {conan-2.11.0 → conan-2.12.1}/conan/api/__init__.py +0 -0
  137. {conan-2.11.0 → conan-2.12.1}/conan/api/input.py +0 -0
  138. {conan-2.11.0 → conan-2.12.1}/conan/api/subapi/__init__.py +0 -0
  139. {conan-2.11.0 → conan-2.12.1}/conan/api/subapi/command.py +0 -0
  140. {conan-2.11.0 → conan-2.12.1}/conan/cli/__init__.py +0 -0
  141. {conan-2.11.0 → conan-2.12.1}/conan/cli/cli.py +0 -0
  142. {conan-2.11.0 → conan-2.12.1}/conan/cli/commands/__init__.py +0 -0
  143. {conan-2.11.0 → conan-2.12.1}/conan/cli/commands/build.py +0 -0
  144. {conan-2.11.0 → conan-2.12.1}/conan/cli/commands/create.py +0 -0
  145. {conan-2.11.0 → conan-2.12.1}/conan/cli/commands/download.py +0 -0
  146. {conan-2.11.0 → conan-2.12.1}/conan/cli/commands/editable.py +0 -0
  147. {conan-2.11.0 → conan-2.12.1}/conan/cli/commands/export.py +0 -0
  148. {conan-2.11.0 → conan-2.12.1}/conan/cli/commands/export_pkg.py +0 -0
  149. {conan-2.11.0 → conan-2.12.1}/conan/cli/commands/inspect.py +0 -0
  150. {conan-2.11.0 → conan-2.12.1}/conan/cli/commands/install.py +0 -0
  151. {conan-2.11.0 → conan-2.12.1}/conan/cli/commands/list.py +0 -0
  152. {conan-2.11.0 → conan-2.12.1}/conan/cli/commands/pkglist.py +0 -0
  153. {conan-2.11.0 → conan-2.12.1}/conan/cli/commands/remote.py +0 -0
  154. {conan-2.11.0 → conan-2.12.1}/conan/cli/commands/remove.py +0 -0
  155. {conan-2.11.0 → conan-2.12.1}/conan/cli/commands/search.py +0 -0
  156. {conan-2.11.0 → conan-2.12.1}/conan/cli/commands/source.py +0 -0
  157. {conan-2.11.0 → conan-2.12.1}/conan/cli/commands/upload.py +0 -0
  158. {conan-2.11.0 → conan-2.12.1}/conan/cli/commands/version.py +0 -0
  159. {conan-2.11.0 → conan-2.12.1}/conan/cli/exit_codes.py +0 -0
  160. {conan-2.11.0 → conan-2.12.1}/conan/cli/formatters/__init__.py +0 -0
  161. {conan-2.11.0 → conan-2.12.1}/conan/cli/formatters/graph/__init__.py +0 -0
  162. {conan-2.11.0 → conan-2.12.1}/conan/cli/formatters/graph/build_order_html.py +0 -0
  163. {conan-2.11.0 → conan-2.12.1}/conan/cli/formatters/graph/graph.py +0 -0
  164. {conan-2.11.0 → conan-2.12.1}/conan/cli/formatters/graph/graph_info_text.py +0 -0
  165. {conan-2.11.0 → conan-2.12.1}/conan/cli/formatters/graph/info_graph_dot.py +0 -0
  166. {conan-2.11.0 → conan-2.12.1}/conan/cli/formatters/graph/info_graph_html.py +0 -0
  167. {conan-2.11.0 → conan-2.12.1}/conan/cli/formatters/list/__init__.py +0 -0
  168. {conan-2.11.0 → conan-2.12.1}/conan/cli/formatters/list/list.py +0 -0
  169. {conan-2.11.0 → conan-2.12.1}/conan/cli/formatters/list/search_table_html.py +0 -0
  170. {conan-2.11.0 → conan-2.12.1}/conan/cli/printers/__init__.py +0 -0
  171. {conan-2.11.0 → conan-2.12.1}/conan/cli/printers/graph.py +0 -0
  172. {conan-2.11.0 → conan-2.12.1}/conan/cps/__init__.py +0 -0
  173. {conan-2.11.0 → conan-2.12.1}/conan/errors.py +0 -0
  174. {conan-2.11.0 → conan-2.12.1}/conan/internal/__init__.py +0 -0
  175. {conan-2.11.0 → conan-2.12.1}/conan/internal/api/__init__.py +0 -0
  176. {conan-2.11.0 → conan-2.12.1}/conan/internal/api/config/__init__.py +0 -0
  177. {conan-2.11.0 → conan-2.12.1}/conan/internal/api/detect/__init__.py +0 -0
  178. {conan-2.11.0 → conan-2.12.1}/conan/internal/api/detect/detect_vs.py +0 -0
  179. {conan-2.11.0 → conan-2.12.1}/conan/internal/api/install/__init__.py +0 -0
  180. {conan-2.11.0 → conan-2.12.1}/conan/internal/api/install/generators.py +0 -0
  181. {conan-2.11.0 → conan-2.12.1}/conan/internal/api/list/__init__.py +0 -0
  182. {conan-2.11.0 → conan-2.12.1}/conan/internal/api/list/query_parse.py +0 -0
  183. {conan-2.11.0 → conan-2.12.1}/conan/internal/api/local/__init__.py +0 -0
  184. {conan-2.11.0 → conan-2.12.1}/conan/internal/api/new/__init__.py +0 -0
  185. {conan-2.11.0 → conan-2.12.1}/conan/internal/api/new/alias_new.py +0 -0
  186. {conan-2.11.0 → conan-2.12.1}/conan/internal/api/new/autoools_exe.py +0 -0
  187. {conan-2.11.0 → conan-2.12.1}/conan/internal/api/new/autotools_lib.py +0 -0
  188. {conan-2.11.0 → conan-2.12.1}/conan/internal/api/new/basic.py +0 -0
  189. {conan-2.11.0 → conan-2.12.1}/conan/internal/api/new/bazel_7_exe.py +0 -0
  190. {conan-2.11.0 → conan-2.12.1}/conan/internal/api/new/bazel_7_lib.py +0 -0
  191. {conan-2.11.0 → conan-2.12.1}/conan/internal/api/new/bazel_exe.py +0 -0
  192. {conan-2.11.0 → conan-2.12.1}/conan/internal/api/new/bazel_lib.py +0 -0
  193. {conan-2.11.0 → conan-2.12.1}/conan/internal/api/new/cmake_exe.py +0 -0
  194. {conan-2.11.0 → conan-2.12.1}/conan/internal/api/new/cmake_lib.py +0 -0
  195. {conan-2.11.0 → conan-2.12.1}/conan/internal/api/new/local_recipes_index.py +0 -0
  196. {conan-2.11.0 → conan-2.12.1}/conan/internal/api/new/meson_exe.py +0 -0
  197. {conan-2.11.0 → conan-2.12.1}/conan/internal/api/new/meson_lib.py +0 -0
  198. {conan-2.11.0 → conan-2.12.1}/conan/internal/api/new/msbuild_exe.py +0 -0
  199. {conan-2.11.0 → conan-2.12.1}/conan/internal/api/new/msbuild_lib.py +0 -0
  200. {conan-2.11.0 → conan-2.12.1}/conan/internal/api/new/qbs_lib.py +0 -0
  201. {conan-2.11.0 → conan-2.12.1}/conan/internal/api/profile/__init__.py +0 -0
  202. {conan-2.11.0 → conan-2.12.1}/conan/internal/api/profile/detect.py +0 -0
  203. {conan-2.11.0 → conan-2.12.1}/conan/internal/api/remotes/__init__.py +0 -0
  204. {conan-2.11.0 → conan-2.12.1}/conan/internal/api/remotes/encrypt.py +0 -0
  205. {conan-2.11.0 → conan-2.12.1}/conan/internal/api/remotes/localdb.py +0 -0
  206. {conan-2.11.0 → conan-2.12.1}/conan/internal/api/uploader.py +0 -0
  207. {conan-2.11.0 → conan-2.12.1}/conan/internal/cache/__init__.py +0 -0
  208. {conan-2.11.0 → conan-2.12.1}/conan/internal/cache/db/__init__.py +0 -0
  209. {conan-2.11.0 → conan-2.12.1}/conan/internal/cache/home_paths.py +0 -0
  210. {conan-2.11.0 → conan-2.12.1}/conan/internal/default_settings.py +0 -0
  211. {conan-2.11.0 → conan-2.12.1}/conan/internal/errors.py +0 -0
  212. {conan-2.11.0 → conan-2.12.1}/conan/internal/internal_tools.py +0 -0
  213. {conan-2.11.0/conan/test → conan-2.12.1/conan/internal/model}/__init__.py +0 -0
  214. {conan-2.11.0/conans → conan-2.12.1/conan/internal}/model/conanfile_interface.py +0 -0
  215. {conan-2.11.0/conans → conan-2.12.1/conan/internal}/model/manifest.py +0 -0
  216. {conan-2.11.0/conans → conan-2.12.1/conan/internal}/model/pkg_type.py +0 -0
  217. {conan-2.11.0/conans → conan-2.12.1/conan/internal}/model/settings.py +0 -0
  218. {conan-2.11.0/conans → conan-2.12.1/conan/internal}/model/version.py +0 -0
  219. {conan-2.11.0 → conan-2.12.1}/conan/internal/paths.py +0 -0
  220. {conan-2.11.0 → conan-2.12.1}/conan/internal/runner/__init__.py +0 -0
  221. {conan-2.11.0 → conan-2.12.1}/conan/internal/runner/ssh.py +0 -0
  222. {conan-2.11.0 → conan-2.12.1}/conan/internal/runner/wsl.py +0 -0
  223. {conan-2.11.0/conan/test/utils → conan-2.12.1/conan/test}/__init__.py +0 -0
  224. {conan-2.11.0 → conan-2.12.1}/conan/test/assets/__init__.py +0 -0
  225. {conan-2.11.0 → conan-2.12.1}/conan/test/assets/autotools.py +0 -0
  226. {conan-2.11.0 → conan-2.12.1}/conan/test/assets/cmake.py +0 -0
  227. {conan-2.11.0 → conan-2.12.1}/conan/test/assets/sources.py +0 -0
  228. {conan-2.11.0 → conan-2.12.1}/conan/test/assets/visual_project_files.py +0 -0
  229. {conan-2.11.0/conan/tools/cmake/cmakedeps2 → conan-2.12.1/conan/test/utils}/__init__.py +0 -0
  230. {conan-2.11.0 → conan-2.12.1}/conan/test/utils/artifactory.py +0 -0
  231. {conan-2.11.0 → conan-2.12.1}/conan/test/utils/env.py +0 -0
  232. {conan-2.11.0 → conan-2.12.1}/conan/test/utils/file_server.py +0 -0
  233. {conan-2.11.0 → conan-2.12.1}/conan/test/utils/scm.py +0 -0
  234. {conan-2.11.0 → conan-2.12.1}/conan/test/utils/server_launcher.py +0 -0
  235. {conan-2.11.0 → conan-2.12.1}/conan/test/utils/test_files.py +0 -0
  236. {conan-2.11.0 → conan-2.12.1}/conan/tools/android/__init__.py +0 -0
  237. {conan-2.11.0 → conan-2.12.1}/conan/tools/android/utils.py +0 -0
  238. {conan-2.11.0 → conan-2.12.1}/conan/tools/apple/__init__.py +0 -0
  239. {conan-2.11.0 → conan-2.12.1}/conan/tools/apple/apple.py +0 -0
  240. {conan-2.11.0 → conan-2.12.1}/conan/tools/apple/xcodebuild.py +0 -0
  241. {conan-2.11.0 → conan-2.12.1}/conan/tools/apple/xcodetoolchain.py +0 -0
  242. {conan-2.11.0 → conan-2.12.1}/conan/tools/build/__init__.py +0 -0
  243. {conan-2.11.0 → conan-2.12.1}/conan/tools/build/cpu.py +0 -0
  244. {conan-2.11.0 → conan-2.12.1}/conan/tools/build/cross_building.py +0 -0
  245. {conan-2.11.0 → conan-2.12.1}/conan/tools/build/stdcpp_library.py +0 -0
  246. {conan-2.11.0 → conan-2.12.1}/conan/tools/cmake/cmake.py +0 -0
  247. {conan-2.11.0 → conan-2.12.1}/conan/tools/cmake/cmakedeps/__init__.py +0 -0
  248. {conan-2.11.0 → conan-2.12.1}/conan/tools/cmake/cmakedeps/templates/__init__.py +0 -0
  249. {conan-2.11.0 → conan-2.12.1}/conan/tools/cmake/cmakedeps/templates/config.py +0 -0
  250. {conan-2.11.0 → conan-2.12.1}/conan/tools/cmake/cmakedeps/templates/config_version.py +0 -0
  251. {conan-2.11.0 → conan-2.12.1}/conan/tools/cmake/cmakedeps/templates/macros.py +0 -0
  252. {conan-2.11.0 → conan-2.12.1}/conan/tools/cmake/cmakedeps/templates/target_configuration.py +0 -0
  253. {conan-2.11.0 → conan-2.12.1}/conan/tools/cmake/cmakedeps/templates/target_data.py +0 -0
  254. {conan-2.11.0 → conan-2.12.1}/conan/tools/cmake/cmakedeps/templates/targets.py +0 -0
  255. {conan-2.11.0/conan/tools/system → conan-2.12.1/conan/tools/cmake/cmakedeps2}/__init__.py +0 -0
  256. {conan-2.11.0 → conan-2.12.1}/conan/tools/cmake/cmakedeps2/config.py +0 -0
  257. {conan-2.11.0 → conan-2.12.1}/conan/tools/cmake/cmakedeps2/config_version.py +0 -0
  258. {conan-2.11.0 → conan-2.12.1}/conan/tools/cmake/cmakedeps2/targets.py +0 -0
  259. {conan-2.11.0 → conan-2.12.1}/conan/tools/cmake/layout.py +0 -0
  260. {conan-2.11.0 → conan-2.12.1}/conan/tools/cmake/toolchain/__init__.py +0 -0
  261. {conan-2.11.0 → conan-2.12.1}/conan/tools/cmake/utils.py +0 -0
  262. {conan-2.11.0 → conan-2.12.1}/conan/tools/cps/__init__.py +0 -0
  263. {conan-2.11.0 → conan-2.12.1}/conan/tools/cps/cps_deps.py +0 -0
  264. {conan-2.11.0 → conan-2.12.1}/conan/tools/env/__init__.py +0 -0
  265. {conan-2.11.0 → conan-2.12.1}/conan/tools/env/virtualbuildenv.py +0 -0
  266. {conan-2.11.0 → conan-2.12.1}/conan/tools/env/virtualrunenv.py +0 -0
  267. {conan-2.11.0 → conan-2.12.1}/conan/tools/files/__init__.py +0 -0
  268. {conan-2.11.0 → conan-2.12.1}/conan/tools/files/copy_pattern.py +0 -0
  269. {conan-2.11.0 → conan-2.12.1}/conan/tools/files/packager.py +0 -0
  270. {conan-2.11.0 → conan-2.12.1}/conan/tools/files/symlinks/__init__.py +0 -0
  271. {conan-2.11.0 → conan-2.12.1}/conan/tools/files/symlinks/symlinks.py +0 -0
  272. {conan-2.11.0 → conan-2.12.1}/conan/tools/gnu/__init__.py +0 -0
  273. {conan-2.11.0 → conan-2.12.1}/conan/tools/gnu/autotools.py +0 -0
  274. {conan-2.11.0 → conan-2.12.1}/conan/tools/gnu/autotoolsdeps.py +0 -0
  275. {conan-2.11.0 → conan-2.12.1}/conan/tools/gnu/get_gnu_triplet.py +0 -0
  276. {conan-2.11.0 → conan-2.12.1}/conan/tools/gnu/gnudeps_flags.py +0 -0
  277. {conan-2.11.0 → conan-2.12.1}/conan/tools/gnu/makedeps.py +0 -0
  278. {conan-2.11.0 → conan-2.12.1}/conan/tools/gnu/pkgconfig.py +0 -0
  279. {conan-2.11.0 → conan-2.12.1}/conan/tools/google/__init__.py +0 -0
  280. {conan-2.11.0 → conan-2.12.1}/conan/tools/google/bazel.py +0 -0
  281. {conan-2.11.0 → conan-2.12.1}/conan/tools/google/layout.py +0 -0
  282. {conan-2.11.0 → conan-2.12.1}/conan/tools/google/toolchain.py +0 -0
  283. {conan-2.11.0 → conan-2.12.1}/conan/tools/intel/__init__.py +0 -0
  284. {conan-2.11.0 → conan-2.12.1}/conan/tools/intel/intel_cc.py +0 -0
  285. {conan-2.11.0 → conan-2.12.1}/conan/tools/layout/__init__.py +0 -0
  286. {conan-2.11.0 → conan-2.12.1}/conan/tools/meson/__init__.py +0 -0
  287. {conan-2.11.0 → conan-2.12.1}/conan/tools/meson/meson.py +0 -0
  288. {conan-2.11.0 → conan-2.12.1}/conan/tools/microsoft/__init__.py +0 -0
  289. {conan-2.11.0 → conan-2.12.1}/conan/tools/microsoft/layout.py +0 -0
  290. {conan-2.11.0 → conan-2.12.1}/conan/tools/microsoft/msbuild.py +0 -0
  291. {conan-2.11.0 → conan-2.12.1}/conan/tools/microsoft/nmakedeps.py +0 -0
  292. {conan-2.11.0 → conan-2.12.1}/conan/tools/microsoft/nmaketoolchain.py +0 -0
  293. {conan-2.11.0 → conan-2.12.1}/conan/tools/microsoft/subsystems.py +0 -0
  294. {conan-2.11.0 → conan-2.12.1}/conan/tools/microsoft/toolchain.py +0 -0
  295. {conan-2.11.0 → conan-2.12.1}/conan/tools/microsoft/visual.py +0 -0
  296. {conan-2.11.0 → conan-2.12.1}/conan/tools/premake/__init__.py +0 -0
  297. {conan-2.11.0 → conan-2.12.1}/conan/tools/premake/premake.py +0 -0
  298. {conan-2.11.0 → conan-2.12.1}/conan/tools/premake/premakedeps.py +0 -0
  299. {conan-2.11.0 → conan-2.12.1}/conan/tools/qbs/__init__.py +0 -0
  300. {conan-2.11.0 → conan-2.12.1}/conan/tools/qbs/common.py +0 -0
  301. {conan-2.11.0 → conan-2.12.1}/conan/tools/qbs/qbs.py +0 -0
  302. {conan-2.11.0 → conan-2.12.1}/conan/tools/qbs/qbsprofile.py +0 -0
  303. {conan-2.11.0 → conan-2.12.1}/conan/tools/ros/__init__.py +0 -0
  304. {conan-2.11.0 → conan-2.12.1}/conan/tools/ros/rosenv.py +0 -0
  305. {conan-2.11.0/conans → conan-2.12.1/conan/tools/sbom}/__init__.py +0 -0
  306. {conan-2.11.0 → conan-2.12.1}/conan/tools/scons/__init__.py +0 -0
  307. {conan-2.11.0 → conan-2.12.1}/conan/tools/scons/sconsdeps.py +0 -0
  308. {conan-2.11.0/conans/client → conan-2.12.1/conan/tools/system}/__init__.py +0 -0
  309. {conan-2.11.0 → conan-2.12.1}/conan/tools/system/package_manager.py +0 -0
  310. {conan-2.11.0 → conan-2.12.1}/conan.egg-info/dependency_links.txt +0 -0
  311. {conan-2.11.0 → conan-2.12.1}/conan.egg-info/entry_points.txt +0 -0
  312. {conan-2.11.0 → conan-2.12.1}/conan.egg-info/top_level.txt +0 -0
  313. {conan-2.11.0/conans/client/downloaders → conan-2.12.1/conans}/__init__.py +0 -0
  314. {conan-2.11.0/conans/client/graph → conan-2.12.1/conans/client}/__init__.py +0 -0
  315. {conan-2.11.0/conans/model → conan-2.12.1/conans/client/downloaders}/__init__.py +0 -0
  316. {conan-2.11.0 → conan-2.12.1}/conans/client/downloaders/caching_file_downloader.py +0 -0
  317. {conan-2.11.0 → conan-2.12.1}/conans/client/downloaders/download_cache.py +0 -0
  318. {conan-2.11.0 → conan-2.12.1}/conans/client/downloaders/file_downloader.py +0 -0
  319. {conan-2.11.0/conans/util → conan-2.12.1/conans/client/graph}/__init__.py +0 -0
  320. {conan-2.11.0 → conan-2.12.1}/conans/client/graph/graph_error.py +0 -0
  321. {conan-2.11.0 → conan-2.12.1}/conans/client/graph/proxy.py +0 -0
  322. {conan-2.11.0 → conan-2.12.1}/conans/client/hook_manager.py +0 -0
  323. {conan-2.11.0 → conan-2.12.1}/conans/client/loader_txt.py +0 -0
  324. {conan-2.11.0 → conan-2.12.1}/conans/client/pkg_sign.py +0 -0
  325. {conan-2.11.0 → conan-2.12.1}/conans/client/rest/__init__.py +0 -0
  326. {conan-2.11.0 → conan-2.12.1}/conans/client/rest/remote_credentials.py +0 -0
  327. {conan-2.11.0 → conan-2.12.1}/conans/client/rest/rest_client.py +0 -0
  328. {conan-2.11.0/conans/model → conan-2.12.1/conans/client/rest}/rest_routes.py +0 -0
  329. {conan-2.11.0 → conan-2.12.1}/conans/client/source.py +0 -0
  330. {conan-2.11.0 → conan-2.12.1}/conans/client/subsystems.py +0 -0
  331. {conan-2.11.0 → conan-2.12.1}/conans/conan.py +0 -0
  332. {conan-2.11.0 → conan-2.12.1}/conans/conan_server.py +0 -0
  333. {conan-2.11.0 → conan-2.12.1}/conans/requirements.txt +0 -0
  334. {conan-2.11.0 → conan-2.12.1}/conans/requirements_runner.txt +0 -0
  335. {conan-2.11.0 → conan-2.12.1}/conans/util/config_parser.py +0 -0
  336. {conan-2.11.0 → conan-2.12.1}/conans/util/dates.py +0 -0
  337. {conan-2.11.0 → conan-2.12.1}/conans/util/files.py +0 -0
  338. {conan-2.11.0 → conan-2.12.1}/conans/util/locks.py +0 -0
  339. {conan-2.11.0 → conan-2.12.1}/conans/util/runners.py +0 -0
  340. {conan-2.11.0 → conan-2.12.1}/conans/util/thread.py +0 -0
  341. {conan-2.11.0 → conan-2.12.1}/pyproject.toml +0 -0
  342. {conan-2.11.0 → conan-2.12.1}/setup.cfg +0 -0
  343. {conan-2.11.0 → conan-2.12.1}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: conan
3
- Version: 2.11.0
3
+ Version: 2.12.1
4
4
  Summary: Conan C/C++ package manager
5
5
  Home-page: https://conan.io
6
6
  Author: JFrog LTD
@@ -25,6 +25,8 @@ Description: <picture>
25
25
  - Docs: https://docs.conan.io
26
26
  - Slack: https://cpplang.slack.com (#conan channel. Please, click [here](https://join.slack.com/t/cpplang/shared_invite/zt-1snzdn6rp-rOUxF3166oz1_11Tr5H~xg) to get an invitation)
27
27
  - Twitter: https://twitter.com/conan_io
28
+ - Blog: https://blog.conan.io
29
+ - Security reports: https://jfrog.com/trust/report-vulnerability
28
30
 
29
31
 
30
32
  Conan is a package manager for C and C++ developers:
@@ -14,6 +14,8 @@ Decentralized, open-source (MIT), C/C++ package manager.
14
14
  - Docs: https://docs.conan.io
15
15
  - Slack: https://cpplang.slack.com (#conan channel. Please, click [here](https://join.slack.com/t/cpplang/shared_invite/zt-1snzdn6rp-rOUxF3166oz1_11Tr5H~xg) to get an invitation)
16
16
  - Twitter: https://twitter.com/conan_io
17
+ - Blog: https://blog.conan.io
18
+ - Security reports: https://jfrog.com/trust/report-vulnerability
17
19
 
18
20
 
19
21
  Conan is a package manager for C and C++ developers:
@@ -0,0 +1,5 @@
1
+ from conan.internal.model.conan_file import ConanFile
2
+ from conan.internal.model.version import Version
3
+
4
+ __version__ = '2.12.1'
5
+ conan_version = Version(__version__)
@@ -6,7 +6,6 @@ from conan.api.subapi.command import CommandAPI
6
6
  from conan.api.subapi.local import LocalAPI
7
7
  from conan.api.subapi.lockfile import LockfileAPI
8
8
  from conan.api.subapi.workspace import WorkspaceAPI
9
- from conan import conan_version
10
9
  from conan.api.subapi.config import ConfigAPI
11
10
  from conan.api.subapi.download import DownloadAPI
12
11
  from conan.api.subapi.export import ExportAPI
@@ -19,13 +18,18 @@ from conan.api.subapi.remotes import RemotesAPI
19
18
  from conan.api.subapi.remove import RemoveAPI
20
19
  from conan.api.subapi.search import SearchAPI
21
20
  from conan.api.subapi.upload import UploadAPI
22
- from conans.client.migrations import ClientMigrator
23
21
  from conan.errors import ConanException
24
22
  from conan.internal.paths import get_conan_user_home
25
- from conans.model.version_range import validate_conan_version
23
+ from conans.client.migrations import ClientMigrator
24
+ from conan.internal.model.version_range import validate_conan_version
26
25
 
27
26
 
28
27
  class ConanAPI:
28
+ """
29
+ This is the main object to interact with the Conan API. It provides all the subapis to work with
30
+ recipes, packages, remotes, etc., which are exposed as attributes of this class, and should
31
+ not be created directly.
32
+ """
29
33
  def __init__(self, cache_folder=None):
30
34
 
31
35
  version = sys.version_info
@@ -36,14 +40,14 @@ class ConanAPI:
36
40
  self.workspace = WorkspaceAPI(self)
37
41
  self.cache_folder = self.workspace.home_folder() or cache_folder or get_conan_user_home()
38
42
  self.home_folder = self.cache_folder # Lets call it home, deprecate "cache"
43
+ self.migrate()
39
44
 
40
- # Migration system
41
- migrator = ClientMigrator(self.cache_folder, conan_version)
42
- migrator.migrate()
45
+ # This API is depended upon by the subsequent ones, it should be initialized first
46
+ self.config = ConfigAPI(self)
43
47
 
44
- self.command = CommandAPI(self)
45
48
  self.remotes = RemotesAPI(self)
46
- # Search recipes by wildcard and packages filtering by configuracion
49
+ self.command = CommandAPI(self)
50
+ # Search recipes by wildcard and packages filtering by configuration
47
51
  self.search = SearchAPI(self)
48
52
  # Get latest refs and list refs of recipes and packages
49
53
  self.list = ListAPI(self)
@@ -52,7 +56,6 @@ class ConanAPI:
52
56
  self.graph = GraphAPI(self)
53
57
  self.export = ExportAPI(self)
54
58
  self.remove = RemoveAPI(self)
55
- self.config = ConfigAPI(self)
56
59
  self.new = NewAPI(self)
57
60
  self.upload = UploadAPI(self)
58
61
  self.download = DownloadAPI(self)
@@ -60,6 +63,27 @@ class ConanAPI:
60
63
  self.lockfile = LockfileAPI(self)
61
64
  self.local = LocalAPI(self)
62
65
 
63
- required_range_new = self.config.global_conf.get("core:required_conan_version")
64
- if required_range_new:
65
- validate_conan_version(required_range_new)
66
+ _check_conan_version(self)
67
+
68
+ def reinit(self):
69
+ """
70
+ Reinitialize the Conan API. This is useful when the configuration changes.
71
+ """
72
+ self.config.reinit()
73
+ self.remotes.reinit()
74
+ self.local.reinit()
75
+
76
+ _check_conan_version(self)
77
+
78
+ def migrate(self):
79
+ # Migration system
80
+ # TODO: A prettier refactoring of migrators would be nice
81
+ from conan import conan_version
82
+ migrator = ClientMigrator(self.cache_folder, conan_version)
83
+ migrator.migrate()
84
+
85
+
86
+ def _check_conan_version(conan_api):
87
+ required_range_new = conan_api.config.global_conf.get("core:required_conan_version")
88
+ if required_range_new:
89
+ validate_conan_version(required_range_new)
@@ -0,0 +1,3 @@
1
+ from conan.api.model.remote import Remote, LOCAL_RECIPES_INDEX
2
+ from conan.api.model.refs import RecipeReference, PkgReference
3
+ from conan.api.model.list import PackagesList, MultiPackagesList, ListPattern
@@ -3,47 +3,13 @@ import json
3
3
  import os
4
4
  from json import JSONDecodeError
5
5
 
6
+ from conan.errors import ConanException
7
+ from conan.internal.errors import NotFoundException
8
+ from conan.api.model import RecipeReference, PkgReference
9
+ from conan.internal.model.version_range import VersionRange
6
10
  from conans.client.graph.graph import RECIPE_EDITABLE, RECIPE_CONSUMER, RECIPE_PLATFORM, \
7
11
  RECIPE_VIRTUAL, BINARY_SKIP, BINARY_MISSING, BINARY_INVALID
8
- from conan.internal.errors import NotFoundException
9
- from conan.errors import ConanException
10
- from conans.model.package_ref import PkgReference
11
- from conans.model.recipe_ref import RecipeReference
12
12
  from conans.util.files import load
13
- from conans.model.version_range import VersionRange
14
-
15
- LOCAL_RECIPES_INDEX = "local-recipes-index"
16
-
17
-
18
- class Remote:
19
-
20
- def __init__(self, name, url, verify_ssl=True, disabled=False, allowed_packages=None,
21
- remote_type=None):
22
- self.name = name # Read only, is the key
23
- self.url = url
24
- self.verify_ssl = verify_ssl
25
- self.disabled = disabled
26
- self.allowed_packages = allowed_packages
27
- self.remote_type = remote_type
28
-
29
- def __eq__(self, other):
30
- if other is None:
31
- return False
32
- return (self.name == other.name and self.url == other.url and
33
- self.verify_ssl == other.verify_ssl and self.disabled == other.disabled)
34
-
35
- def __str__(self):
36
- allowed_msg = ""
37
- if self.allowed_packages:
38
- allowed_msg = ", Allowed packages: {}".format(", ".join(self.allowed_packages))
39
- if self.remote_type == LOCAL_RECIPES_INDEX:
40
- return "{}: {} [{}, Enabled: {}{}]".format(self.name, self.url, LOCAL_RECIPES_INDEX,
41
- not self.disabled, allowed_msg)
42
- return "{}: {} [Verify SSL: {}, Enabled: {}{}]".format(self.name, self.url, self.verify_ssl,
43
- not self.disabled, allowed_msg)
44
-
45
- def __repr__(self):
46
- return str(self)
47
13
 
48
14
 
49
15
  class MultiPackagesList:
@@ -4,7 +4,7 @@ import re
4
4
  from functools import total_ordering
5
5
 
6
6
  from conan.errors import ConanException
7
- from conans.model.version import Version
7
+ from conan.internal.model.version import Version
8
8
  from conans.util.dates import timestamp_to_str
9
9
 
10
10
 
@@ -205,8 +205,102 @@ class RecipeReference:
205
205
  return True
206
206
 
207
207
 
208
- def ref_matches(ref, pattern, is_consumer):
209
- if not ref or not str(ref):
210
- assert is_consumer
211
- ref = RecipeReference.loads("*/*") # FIXME: ugly
212
- return ref.matches(pattern, is_consumer=is_consumer)
208
+ class PkgReference:
209
+
210
+ def __init__(self, ref=None, package_id=None, revision=None, timestamp=None):
211
+ self.ref = ref
212
+ self.package_id = package_id
213
+ self.revision = revision
214
+ self.timestamp = timestamp # float, Unix seconds UTC
215
+
216
+ def __repr__(self):
217
+ """ long repr like pkg/0.1@user/channel#rrev%timestamp """
218
+ if self.ref is None:
219
+ return ""
220
+ result = repr(self.ref)
221
+ if self.package_id:
222
+ result += ":{}".format(self.package_id)
223
+ if self.revision is not None:
224
+ result += "#{}".format(self.revision)
225
+ if self.timestamp is not None:
226
+ result += "%{}".format(self.timestamp)
227
+ return result
228
+
229
+ def repr_notime(self):
230
+ if self.ref is None:
231
+ return ""
232
+ result = self.ref.repr_notime()
233
+ if self.package_id:
234
+ result += ":{}".format(self.package_id)
235
+ if self.revision is not None:
236
+ result += "#{}".format(self.revision)
237
+ return result
238
+
239
+ def repr_reduced(self):
240
+ if self.ref is None:
241
+ return ""
242
+ result = self.ref.repr_reduced()
243
+ if self.package_id:
244
+ result += ":{}".format(self.package_id[0:4])
245
+ if self.revision is not None:
246
+ result += "#{}".format(self.revision[0:4])
247
+ return result
248
+
249
+ def repr_humantime(self):
250
+ result = self.repr_notime()
251
+ assert self.timestamp
252
+ result += " ({})".format(timestamp_to_str(self.timestamp))
253
+ return result
254
+
255
+ def __str__(self):
256
+ """ shorter representation, excluding the revision and timestamp """
257
+ if self.ref is None:
258
+ return ""
259
+ result = str(self.ref)
260
+ if self.package_id:
261
+ result += ":{}".format(self.package_id)
262
+ return result
263
+
264
+ def __lt__(self, ref):
265
+ # The timestamp goes before the revision for ordering revisions chronologically
266
+ raise Exception("WHO IS COMPARING PACKAGE REFERENCES?")
267
+ # return (self.name, self.version, self.user, self.channel, self.timestamp, self.revision) \
268
+ # < (ref.name, ref.version, ref.user, ref.channel, ref._timestamp, ref.revision)
269
+
270
+ def __eq__(self, other):
271
+ # TODO: In case of equality, should it use the revision and timestamp?
272
+ # Used:
273
+ # at "graph_binaries" to check: cache_latest_prev != pref
274
+ # at "installer" to check: if pkg_layout.reference != pref (probably just optimization?)
275
+ # at "revisions_test"
276
+ return self.ref == other.ref and self.package_id == other.package_id and \
277
+ self.revision == other.revision
278
+
279
+ def __hash__(self):
280
+ # Used in dicts of PkgReferences as keys like the cached nodes in the graph binaries
281
+ return hash((self.ref, self.package_id, self.revision))
282
+
283
+ @staticmethod
284
+ def loads(pkg_ref): # TODO: change this default to validate only on end points
285
+ try:
286
+ tokens = pkg_ref.split(":", 1)
287
+ assert len(tokens) == 2
288
+ ref, pkg_id = tokens
289
+
290
+ ref = RecipeReference.loads(ref)
291
+
292
+ # timestamp
293
+ tokens = pkg_id.rsplit("%", 1)
294
+ text = tokens[0]
295
+ timestamp = float(tokens[1]) if len(tokens) == 2 else None
296
+
297
+ # revision
298
+ tokens = text.split("#", 1)
299
+ package_id = tokens[0]
300
+ revision = tokens[1] if len(tokens) == 2 else None
301
+
302
+ return PkgReference(ref, package_id, revision, timestamp)
303
+ except Exception:
304
+ raise ConanException(
305
+ f"{pkg_ref} is not a valid package reference, provide a reference"
306
+ f" in the form name/version[@user/channel:package_id]")
@@ -0,0 +1,39 @@
1
+ LOCAL_RECIPES_INDEX = "local-recipes-index"
2
+
3
+
4
+ class Remote:
5
+ """
6
+ The ``Remote`` class represents a remote registry of packages. It's a read-only opaque object that
7
+ should not be created directly, but obtained from the relevant ``RemotesAPI`` subapi methods.
8
+ """
9
+ def __init__(self, name, url, verify_ssl=True, disabled=False, allowed_packages=None,
10
+ remote_type=None):
11
+ self.name = name # Read only, is the key
12
+ self.url = url
13
+ self.verify_ssl = verify_ssl
14
+ self.disabled = disabled
15
+ self.allowed_packages = allowed_packages
16
+ self.remote_type = remote_type
17
+ self._caching = {}
18
+
19
+ def __eq__(self, other):
20
+ if other is None:
21
+ return False
22
+ return (self.name == other.name and self.url == other.url and
23
+ self.verify_ssl == other.verify_ssl and self.disabled == other.disabled)
24
+
25
+ def __str__(self):
26
+ allowed_msg = ""
27
+ if self.allowed_packages:
28
+ allowed_msg = ", Allowed packages: {}".format(", ".join(self.allowed_packages))
29
+ if self.remote_type == LOCAL_RECIPES_INDEX:
30
+ return "{}: {} [{}, Enabled: {}{}]".format(self.name, self.url, LOCAL_RECIPES_INDEX,
31
+ not self.disabled, allowed_msg)
32
+ return "{}: {} [Verify SSL: {}, Enabled: {}{}]".format(self.name, self.url, self.verify_ssl,
33
+ not self.disabled, allowed_msg)
34
+
35
+ def __repr__(self):
36
+ return str(self)
37
+
38
+ def invalidate_cache(self):
39
+ self._caching = {}
@@ -212,12 +212,12 @@ class ConanOutput:
212
212
 
213
213
  def trace(self, msg):
214
214
  if self._conan_output_level <= LEVEL_TRACE:
215
- self._write_message(msg, fg=Color.BRIGHT_WHITE)
215
+ self._write_message(msg, fg=Color.BLUE)
216
216
  return self
217
217
 
218
218
  def debug(self, msg):
219
219
  if self._conan_output_level <= LEVEL_DEBUG:
220
- self._write_message(msg)
220
+ self._write_message(msg, fg=Color.MAGENTA)
221
221
  return self
222
222
 
223
223
  def verbose(self, msg, fg=None, bg=None):
@@ -294,10 +294,14 @@ def cli_out_write(data, fg=None, bg=None, endline="\n", indentation=0):
294
294
  sys.stdout.write(data)
295
295
  else:
296
296
  data = f"{' ' * indentation}{data}{endline}"
297
- # https://github.com/conan-io/conan/issues/17245 avoid colorama crash and overhead
298
- colorama.deinit()
299
- sys.stdout.write(data)
300
- colorama.reinit()
297
+ if sys.stdout.isatty():
298
+ # https://github.com/conan-io/conan/issues/17245 avoid colorama crash and overhead
299
+ # skip deinit/reinit if stdout is not a TTY to preserve redirected output to file
300
+ colorama.deinit()
301
+ sys.stdout.write(data)
302
+ colorama.reinit()
303
+ else:
304
+ sys.stdout.write(data)
301
305
 
302
306
 
303
307
  class TimedOutput:
@@ -11,8 +11,8 @@ from conan.internal.cache.home_paths import HomePaths
11
11
  from conan.internal.cache.integrity_check import IntegrityChecker
12
12
  from conans.client.downloaders.download_cache import DownloadCache
13
13
  from conan.errors import ConanException
14
- from conans.model.package_ref import PkgReference
15
- from conans.model.recipe_ref import RecipeReference
14
+ from conan.api.model import PkgReference
15
+ from conan.api.model import RecipeReference
16
16
  from conans.util.dates import revision_timestamp_now
17
17
  from conans.util.files import rmdir, gzopen_without_timestamps, mkdir, remove
18
18
 
@@ -16,11 +16,11 @@ from conans.client.graph.graph import CONTEXT_HOST, RECIPE_VIRTUAL, Node
16
16
  from conans.client.graph.graph_builder import DepsGraphBuilder
17
17
  from conans.client.graph.profile_node_definer import consumer_definer
18
18
  from conan.errors import ConanException
19
- from conans.model.conf import ConfDefinition, BUILT_IN_CONFS
20
- from conans.model.pkg_type import PackageType
21
- from conans.model.recipe_ref import RecipeReference
22
- from conans.model.settings import Settings
23
- from conans.util.files import load, save
19
+ from conan.internal.model.conf import ConfDefinition, BUILT_IN_CONFS, CORE_CONF_PATTERN
20
+ from conan.internal.model.pkg_type import PackageType
21
+ from conan.api.model import RecipeReference
22
+ from conan.internal.model.settings import Settings
23
+ from conans.util.files import load, save, rmdir, remove
24
24
 
25
25
 
26
26
  class ConfigAPI:
@@ -28,6 +28,7 @@ class ConfigAPI:
28
28
  def __init__(self, conan_api):
29
29
  self.conan_api = conan_api
30
30
  self._new_config = None
31
+ self._cli_core_confs = None
31
32
 
32
33
  def home(self):
33
34
  return self.conan_api.cache_folder
@@ -36,9 +37,11 @@ class ConfigAPI:
36
37
  source_folder=None, target_folder=None):
37
38
  # TODO: We probably want to split this into git-folder-http cases?
38
39
  from conan.internal.api.config.config_installer import configuration_install
39
- app = ConanApp(self.conan_api)
40
- configuration_install(app, path_or_url, verify_ssl, config_type=config_type, args=args,
40
+ cache_folder = self.conan_api.cache_folder
41
+ requester = self.conan_api.remotes.requester
42
+ configuration_install(cache_folder, requester, path_or_url, verify_ssl, config_type=config_type, args=args,
41
43
  source_folder=source_folder, target_folder=target_folder)
44
+ self.conan_api.reinit()
42
45
 
43
46
  def install_pkg(self, ref, lockfile=None, force=False, remotes=None, profile=None):
44
47
  ConanOutput().warning("The 'conan config install-pkg' is experimental",
@@ -90,13 +93,16 @@ class ConfigAPI:
90
93
  return pkg.pref # Already installed, we can skip repeating the install
91
94
 
92
95
  from conan.internal.api.config.config_installer import configuration_install
93
- configuration_install(app, uri=pkg.conanfile.package_folder, verify_ssl=False,
96
+ cache_folder = self.conan_api.cache_folder
97
+ requester = self.conan_api.remotes.requester
98
+ configuration_install(cache_folder, requester, uri=pkg.conanfile.package_folder, verify_ssl=False,
94
99
  config_type="dir", ignore=["conaninfo.txt", "conanmanifest.txt"])
95
100
  # We save the current package full reference in the file for future
96
101
  # And for ``package_id`` computation
97
102
  config_versions = {ref.split("/", 1)[0]: ref for ref in config_versions}
98
103
  config_versions[pkg.pref.ref.name] = pkg.pref.repr_notime()
99
104
  save(config_version_file, json.dumps({"config_version": list(config_versions.values())}))
105
+ self.conan_api.reinit()
100
106
  return pkg.pref
101
107
 
102
108
  def get(self, name, default=None, check_type=None):
@@ -111,11 +117,19 @@ class ConfigAPI:
111
117
  configuration defined with the new syntax as in profiles, this config will be composed
112
118
  to the profile ones and passed to the conanfiles.conf, which can be passed to collaborators
113
119
  """
120
+ # Lazy loading
114
121
  if self._new_config is None:
115
- cache_folder = self.conan_api.cache_folder
116
- self._new_config = self.load_config(cache_folder)
122
+ self._new_config = ConfDefinition()
123
+ self._populate_global_conf()
117
124
  return self._new_config
118
125
 
126
+ def _populate_global_conf(self):
127
+ cache_folder = self.conan_api.cache_folder
128
+ new_config = self.load_config(cache_folder)
129
+ self._new_config.update_conf_definition(new_config)
130
+ if self._cli_core_confs is not None:
131
+ self._new_config.update_conf_definition(self._cli_core_confs)
132
+
119
133
  @staticmethod
120
134
  def load_config(home_folder):
121
135
  # Do not document yet, keep it private
@@ -188,3 +202,35 @@ class ConfigAPI:
188
202
  appending_recursive_dict_update(settings, settings_user)
189
203
 
190
204
  return Settings(settings)
205
+
206
+ def clean(self):
207
+ contents = os.listdir(self.home())
208
+ packages_folder = self.global_conf.get("core.cache:storage_path") or os.path.join(self.home(), "p")
209
+ for content in contents:
210
+ content_path = os.path.join(self.home(), content)
211
+ if content_path == packages_folder:
212
+ continue
213
+ ConanOutput().debug(f"Removing {content_path}")
214
+ if os.path.isdir(content_path):
215
+ rmdir(content_path)
216
+ else:
217
+ remove(content_path)
218
+ self.conan_api.reinit()
219
+ # CHECK: This also generates a remotes.json that is not there after a conan profile show?
220
+ self.conan_api.migrate()
221
+
222
+ def set_core_confs(self, core_confs):
223
+ confs = ConfDefinition()
224
+ for c in core_confs:
225
+ if not CORE_CONF_PATTERN.match(c):
226
+ raise ConanException(f"Only core. values are allowed in --core-conf. Got {c}")
227
+ confs.loads("\n".join(core_confs))
228
+ confs.validate()
229
+ self._cli_core_confs = confs
230
+ # Last but not least, apply the new configuration
231
+ self.conan_api.reinit()
232
+
233
+ def reinit(self):
234
+ if self._new_config is not None:
235
+ self._new_config.clear()
236
+ self._populate_global_conf()
@@ -6,8 +6,8 @@ from conan.api.model import Remote, PackagesList
6
6
  from conan.api.output import ConanOutput
7
7
  from conan.internal.conan_app import ConanBasicApp
8
8
  from conan.errors import ConanException
9
- from conans.model.package_ref import PkgReference
10
- from conans.model.recipe_ref import RecipeReference
9
+ from conan.api.model import PkgReference
10
+ from conan.api.model import RecipeReference
11
11
 
12
12
 
13
13
  class DownloadAPI:
@@ -6,7 +6,7 @@ from conan.internal.api.export import cmd_export
6
6
  from conan.internal.methods import run_package_method
7
7
  from conans.client.graph.graph import BINARY_BUILD, RECIPE_INCACHE
8
8
  from conans.client.hook_manager import HookManager
9
- from conans.model.package_ref import PkgReference
9
+ from conan.api.model import PkgReference
10
10
  from conans.util.files import mkdir
11
11
 
12
12
 
@@ -1,12 +1,13 @@
1
1
  from conan.api.output import ConanOutput
2
- from conan.internal.conan_app import ConanApp
2
+ from conan.internal.conan_app import ConanApp, ConanBasicApp
3
+ from conan.internal.model.recipe_ref import ref_matches
3
4
  from conans.client.graph.graph import Node, RECIPE_CONSUMER, CONTEXT_HOST, RECIPE_VIRTUAL, \
4
- CONTEXT_BUILD
5
+ CONTEXT_BUILD, BINARY_MISSING
5
6
  from conans.client.graph.graph_binaries import GraphBinariesAnalyzer
6
7
  from conans.client.graph.graph_builder import DepsGraphBuilder
7
8
  from conans.client.graph.profile_node_definer import initialize_conanfile_profile, consumer_definer
8
9
  from conan.errors import ConanException
9
- from conans.model.recipe_ref import RecipeReference
10
+ from conan.api.model import RecipeReference
10
11
 
11
12
 
12
13
  class GraphAPI:
@@ -196,7 +197,18 @@ class GraphAPI:
196
197
  :param tested_graph: In case of a "test_package", the graph being tested
197
198
  """
198
199
  ConanOutput().title("Computing necessary packages")
199
- conan_app = ConanApp(self.conan_api)
200
+ conan_app = ConanBasicApp(self.conan_api)
200
201
  binaries_analyzer = GraphBinariesAnalyzer(conan_app, self.conan_api.config.global_conf)
201
202
  binaries_analyzer.evaluate_graph(graph, build_mode, lockfile, remotes, update,
202
203
  build_modes_test, tested_graph)
204
+
205
+ @staticmethod
206
+ def find_first_missing_binary(graph, missing=None):
207
+ """ (Experimental) Given a dependency graph, will return the first node with a
208
+ missing binary package
209
+ """
210
+ for node in graph.ordered_iterate():
211
+ if ((not missing and node.binary == BINARY_MISSING) # First missing binary or specified
212
+ or (missing and ref_matches(node.ref, missing, is_consumer=None))):
213
+ return node.ref, node.conanfile.info
214
+ raise ConanException("There is no missing binary")
@@ -75,7 +75,7 @@ class InstallAPI:
75
75
  # Issue related: https://github.com/conan-io/conan/issues/16543
76
76
  base_folder = os.path.abspath(deploy_folder) if deploy_folder \
77
77
  else conanfile.folders.base_build
78
- do_deploys(self.conan_api, deps_graph, deploy, deploy_package, base_folder)
78
+ do_deploys(self.conan_api.home_folder, deps_graph, deploy, deploy_package, base_folder)
79
79
 
80
80
  final_generators = []
81
81
  # Don't use set for uniqueness because order matters
@@ -89,3 +89,7 @@ class InstallAPI:
89
89
  hook_manager = HookManager(HomePaths(self.conan_api.home_folder).hooks_path)
90
90
  write_generators(conanfile, hook_manager, self.conan_api.home_folder,
91
91
  envs_generation=envs_generation)
92
+
93
+ def deploy(self, graph, deployer, deploy_package=None, deploy_folder=None):
94
+ return do_deploys(self.conan_api.home_folder, graph, deployer, deploy_package=deploy_package,
95
+ deploy_folder=deploy_folder)
@@ -6,12 +6,13 @@ from conan.api.model import PackagesList
6
6
  from conan.api.output import ConanOutput, TimedOutput
7
7
  from conan.internal.api.list.query_parse import filter_package_configs
8
8
  from conan.internal.conan_app import ConanBasicApp
9
+ from conan.internal.model.recipe_ref import ref_matches
9
10
  from conan.internal.paths import CONANINFO
10
11
  from conan.internal.errors import NotFoundException
11
12
  from conan.errors import ConanException
12
- from conans.model.info import load_binary_info
13
- from conans.model.package_ref import PkgReference
14
- from conans.model.recipe_ref import RecipeReference, ref_matches
13
+ from conan.internal.model.info import load_binary_info
14
+ from conan.api.model import PkgReference
15
+ from conan.api.model import RecipeReference
15
16
  from conans.util.dates import timelimit
16
17
  from conans.util.files import load
17
18
 
@@ -224,6 +225,8 @@ class ListAPI:
224
225
  return select_bundle
225
226
 
226
227
  def explain_missing_binaries(self, ref, conaninfo, remotes):
228
+ """ (Experimental) Explain why a binary is missing in the cache
229
+ """
227
230
  ConanOutput().info(f"Missing binary: {ref}")
228
231
  ConanOutput().info(f"With conaninfo.txt (package_id):\n{conaninfo.dumps()}")
229
232
  conaninfo = load_binary_info(conaninfo.dumps())
@@ -391,10 +394,12 @@ def _get_cache_packages_binary_info(cache, prefs) -> Dict[PkgReference, dict]:
391
394
  # Read conaninfo
392
395
  info_path = os.path.join(pkg_layout.package(), CONANINFO)
393
396
  if not os.path.exists(info_path):
394
- raise ConanException(f"Corrupted package '{pkg_layout.reference}' "
395
- f"without conaninfo.txt in: {info_path}")
396
- conan_info_content = load(info_path)
397
- info = load_binary_info(conan_info_content)
397
+ ConanOutput().error(f"Corrupted package '{pkg_layout.reference}' "
398
+ f"without conaninfo.txt in: {info_path}")
399
+ info = {}
400
+ else:
401
+ conan_info_content = load(info_path)
402
+ info = load_binary_info(conan_info_content)
398
403
  pref = pkg_layout.reference
399
404
  # The key shoudln't have the latest package revision, we are asking for package configs
400
405
  pref.revision = None
@@ -10,7 +10,7 @@ from conans.client.graph.profile_node_definer import initialize_conanfile_profil
10
10
  from conan.internal.errors import conanfile_exception_formatter
11
11
  from conan.errors import ConanException
12
12
  from conans.client.hook_manager import HookManager
13
- from conans.model.recipe_ref import RecipeReference
13
+ from conan.api.model import RecipeReference
14
14
  from conans.util.files import chdir
15
15
 
16
16
 
@@ -118,3 +118,6 @@ class LocalAPI:
118
118
  conanfile = app.loader.load_named(conanfile_path, name=name, version=version, user=user,
119
119
  channel=channel, remotes=remotes, graph_lock=lockfile)
120
120
  return conanfile
121
+
122
+ def reinit(self):
123
+ self.editable_packages = EditablePackages(self._conan_api.home_folder)
@@ -4,7 +4,7 @@ from conan.api.output import ConanOutput
4
4
  from conan.cli import make_abs_path
5
5
  from conans.client.graph.graph import Overrides
6
6
  from conan.errors import ConanException
7
- from conans.model.graph_lock import Lockfile, LOCKFILE
7
+ from conan.internal.model.lockfile import Lockfile, LOCKFILE
8
8
 
9
9
 
10
10
  class LockfileAPI:
@@ -80,6 +80,15 @@ class LockfileAPI:
80
80
  lockfile.update_lock(graph, lock_packages)
81
81
  return lockfile
82
82
 
83
+ @staticmethod
84
+ def merge_lockfiles(lockfiles):
85
+ result = Lockfile()
86
+ for lockfile in lockfiles:
87
+ lockfile = make_abs_path(lockfile)
88
+ graph_lock = Lockfile.load(lockfile)
89
+ result.merge(graph_lock)
90
+ return result
91
+
83
92
  @staticmethod
84
93
  def add_lockfile(lockfile=None, requires=None, build_requires=None, python_requires=None,
85
94
  config_requires=None):