conan 2.13.0__tar.gz → 2.15.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 (346) hide show
  1. {conan-2.13.0/conan.egg-info → conan-2.15.0}/PKG-INFO +1 -1
  2. {conan-2.13.0 → conan-2.15.0}/conan/__init__.py +1 -1
  3. {conan-2.13.0 → conan-2.15.0}/conan/api/conan_api.py +9 -0
  4. {conan-2.13.0 → conan-2.15.0}/conan/api/model/list.py +49 -4
  5. conan-2.15.0/conan/api/subapi/audit.py +162 -0
  6. {conan-2.13.0 → conan-2.15.0}/conan/api/subapi/command.py +27 -3
  7. {conan-2.13.0 → conan-2.15.0}/conan/api/subapi/config.py +3 -0
  8. {conan-2.13.0 → conan-2.15.0}/conan/api/subapi/export.py +2 -4
  9. {conan-2.13.0 → conan-2.15.0}/conan/api/subapi/install.py +7 -6
  10. {conan-2.13.0 → conan-2.15.0}/conan/api/subapi/list.py +79 -2
  11. {conan-2.13.0 → conan-2.15.0}/conan/api/subapi/local.py +2 -4
  12. {conan-2.13.0 → conan-2.15.0}/conan/api/subapi/workspace.py +10 -0
  13. {conan-2.13.0 → conan-2.15.0}/conan/cli/cli.py +2 -2
  14. conan-2.15.0/conan/cli/commands/audit.py +198 -0
  15. {conan-2.13.0 → conan-2.15.0}/conan/cli/commands/create.py +5 -22
  16. {conan-2.13.0 → conan-2.15.0}/conan/cli/commands/graph.py +5 -50
  17. {conan-2.13.0 → conan-2.15.0}/conan/cli/commands/list.py +5 -2
  18. {conan-2.13.0 → conan-2.15.0}/conan/cli/commands/pkglist.py +4 -34
  19. {conan-2.13.0 → conan-2.15.0}/conan/cli/commands/workspace.py +7 -6
  20. conan-2.15.0/conan/cli/formatters/audit/vulnerabilities.py +271 -0
  21. conan-2.15.0/conan/cli/formatters/graph/graph.py +62 -0
  22. {conan-2.13.0 → conan-2.15.0}/conan/cli/formatters/list/list.py +4 -2
  23. {conan-2.13.0 → conan-2.15.0}/conan/cli/printers/graph.py +10 -6
  24. conan-2.15.0/conan/internal/api/audit/providers.py +205 -0
  25. {conan-2.13.0 → conan-2.15.0}/conan/internal/api/install/generators.py +15 -10
  26. {conan-2.13.0 → conan-2.15.0}/conan/internal/api/profile/profile_loader.py +1 -1
  27. {conan-2.13.0 → conan-2.15.0}/conan/internal/api/uploader.py +1 -1
  28. {conan-2.13.0 → conan-2.15.0}/conan/internal/cache/home_paths.py +4 -4
  29. {conan-2.13.0 → conan-2.15.0}/conan/internal/conan_app.py +22 -0
  30. {conan-2.13.0 → conan-2.15.0}/conan/internal/default_settings.py +2 -1
  31. {conan-2.13.0 → conan-2.15.0}/conan/internal/model/conan_file.py +2 -1
  32. {conan-2.13.0 → conan-2.15.0}/conan/internal/model/conf.py +7 -9
  33. {conan-2.13.0 → conan-2.15.0}/conan/internal/model/cpp_info.py +37 -28
  34. {conan-2.13.0 → conan-2.15.0}/conan/internal/model/requires.py +1 -1
  35. {conan-2.13.0 → conan-2.15.0}/conan/internal/model/version_range.py +8 -1
  36. {conan-2.13.0 → conan-2.15.0}/conan/test/utils/tools.py +13 -0
  37. {conan-2.13.0 → conan-2.15.0}/conan/tools/apple/apple.py +3 -3
  38. {conan-2.13.0 → conan-2.15.0}/conan/tools/cmake/cmakedeps/cmakedeps.py +1 -1
  39. {conan-2.13.0 → conan-2.15.0}/conan/tools/cmake/cmakedeps/templates/target_configuration.py +6 -18
  40. {conan-2.13.0 → conan-2.15.0}/conan/tools/cmake/cmakedeps2/cmakedeps.py +12 -6
  41. {conan-2.13.0 → conan-2.15.0}/conan/tools/cmake/cmakedeps2/target_configuration.py +50 -14
  42. {conan-2.13.0 → conan-2.15.0}/conan/tools/env/environment.py +1 -1
  43. {conan-2.13.0 → conan-2.15.0}/conan/tools/files/__init__.py +1 -1
  44. {conan-2.13.0 → conan-2.15.0}/conan/tools/files/files.py +86 -7
  45. {conan-2.13.0 → conan-2.15.0}/conan/tools/meson/helpers.py +11 -0
  46. {conan-2.13.0 → conan-2.15.0}/conan/tools/meson/toolchain.py +13 -0
  47. {conan-2.13.0 → conan-2.15.0}/conan/tools/microsoft/msbuilddeps.py +11 -6
  48. {conan-2.13.0 → conan-2.15.0}/conan/tools/microsoft/visual.py +1 -1
  49. {conan-2.13.0 → conan-2.15.0}/conan/tools/sbom/cyclonedx.py +15 -15
  50. {conan-2.13.0 → conan-2.15.0/conan.egg-info}/PKG-INFO +1 -1
  51. {conan-2.13.0 → conan-2.15.0}/conan.egg-info/SOURCES.txt +6 -0
  52. {conan-2.13.0 → conan-2.15.0}/conans/client/downloaders/download_cache.py +3 -2
  53. {conan-2.13.0 → conan-2.15.0}/conans/client/graph/compute_pid.py +7 -3
  54. {conan-2.13.0 → conan-2.15.0}/conans/client/graph/graph.py +0 -7
  55. {conan-2.13.0 → conan-2.15.0}/conans/client/graph/graph_binaries.py +3 -2
  56. {conan-2.13.0 → conan-2.15.0}/conans/client/graph/graph_builder.py +17 -6
  57. {conan-2.13.0 → conan-2.15.0}/conans/client/graph/install_graph.py +13 -1
  58. {conan-2.13.0 → conan-2.15.0}/conans/client/graph/proxy.py +1 -1
  59. {conan-2.13.0 → conan-2.15.0}/conans/client/graph/python_requires.py +1 -1
  60. {conan-2.13.0 → conan-2.15.0}/conans/client/hook_manager.py +1 -0
  61. {conan-2.13.0 → conan-2.15.0}/conans/client/installer.py +3 -8
  62. {conan-2.13.0 → conan-2.15.0}/conans/client/rest_client_local_recipe_index.py +4 -7
  63. conan-2.15.0/conans/model/__init__.py +0 -0
  64. conan-2.15.0/conans/util/__init__.py +0 -0
  65. conan-2.13.0/conan/cli/formatters/graph/graph.py +0 -148
  66. {conan-2.13.0 → conan-2.15.0}/LICENSE.md +0 -0
  67. {conan-2.13.0 → conan-2.15.0}/MANIFEST.in +0 -0
  68. {conan-2.13.0 → conan-2.15.0}/README.md +0 -0
  69. {conan-2.13.0 → conan-2.15.0}/conan/api/__init__.py +0 -0
  70. {conan-2.13.0 → conan-2.15.0}/conan/api/input.py +0 -0
  71. {conan-2.13.0 → conan-2.15.0}/conan/api/model/__init__.py +0 -0
  72. {conan-2.13.0 → conan-2.15.0}/conan/api/model/refs.py +0 -0
  73. {conan-2.13.0 → conan-2.15.0}/conan/api/model/remote.py +0 -0
  74. {conan-2.13.0 → conan-2.15.0}/conan/api/output.py +0 -0
  75. {conan-2.13.0 → conan-2.15.0}/conan/api/subapi/__init__.py +0 -0
  76. {conan-2.13.0 → conan-2.15.0}/conan/api/subapi/cache.py +0 -0
  77. {conan-2.13.0 → conan-2.15.0}/conan/api/subapi/download.py +0 -0
  78. {conan-2.13.0 → conan-2.15.0}/conan/api/subapi/graph.py +0 -0
  79. {conan-2.13.0 → conan-2.15.0}/conan/api/subapi/lockfile.py +0 -0
  80. {conan-2.13.0 → conan-2.15.0}/conan/api/subapi/new.py +0 -0
  81. {conan-2.13.0 → conan-2.15.0}/conan/api/subapi/profiles.py +0 -0
  82. {conan-2.13.0 → conan-2.15.0}/conan/api/subapi/remotes.py +0 -0
  83. {conan-2.13.0 → conan-2.15.0}/conan/api/subapi/remove.py +0 -0
  84. {conan-2.13.0 → conan-2.15.0}/conan/api/subapi/search.py +0 -0
  85. {conan-2.13.0 → conan-2.15.0}/conan/api/subapi/upload.py +0 -0
  86. {conan-2.13.0 → conan-2.15.0}/conan/cli/__init__.py +0 -0
  87. {conan-2.13.0 → conan-2.15.0}/conan/cli/args.py +0 -0
  88. {conan-2.13.0 → conan-2.15.0}/conan/cli/command.py +0 -0
  89. {conan-2.13.0 → conan-2.15.0}/conan/cli/commands/__init__.py +0 -0
  90. {conan-2.13.0 → conan-2.15.0}/conan/cli/commands/build.py +0 -0
  91. {conan-2.13.0 → conan-2.15.0}/conan/cli/commands/cache.py +0 -0
  92. {conan-2.13.0 → conan-2.15.0}/conan/cli/commands/config.py +0 -0
  93. {conan-2.13.0 → conan-2.15.0}/conan/cli/commands/download.py +0 -0
  94. {conan-2.13.0 → conan-2.15.0}/conan/cli/commands/editable.py +0 -0
  95. {conan-2.13.0 → conan-2.15.0}/conan/cli/commands/export.py +0 -0
  96. {conan-2.13.0 → conan-2.15.0}/conan/cli/commands/export_pkg.py +0 -0
  97. {conan-2.13.0 → conan-2.15.0}/conan/cli/commands/inspect.py +0 -0
  98. {conan-2.13.0 → conan-2.15.0}/conan/cli/commands/install.py +0 -0
  99. {conan-2.13.0 → conan-2.15.0}/conan/cli/commands/lock.py +0 -0
  100. {conan-2.13.0 → conan-2.15.0}/conan/cli/commands/new.py +0 -0
  101. {conan-2.13.0 → conan-2.15.0}/conan/cli/commands/profile.py +0 -0
  102. {conan-2.13.0 → conan-2.15.0}/conan/cli/commands/remote.py +0 -0
  103. {conan-2.13.0 → conan-2.15.0}/conan/cli/commands/remove.py +0 -0
  104. {conan-2.13.0 → conan-2.15.0}/conan/cli/commands/search.py +0 -0
  105. {conan-2.13.0 → conan-2.15.0}/conan/cli/commands/source.py +0 -0
  106. {conan-2.13.0 → conan-2.15.0}/conan/cli/commands/test.py +0 -0
  107. {conan-2.13.0 → conan-2.15.0}/conan/cli/commands/upload.py +0 -0
  108. {conan-2.13.0 → conan-2.15.0}/conan/cli/commands/version.py +0 -0
  109. {conan-2.13.0 → conan-2.15.0}/conan/cli/exit_codes.py +0 -0
  110. {conan-2.13.0 → conan-2.15.0}/conan/cli/formatters/__init__.py +0 -0
  111. {conan-2.13.0/conan/internal/api → conan-2.15.0/conan/cli/formatters/audit}/__init__.py +0 -0
  112. {conan-2.13.0 → conan-2.15.0}/conan/cli/formatters/graph/__init__.py +0 -0
  113. {conan-2.13.0 → conan-2.15.0}/conan/cli/formatters/graph/build_order_html.py +0 -0
  114. {conan-2.13.0 → conan-2.15.0}/conan/cli/formatters/graph/graph_info_text.py +0 -0
  115. {conan-2.13.0 → conan-2.15.0}/conan/cli/formatters/graph/info_graph_dot.py +0 -0
  116. {conan-2.13.0 → conan-2.15.0}/conan/cli/formatters/graph/info_graph_html.py +0 -0
  117. {conan-2.13.0 → conan-2.15.0}/conan/cli/formatters/list/__init__.py +0 -0
  118. {conan-2.13.0 → conan-2.15.0}/conan/cli/formatters/list/search_table_html.py +0 -0
  119. {conan-2.13.0 → conan-2.15.0}/conan/cli/printers/__init__.py +0 -0
  120. {conan-2.13.0 → conan-2.15.0}/conan/cps/__init__.py +0 -0
  121. {conan-2.13.0 → conan-2.15.0}/conan/cps/cps.py +0 -0
  122. {conan-2.13.0 → conan-2.15.0}/conan/errors.py +0 -0
  123. {conan-2.13.0 → conan-2.15.0}/conan/internal/__init__.py +0 -0
  124. {conan-2.13.0/conan/internal/api/config → conan-2.15.0/conan/internal/api}/__init__.py +0 -0
  125. {conan-2.13.0/conan/internal/api/detect → conan-2.15.0/conan/internal/api/audit}/__init__.py +0 -0
  126. {conan-2.13.0/conan/internal/api/install → conan-2.15.0/conan/internal/api/config}/__init__.py +0 -0
  127. {conan-2.13.0 → conan-2.15.0}/conan/internal/api/config/config_installer.py +0 -0
  128. {conan-2.13.0/conan/internal/api/list → conan-2.15.0/conan/internal/api/detect}/__init__.py +0 -0
  129. {conan-2.13.0 → conan-2.15.0}/conan/internal/api/detect/detect_api.py +0 -0
  130. {conan-2.13.0 → conan-2.15.0}/conan/internal/api/detect/detect_vs.py +0 -0
  131. {conan-2.13.0 → conan-2.15.0}/conan/internal/api/export.py +0 -0
  132. {conan-2.13.0/conan/internal/api/local → conan-2.15.0/conan/internal/api/install}/__init__.py +0 -0
  133. {conan-2.13.0/conan/internal/api/new → conan-2.15.0/conan/internal/api/list}/__init__.py +0 -0
  134. {conan-2.13.0 → conan-2.15.0}/conan/internal/api/list/query_parse.py +0 -0
  135. {conan-2.13.0/conan/internal/api/profile → conan-2.15.0/conan/internal/api/local}/__init__.py +0 -0
  136. {conan-2.13.0 → conan-2.15.0}/conan/internal/api/local/editable.py +0 -0
  137. {conan-2.13.0/conan/internal/api/remotes → conan-2.15.0/conan/internal/api/new}/__init__.py +0 -0
  138. {conan-2.13.0 → conan-2.15.0}/conan/internal/api/new/alias_new.py +0 -0
  139. {conan-2.13.0 → conan-2.15.0}/conan/internal/api/new/autoools_exe.py +0 -0
  140. {conan-2.13.0 → conan-2.15.0}/conan/internal/api/new/autotools_lib.py +0 -0
  141. {conan-2.13.0 → conan-2.15.0}/conan/internal/api/new/basic.py +0 -0
  142. {conan-2.13.0 → conan-2.15.0}/conan/internal/api/new/bazel_7_exe.py +0 -0
  143. {conan-2.13.0 → conan-2.15.0}/conan/internal/api/new/bazel_7_lib.py +0 -0
  144. {conan-2.13.0 → conan-2.15.0}/conan/internal/api/new/bazel_exe.py +0 -0
  145. {conan-2.13.0 → conan-2.15.0}/conan/internal/api/new/bazel_lib.py +0 -0
  146. {conan-2.13.0 → conan-2.15.0}/conan/internal/api/new/cmake_exe.py +0 -0
  147. {conan-2.13.0 → conan-2.15.0}/conan/internal/api/new/cmake_lib.py +0 -0
  148. {conan-2.13.0 → conan-2.15.0}/conan/internal/api/new/local_recipes_index.py +0 -0
  149. {conan-2.13.0 → conan-2.15.0}/conan/internal/api/new/meson_exe.py +0 -0
  150. {conan-2.13.0 → conan-2.15.0}/conan/internal/api/new/meson_lib.py +0 -0
  151. {conan-2.13.0 → conan-2.15.0}/conan/internal/api/new/msbuild_exe.py +0 -0
  152. {conan-2.13.0 → conan-2.15.0}/conan/internal/api/new/msbuild_lib.py +0 -0
  153. {conan-2.13.0 → conan-2.15.0}/conan/internal/api/new/qbs_lib.py +0 -0
  154. {conan-2.13.0 → conan-2.15.0}/conan/internal/api/new/workspace.py +0 -0
  155. {conan-2.13.0/conan/internal/cache → conan-2.15.0/conan/internal/api/profile}/__init__.py +0 -0
  156. {conan-2.13.0 → conan-2.15.0}/conan/internal/api/profile/detect.py +0 -0
  157. {conan-2.13.0/conan/internal/cache/db → conan-2.15.0/conan/internal/api/remotes}/__init__.py +0 -0
  158. {conan-2.13.0 → conan-2.15.0}/conan/internal/api/remotes/encrypt.py +0 -0
  159. {conan-2.13.0 → conan-2.15.0}/conan/internal/api/remotes/localdb.py +0 -0
  160. {conan-2.13.0/conan/internal/model → conan-2.15.0/conan/internal/cache}/__init__.py +0 -0
  161. {conan-2.13.0 → conan-2.15.0}/conan/internal/cache/cache.py +0 -0
  162. {conan-2.13.0 → conan-2.15.0}/conan/internal/cache/conan_reference_layout.py +0 -0
  163. {conan-2.13.0/conan/test → conan-2.15.0/conan/internal/cache/db}/__init__.py +0 -0
  164. {conan-2.13.0 → conan-2.15.0}/conan/internal/cache/db/cache_database.py +0 -0
  165. {conan-2.13.0 → conan-2.15.0}/conan/internal/cache/db/packages_table.py +0 -0
  166. {conan-2.13.0 → conan-2.15.0}/conan/internal/cache/db/recipes_table.py +0 -0
  167. {conan-2.13.0 → conan-2.15.0}/conan/internal/cache/db/table.py +0 -0
  168. {conan-2.13.0 → conan-2.15.0}/conan/internal/cache/integrity_check.py +0 -0
  169. {conan-2.13.0 → conan-2.15.0}/conan/internal/deploy.py +0 -0
  170. {conan-2.13.0 → conan-2.15.0}/conan/internal/errors.py +0 -0
  171. {conan-2.13.0 → conan-2.15.0}/conan/internal/internal_tools.py +0 -0
  172. {conan-2.13.0 → conan-2.15.0}/conan/internal/methods.py +0 -0
  173. {conan-2.13.0/conan/test/assets → conan-2.15.0/conan/internal/model}/__init__.py +0 -0
  174. {conan-2.13.0 → conan-2.15.0}/conan/internal/model/conanfile_interface.py +0 -0
  175. {conan-2.13.0 → conan-2.15.0}/conan/internal/model/dependencies.py +0 -0
  176. {conan-2.13.0 → conan-2.15.0}/conan/internal/model/info.py +0 -0
  177. {conan-2.13.0 → conan-2.15.0}/conan/internal/model/layout.py +0 -0
  178. {conan-2.13.0 → conan-2.15.0}/conan/internal/model/lockfile.py +0 -0
  179. {conan-2.13.0 → conan-2.15.0}/conan/internal/model/manifest.py +0 -0
  180. {conan-2.13.0 → conan-2.15.0}/conan/internal/model/options.py +0 -0
  181. {conan-2.13.0 → conan-2.15.0}/conan/internal/model/pkg_type.py +0 -0
  182. {conan-2.13.0 → conan-2.15.0}/conan/internal/model/profile.py +0 -0
  183. {conan-2.13.0 → conan-2.15.0}/conan/internal/model/recipe_ref.py +0 -0
  184. {conan-2.13.0 → conan-2.15.0}/conan/internal/model/settings.py +0 -0
  185. {conan-2.13.0 → conan-2.15.0}/conan/internal/model/version.py +0 -0
  186. {conan-2.13.0 → conan-2.15.0}/conan/internal/model/workspace.py +0 -0
  187. {conan-2.13.0 → conan-2.15.0}/conan/internal/paths.py +0 -0
  188. {conan-2.13.0 → conan-2.15.0}/conan/internal/runner/__init__.py +0 -0
  189. {conan-2.13.0 → conan-2.15.0}/conan/internal/runner/docker.py +0 -0
  190. {conan-2.13.0 → conan-2.15.0}/conan/internal/runner/output.py +0 -0
  191. {conan-2.13.0 → conan-2.15.0}/conan/internal/runner/ssh.py +0 -0
  192. {conan-2.13.0 → conan-2.15.0}/conan/internal/runner/wsl.py +0 -0
  193. {conan-2.13.0/conan/test/utils → conan-2.15.0/conan/test}/__init__.py +0 -0
  194. {conan-2.13.0/conan/tools/cmake/cmakedeps2 → conan-2.15.0/conan/test/assets}/__init__.py +0 -0
  195. {conan-2.13.0 → conan-2.15.0}/conan/test/assets/autotools.py +0 -0
  196. {conan-2.13.0 → conan-2.15.0}/conan/test/assets/cmake.py +0 -0
  197. {conan-2.13.0 → conan-2.15.0}/conan/test/assets/genconanfile.py +0 -0
  198. {conan-2.13.0 → conan-2.15.0}/conan/test/assets/sources.py +0 -0
  199. {conan-2.13.0 → conan-2.15.0}/conan/test/assets/visual_project_files.py +0 -0
  200. {conan-2.13.0/conan/tools/system → conan-2.15.0/conan/test/utils}/__init__.py +0 -0
  201. {conan-2.13.0 → conan-2.15.0}/conan/test/utils/artifactory.py +0 -0
  202. {conan-2.13.0 → conan-2.15.0}/conan/test/utils/env.py +0 -0
  203. {conan-2.13.0 → conan-2.15.0}/conan/test/utils/file_server.py +0 -0
  204. {conan-2.13.0 → conan-2.15.0}/conan/test/utils/mocks.py +0 -0
  205. {conan-2.13.0 → conan-2.15.0}/conan/test/utils/profiles.py +0 -0
  206. {conan-2.13.0 → conan-2.15.0}/conan/test/utils/scm.py +0 -0
  207. {conan-2.13.0 → conan-2.15.0}/conan/test/utils/server_launcher.py +0 -0
  208. {conan-2.13.0 → conan-2.15.0}/conan/test/utils/test_files.py +0 -0
  209. {conan-2.13.0 → conan-2.15.0}/conan/tools/__init__.py +0 -0
  210. {conan-2.13.0 → conan-2.15.0}/conan/tools/android/__init__.py +0 -0
  211. {conan-2.13.0 → conan-2.15.0}/conan/tools/android/utils.py +0 -0
  212. {conan-2.13.0 → conan-2.15.0}/conan/tools/apple/__init__.py +0 -0
  213. {conan-2.13.0 → conan-2.15.0}/conan/tools/apple/xcodebuild.py +0 -0
  214. {conan-2.13.0 → conan-2.15.0}/conan/tools/apple/xcodedeps.py +0 -0
  215. {conan-2.13.0 → conan-2.15.0}/conan/tools/apple/xcodetoolchain.py +0 -0
  216. {conan-2.13.0 → conan-2.15.0}/conan/tools/build/__init__.py +0 -0
  217. {conan-2.13.0 → conan-2.15.0}/conan/tools/build/cppstd.py +0 -0
  218. {conan-2.13.0 → conan-2.15.0}/conan/tools/build/cpu.py +0 -0
  219. {conan-2.13.0 → conan-2.15.0}/conan/tools/build/cross_building.py +0 -0
  220. {conan-2.13.0 → conan-2.15.0}/conan/tools/build/cstd.py +0 -0
  221. {conan-2.13.0 → conan-2.15.0}/conan/tools/build/flags.py +0 -0
  222. {conan-2.13.0 → conan-2.15.0}/conan/tools/build/stdcpp_library.py +0 -0
  223. {conan-2.13.0 → conan-2.15.0}/conan/tools/cmake/__init__.py +0 -0
  224. {conan-2.13.0 → conan-2.15.0}/conan/tools/cmake/cmake.py +0 -0
  225. {conan-2.13.0 → conan-2.15.0}/conan/tools/cmake/cmakedeps/__init__.py +0 -0
  226. {conan-2.13.0 → conan-2.15.0}/conan/tools/cmake/cmakedeps/templates/__init__.py +0 -0
  227. {conan-2.13.0 → conan-2.15.0}/conan/tools/cmake/cmakedeps/templates/config.py +0 -0
  228. {conan-2.13.0 → conan-2.15.0}/conan/tools/cmake/cmakedeps/templates/config_version.py +0 -0
  229. {conan-2.13.0 → conan-2.15.0}/conan/tools/cmake/cmakedeps/templates/macros.py +0 -0
  230. {conan-2.13.0 → conan-2.15.0}/conan/tools/cmake/cmakedeps/templates/target_data.py +0 -0
  231. {conan-2.13.0 → conan-2.15.0}/conan/tools/cmake/cmakedeps/templates/targets.py +0 -0
  232. {conan-2.13.0/conans → conan-2.15.0/conan/tools/cmake/cmakedeps2}/__init__.py +0 -0
  233. {conan-2.13.0 → conan-2.15.0}/conan/tools/cmake/cmakedeps2/config.py +0 -0
  234. {conan-2.13.0 → conan-2.15.0}/conan/tools/cmake/cmakedeps2/config_version.py +0 -0
  235. {conan-2.13.0 → conan-2.15.0}/conan/tools/cmake/cmakedeps2/targets.py +0 -0
  236. {conan-2.13.0 → conan-2.15.0}/conan/tools/cmake/layout.py +0 -0
  237. {conan-2.13.0 → conan-2.15.0}/conan/tools/cmake/presets.py +0 -0
  238. {conan-2.13.0 → conan-2.15.0}/conan/tools/cmake/toolchain/__init__.py +0 -0
  239. {conan-2.13.0 → conan-2.15.0}/conan/tools/cmake/toolchain/blocks.py +0 -0
  240. {conan-2.13.0 → conan-2.15.0}/conan/tools/cmake/toolchain/toolchain.py +0 -0
  241. {conan-2.13.0 → conan-2.15.0}/conan/tools/cmake/utils.py +0 -0
  242. {conan-2.13.0 → conan-2.15.0}/conan/tools/cps/__init__.py +0 -0
  243. {conan-2.13.0 → conan-2.15.0}/conan/tools/cps/cps_deps.py +0 -0
  244. {conan-2.13.0 → conan-2.15.0}/conan/tools/env/__init__.py +0 -0
  245. {conan-2.13.0 → conan-2.15.0}/conan/tools/env/virtualbuildenv.py +0 -0
  246. {conan-2.13.0 → conan-2.15.0}/conan/tools/env/virtualrunenv.py +0 -0
  247. {conan-2.13.0 → conan-2.15.0}/conan/tools/files/conandata.py +0 -0
  248. {conan-2.13.0 → conan-2.15.0}/conan/tools/files/copy_pattern.py +0 -0
  249. {conan-2.13.0 → conan-2.15.0}/conan/tools/files/packager.py +0 -0
  250. {conan-2.13.0 → conan-2.15.0}/conan/tools/files/patches.py +0 -0
  251. {conan-2.13.0 → conan-2.15.0}/conan/tools/files/symlinks/__init__.py +0 -0
  252. {conan-2.13.0 → conan-2.15.0}/conan/tools/files/symlinks/symlinks.py +0 -0
  253. {conan-2.13.0 → conan-2.15.0}/conan/tools/gnu/__init__.py +0 -0
  254. {conan-2.13.0 → conan-2.15.0}/conan/tools/gnu/autotools.py +0 -0
  255. {conan-2.13.0 → conan-2.15.0}/conan/tools/gnu/autotoolsdeps.py +0 -0
  256. {conan-2.13.0 → conan-2.15.0}/conan/tools/gnu/autotoolstoolchain.py +0 -0
  257. {conan-2.13.0 → conan-2.15.0}/conan/tools/gnu/get_gnu_triplet.py +0 -0
  258. {conan-2.13.0 → conan-2.15.0}/conan/tools/gnu/gnudeps_flags.py +0 -0
  259. {conan-2.13.0 → conan-2.15.0}/conan/tools/gnu/gnutoolchain.py +0 -0
  260. {conan-2.13.0 → conan-2.15.0}/conan/tools/gnu/makedeps.py +0 -0
  261. {conan-2.13.0 → conan-2.15.0}/conan/tools/gnu/pkgconfig.py +0 -0
  262. {conan-2.13.0 → conan-2.15.0}/conan/tools/gnu/pkgconfigdeps.py +0 -0
  263. {conan-2.13.0 → conan-2.15.0}/conan/tools/google/__init__.py +0 -0
  264. {conan-2.13.0 → conan-2.15.0}/conan/tools/google/bazel.py +0 -0
  265. {conan-2.13.0 → conan-2.15.0}/conan/tools/google/bazeldeps.py +0 -0
  266. {conan-2.13.0 → conan-2.15.0}/conan/tools/google/layout.py +0 -0
  267. {conan-2.13.0 → conan-2.15.0}/conan/tools/google/toolchain.py +0 -0
  268. {conan-2.13.0 → conan-2.15.0}/conan/tools/intel/__init__.py +0 -0
  269. {conan-2.13.0 → conan-2.15.0}/conan/tools/intel/intel_cc.py +0 -0
  270. {conan-2.13.0 → conan-2.15.0}/conan/tools/layout/__init__.py +0 -0
  271. {conan-2.13.0 → conan-2.15.0}/conan/tools/meson/__init__.py +0 -0
  272. {conan-2.13.0 → conan-2.15.0}/conan/tools/meson/meson.py +0 -0
  273. {conan-2.13.0 → conan-2.15.0}/conan/tools/microsoft/__init__.py +0 -0
  274. {conan-2.13.0 → conan-2.15.0}/conan/tools/microsoft/layout.py +0 -0
  275. {conan-2.13.0 → conan-2.15.0}/conan/tools/microsoft/msbuild.py +0 -0
  276. {conan-2.13.0 → conan-2.15.0}/conan/tools/microsoft/nmakedeps.py +0 -0
  277. {conan-2.13.0 → conan-2.15.0}/conan/tools/microsoft/nmaketoolchain.py +0 -0
  278. {conan-2.13.0 → conan-2.15.0}/conan/tools/microsoft/subsystems.py +0 -0
  279. {conan-2.13.0 → conan-2.15.0}/conan/tools/microsoft/toolchain.py +0 -0
  280. {conan-2.13.0 → conan-2.15.0}/conan/tools/premake/__init__.py +0 -0
  281. {conan-2.13.0 → conan-2.15.0}/conan/tools/premake/premake.py +0 -0
  282. {conan-2.13.0 → conan-2.15.0}/conan/tools/premake/premakedeps.py +0 -0
  283. {conan-2.13.0 → conan-2.15.0}/conan/tools/qbs/__init__.py +0 -0
  284. {conan-2.13.0 → conan-2.15.0}/conan/tools/qbs/common.py +0 -0
  285. {conan-2.13.0 → conan-2.15.0}/conan/tools/qbs/qbs.py +0 -0
  286. {conan-2.13.0 → conan-2.15.0}/conan/tools/qbs/qbsdeps.py +0 -0
  287. {conan-2.13.0 → conan-2.15.0}/conan/tools/qbs/qbsprofile.py +0 -0
  288. {conan-2.13.0 → conan-2.15.0}/conan/tools/ros/__init__.py +0 -0
  289. {conan-2.13.0 → conan-2.15.0}/conan/tools/ros/rosenv.py +0 -0
  290. {conan-2.13.0 → conan-2.15.0}/conan/tools/sbom/__init__.py +0 -0
  291. {conan-2.13.0 → conan-2.15.0}/conan/tools/scm/__init__.py +0 -0
  292. {conan-2.13.0 → conan-2.15.0}/conan/tools/scm/git.py +0 -0
  293. {conan-2.13.0 → conan-2.15.0}/conan/tools/scons/__init__.py +0 -0
  294. {conan-2.13.0 → conan-2.15.0}/conan/tools/scons/sconsdeps.py +0 -0
  295. {conan-2.13.0/conans/client → conan-2.15.0/conan/tools/system}/__init__.py +0 -0
  296. {conan-2.13.0 → conan-2.15.0}/conan/tools/system/package_manager.py +0 -0
  297. {conan-2.13.0 → conan-2.15.0}/conan.egg-info/dependency_links.txt +0 -0
  298. {conan-2.13.0 → conan-2.15.0}/conan.egg-info/entry_points.txt +0 -0
  299. {conan-2.13.0 → conan-2.15.0}/conan.egg-info/requires.txt +0 -0
  300. {conan-2.13.0 → conan-2.15.0}/conan.egg-info/top_level.txt +0 -0
  301. {conan-2.13.0/conans/client/downloaders → conan-2.15.0/conans}/__init__.py +0 -0
  302. {conan-2.13.0/conans/client/graph → conan-2.15.0/conans/client}/__init__.py +0 -0
  303. {conan-2.13.0/conans/model → conan-2.15.0/conans/client/downloaders}/__init__.py +0 -0
  304. {conan-2.13.0 → conan-2.15.0}/conans/client/downloaders/caching_file_downloader.py +0 -0
  305. {conan-2.13.0 → conan-2.15.0}/conans/client/downloaders/file_downloader.py +0 -0
  306. {conan-2.13.0/conans/util → conan-2.15.0/conans/client/graph}/__init__.py +0 -0
  307. {conan-2.13.0 → conan-2.15.0}/conans/client/graph/build_mode.py +0 -0
  308. {conan-2.13.0 → conan-2.15.0}/conans/client/graph/compatibility.py +0 -0
  309. {conan-2.13.0 → conan-2.15.0}/conans/client/graph/graph_error.py +0 -0
  310. {conan-2.13.0 → conan-2.15.0}/conans/client/graph/profile_node_definer.py +0 -0
  311. {conan-2.13.0 → conan-2.15.0}/conans/client/graph/provides.py +0 -0
  312. {conan-2.13.0 → conan-2.15.0}/conans/client/graph/range_resolver.py +0 -0
  313. {conan-2.13.0 → conan-2.15.0}/conans/client/loader.py +0 -0
  314. {conan-2.13.0 → conan-2.15.0}/conans/client/loader_txt.py +0 -0
  315. {conan-2.13.0 → conan-2.15.0}/conans/client/migrations.py +0 -0
  316. {conan-2.13.0 → conan-2.15.0}/conans/client/pkg_sign.py +0 -0
  317. {conan-2.13.0 → conan-2.15.0}/conans/client/remote_manager.py +0 -0
  318. {conan-2.13.0 → conan-2.15.0}/conans/client/rest/__init__.py +0 -0
  319. {conan-2.13.0 → conan-2.15.0}/conans/client/rest/auth_manager.py +0 -0
  320. {conan-2.13.0 → conan-2.15.0}/conans/client/rest/client_routes.py +0 -0
  321. {conan-2.13.0 → conan-2.15.0}/conans/client/rest/conan_requester.py +0 -0
  322. {conan-2.13.0 → conan-2.15.0}/conans/client/rest/file_uploader.py +0 -0
  323. {conan-2.13.0 → conan-2.15.0}/conans/client/rest/remote_credentials.py +0 -0
  324. {conan-2.13.0 → conan-2.15.0}/conans/client/rest/rest_client.py +0 -0
  325. {conan-2.13.0 → conan-2.15.0}/conans/client/rest/rest_client_v2.py +0 -0
  326. {conan-2.13.0 → conan-2.15.0}/conans/client/rest/rest_routes.py +0 -0
  327. {conan-2.13.0 → conan-2.15.0}/conans/client/source.py +0 -0
  328. {conan-2.13.0 → conan-2.15.0}/conans/client/subsystems.py +0 -0
  329. {conan-2.13.0 → conan-2.15.0}/conans/conan.py +0 -0
  330. {conan-2.13.0 → conan-2.15.0}/conans/conan_server.py +0 -0
  331. {conan-2.13.0 → conan-2.15.0}/conans/migrations.py +0 -0
  332. {conan-2.13.0 → conan-2.15.0}/conans/model/package_ref.py +0 -0
  333. {conan-2.13.0 → conan-2.15.0}/conans/model/recipe_ref.py +0 -0
  334. {conan-2.13.0 → conan-2.15.0}/conans/requirements.txt +0 -0
  335. {conan-2.13.0 → conan-2.15.0}/conans/requirements_dev.txt +0 -0
  336. {conan-2.13.0 → conan-2.15.0}/conans/requirements_runner.txt +0 -0
  337. {conan-2.13.0 → conan-2.15.0}/conans/requirements_server.txt +0 -0
  338. {conan-2.13.0 → conan-2.15.0}/conans/util/config_parser.py +0 -0
  339. {conan-2.13.0 → conan-2.15.0}/conans/util/dates.py +0 -0
  340. {conan-2.13.0 → conan-2.15.0}/conans/util/files.py +0 -0
  341. {conan-2.13.0 → conan-2.15.0}/conans/util/locks.py +0 -0
  342. {conan-2.13.0 → conan-2.15.0}/conans/util/runners.py +0 -0
  343. {conan-2.13.0 → conan-2.15.0}/conans/util/thread.py +0 -0
  344. {conan-2.13.0 → conan-2.15.0}/pyproject.toml +0 -0
  345. {conan-2.13.0 → conan-2.15.0}/setup.cfg +0 -0
  346. {conan-2.13.0 → conan-2.15.0}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: conan
