conan 2.13.0__tar.gz → 2.14.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 (345) hide show
  1. {conan-2.13.0/conan.egg-info → conan-2.14.0}/PKG-INFO +1 -1
  2. {conan-2.13.0 → conan-2.14.0}/conan/__init__.py +1 -1
  3. {conan-2.13.0 → conan-2.14.0}/conan/api/conan_api.py +9 -0
  4. conan-2.14.0/conan/api/subapi/audit.py +159 -0
  5. {conan-2.13.0 → conan-2.14.0}/conan/api/subapi/config.py +3 -0
  6. {conan-2.13.0 → conan-2.14.0}/conan/api/subapi/export.py +2 -4
  7. {conan-2.13.0 → conan-2.14.0}/conan/api/subapi/install.py +7 -6
  8. {conan-2.13.0 → conan-2.14.0}/conan/api/subapi/local.py +2 -4
  9. {conan-2.13.0 → conan-2.14.0}/conan/api/subapi/workspace.py +10 -0
  10. conan-2.14.0/conan/cli/commands/audit.py +195 -0
  11. {conan-2.13.0 → conan-2.14.0}/conan/cli/commands/workspace.py +7 -6
  12. conan-2.14.0/conan/cli/formatters/audit/vulnerabilities.py +271 -0
  13. conan-2.14.0/conan/internal/api/audit/providers.py +208 -0
  14. {conan-2.13.0 → conan-2.14.0}/conan/internal/api/profile/profile_loader.py +1 -1
  15. {conan-2.13.0 → conan-2.14.0}/conan/internal/conan_app.py +22 -0
  16. {conan-2.13.0 → conan-2.14.0}/conan/internal/default_settings.py +2 -1
  17. {conan-2.13.0 → conan-2.14.0}/conan/internal/model/cpp_info.py +26 -16
  18. {conan-2.13.0 → conan-2.14.0}/conan/internal/model/requires.py +1 -1
  19. {conan-2.13.0 → conan-2.14.0}/conan/tools/cmake/cmakedeps/cmakedeps.py +1 -1
  20. {conan-2.13.0 → conan-2.14.0}/conan/tools/cmake/cmakedeps/templates/target_configuration.py +6 -18
  21. {conan-2.13.0 → conan-2.14.0}/conan/tools/cmake/cmakedeps2/cmakedeps.py +12 -6
  22. {conan-2.13.0 → conan-2.14.0}/conan/tools/cmake/cmakedeps2/target_configuration.py +44 -11
  23. {conan-2.13.0 → conan-2.14.0}/conan/tools/env/environment.py +1 -1
  24. {conan-2.13.0 → conan-2.14.0}/conan/tools/microsoft/msbuilddeps.py +2 -2
  25. {conan-2.13.0 → conan-2.14.0}/conan/tools/microsoft/visual.py +1 -1
  26. {conan-2.13.0 → conan-2.14.0/conan.egg-info}/PKG-INFO +1 -1
  27. {conan-2.13.0 → conan-2.14.0}/conan.egg-info/SOURCES.txt +6 -0
  28. {conan-2.13.0 → conan-2.14.0}/conans/client/graph/compute_pid.py +7 -3
  29. {conan-2.13.0 → conan-2.14.0}/conans/client/graph/graph_binaries.py +3 -2
  30. {conan-2.13.0 → conan-2.14.0}/conans/client/graph/graph_builder.py +17 -6
  31. {conan-2.13.0 → conan-2.14.0}/conans/client/graph/install_graph.py +13 -1
  32. {conan-2.13.0 → conan-2.14.0}/conans/client/hook_manager.py +1 -0
  33. {conan-2.13.0 → conan-2.14.0}/conans/client/installer.py +2 -4
  34. {conan-2.13.0 → conan-2.14.0}/conans/client/rest_client_local_recipe_index.py +4 -7
  35. conan-2.14.0/conans/model/__init__.py +0 -0
  36. conan-2.14.0/conans/util/__init__.py +0 -0
  37. {conan-2.13.0 → conan-2.14.0}/LICENSE.md +0 -0
  38. {conan-2.13.0 → conan-2.14.0}/MANIFEST.in +0 -0
  39. {conan-2.13.0 → conan-2.14.0}/README.md +0 -0
  40. {conan-2.13.0 → conan-2.14.0}/conan/api/__init__.py +0 -0
  41. {conan-2.13.0 → conan-2.14.0}/conan/api/input.py +0 -0
  42. {conan-2.13.0 → conan-2.14.0}/conan/api/model/__init__.py +0 -0
  43. {conan-2.13.0 → conan-2.14.0}/conan/api/model/list.py +0 -0
  44. {conan-2.13.0 → conan-2.14.0}/conan/api/model/refs.py +0 -0
  45. {conan-2.13.0 → conan-2.14.0}/conan/api/model/remote.py +0 -0
  46. {conan-2.13.0 → conan-2.14.0}/conan/api/output.py +0 -0
  47. {conan-2.13.0 → conan-2.14.0}/conan/api/subapi/__init__.py +0 -0
  48. {conan-2.13.0 → conan-2.14.0}/conan/api/subapi/cache.py +0 -0
  49. {conan-2.13.0 → conan-2.14.0}/conan/api/subapi/command.py +0 -0
  50. {conan-2.13.0 → conan-2.14.0}/conan/api/subapi/download.py +0 -0
  51. {conan-2.13.0 → conan-2.14.0}/conan/api/subapi/graph.py +0 -0
  52. {conan-2.13.0 → conan-2.14.0}/conan/api/subapi/list.py +0 -0
  53. {conan-2.13.0 → conan-2.14.0}/conan/api/subapi/lockfile.py +0 -0
  54. {conan-2.13.0 → conan-2.14.0}/conan/api/subapi/new.py +0 -0
  55. {conan-2.13.0 → conan-2.14.0}/conan/api/subapi/profiles.py +0 -0
  56. {conan-2.13.0 → conan-2.14.0}/conan/api/subapi/remotes.py +0 -0
  57. {conan-2.13.0 → conan-2.14.0}/conan/api/subapi/remove.py +0 -0
  58. {conan-2.13.0 → conan-2.14.0}/conan/api/subapi/search.py +0 -0
  59. {conan-2.13.0 → conan-2.14.0}/conan/api/subapi/upload.py +0 -0
  60. {conan-2.13.0 → conan-2.14.0}/conan/cli/__init__.py +0 -0
  61. {conan-2.13.0 → conan-2.14.0}/conan/cli/args.py +0 -0
  62. {conan-2.13.0 → conan-2.14.0}/conan/cli/cli.py +0 -0
  63. {conan-2.13.0 → conan-2.14.0}/conan/cli/command.py +0 -0
  64. {conan-2.13.0 → conan-2.14.0}/conan/cli/commands/__init__.py +0 -0
  65. {conan-2.13.0 → conan-2.14.0}/conan/cli/commands/build.py +0 -0
  66. {conan-2.13.0 → conan-2.14.0}/conan/cli/commands/cache.py +0 -0
  67. {conan-2.13.0 → conan-2.14.0}/conan/cli/commands/config.py +0 -0
  68. {conan-2.13.0 → conan-2.14.0}/conan/cli/commands/create.py +0 -0
  69. {conan-2.13.0 → conan-2.14.0}/conan/cli/commands/download.py +0 -0
  70. {conan-2.13.0 → conan-2.14.0}/conan/cli/commands/editable.py +0 -0
  71. {conan-2.13.0 → conan-2.14.0}/conan/cli/commands/export.py +0 -0
  72. {conan-2.13.0 → conan-2.14.0}/conan/cli/commands/export_pkg.py +0 -0
  73. {conan-2.13.0 → conan-2.14.0}/conan/cli/commands/graph.py +0 -0
  74. {conan-2.13.0 → conan-2.14.0}/conan/cli/commands/inspect.py +0 -0
  75. {conan-2.13.0 → conan-2.14.0}/conan/cli/commands/install.py +0 -0
  76. {conan-2.13.0 → conan-2.14.0}/conan/cli/commands/list.py +0 -0
  77. {conan-2.13.0 → conan-2.14.0}/conan/cli/commands/lock.py +0 -0
  78. {conan-2.13.0 → conan-2.14.0}/conan/cli/commands/new.py +0 -0
  79. {conan-2.13.0 → conan-2.14.0}/conan/cli/commands/pkglist.py +0 -0
  80. {conan-2.13.0 → conan-2.14.0}/conan/cli/commands/profile.py +0 -0
  81. {conan-2.13.0 → conan-2.14.0}/conan/cli/commands/remote.py +0 -0
  82. {conan-2.13.0 → conan-2.14.0}/conan/cli/commands/remove.py +0 -0
  83. {conan-2.13.0 → conan-2.14.0}/conan/cli/commands/search.py +0 -0
  84. {conan-2.13.0 → conan-2.14.0}/conan/cli/commands/source.py +0 -0
  85. {conan-2.13.0 → conan-2.14.0}/conan/cli/commands/test.py +0 -0
  86. {conan-2.13.0 → conan-2.14.0}/conan/cli/commands/upload.py +0 -0
  87. {conan-2.13.0 → conan-2.14.0}/conan/cli/commands/version.py +0 -0
  88. {conan-2.13.0 → conan-2.14.0}/conan/cli/exit_codes.py +0 -0
  89. {conan-2.13.0 → conan-2.14.0}/conan/cli/formatters/__init__.py +0 -0
  90. {conan-2.13.0/conan/internal/api → conan-2.14.0/conan/cli/formatters/audit}/__init__.py +0 -0
  91. {conan-2.13.0 → conan-2.14.0}/conan/cli/formatters/graph/__init__.py +0 -0
  92. {conan-2.13.0 → conan-2.14.0}/conan/cli/formatters/graph/build_order_html.py +0 -0
  93. {conan-2.13.0 → conan-2.14.0}/conan/cli/formatters/graph/graph.py +0 -0
  94. {conan-2.13.0 → conan-2.14.0}/conan/cli/formatters/graph/graph_info_text.py +0 -0
  95. {conan-2.13.0 → conan-2.14.0}/conan/cli/formatters/graph/info_graph_dot.py +0 -0
  96. {conan-2.13.0 → conan-2.14.0}/conan/cli/formatters/graph/info_graph_html.py +0 -0
  97. {conan-2.13.0 → conan-2.14.0}/conan/cli/formatters/list/__init__.py +0 -0
  98. {conan-2.13.0 → conan-2.14.0}/conan/cli/formatters/list/list.py +0 -0
  99. {conan-2.13.0 → conan-2.14.0}/conan/cli/formatters/list/search_table_html.py +0 -0
  100. {conan-2.13.0 → conan-2.14.0}/conan/cli/printers/__init__.py +0 -0
  101. {conan-2.13.0 → conan-2.14.0}/conan/cli/printers/graph.py +0 -0
  102. {conan-2.13.0 → conan-2.14.0}/conan/cps/__init__.py +0 -0
  103. {conan-2.13.0 → conan-2.14.0}/conan/cps/cps.py +0 -0
  104. {conan-2.13.0 → conan-2.14.0}/conan/errors.py +0 -0
  105. {conan-2.13.0 → conan-2.14.0}/conan/internal/__init__.py +0 -0
  106. {conan-2.13.0/conan/internal/api/config → conan-2.14.0/conan/internal/api}/__init__.py +0 -0
  107. {conan-2.13.0/conan/internal/api/detect → conan-2.14.0/conan/internal/api/audit}/__init__.py +0 -0
  108. {conan-2.13.0/conan/internal/api/install → conan-2.14.0/conan/internal/api/config}/__init__.py +0 -0
  109. {conan-2.13.0 → conan-2.14.0}/conan/internal/api/config/config_installer.py +0 -0
  110. {conan-2.13.0/conan/internal/api/list → conan-2.14.0/conan/internal/api/detect}/__init__.py +0 -0
  111. {conan-2.13.0 → conan-2.14.0}/conan/internal/api/detect/detect_api.py +0 -0
  112. {conan-2.13.0 → conan-2.14.0}/conan/internal/api/detect/detect_vs.py +0 -0
  113. {conan-2.13.0 → conan-2.14.0}/conan/internal/api/export.py +0 -0
  114. {conan-2.13.0/conan/internal/api/local → conan-2.14.0/conan/internal/api/install}/__init__.py +0 -0
  115. {conan-2.13.0 → conan-2.14.0}/conan/internal/api/install/generators.py +0 -0
  116. {conan-2.13.0/conan/internal/api/new → conan-2.14.0/conan/internal/api/list}/__init__.py +0 -0
  117. {conan-2.13.0 → conan-2.14.0}/conan/internal/api/list/query_parse.py +0 -0
  118. {conan-2.13.0/conan/internal/api/profile → conan-2.14.0/conan/internal/api/local}/__init__.py +0 -0
  119. {conan-2.13.0 → conan-2.14.0}/conan/internal/api/local/editable.py +0 -0
  120. {conan-2.13.0/conan/internal/api/remotes → conan-2.14.0/conan/internal/api/new}/__init__.py +0 -0
  121. {conan-2.13.0 → conan-2.14.0}/conan/internal/api/new/alias_new.py +0 -0
  122. {conan-2.13.0 → conan-2.14.0}/conan/internal/api/new/autoools_exe.py +0 -0
  123. {conan-2.13.0 → conan-2.14.0}/conan/internal/api/new/autotools_lib.py +0 -0
  124. {conan-2.13.0 → conan-2.14.0}/conan/internal/api/new/basic.py +0 -0
  125. {conan-2.13.0 → conan-2.14.0}/conan/internal/api/new/bazel_7_exe.py +0 -0
  126. {conan-2.13.0 → conan-2.14.0}/conan/internal/api/new/bazel_7_lib.py +0 -0
  127. {conan-2.13.0 → conan-2.14.0}/conan/internal/api/new/bazel_exe.py +0 -0
  128. {conan-2.13.0 → conan-2.14.0}/conan/internal/api/new/bazel_lib.py +0 -0
  129. {conan-2.13.0 → conan-2.14.0}/conan/internal/api/new/cmake_exe.py +0 -0
  130. {conan-2.13.0 → conan-2.14.0}/conan/internal/api/new/cmake_lib.py +0 -0
  131. {conan-2.13.0 → conan-2.14.0}/conan/internal/api/new/local_recipes_index.py +0 -0
  132. {conan-2.13.0 → conan-2.14.0}/conan/internal/api/new/meson_exe.py +0 -0
  133. {conan-2.13.0 → conan-2.14.0}/conan/internal/api/new/meson_lib.py +0 -0
  134. {conan-2.13.0 → conan-2.14.0}/conan/internal/api/new/msbuild_exe.py +0 -0
  135. {conan-2.13.0 → conan-2.14.0}/conan/internal/api/new/msbuild_lib.py +0 -0
  136. {conan-2.13.0 → conan-2.14.0}/conan/internal/api/new/qbs_lib.py +0 -0
  137. {conan-2.13.0 → conan-2.14.0}/conan/internal/api/new/workspace.py +0 -0
  138. {conan-2.13.0/conan/internal/cache → conan-2.14.0/conan/internal/api/profile}/__init__.py +0 -0
  139. {conan-2.13.0 → conan-2.14.0}/conan/internal/api/profile/detect.py +0 -0
  140. {conan-2.13.0/conan/internal/cache/db → conan-2.14.0/conan/internal/api/remotes}/__init__.py +0 -0
  141. {conan-2.13.0 → conan-2.14.0}/conan/internal/api/remotes/encrypt.py +0 -0
  142. {conan-2.13.0 → conan-2.14.0}/conan/internal/api/remotes/localdb.py +0 -0
  143. {conan-2.13.0 → conan-2.14.0}/conan/internal/api/uploader.py +0 -0
  144. {conan-2.13.0/conan/internal/model → conan-2.14.0/conan/internal/cache}/__init__.py +0 -0
  145. {conan-2.13.0 → conan-2.14.0}/conan/internal/cache/cache.py +0 -0
  146. {conan-2.13.0 → conan-2.14.0}/conan/internal/cache/conan_reference_layout.py +0 -0
  147. {conan-2.13.0/conan/test → conan-2.14.0/conan/internal/cache/db}/__init__.py +0 -0
  148. {conan-2.13.0 → conan-2.14.0}/conan/internal/cache/db/cache_database.py +0 -0
  149. {conan-2.13.0 → conan-2.14.0}/conan/internal/cache/db/packages_table.py +0 -0
  150. {conan-2.13.0 → conan-2.14.0}/conan/internal/cache/db/recipes_table.py +0 -0
  151. {conan-2.13.0 → conan-2.14.0}/conan/internal/cache/db/table.py +0 -0
  152. {conan-2.13.0 → conan-2.14.0}/conan/internal/cache/home_paths.py +0 -0
  153. {conan-2.13.0 → conan-2.14.0}/conan/internal/cache/integrity_check.py +0 -0
  154. {conan-2.13.0 → conan-2.14.0}/conan/internal/deploy.py +0 -0
  155. {conan-2.13.0 → conan-2.14.0}/conan/internal/errors.py +0 -0
  156. {conan-2.13.0 → conan-2.14.0}/conan/internal/internal_tools.py +0 -0
  157. {conan-2.13.0 → conan-2.14.0}/conan/internal/methods.py +0 -0
  158. {conan-2.13.0/conan/test/assets → conan-2.14.0/conan/internal/model}/__init__.py +0 -0
  159. {conan-2.13.0 → conan-2.14.0}/conan/internal/model/conan_file.py +0 -0
  160. {conan-2.13.0 → conan-2.14.0}/conan/internal/model/conanfile_interface.py +0 -0
  161. {conan-2.13.0 → conan-2.14.0}/conan/internal/model/conf.py +0 -0
  162. {conan-2.13.0 → conan-2.14.0}/conan/internal/model/dependencies.py +0 -0
  163. {conan-2.13.0 → conan-2.14.0}/conan/internal/model/info.py +0 -0
  164. {conan-2.13.0 → conan-2.14.0}/conan/internal/model/layout.py +0 -0
  165. {conan-2.13.0 → conan-2.14.0}/conan/internal/model/lockfile.py +0 -0
  166. {conan-2.13.0 → conan-2.14.0}/conan/internal/model/manifest.py +0 -0
  167. {conan-2.13.0 → conan-2.14.0}/conan/internal/model/options.py +0 -0
  168. {conan-2.13.0 → conan-2.14.0}/conan/internal/model/pkg_type.py +0 -0
  169. {conan-2.13.0 → conan-2.14.0}/conan/internal/model/profile.py +0 -0
  170. {conan-2.13.0 → conan-2.14.0}/conan/internal/model/recipe_ref.py +0 -0
  171. {conan-2.13.0 → conan-2.14.0}/conan/internal/model/settings.py +0 -0
  172. {conan-2.13.0 → conan-2.14.0}/conan/internal/model/version.py +0 -0
  173. {conan-2.13.0 → conan-2.14.0}/conan/internal/model/version_range.py +0 -0
  174. {conan-2.13.0 → conan-2.14.0}/conan/internal/model/workspace.py +0 -0
  175. {conan-2.13.0 → conan-2.14.0}/conan/internal/paths.py +0 -0
  176. {conan-2.13.0 → conan-2.14.0}/conan/internal/runner/__init__.py +0 -0
  177. {conan-2.13.0 → conan-2.14.0}/conan/internal/runner/docker.py +0 -0
  178. {conan-2.13.0 → conan-2.14.0}/conan/internal/runner/output.py +0 -0
  179. {conan-2.13.0 → conan-2.14.0}/conan/internal/runner/ssh.py +0 -0
  180. {conan-2.13.0 → conan-2.14.0}/conan/internal/runner/wsl.py +0 -0
  181. {conan-2.13.0/conan/test/utils → conan-2.14.0/conan/test}/__init__.py +0 -0
  182. {conan-2.13.0/conan/tools/cmake/cmakedeps2 → conan-2.14.0/conan/test/assets}/__init__.py +0 -0
  183. {conan-2.13.0 → conan-2.14.0}/conan/test/assets/autotools.py +0 -0
  184. {conan-2.13.0 → conan-2.14.0}/conan/test/assets/cmake.py +0 -0
  185. {conan-2.13.0 → conan-2.14.0}/conan/test/assets/genconanfile.py +0 -0
  186. {conan-2.13.0 → conan-2.14.0}/conan/test/assets/sources.py +0 -0
  187. {conan-2.13.0 → conan-2.14.0}/conan/test/assets/visual_project_files.py +0 -0
  188. {conan-2.13.0/conan/tools/system → conan-2.14.0/conan/test/utils}/__init__.py +0 -0
  189. {conan-2.13.0 → conan-2.14.0}/conan/test/utils/artifactory.py +0 -0
  190. {conan-2.13.0 → conan-2.14.0}/conan/test/utils/env.py +0 -0
  191. {conan-2.13.0 → conan-2.14.0}/conan/test/utils/file_server.py +0 -0
  192. {conan-2.13.0 → conan-2.14.0}/conan/test/utils/mocks.py +0 -0
  193. {conan-2.13.0 → conan-2.14.0}/conan/test/utils/profiles.py +0 -0
  194. {conan-2.13.0 → conan-2.14.0}/conan/test/utils/scm.py +0 -0
  195. {conan-2.13.0 → conan-2.14.0}/conan/test/utils/server_launcher.py +0 -0
  196. {conan-2.13.0 → conan-2.14.0}/conan/test/utils/test_files.py +0 -0
  197. {conan-2.13.0 → conan-2.14.0}/conan/test/utils/tools.py +0 -0
  198. {conan-2.13.0 → conan-2.14.0}/conan/tools/__init__.py +0 -0
  199. {conan-2.13.0 → conan-2.14.0}/conan/tools/android/__init__.py +0 -0
  200. {conan-2.13.0 → conan-2.14.0}/conan/tools/android/utils.py +0 -0
  201. {conan-2.13.0 → conan-2.14.0}/conan/tools/apple/__init__.py +0 -0
  202. {conan-2.13.0 → conan-2.14.0}/conan/tools/apple/apple.py +0 -0
  203. {conan-2.13.0 → conan-2.14.0}/conan/tools/apple/xcodebuild.py +0 -0
  204. {conan-2.13.0 → conan-2.14.0}/conan/tools/apple/xcodedeps.py +0 -0
  205. {conan-2.13.0 → conan-2.14.0}/conan/tools/apple/xcodetoolchain.py +0 -0
  206. {conan-2.13.0 → conan-2.14.0}/conan/tools/build/__init__.py +0 -0
  207. {conan-2.13.0 → conan-2.14.0}/conan/tools/build/cppstd.py +0 -0
  208. {conan-2.13.0 → conan-2.14.0}/conan/tools/build/cpu.py +0 -0
  209. {conan-2.13.0 → conan-2.14.0}/conan/tools/build/cross_building.py +0 -0
  210. {conan-2.13.0 → conan-2.14.0}/conan/tools/build/cstd.py +0 -0
  211. {conan-2.13.0 → conan-2.14.0}/conan/tools/build/flags.py +0 -0
  212. {conan-2.13.0 → conan-2.14.0}/conan/tools/build/stdcpp_library.py +0 -0
  213. {conan-2.13.0 → conan-2.14.0}/conan/tools/cmake/__init__.py +0 -0
  214. {conan-2.13.0 → conan-2.14.0}/conan/tools/cmake/cmake.py +0 -0
  215. {conan-2.13.0 → conan-2.14.0}/conan/tools/cmake/cmakedeps/__init__.py +0 -0
  216. {conan-2.13.0 → conan-2.14.0}/conan/tools/cmake/cmakedeps/templates/__init__.py +0 -0
  217. {conan-2.13.0 → conan-2.14.0}/conan/tools/cmake/cmakedeps/templates/config.py +0 -0
  218. {conan-2.13.0 → conan-2.14.0}/conan/tools/cmake/cmakedeps/templates/config_version.py +0 -0
  219. {conan-2.13.0 → conan-2.14.0}/conan/tools/cmake/cmakedeps/templates/macros.py +0 -0
  220. {conan-2.13.0 → conan-2.14.0}/conan/tools/cmake/cmakedeps/templates/target_data.py +0 -0
  221. {conan-2.13.0 → conan-2.14.0}/conan/tools/cmake/cmakedeps/templates/targets.py +0 -0
  222. {conan-2.13.0/conans → conan-2.14.0/conan/tools/cmake/cmakedeps2}/__init__.py +0 -0
  223. {conan-2.13.0 → conan-2.14.0}/conan/tools/cmake/cmakedeps2/config.py +0 -0
  224. {conan-2.13.0 → conan-2.14.0}/conan/tools/cmake/cmakedeps2/config_version.py +0 -0
  225. {conan-2.13.0 → conan-2.14.0}/conan/tools/cmake/cmakedeps2/targets.py +0 -0
  226. {conan-2.13.0 → conan-2.14.0}/conan/tools/cmake/layout.py +0 -0
  227. {conan-2.13.0 → conan-2.14.0}/conan/tools/cmake/presets.py +0 -0
  228. {conan-2.13.0 → conan-2.14.0}/conan/tools/cmake/toolchain/__init__.py +0 -0
  229. {conan-2.13.0 → conan-2.14.0}/conan/tools/cmake/toolchain/blocks.py +0 -0
  230. {conan-2.13.0 → conan-2.14.0}/conan/tools/cmake/toolchain/toolchain.py +0 -0
  231. {conan-2.13.0 → conan-2.14.0}/conan/tools/cmake/utils.py +0 -0
  232. {conan-2.13.0 → conan-2.14.0}/conan/tools/cps/__init__.py +0 -0
  233. {conan-2.13.0 → conan-2.14.0}/conan/tools/cps/cps_deps.py +0 -0
  234. {conan-2.13.0 → conan-2.14.0}/conan/tools/env/__init__.py +0 -0
  235. {conan-2.13.0 → conan-2.14.0}/conan/tools/env/virtualbuildenv.py +0 -0
  236. {conan-2.13.0 → conan-2.14.0}/conan/tools/env/virtualrunenv.py +0 -0
  237. {conan-2.13.0 → conan-2.14.0}/conan/tools/files/__init__.py +0 -0
  238. {conan-2.13.0 → conan-2.14.0}/conan/tools/files/conandata.py +0 -0
  239. {conan-2.13.0 → conan-2.14.0}/conan/tools/files/copy_pattern.py +0 -0
  240. {conan-2.13.0 → conan-2.14.0}/conan/tools/files/files.py +0 -0
  241. {conan-2.13.0 → conan-2.14.0}/conan/tools/files/packager.py +0 -0
  242. {conan-2.13.0 → conan-2.14.0}/conan/tools/files/patches.py +0 -0
  243. {conan-2.13.0 → conan-2.14.0}/conan/tools/files/symlinks/__init__.py +0 -0
  244. {conan-2.13.0 → conan-2.14.0}/conan/tools/files/symlinks/symlinks.py +0 -0
  245. {conan-2.13.0 → conan-2.14.0}/conan/tools/gnu/__init__.py +0 -0
  246. {conan-2.13.0 → conan-2.14.0}/conan/tools/gnu/autotools.py +0 -0
  247. {conan-2.13.0 → conan-2.14.0}/conan/tools/gnu/autotoolsdeps.py +0 -0
  248. {conan-2.13.0 → conan-2.14.0}/conan/tools/gnu/autotoolstoolchain.py +0 -0
  249. {conan-2.13.0 → conan-2.14.0}/conan/tools/gnu/get_gnu_triplet.py +0 -0
  250. {conan-2.13.0 → conan-2.14.0}/conan/tools/gnu/gnudeps_flags.py +0 -0
  251. {conan-2.13.0 → conan-2.14.0}/conan/tools/gnu/gnutoolchain.py +0 -0
  252. {conan-2.13.0 → conan-2.14.0}/conan/tools/gnu/makedeps.py +0 -0
  253. {conan-2.13.0 → conan-2.14.0}/conan/tools/gnu/pkgconfig.py +0 -0
  254. {conan-2.13.0 → conan-2.14.0}/conan/tools/gnu/pkgconfigdeps.py +0 -0
  255. {conan-2.13.0 → conan-2.14.0}/conan/tools/google/__init__.py +0 -0
  256. {conan-2.13.0 → conan-2.14.0}/conan/tools/google/bazel.py +0 -0
  257. {conan-2.13.0 → conan-2.14.0}/conan/tools/google/bazeldeps.py +0 -0
  258. {conan-2.13.0 → conan-2.14.0}/conan/tools/google/layout.py +0 -0
  259. {conan-2.13.0 → conan-2.14.0}/conan/tools/google/toolchain.py +0 -0
  260. {conan-2.13.0 → conan-2.14.0}/conan/tools/intel/__init__.py +0 -0
  261. {conan-2.13.0 → conan-2.14.0}/conan/tools/intel/intel_cc.py +0 -0
  262. {conan-2.13.0 → conan-2.14.0}/conan/tools/layout/__init__.py +0 -0
  263. {conan-2.13.0 → conan-2.14.0}/conan/tools/meson/__init__.py +0 -0
  264. {conan-2.13.0 → conan-2.14.0}/conan/tools/meson/helpers.py +0 -0
  265. {conan-2.13.0 → conan-2.14.0}/conan/tools/meson/meson.py +0 -0
  266. {conan-2.13.0 → conan-2.14.0}/conan/tools/meson/toolchain.py +0 -0
  267. {conan-2.13.0 → conan-2.14.0}/conan/tools/microsoft/__init__.py +0 -0
  268. {conan-2.13.0 → conan-2.14.0}/conan/tools/microsoft/layout.py +0 -0
  269. {conan-2.13.0 → conan-2.14.0}/conan/tools/microsoft/msbuild.py +0 -0
  270. {conan-2.13.0 → conan-2.14.0}/conan/tools/microsoft/nmakedeps.py +0 -0
  271. {conan-2.13.0 → conan-2.14.0}/conan/tools/microsoft/nmaketoolchain.py +0 -0
  272. {conan-2.13.0 → conan-2.14.0}/conan/tools/microsoft/subsystems.py +0 -0
  273. {conan-2.13.0 → conan-2.14.0}/conan/tools/microsoft/toolchain.py +0 -0
  274. {conan-2.13.0 → conan-2.14.0}/conan/tools/premake/__init__.py +0 -0
  275. {conan-2.13.0 → conan-2.14.0}/conan/tools/premake/premake.py +0 -0
  276. {conan-2.13.0 → conan-2.14.0}/conan/tools/premake/premakedeps.py +0 -0
  277. {conan-2.13.0 → conan-2.14.0}/conan/tools/qbs/__init__.py +0 -0
  278. {conan-2.13.0 → conan-2.14.0}/conan/tools/qbs/common.py +0 -0
  279. {conan-2.13.0 → conan-2.14.0}/conan/tools/qbs/qbs.py +0 -0
  280. {conan-2.13.0 → conan-2.14.0}/conan/tools/qbs/qbsdeps.py +0 -0
  281. {conan-2.13.0 → conan-2.14.0}/conan/tools/qbs/qbsprofile.py +0 -0
  282. {conan-2.13.0 → conan-2.14.0}/conan/tools/ros/__init__.py +0 -0
  283. {conan-2.13.0 → conan-2.14.0}/conan/tools/ros/rosenv.py +0 -0
  284. {conan-2.13.0 → conan-2.14.0}/conan/tools/sbom/__init__.py +0 -0
  285. {conan-2.13.0 → conan-2.14.0}/conan/tools/sbom/cyclonedx.py +0 -0
  286. {conan-2.13.0 → conan-2.14.0}/conan/tools/scm/__init__.py +0 -0
  287. {conan-2.13.0 → conan-2.14.0}/conan/tools/scm/git.py +0 -0
  288. {conan-2.13.0 → conan-2.14.0}/conan/tools/scons/__init__.py +0 -0
  289. {conan-2.13.0 → conan-2.14.0}/conan/tools/scons/sconsdeps.py +0 -0
  290. {conan-2.13.0/conans/client → conan-2.14.0/conan/tools/system}/__init__.py +0 -0
  291. {conan-2.13.0 → conan-2.14.0}/conan/tools/system/package_manager.py +0 -0
  292. {conan-2.13.0 → conan-2.14.0}/conan.egg-info/dependency_links.txt +0 -0
  293. {conan-2.13.0 → conan-2.14.0}/conan.egg-info/entry_points.txt +0 -0
  294. {conan-2.13.0 → conan-2.14.0}/conan.egg-info/requires.txt +0 -0
  295. {conan-2.13.0 → conan-2.14.0}/conan.egg-info/top_level.txt +0 -0
  296. {conan-2.13.0/conans/client/downloaders → conan-2.14.0/conans}/__init__.py +0 -0
  297. {conan-2.13.0/conans/client/graph → conan-2.14.0/conans/client}/__init__.py +0 -0
  298. {conan-2.13.0/conans/model → conan-2.14.0/conans/client/downloaders}/__init__.py +0 -0
  299. {conan-2.13.0 → conan-2.14.0}/conans/client/downloaders/caching_file_downloader.py +0 -0
  300. {conan-2.13.0 → conan-2.14.0}/conans/client/downloaders/download_cache.py +0 -0
  301. {conan-2.13.0 → conan-2.14.0}/conans/client/downloaders/file_downloader.py +0 -0
  302. {conan-2.13.0/conans/util → conan-2.14.0/conans/client/graph}/__init__.py +0 -0
  303. {conan-2.13.0 → conan-2.14.0}/conans/client/graph/build_mode.py +0 -0
  304. {conan-2.13.0 → conan-2.14.0}/conans/client/graph/compatibility.py +0 -0
  305. {conan-2.13.0 → conan-2.14.0}/conans/client/graph/graph.py +0 -0
  306. {conan-2.13.0 → conan-2.14.0}/conans/client/graph/graph_error.py +0 -0
  307. {conan-2.13.0 → conan-2.14.0}/conans/client/graph/profile_node_definer.py +0 -0
  308. {conan-2.13.0 → conan-2.14.0}/conans/client/graph/provides.py +0 -0
  309. {conan-2.13.0 → conan-2.14.0}/conans/client/graph/proxy.py +0 -0
  310. {conan-2.13.0 → conan-2.14.0}/conans/client/graph/python_requires.py +0 -0
  311. {conan-2.13.0 → conan-2.14.0}/conans/client/graph/range_resolver.py +0 -0
  312. {conan-2.13.0 → conan-2.14.0}/conans/client/loader.py +0 -0
  313. {conan-2.13.0 → conan-2.14.0}/conans/client/loader_txt.py +0 -0
  314. {conan-2.13.0 → conan-2.14.0}/conans/client/migrations.py +0 -0
  315. {conan-2.13.0 → conan-2.14.0}/conans/client/pkg_sign.py +0 -0
  316. {conan-2.13.0 → conan-2.14.0}/conans/client/remote_manager.py +0 -0
  317. {conan-2.13.0 → conan-2.14.0}/conans/client/rest/__init__.py +0 -0
  318. {conan-2.13.0 → conan-2.14.0}/conans/client/rest/auth_manager.py +0 -0
  319. {conan-2.13.0 → conan-2.14.0}/conans/client/rest/client_routes.py +0 -0
  320. {conan-2.13.0 → conan-2.14.0}/conans/client/rest/conan_requester.py +0 -0
  321. {conan-2.13.0 → conan-2.14.0}/conans/client/rest/file_uploader.py +0 -0
  322. {conan-2.13.0 → conan-2.14.0}/conans/client/rest/remote_credentials.py +0 -0
  323. {conan-2.13.0 → conan-2.14.0}/conans/client/rest/rest_client.py +0 -0
  324. {conan-2.13.0 → conan-2.14.0}/conans/client/rest/rest_client_v2.py +0 -0
  325. {conan-2.13.0 → conan-2.14.0}/conans/client/rest/rest_routes.py +0 -0
  326. {conan-2.13.0 → conan-2.14.0}/conans/client/source.py +0 -0
  327. {conan-2.13.0 → conan-2.14.0}/conans/client/subsystems.py +0 -0
  328. {conan-2.13.0 → conan-2.14.0}/conans/conan.py +0 -0
  329. {conan-2.13.0 → conan-2.14.0}/conans/conan_server.py +0 -0
  330. {conan-2.13.0 → conan-2.14.0}/conans/migrations.py +0 -0
  331. {conan-2.13.0 → conan-2.14.0}/conans/model/package_ref.py +0 -0
  332. {conan-2.13.0 → conan-2.14.0}/conans/model/recipe_ref.py +0 -0
  333. {conan-2.13.0 → conan-2.14.0}/conans/requirements.txt +0 -0
  334. {conan-2.13.0 → conan-2.14.0}/conans/requirements_dev.txt +0 -0
  335. {conan-2.13.0 → conan-2.14.0}/conans/requirements_runner.txt +0 -0
  336. {conan-2.13.0 → conan-2.14.0}/conans/requirements_server.txt +0 -0
  337. {conan-2.13.0 → conan-2.14.0}/conans/util/config_parser.py +0 -0
  338. {conan-2.13.0 → conan-2.14.0}/conans/util/dates.py +0 -0
  339. {conan-2.13.0 → conan-2.14.0}/conans/util/files.py +0 -0
  340. {conan-2.13.0 → conan-2.14.0}/conans/util/locks.py +0 -0
  341. {conan-2.13.0 → conan-2.14.0}/conans/util/runners.py +0 -0
  342. {conan-2.13.0 → conan-2.14.0}/conans/util/thread.py +0 -0
  343. {conan-2.13.0 → conan-2.14.0}/pyproject.toml +0 -0
  344. {conan-2.13.0 → conan-2.14.0}/setup.cfg +0 -0
  345. {conan-2.13.0 → conan-2.14.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.14.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.14.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
 
@@ -0,0 +1,159 @@
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
+ class AuditAPI:
16
+ """
17
+ This class provides the functionality to scan references for vulnerabilities.
18
+ """
19
+
20
+ def __init__(self, conan_api):
21
+ self.conan_api = conan_api
22
+ self._home_folder = conan_api.home_folder
23
+ self._providers_path = os.path.join(self._home_folder, "audit_providers.json")
24
+ self._provider_cls = {
25
+ "conan-center-proxy": ConanCenterProvider,
26
+ "private": PrivateProvider,
27
+ }
28
+
29
+ def scan(self, deps_graph, provider):
30
+ """
31
+ Scan a given recipe for vulnerabilities in its dependencies.
32
+ """
33
+ refs = sorted(set(RecipeReference.loads(f"{node.ref.name}/{node.ref.version}")
34
+ for node in deps_graph.nodes[1:]), key= lambda ref: ref.name)
35
+ return provider.get_cves(refs)
36
+
37
+ def list(self, references, provider):
38
+ """
39
+ List the vulnerabilities of the given reference.
40
+ """
41
+ refs = [RecipeReference.loads(ref) for ref in references]
42
+ for ref in refs:
43
+ ref.validate_ref()
44
+ return provider.get_cves(refs)
45
+
46
+ def get_provider(self, provider_name):
47
+ """
48
+ Get the provider by name.
49
+ """
50
+ # TODO: More work remains to be done here, hardcoded for now for testing
51
+ providers = _load_providers(self._providers_path)
52
+ if provider_name not in providers:
53
+ add_arguments = (
54
+ "--url=https://audit.conan.io/ --type=conan-center-proxy"
55
+ if provider_name == CONAN_CENTER_AUDIT_PROVIDER_NAME
56
+ else "--url=<url> --type=<type>"
57
+ )
58
+
59
+ register_message = (
60
+ f"If you don't have a valid token, register at: https://audit.conan.io/register."
61
+ if provider_name == CONAN_CENTER_AUDIT_PROVIDER_NAME
62
+ else ""
63
+ )
64
+
65
+ raise ConanException(
66
+ f"Provider '{provider_name}' not found. Please specify a valid provider name or add it using: "
67
+ f"'conan audit provider add {provider_name} {add_arguments} --token=<token>'\n"
68
+ f"{register_message}"
69
+ )
70
+
71
+ provider_data = providers[provider_name]
72
+ safe_provider_name = provider_name.replace("-", "_")
73
+ env_token = os.getenv(f"CONAN_AUDIT_PROVIDER_TOKEN_{safe_provider_name.upper()}")
74
+
75
+ if env_token:
76
+ # Always override the token with the environment variable
77
+ provider_data["token"] = env_token
78
+ elif "token" in provider_data:
79
+ try:
80
+ provider_data["token"] = decode(base64.standard_b64decode(provider_data["token"]).decode(), CYPHER_KEY)
81
+ except binascii.Error as e:
82
+ raise ConanException(f"Invalid token format for provider '{provider_name}'. The token might be corrupt.")
83
+
84
+ provider_cls = self._provider_cls.get(provider_data["type"])
85
+
86
+ return provider_cls(self.conan_api, provider_name, provider_data)
87
+
88
+ def list_providers(self):
89
+ """
90
+ Get all available providers.
91
+ """
92
+ providers = _load_providers(self._providers_path)
93
+ result = []
94
+ for name, provider_data in providers.items():
95
+ provider_cls = self._provider_cls.get(provider_data["type"])
96
+ result.append(provider_cls(self.conan_api, name, provider_data))
97
+ return result
98
+
99
+ def add_provider(self, name, url, provider_type):
100
+ """
101
+ Add a provider.
102
+ """
103
+ providers = _load_providers(self._providers_path)
104
+ if name in providers:
105
+ raise ConanException(f"Provider '{name}' already exists")
106
+
107
+ if provider_type not in self._provider_cls:
108
+ raise ConanException(f"Provider type '{provider_type}' not found")
109
+
110
+ providers[name] = {
111
+ "name": name,
112
+ "url": url,
113
+ "type": provider_type
114
+ }
115
+
116
+ _save_providers(self._providers_path, providers)
117
+
118
+ def remove_provider(self, provider_name):
119
+ """
120
+ Remove a provider.
121
+ """
122
+ providers = _load_providers(self._providers_path)
123
+ if provider_name not in providers:
124
+ raise ConanException(f"Provider '{provider_name}' not found")
125
+
126
+ del providers[provider_name]
127
+
128
+ _save_providers(self._providers_path, providers)
129
+
130
+ def auth_provider(self, provider, token):
131
+ """
132
+ Authenticate a provider.
133
+ """
134
+ if not provider:
135
+ raise ConanException("Provider not found")
136
+
137
+ providers = _load_providers(self._providers_path)
138
+
139
+ assert provider.name in providers
140
+ providers[provider.name]["token"] = base64.standard_b64encode(encode(token, CYPHER_KEY).encode()).decode()
141
+ setattr(provider, "token", token)
142
+ _save_providers(self._providers_path, providers)
143
+
144
+
145
+ def _load_providers(providers_path):
146
+ if not os.path.exists(providers_path):
147
+ default_providers = {
148
+ CONAN_CENTER_AUDIT_PROVIDER_NAME: {
149
+ "url": "https://audit.conan.io/",
150
+ "type": "conan-center-proxy"
151
+ }
152
+ }
153
+ save(providers_path, json.dumps(default_providers, indent=4))
154
+
155
+ return json.loads(load(providers_path))
156
+
157
+
158
+ def _save_providers(providers_path, providers):
159
+ save(providers_path, json.dumps(providers, indent=4))
@@ -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,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()
@@ -0,0 +1,195 @@
1
+ import json
2
+ import os
3
+
4
+ from conan.api.conan_api import ConanAPI
5
+ from conan.api.input import UserInput
6
+ from conan.api.model import MultiPackagesList
7
+ from conan.api.output import cli_out_write, ConanOutput
8
+ from conan.api.subapi.audit import CONAN_CENTER_AUDIT_PROVIDER_NAME
9
+ from conan.cli import make_abs_path
10
+ from conan.cli.args import common_graph_args, validate_common_graph_args
11
+ from conan.cli.command import conan_command, conan_subcommand
12
+ from conan.cli.formatters.audit.vulnerabilities import text_vuln_formatter, json_vuln_formatter, \
13
+ html_vuln_formatter
14
+ from conan.cli.printers import print_profiles
15
+ from conan.cli.printers.graph import print_graph_basic
16
+ from conan.errors import ConanException
17
+
18
+
19
+ def _add_provider_arg(subparser):
20
+ subparser.add_argument("-p", "--provider", help="Provider to use for scanning")
21
+
22
+
23
+ @conan_subcommand(formatters={"text": text_vuln_formatter,
24
+ "json": json_vuln_formatter,
25
+ "html": html_vuln_formatter})
26
+ def audit_scan(conan_api: ConanAPI, parser, subparser, *args):
27
+ """
28
+ Scan a given recipe for vulnerabilities in its dependencies.
29
+ """
30
+ common_graph_args(subparser)
31
+ # Needed for the validation of args, but this should usually be left as False here
32
+ # TODO: Do we then want to hide it in the --help?
33
+ subparser.add_argument("--build-require", action='store_true', default=False,
34
+ help='Whether the provided reference is a build-require')
35
+
36
+ _add_provider_arg(subparser)
37
+ args = parser.parse_args(*args)
38
+
39
+ # This comes from install command
40
+
41
+ validate_common_graph_args(args)
42
+ # basic paths
43
+ cwd = os.getcwd()
44
+ path = conan_api.local.get_conanfile_path(args.path, cwd, py=None) if args.path else None
45
+
46
+ # Basic collaborators: remotes, lockfile, profiles
47
+ remotes = conan_api.remotes.list(args.remote) if not args.no_remote else []
48
+ overrides = eval(args.lockfile_overrides) if args.lockfile_overrides else None
49
+ lockfile = conan_api.lockfile.get_lockfile(lockfile=args.lockfile, conanfile_path=path, cwd=cwd,
50
+ partial=args.lockfile_partial, overrides=overrides)
51
+ profile_host, profile_build = conan_api.profiles.get_profiles_from_args(args)
52
+ print_profiles(profile_host, profile_build)
53
+
54
+ # Graph computation (without installation of binaries)
55
+ gapi = conan_api.graph
56
+ if path:
57
+ deps_graph = gapi.load_graph_consumer(path, args.name, args.version, args.user, args.channel,
58
+ profile_host, profile_build, lockfile, remotes,
59
+ # TO DISCUSS: defaulting to False the is_build_require
60
+ args.update, is_build_require=args.build_require)
61
+ else:
62
+ deps_graph = gapi.load_graph_requires(args.requires, args.tool_requires, profile_host,
63
+ profile_build, lockfile, remotes, args.update)
64
+ print_graph_basic(deps_graph)
65
+ deps_graph.report_graph_error()
66
+
67
+ if deps_graph.error:
68
+ return {"error": deps_graph.error}
69
+
70
+ provider = conan_api.audit.get_provider(args.provider or CONAN_CENTER_AUDIT_PROVIDER_NAME)
71
+
72
+ return conan_api.audit.scan(deps_graph, provider)
73
+
74
+
75
+ @conan_subcommand(formatters={"text": text_vuln_formatter,
76
+ "json": json_vuln_formatter,
77
+ "html": html_vuln_formatter})
78
+ def audit_list(conan_api: ConanAPI, parser, subparser, *args):
79
+ """
80
+ List the vulnerabilities of the given reference.
81
+ """
82
+ subparser.add_argument("reference", help="Reference to list vulnerabilities for", nargs="?")
83
+ subparser.add_argument("-l", "--list", help="pkglist file to list vulnerabilities for", default=None)
84
+ subparser.add_argument("-r", "--remote", help="Remote to use for listing", default=None)
85
+ _add_provider_arg(subparser)
86
+ args = parser.parse_args(*args)
87
+
88
+ if not args.reference and not args.list:
89
+ raise ConanException("Please specify a reference or a pkglist file")
90
+
91
+ if args.reference and args.list:
92
+ raise ConanException("Please specify a reference or a pkglist file, not both")
93
+
94
+ provider = conan_api.audit.get_provider(args.provider or CONAN_CENTER_AUDIT_PROVIDER_NAME)
95
+
96
+ references = []
97
+ if args.list:
98
+ listfile = make_abs_path(args.list)
99
+ multi_package_list = MultiPackagesList.load(listfile)
100
+ cache_name = "Local Cache" if not args.remote else args.remote
101
+ package_list = multi_package_list[cache_name]
102
+ refs_to_list = package_list.serialize()
103
+ references = list(refs_to_list.keys())
104
+ if not references: # the package list might contain only refs, no revs
105
+ ConanOutput().warning("Nothing to list, package list do not contain recipe revisions")
106
+ else:
107
+ references = [args.reference]
108
+ return conan_api.audit.list(references, provider)
109
+
110
+ def text_provider_formatter(providers_action):
111
+ providers = providers_action[0]
112
+ action = providers_action[1]
113
+
114
+ if action == "remove":
115
+ cli_out_write("Provider removed successfully.")
116
+ elif action == "add":
117
+ cli_out_write("Provider added successfully.")
118
+ elif action == "auth":
119
+ cli_out_write("Provider authentication added.")
120
+ elif action == "list":
121
+ if not providers:
122
+ cli_out_write("No providers found.")
123
+ else:
124
+ for provider in providers:
125
+ if provider:
126
+ cli_out_write(f"{provider.name} (type: {provider.type}) - {provider.url}")
127
+
128
+ def json_provider_formatter(providers_action):
129
+ ret = []
130
+ for provider in providers_action[0]:
131
+ if provider:
132
+ ret.append({"name": provider.name, "url": provider.url, "type": provider.type})
133
+ cli_out_write(json.dumps(ret, indent=4))
134
+
135
+
136
+ @conan_subcommand(formatters={"text": text_provider_formatter, "json": json_provider_formatter})
137
+ def audit_provider(conan_api, parser, subparser, *args):
138
+ """
139
+ Manage security providers for the 'conan audit' command.
140
+ """
141
+
142
+ subparser.add_argument("action", choices=["add", "list", "auth", "remove"], help="Action to perform from 'add', 'list' , 'remove' or 'auth'")
143
+ subparser.add_argument("name", help="Provider name", nargs="?")
144
+
145
+ subparser.add_argument("--url", help="Provider URL")
146
+ subparser.add_argument("--type", help="Provider type", choices=["conan-center-proxy", "private"])
147
+ subparser.add_argument("--token", help="Provider token")
148
+ args = parser.parse_args(*args)
149
+
150
+ if args.action == "add":
151
+ if not args.name or not args.url or not args.type:
152
+ raise ConanException("Name, URL and type are required to add a provider")
153
+ if " " in args.name:
154
+ raise ConanException("Name cannot contain spaces")
155
+ conan_api.audit.add_provider(args.name, args.url, args.type)
156
+
157
+ if not args.token:
158
+ user_input = UserInput(conan_api.config.get("core:non_interactive"))
159
+ ConanOutput().write(f"Please enter a token for {args.name} the provider: ")
160
+ token = user_input.get_password()
161
+ else:
162
+ token = args.token
163
+
164
+ provider = conan_api.audit.get_provider(args.name)
165
+ if token:
166
+ conan_api.audit.auth_provider(provider, token)
167
+
168
+ return [provider], args.action
169
+ elif args.action == "remove":
170
+ if not args.name:
171
+ raise ConanException("Name required to remove a provider")
172
+ conan_api.audit.remove_provider(args.name)
173
+ return [], args.action
174
+ elif args.action == "list":
175
+ providers = conan_api.audit.list_providers()
176
+ return providers, args.action
177
+ elif args.action == "auth":
178
+ if not args.name:
179
+ raise ConanException("Name is required to authenticate on a provider")
180
+ if not args.token:
181
+ user_input = UserInput(conan_api.config.get("core:non_interactive"))
182
+ ConanOutput().write(f"Please enter a token for {args.name} the provider: ")
183
+ token = user_input.get_password()
184
+ else:
185
+ token = args.token
186
+
187
+ provider = conan_api.audit.get_provider(args.name)
188
+ conan_api.audit.auth_provider(provider, token)
189
+ return [provider], args.action
190
+
191
+ @conan_command(group="Security")
192
+ def audit(conan_api, parser, *args):
193
+ """
194
+ Find vulnerabilities in your dependencies.
195
+ """
@@ -50,8 +50,7 @@ def workspace_add(conan_api: ConanAPI, parser, subparser, *args):
50
50
  subparser.add_argument('path', nargs="?",
51
51
  help='Path to the package folder in the user workspace')
52
52
  add_reference_args(subparser)
53
- subparser.add_argument("--ref", nargs="?",
54
- help="Open and add this reference")
53
+ subparser.add_argument("--ref", help="Open and add this reference")
55
54
  subparser.add_argument("-of", "--output-folder",
56
55
  help='The root output folder for generated and build files')
57
56
  group = subparser.add_mutually_exclusive_group()
@@ -78,9 +77,10 @@ def workspace_add(conan_api: ConanAPI, parser, subparser, *args):
78
77
  @conan_subcommand()
79
78
  def workspace_remove(conan_api: ConanAPI, parser, subparser, *args):
80
79
  """
81
- Remove packages to current workspace
80
+ Remove packages from the current workspace
82
81
  """
83
- subparser.add_argument('path', help='Path to the package folder in the user workspace')
82
+ subparser.add_argument('path',
83
+ help='Path to the package folder in the user workspace')
84
84
  args = parser.parse_args(*args)
85
85
  removed = conan_api.workspace.remove(make_abs_path(args.path))
86
86
  ConanOutput().info(f"Removed from workspace: {removed}")
@@ -170,6 +170,8 @@ def workspace_install(conan_api: ConanAPI, parser, subparser, *args):
170
170
  Install the workspace as a monolith, installing only external dependencies to the workspace,
171
171
  generating a single result (generators, etc) for the whole workspace.
172
172
  """
173
+ subparser.add_argument("path", nargs="*",
174
+ help="Install only these editable packages, not all")
173
175
  subparser.add_argument("-g", "--generator", action="append", help='Generators to use')
174
176
  subparser.add_argument("-of", "--output-folder",
175
177
  help='The root output folder for generated and build files')
@@ -191,8 +193,7 @@ def workspace_install(conan_api: ConanAPI, parser, subparser, *args):
191
193
 
192
194
  conan_api.workspace.info() # FIXME: Just to force error if WS not enabled
193
195
  # Build a dependency graph with all editables as requirements
194
- editables = conan_api.workspace.editable_packages
195
- requires = [ref for ref in editables]
196
+ requires = conan_api.workspace.select_editables(args.path)
196
197
  if not requires:
197
198
  raise ConanException("This workspace cannot be installed, it doesn't have any editable")
198
199
  deps_graph = conan_api.graph.load_graph_requires(requires, [],