3
- Version: 2.13.0
3
+ Version: 2.15.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.13.0'
5
+ __version__ = '2.15.0'
6
6
  conan_version = Version(__version__)
@@ -1,6 +1,8 @@
1
+ import os
1
2
  import sys
2
3
 
3
4
  from conan.api.output import init_colorama
5
+ from conan.api.subapi.audit import AuditAPI
4
6
  from conan.api.subapi.cache import CacheAPI
5
7
  from conan.api.subapi.command import CommandAPI
6
8
  from conan.api.subapi.local import LocalAPI
@@ -31,10 +33,16 @@ class ConanAPI:
31
33
  not be created directly.
32
34
  """
33
35
  def __init__(self, cache_folder=None):
36
+ """
37
+ :param cache_folder: Conan cache/home folder. It will have less priority than the
38
+ "home_folder" defined in a Workspace.
39
+ """
34
40
 
35
41
  version = sys.version_info
36
42
  if version.major == 2 or version.minor < 6:
37
43
  raise ConanException("Conan needs Python >= 3.6")
44
+ if cache_folder is not None and not os.path.isabs(cache_folder):
45
+ raise ConanException("cache_folder has to be an absolute path")
38
46
 
39
47
  init_colorama(sys.stderr)
40
48
  self.workspace = WorkspaceAPI(self)
@@ -62,6 +70,7 @@ class ConanAPI:
62
70
  self.cache = CacheAPI(self)
63
71
  self.lockfile = LockfileAPI(self)
64
72
  self.local = LocalAPI(self)
73
+ self.audit = AuditAPI(self)
65
74
 
66
75
  _check_conan_version(self)
67
76
 
@@ -3,9 +3,10 @@ import json
3
3
  import os
4
4
  from json import JSONDecodeError
5
5
 
6
+ from conan.api.model import RecipeReference, PkgReference
7
+ from conan.cli import make_abs_path
6
8
  from conan.errors import ConanException
7
9
  from conan.internal.errors import NotFoundException
8
- from conan.api.model import RecipeReference, PkgReference
9
10
  from conan.internal.model.version_range import VersionRange
10
11
  from conans.client.graph.graph import RECIPE_EDITABLE, RECIPE_CONSUMER, RECIPE_PLATFORM, \
11
12
  RECIPE_VIRTUAL, BINARY_SKIP, BINARY_MISSING, BINARY_INVALID
@@ -36,6 +37,10 @@ class MultiPackagesList:
36
37
  for k, v in other.lists.items():
37
38
  self.lists.setdefault(k, PackagesList()).merge(v)
38
39
 
40
+ def keep_outer(self, other):
41
+ for namespace, other_pkg_list in other.lists.items():
42
+ self.lists.get(namespace, PackagesList()).keep_outer(other_pkg_list)
43
+
39
44
  @staticmethod
40
45
  def load(file):
41
46
  try:
@@ -44,6 +49,14 @@ class MultiPackagesList:
44
49
  raise ConanException(f"Package list file invalid JSON: {file}\n{e}")
45
50
  except Exception as e:
46
51
  raise ConanException(f"Package list file missing or broken: {file}\n{e}")
52
+ # Check if input json is not a graph file
53
+ if "graph" in content:
54
+ base_path = os.path.basename(file)
55
+ raise ConanException(
56
+ 'Expected a package list file but found a graph file. You can create a "package list" JSON file by running:\n\n'
57
+ f"\tconan list --graph {base_path} --format=json > pkglist.json\n\n"
58
+ "More Info at 'https://docs.conan.io/2/examples/commands/pkglists.html"
59
+ )
47
60
  result = {}
48
61
  for remote, pkglist in content.items():
49
62
  if "error" in pkglist:
@@ -55,19 +68,40 @@ class MultiPackagesList:
55
68
  return pkglist
56
69
 
57
70
  @staticmethod
58
- def load_graph(graphfile, graph_recipes=None, graph_binaries=None):
71
+ def load_graph(graphfile, graph_recipes=None, graph_binaries=None, context=None):
59
72
  if not os.path.isfile(graphfile):
60
73
  raise ConanException(f"Graph file not found: {graphfile}")
61
74
  try:
75
+ base_context = context.split("-")[0] if context else None
62
76
  graph = json.loads(load(graphfile))
63
- return MultiPackagesList._define_graph(graph, graph_recipes, graph_binaries)
77
+ # Check if input json is a graph file
78
+ if "graph" not in graph:
79
+ raise ConanException(
80
+ 'Expected a graph file but found an unexpected JSON file format. You can create a "graph" JSON file by running:\n\n'
81
+ f"\tconan [ graph-info | create | export-pkg | install | test ] --format=json > graph.json\n\n"
82
+ "More Info at 'https://docs.conan.io/2/reference/commands/formatters/graph_info_json_formatter.html"
83
+ )
84
+
85
+ mpkglist = MultiPackagesList._define_graph(graph, graph_recipes, graph_binaries,
86
+ context=base_context)
87
+ if context == "build-only":
88
+ host = MultiPackagesList._define_graph(graph, graph_recipes, graph_binaries,
89
+ context="host")
90
+ mpkglist.keep_outer(host)
91
+ elif context == "host-only":
92
+ build = MultiPackagesList._define_graph(graph, graph_recipes, graph_binaries,
93
+ context="build")
94
+ mpkglist.keep_outer(build)
95
+ return mpkglist
64
96
  except JSONDecodeError as e:
65
97
  raise ConanException(f"Graph file invalid JSON: {graphfile}\n{e}")
98
+ except ConanException as e:
99
+ raise e
66
100
  except Exception as e:
67
101
  raise ConanException(f"Graph file broken: {graphfile}\n{e}")
68
102
 
69
103
  @staticmethod
70
- def _define_graph(graph, graph_recipes=None, graph_binaries=None):
104
+ def _define_graph(graph, graph_recipes=None, graph_binaries=None, context=None):
71
105
  pkglist = MultiPackagesList()
72
106
  cache_list = PackagesList()
73
107
  if graph_recipes is None and graph_binaries is None:
@@ -79,6 +113,9 @@ class MultiPackagesList:
79
113
 
80
114
  pkglist.lists["Local Cache"] = cache_list
81
115
  for node in graph["graph"]["nodes"].values():
116
+ if context and node['context'] != context:
117
+ continue
118
+
82
119
  # We need to add the python_requires too
83
120
  python_requires = node.get("python_requires")
84
121
  if python_requires is not None:
@@ -142,6 +179,14 @@ class PackagesList:
142
179
  return d
143
180
  recursive_dict_update(self.recipes, other.recipes)
144
181
 
182
+ def keep_outer(self, other):
183
+ if not self.recipes:
184
+ return
185
+
186
+ for ref, info in other.recipes.items():
187
+ if self.recipes.get(ref, {}) == info:
188
+ self.recipes.pop(ref)
189
+
145
190
  def split(self):
146
191
  """
147
192
  Returns a list of PackageList, splitted one per reference.
@@ -0,0 +1,162 @@
1
+ import binascii
2
+ import json
3
+ import os
4
+ import base64
5
+
6
+ from conan.internal.api.audit.providers import ConanCenterProvider, PrivateProvider
7
+ from conan.errors import ConanException
8
+ from conan.internal.api.remotes.encrypt import encode, decode
9
+ from conan.internal.model.recipe_ref import RecipeReference
10
+ from conans.util.files import save, load
11
+
12
+ CONAN_CENTER_AUDIT_PROVIDER_NAME = "conancenter"
13
+ CYPHER_KEY = "private"
14
+
15
+
16
+ class AuditAPI:
17
+ """
18
+ This class provides the functionality to scan references for vulnerabilities.
19
+ """
20
+
21
+ def __init__(self, conan_api):
22
+ self.conan_api = conan_api
23
+ self._home_folder = conan_api.home_folder
24
+ self._providers_path = os.path.join(self._home_folder, "audit_providers.json")
25
+ self._provider_cls = {
26
+ "conan-center-proxy": ConanCenterProvider,
27
+ "private": PrivateProvider,
28
+ }
29
+
30
+ @staticmethod
31
+ def scan(deps_graph, provider):
32
+ """
33
+ Scan a given recipe for vulnerabilities in its dependencies.
34
+ """
35
+ refs = sorted(set(RecipeReference.loads(f"{node.ref.name}/{node.ref.version}")
36
+ for node in deps_graph.nodes[1:]), key=lambda ref: ref.name)
37
+ return provider.get_cves(refs)
38
+
39
+ @staticmethod
40
+ def list(references, provider):
41
+ """
42
+ List the vulnerabilities of the given reference.
43
+ """
44
+ refs = [RecipeReference.loads(ref) for ref in references]
45
+ for ref in refs:
46
+ ref.validate_ref()
47
+ return provider.get_cves(refs)
48
+
49
+ def get_provider(self, provider_name):
50
+ """
51
+ Get the provider by name.
52
+ """
53
+ # TODO: More work remains to be done here, hardcoded for now for testing
54
+ providers = _load_providers(self._providers_path)
55
+ if provider_name not in providers:
56
+ add_arguments = (
57
+ "--url=https://audit.conan.io/ --type=conan-center-proxy"
58
+ if provider_name == CONAN_CENTER_AUDIT_PROVIDER_NAME
59
+ else "--url=<url> --type=<type>"
60
+ )
61
+
62
+ register_message = (
63
+ f"If you don't have a valid token, register at: https://audit.conan.io/register."
64
+ if provider_name == CONAN_CENTER_AUDIT_PROVIDER_NAME
65
+ else ""
66
+ )
67
+
68
+ raise ConanException(
69
+ f"Provider '{provider_name}' not found. Please specify a valid provider name or add it using: "
70
+ f"'conan audit provider add {provider_name} {add_arguments} --token=<token>'\n"
71
+ f"{register_message}"
72
+ )
73
+
74
+ provider_data = providers[provider_name]
75
+ safe_provider_name = provider_name.replace("-", "_")
76
+ env_token = os.getenv(f"CONAN_AUDIT_PROVIDER_TOKEN_{safe_provider_name.upper()}")
77
+
78
+ if env_token:
79
+ # Always override the token with the environment variable
80
+ provider_data["token"] = env_token
81
+ elif "token" in provider_data:
82
+ try:
83
+ provider_data["token"] = decode(base64.standard_b64decode(provider_data["token"]).decode(), CYPHER_KEY)
84
+ except binascii.Error as e:
85
+ raise ConanException(f"Invalid token format for provider '{provider_name}'. The token might be corrupt.")
86
+
87
+ provider_cls = self._provider_cls.get(provider_data["type"])
88
+
89
+ return provider_cls(self.conan_api, provider_name, provider_data)
90
+
91
+ def list_providers(self):
92
+ """
93
+ Get all available providers.
94
+ """
95
+ providers = _load_providers(self._providers_path)
96
+ result = []
97
+ for name, provider_data in providers.items():
98
+ provider_cls = self._provider_cls.get(provider_data["type"])
99
+ result.append(provider_cls(self.conan_api, name, provider_data))
100
+ return result
101
+
102
+ def add_provider(self, name, url, provider_type):
103
+ """
104
+ Add a provider.
105
+ """
106
+ providers = _load_providers(self._providers_path)
107
+ if name in providers:
108
+ raise ConanException(f"Provider '{name}' already exists")
109
+
110
+ if provider_type not in self._provider_cls:
111
+ raise ConanException(f"Provider type '{provider_type}' not found")
112
+
113
+ providers[name] = {
114
+ "name": name,
115
+ "url": url,
116
+ "type": provider_type
117
+ }
118
+
119
+ _save_providers(self._providers_path, providers)
120
+
121
+ def remove_provider(self, provider_name):
122
+ """
123
+ Remove a provider.
124
+ """
125
+ providers = _load_providers(self._providers_path)
126
+ if provider_name not in providers:
127
+ raise ConanException(f"Provider '{provider_name}' not found")
128
+
129
+ del providers[provider_name]
130
+
131
+ _save_providers(self._providers_path, providers)
132
+
133
+ def auth_provider(self, provider, token):
134
+ """
135
+ Authenticate a provider.
136
+ """
137
+ if not provider:
138
+ raise ConanException("Provider not found")
139
+
140
+ providers = _load_providers(self._providers_path)
141
+
142
+ assert provider.name in providers
143
+ providers[provider.name]["token"] = base64.standard_b64encode(encode(token, CYPHER_KEY).encode()).decode()
144
+ setattr(provider, "token", token)
145
+ _save_providers(self._providers_path, providers)
146
+
147
+
148
+ def _load_providers(providers_path):
149
+ if not os.path.exists(providers_path):
150
+ default_providers = {
151
+ CONAN_CENTER_AUDIT_PROVIDER_NAME: {
152
+ "url": "https://audit.conan.io/",
153
+ "type": "conan-center-proxy"
154
+ }
155
+ }
156
+ save(providers_path, json.dumps(default_providers, indent=4))
157
+
158
+ return json.loads(load(providers_path))
159
+
160
+
161
+ def _save_providers(providers_path, providers):
162
+ save(providers_path, json.dumps(providers, indent=4))
@@ -1,3 +1,5 @@
1
+ import os
2
+
1
3
  from conan.api.output import ConanOutput
2
4
  from conan.errors import ConanException
3
5
 
@@ -25,9 +27,9 @@ class CommandAPI:
25
27
  # get redefined when running a command and leak to the calling scope
26
28
  # if running from a custom command.
27
29
  # Store the old one and restore it after the command execution as a workaround.
28
- _conan_output_level = ConanOutput._conan_output_level
29
- _silent_warn_tags = ConanOutput._silent_warn_tags
30
- _warnings_as_errors = ConanOutput._warnings_as_errors
30
+ _conan_output_level = ConanOutput._conan_output_level # noqa
31
+ _silent_warn_tags = ConanOutput._silent_warn_tags # noqa
32
+ _warnings_as_errors = ConanOutput._warnings_as_errors # noqa
31
33
 
32
34
  try:
33
35
  result = command.run_cli(self.conan_api, args)
@@ -36,3 +38,25 @@ class CommandAPI:
36
38
  ConanOutput._silent_warn_tags = _silent_warn_tags
37
39
  ConanOutput._warnings_as_errors = _warnings_as_errors
38
40
  return result
41
+
42
+ @staticmethod
43
+ def get_runner(profile_host):
44
+ if profile_host.runner and not os.environ.get("CONAN_RUNNER_ENVIRONMENT"):
45
+ from conan.internal.runner.docker import DockerRunner
46
+ from conan.internal.runner.ssh import SSHRunner
47
+ from conan.internal.runner.wsl import WSLRunner
48
+ try:
49
+ runner_type = profile_host.runner['type'].lower()
50
+ except KeyError:
51
+ raise ConanException(f"Invalid runner configuration. 'type' must be defined")
52
+ runner_instances_map = {
53
+ 'docker': DockerRunner,
54
+ # 'ssh': SSHRunner,
55
+ # 'wsl': WSLRunner,
56
+ }
57
+ try:
58
+ runner_instance = runner_instances_map[runner_type]
59
+ except KeyError:
60
+ raise ConanException(f"Invalid runner type '{runner_type}'. "
61
+ f"Allowed values: {', '.join(runner_instances_map.keys())}")
62
+ return runner_instance
@@ -20,6 +20,7 @@ from conan.internal.model.conf import ConfDefinition, BUILT_IN_CONFS, CORE_CONF_
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
23
24
  from conans.util.files import load, save, rmdir, remove
24
25
 
25
26
 
@@ -29,6 +30,7 @@ class ConfigAPI:
29
30
  self.conan_api = conan_api
30
31
  self._new_config = None
31
32
  self._cli_core_confs = None
33
+ self.hook_manager = HookManager(HomePaths(conan_api.home_folder).hooks_path)
32
34
 
33
35
  def home(self):
34
36
  return self.conan_api.cache_folder
@@ -234,3 +236,4 @@ class ConfigAPI:
234
236
  if self._new_config is not None:
235
237
  self._new_config.clear()
236
238
  self._populate_global_conf()
239
+ self.hook_manager = HookManager(HomePaths(self.conan_api.home_folder).hooks_path)
@@ -1,11 +1,9 @@
1
1
  from conan.api.output import ConanOutput
2
2
  from conan.internal.cache.cache import PkgCache
3
- from conan.internal.cache.home_paths import HomePaths
4
3
  from conan.internal.conan_app import ConanApp
5
4
  from conan.internal.api.export import cmd_export
6
5
  from conan.internal.methods import run_package_method
7
6
  from conans.client.graph.graph import BINARY_BUILD, RECIPE_INCACHE
8
- from conans.client.hook_manager import HookManager
9
7
  from conan.api.model import PkgReference
10
8
  from conans.util.files import mkdir
11
9
 
@@ -18,13 +16,13 @@ class ExportAPI:
18
16
  def export(self, path, name, version, user, channel, lockfile=None, remotes=None):
19
17
  ConanOutput().title("Exporting recipe to the cache")
20
18
  app = ConanApp(self.conan_api)
21
- hook_manager = HookManager(HomePaths(self.conan_api.home_folder).hooks_path)
19
+ hook_manager = self.conan_api.config.hook_manager
22
20
  return cmd_export(app, hook_manager, self.conan_api.config.global_conf, path, name, version,
23
21
  user, channel, graph_lock=lockfile, remotes=remotes)
24
22
 
25
23
  def export_pkg(self, deps_graph, source_folder, output_folder):
26
24
  cache = PkgCache(self.conan_api.cache_folder, self.conan_api.config.global_conf)
27
- hook_manager = HookManager(HomePaths(self.conan_api.home_folder).hooks_path)
25
+ hook_manager = self.conan_api.config.hook_manager
28
26
 
29
27
  # The graph has to be loaded with build_mode=[ref.name], so that node is not tried
30
28
  # to be downloaded from remotes
@@ -1,12 +1,10 @@
1
1
  import os
2
2
 
3
3
  from conan.internal.api.install.generators import write_generators
4
- from conan.internal.cache.home_paths import HomePaths
5
4
  from conan.internal.conan_app import ConanBasicApp
6
5
  from conan.internal.deploy import do_deploys
7
6
 
8
7
  from conans.client.graph.install_graph import InstallGraph
9
- from conans.client.hook_manager import HookManager
10
8
  from conans.client.installer import BinaryInstaller
11
9
  from conan.errors import ConanInvalidConfiguration
12
10
 
@@ -22,7 +20,8 @@ class InstallAPI:
22
20
  :param remotes:
23
21
  """
24
22
  app = ConanBasicApp(self.conan_api)
25
- installer = BinaryInstaller(app, self.conan_api.config.global_conf, app.editable_packages)
23
+ installer = BinaryInstaller(app, self.conan_api.config.global_conf, app.editable_packages,
24
+ self.conan_api.config.hook_manager)
26
25
  install_graph = InstallGraph(deps_graph)
27
26
  install_graph.raise_errors()
28
27
  install_order = install_graph.install_order()
@@ -35,7 +34,8 @@ class InstallAPI:
35
34
  :param graph: Dependency graph to intall packages for
36
35
  """
37
36
  app = ConanBasicApp(self.conan_api)
38
- installer = BinaryInstaller(app, self.conan_api.config.global_conf, app.editable_packages)
37
+ installer = BinaryInstaller(app, self.conan_api.config.global_conf, app.editable_packages,
38
+ self.conan_api.config.hook_manager)
39
39
  installer.install_system_requires(graph, only_info)
40
40
 
41
41
  def install_sources(self, graph, remotes):
@@ -45,7 +45,8 @@ class InstallAPI:
45
45
  :param graph: Dependency graph to install packages for
46
46
  """
47
47
  app = ConanBasicApp(self.conan_api)
48
- installer = BinaryInstaller(app, self.conan_api.config.global_conf, app.editable_packages)
48
+ installer = BinaryInstaller(app, self.conan_api.config.global_conf, app.editable_packages,
49
+ self.conan_api.config.hook_manager)
49
50
  installer.install_sources(graph, remotes)
50
51
 
51
52
  # TODO: Look for a better name
@@ -86,7 +87,7 @@ class InstallAPI:
86
87
  if gen not in final_generators:
87
88
  final_generators.append(gen)
88
89
  conanfile.generators = final_generators
89
- hook_manager = HookManager(HomePaths(self.conan_api.home_folder).hooks_path)
90
+ hook_manager = self.conan_api.config.hook_manager
90
91
  write_generators(conanfile, hook_manager, self.conan_api.home_folder,
91
92
  envs_generation=envs_generation)
92
93
 
@@ -1,8 +1,9 @@
1
+ import copy
1
2
  import os
2
3
  from collections import OrderedDict
3
4
  from typing import Dict
4
5
 
5
- from conan.api.model import PackagesList
6
+ from conan.api.model import PackagesList, MultiPackagesList, ListPattern
6
7
  from conan.api.output import ConanOutput, TimedOutput
7
8
  from conan.internal.api.list.query_parse import filter_package_configs
8
9
  from conan.internal.conan_app import ConanBasicApp
@@ -242,7 +243,7 @@ class ListAPI:
242
243
  ConanOutput().info(f"Finding binaries in remote {remote.name}")
243
244
  pkg_configurations = self.packages_configurations(ref, remote=remote)
244
245
  except Exception as e:
245
- ConanOutput(f"ERROR IN REMOTE {remote.name}: {e}")
246
+ ConanOutput().error(f"Error in remote '{remote.name}': {e}")
246
247
  else:
247
248
  candidates.extend(_BinaryDistance(pref, data, conaninfo, remote)
248
249
  for pref, data in pkg_configurations.items())
@@ -266,6 +267,82 @@ class ListAPI:
266
267
  rev_dict["packages"][pref.package_id]["remote"] = remote
267
268
  return pkglist
268
269
 
270
+ def find_remotes(self, package_list, remotes):
271
+ """
272
+ (Experimental) Find the remotes where the current package lists can be found
273
+ """
274
+ result = MultiPackagesList()
275
+ for r in remotes:
276
+ result_pkg_list = PackagesList()
277
+ for ref, recipe_bundle in package_list.refs().items():
278
+ ref_no_rev = copy.copy(ref) # TODO: Improve ugly API
279
+ ref_no_rev.revision = None
280
+ try:
281
+ revs = self.recipe_revisions(ref_no_rev, remote=r)
282
+ except NotFoundException:
283
+ continue
284
+ if ref not in revs: # not found
285
+ continue
286
+ result_pkg_list.add_refs([ref])
287
+ for pref, pref_bundle in package_list.prefs(ref, recipe_bundle).items():
288
+ pref_no_rev = copy.copy(pref) # TODO: Improve ugly API
289
+ pref_no_rev.revision = None
290
+ try:
291
+ prevs = self.package_revisions(pref_no_rev, remote=r)
292
+ except NotFoundException:
293
+ continue
294
+ if pref in prevs:
295
+ result_pkg_list.add_prefs(ref, [pref])
296
+ info = recipe_bundle["packages"][pref.package_id]["info"]
297
+ result_pkg_list.add_configurations({pref: info})
298
+ if result_pkg_list.recipes:
299
+ result.add(r.name, result_pkg_list)
300
+ return result
301
+
302
+ def outdated(self, deps_graph, remotes):
303
+ # DO NOT USE YET
304
+ # Data structure to store info per library
305
+ dependencies = deps_graph.nodes[1:]
306
+ dict_nodes = {}
307
+
308
+ # When there are no dependencies command should stop
309
+ if len(dependencies) == 0:
310
+ return dict_nodes
311
+
312
+ ConanOutput().title("Checking remotes")
313
+
314
+ for node in dependencies:
315
+ dict_nodes.setdefault(node.name, {"cache_refs": set(), "version_ranges": [],
316
+ "latest_remote": None})["cache_refs"].add(node.ref)
317
+
318
+ for version_range in deps_graph.resolved_ranges.keys():
319
+ dict_nodes[version_range.name]["version_ranges"].append(version_range)
320
+
321
+ # find in remotes
322
+ for node_name, node_info in dict_nodes.items():
323
+ ref_pattern = ListPattern(node_name, rrev=None, prev=None)
324
+ for remote in remotes:
325
+ try:
326
+ remote_ref_list = self.select(ref_pattern, package_query=None, remote=remote)
327
+ except NotFoundException:
328
+ continue
329
+ if not remote_ref_list.recipes:
330
+ continue
331
+ str_latest_ref = list(remote_ref_list.recipes.keys())[-1]
332
+ recipe_ref = RecipeReference.loads(str_latest_ref)
333
+ if (node_info["latest_remote"] is None
334
+ or node_info["latest_remote"]["ref"] < recipe_ref):
335
+ node_info["latest_remote"] = {"ref": recipe_ref, "remote": remote.name}
336
+
337
+ # Filter nodes with no outdated versions
338
+ filtered_nodes = {}
339
+ for node_name, node in dict_nodes.items():
340
+ if node['latest_remote'] is not None and sorted(list(node['cache_refs']))[0] < \
341
+ node['latest_remote']['ref']:
342
+ filtered_nodes[node_name] = node
343
+
344
+ return filtered_nodes
345
+
269
346
 
270
347
  class _BinaryDistance:
271
348
  def __init__(self, pref, binary, expected, remote=None):
@@ -1,7 +1,6 @@
1
1
  import os
2
2
 
3
3
  from conan.cli import make_abs_path
4
- from conan.internal.cache.home_paths import HomePaths
5
4
  from conan.internal.conan_app import ConanApp
6
5
  from conan.internal.api.local.editable import EditablePackages
7
6
  from conan.internal.methods import run_build_method, run_source_method
@@ -9,7 +8,6 @@ from conans.client.graph.graph import CONTEXT_HOST
9
8
  from conans.client.graph.profile_node_definer import initialize_conanfile_profile
10
9
  from conan.internal.errors import conanfile_exception_formatter
11
10
  from conan.errors import ConanException
12
- from conans.client.hook_manager import HookManager
13
11
  from conan.api.model import RecipeReference
14
12
  from conans.util.files import chdir
15
13
 
@@ -93,13 +91,13 @@ class LocalAPI:
93
91
  conanfile.folders.set_base_build(None)
94
92
  conanfile.folders.set_base_package(None)
95
93
 
96
- hook_manager = HookManager(HomePaths(self._conan_api.home_folder).hooks_path)
94
+ hook_manager = self._conan_api.config.hook_manager
97
95
  run_source_method(conanfile, hook_manager)
98
96
 
99
97
  def build(self, conanfile):
100
98
  """ calls the 'build()' method of the current (user folder) conanfile.py
101
99
  """
102
- hook_manager = HookManager(HomePaths(self._conan_api.home_folder).hooks_path)
100
+ hook_manager = self._conan_api.config.hook_manager
103
101
  conanfile.folders.set_base_package(conanfile.folders.base_build)
104
102
  conanfile.folders.set_base_pkg_metadata(os.path.join(conanfile.build_folder, "metadata"))
105
103
  run_build_method(conanfile, hook_manager)
@@ -122,6 +122,16 @@ class WorkspaceAPI:
122
122
  v["output_folder"]))
123
123
  return editables
124
124
 
125
+ def select_editables(self, paths):
126
+ filtered_refs = [self.editable_from_path(p) for p in paths or []]
127
+ editables = self.editable_packages
128
+ requires = [ref for ref in editables]
129
+ if filtered_refs:
130
+ ConanOutput().info(f"Filtering and installing only selected editable packages")
131
+ requires = [ref for ref in requires if ref in filtered_refs]
132
+ ConanOutput().info(f"Filtered references: {requires}")
133
+ return requires
134
+
125
135
  @property
126
136
  def products(self):
127
137
  self._check_ws()
@@ -15,7 +15,6 @@ from conan.api.output import ConanOutput, Color, cli_out_write, LEVEL_TRACE
15
15
  from conan.cli.command import ConanSubCommand
16
16
  from conan.cli.exit_codes import SUCCESS, ERROR_MIGRATION, ERROR_GENERAL, USER_CTRL_C, \
17
17
  ERROR_SIGTERM, USER_CTRL_BREAK, ERROR_INVALID_CONFIGURATION, ERROR_UNEXPECTED
18
- from conan.internal.cache.home_paths import HomePaths
19
18
  from conan import __version__
20
19
  from conan.errors import ConanException, ConanInvalidConfiguration, ConanMigrationError
21
20
 
@@ -49,7 +48,8 @@ class Cli:
49
48
  for k, v in self._commands.items(): # Fill groups data too
50
49
  self._groups[v.group].append(k)
51
50
 
52
- conan_custom_commands_path = HomePaths(self._conan_api.cache_folder).custom_commands_path
51
+ conan_custom_commands_path = os.path.join(self._conan_api.cache_folder, "extensions",
52
+ "commands")
53
53
  # Important! This variable should be only used for testing/debugging purpose
54
54
  developer_custom_commands_path = os.getenv(_CONAN_INTERNAL_CUSTOM_COMMANDS_PATH)
55
55
  # Notice that in case of having same custom commands file names, the developer one has