conan-server 2.1.0__tar.gz → 2.2.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (356) hide show
  1. {conan-server-2.1.0 → conan-server-2.2.1}/PKG-INFO +1 -1
  2. {conan-server-2.1.0 → conan-server-2.2.1}/conan/api/conan_api.py +2 -0
  3. {conan-server-2.1.0 → conan-server-2.2.1}/conan/api/model.py +10 -3
  4. {conan-server-2.1.0 → conan-server-2.2.1}/conan/api/subapi/cache.py +27 -3
  5. conan-server-2.2.1/conan/api/subapi/command.py +24 -0
  6. {conan-server-2.1.0 → conan-server-2.2.1}/conan/api/subapi/config.py +68 -0
  7. {conan-server-2.1.0 → conan-server-2.2.1}/conan/api/subapi/list.py +33 -5
  8. {conan-server-2.1.0 → conan-server-2.2.1}/conan/api/subapi/lockfile.py +6 -4
  9. {conan-server-2.1.0 → conan-server-2.2.1}/conan/api/subapi/new.py +3 -1
  10. {conan-server-2.1.0 → conan-server-2.2.1}/conan/api/subapi/remotes.py +13 -5
  11. {conan-server-2.1.0 → conan-server-2.2.1}/conan/api/subapi/upload.py +1 -14
  12. {conan-server-2.1.0 → conan-server-2.2.1}/conan/cli/args.py +0 -2
  13. {conan-server-2.1.0 → conan-server-2.2.1}/conan/cli/cli.py +2 -0
  14. {conan-server-2.1.0 → conan-server-2.2.1}/conan/cli/command.py +25 -0
  15. {conan-server-2.1.0 → conan-server-2.2.1}/conan/cli/commands/cache.py +6 -3
  16. {conan-server-2.1.0 → conan-server-2.2.1}/conan/cli/commands/config.py +28 -2
  17. {conan-server-2.1.0 → conan-server-2.2.1}/conan/cli/commands/create.py +5 -9
  18. {conan-server-2.1.0 → conan-server-2.2.1}/conan/cli/commands/graph.py +125 -1
  19. {conan-server-2.1.0 → conan-server-2.2.1}/conan/cli/commands/list.py +24 -6
  20. {conan-server-2.1.0 → conan-server-2.2.1}/conan/cli/commands/lock.py +9 -2
  21. {conan-server-2.1.0 → conan-server-2.2.1}/conan/cli/commands/new.py +1 -1
  22. {conan-server-2.1.0 → conan-server-2.2.1}/conan/cli/commands/remote.py +16 -5
  23. {conan-server-2.1.0 → conan-server-2.2.1}/conan/cli/formatters/graph/graph.py +14 -10
  24. conan-server-2.2.1/conan/cli/formatters/graph/info_graph_html.py +316 -0
  25. {conan-server-2.1.0 → conan-server-2.2.1}/conan/cli/printers/graph.py +11 -0
  26. {conan-server-2.1.0 → conan-server-2.2.1}/conan/internal/api/detect_api.py +91 -3
  27. conan-server-2.2.1/conan/internal/api/new/local_recipes_index.py +113 -0
  28. {conan-server-2.1.0 → conan-server-2.2.1}/conan/internal/api/new/msbuild_lib.py +1 -0
  29. {conan-server-2.1.0 → conan-server-2.2.1}/conan/internal/cache/home_paths.py +8 -0
  30. {conan-server-2.1.0 → conan-server-2.2.1}/conan/internal/deploy.py +12 -5
  31. conan-server-2.2.1/conan/internal/internal_tools.py +24 -0
  32. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/apple/xcodetoolchain.py +1 -1
  33. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/build/__init__.py +1 -0
  34. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/build/flags.py +18 -5
  35. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/cmake/cmakedeps/templates/macros.py +1 -1
  36. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/cmake/cmakedeps/templates/target_configuration.py +37 -40
  37. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/cmake/cmakedeps/templates/target_data.py +6 -6
  38. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/cmake/layout.py +16 -2
  39. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/cmake/toolchain/blocks.py +73 -15
  40. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/cmake/toolchain/toolchain.py +22 -9
  41. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/files/conandata.py +6 -2
  42. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/files/copy_pattern.py +7 -2
  43. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/files/patches.py +6 -0
  44. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/gnu/autotoolstoolchain.py +4 -1
  45. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/gnu/get_gnu_triplet.py +1 -1
  46. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/gnu/pkgconfigdeps.py +121 -123
  47. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/google/toolchain.py +4 -1
  48. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/meson/helpers.py +1 -0
  49. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/meson/meson.py +11 -10
  50. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/meson/toolchain.py +15 -4
  51. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/microsoft/nmaketoolchain.py +1 -1
  52. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/microsoft/visual.py +2 -1
  53. {conan-server-2.1.0 → conan-server-2.2.1}/conan_server.egg-info/PKG-INFO +1 -1
  54. {conan-server-2.1.0 → conan-server-2.2.1}/conan_server.egg-info/SOURCES.txt +4 -1
  55. {conan-server-2.1.0 → conan-server-2.2.1}/conans/__init__.py +1 -1
  56. {conan-server-2.1.0 → conan-server-2.2.1}/conans/client/conanfile/configure.py +5 -0
  57. {conan-server-2.1.0 → conan-server-2.2.1}/conans/client/conf/__init__.py +2 -2
  58. {conan-server-2.1.0 → conan-server-2.2.1}/conans/client/conf/config_installer.py +8 -6
  59. {conan-server-2.1.0 → conan-server-2.2.1}/conans/client/downloaders/download_cache.py +11 -7
  60. {conan-server-2.1.0 → conan-server-2.2.1}/conans/client/generators/__init__.py +4 -1
  61. {conan-server-2.1.0 → conan-server-2.2.1}/conans/client/graph/compute_pid.py +4 -2
  62. {conan-server-2.1.0 → conan-server-2.2.1}/conans/client/graph/graph.py +4 -0
  63. {conan-server-2.1.0 → conan-server-2.2.1}/conans/client/graph/graph_binaries.py +75 -24
  64. {conan-server-2.1.0 → conan-server-2.2.1}/conans/client/graph/graph_builder.py +48 -15
  65. {conan-server-2.1.0 → conan-server-2.2.1}/conans/client/graph/graph_error.py +11 -1
  66. {conan-server-2.1.0 → conan-server-2.2.1}/conans/client/graph/install_graph.py +25 -0
  67. {conan-server-2.1.0 → conan-server-2.2.1}/conans/client/graph/proxy.py +3 -0
  68. {conan-server-2.1.0 → conan-server-2.2.1}/conans/client/loader.py +10 -3
  69. {conan-server-2.1.0 → conan-server-2.2.1}/conans/client/remote_manager.py +21 -2
  70. conan-server-2.2.1/conans/client/rest_client_local_recipe_index.py +227 -0
  71. {conan-server-2.1.0 → conan-server-2.2.1}/conans/model/conf.py +15 -11
  72. {conan-server-2.1.0 → conan-server-2.2.1}/conans/model/graph_lock.py +16 -2
  73. {conan-server-2.1.0 → conan-server-2.2.1}/conans/model/info.py +12 -1
  74. {conan-server-2.1.0 → conan-server-2.2.1}/conans/model/options.py +6 -2
  75. {conan-server-2.1.0 → conan-server-2.2.1}/conans/model/pkg_type.py +1 -0
  76. {conan-server-2.1.0 → conan-server-2.2.1}/conans/model/requires.py +3 -0
  77. {conan-server-2.1.0 → conan-server-2.2.1}/conans/model/settings.py +3 -1
  78. {conan-server-2.1.0 → conan-server-2.2.1}/conans/model/version_range.py +1 -1
  79. {conan-server-2.1.0 → conan-server-2.2.1}/conans/test/assets/genconanfile.py +3 -1
  80. {conan-server-2.1.0 → conan-server-2.2.1}/conans/test/conftest.py +5 -4
  81. {conan-server-2.1.0 → conan-server-2.2.1}/conans/test/utils/mocks.py +4 -0
  82. {conan-server-2.1.0 → conan-server-2.2.1}/conans/util/dates.py +1 -1
  83. {conan-server-2.1.0 → conan-server-2.2.1}/conans/util/files.py +10 -0
  84. {conan-server-2.1.0 → conan-server-2.2.1}/conans/util/runners.py +2 -2
  85. conan-server-2.1.0/conan/cli/formatters/graph/info_graph_html.py +0 -194
  86. conan-server-2.1.0/conans/pylint_plugin.py +0 -85
  87. {conan-server-2.1.0 → conan-server-2.2.1}/LICENSE.md +0 -0
  88. {conan-server-2.1.0 → conan-server-2.2.1}/MANIFEST.in +0 -0
  89. {conan-server-2.1.0 → conan-server-2.2.1}/README.md +0 -0
  90. {conan-server-2.1.0 → conan-server-2.2.1}/conan/__init__.py +0 -0
  91. {conan-server-2.1.0 → conan-server-2.2.1}/conan/api/__init__.py +0 -0
  92. {conan-server-2.1.0 → conan-server-2.2.1}/conan/api/output.py +0 -0
  93. {conan-server-2.1.0 → conan-server-2.2.1}/conan/api/subapi/__init__.py +0 -0
  94. {conan-server-2.1.0 → conan-server-2.2.1}/conan/api/subapi/download.py +0 -0
  95. {conan-server-2.1.0 → conan-server-2.2.1}/conan/api/subapi/export.py +0 -0
  96. {conan-server-2.1.0 → conan-server-2.2.1}/conan/api/subapi/graph.py +0 -0
  97. {conan-server-2.1.0 → conan-server-2.2.1}/conan/api/subapi/install.py +0 -0
  98. {conan-server-2.1.0 → conan-server-2.2.1}/conan/api/subapi/local.py +0 -0
  99. {conan-server-2.1.0 → conan-server-2.2.1}/conan/api/subapi/profiles.py +0 -0
  100. {conan-server-2.1.0 → conan-server-2.2.1}/conan/api/subapi/remove.py +0 -0
  101. {conan-server-2.1.0 → conan-server-2.2.1}/conan/api/subapi/search.py +0 -0
  102. {conan-server-2.1.0 → conan-server-2.2.1}/conan/cli/__init__.py +0 -0
  103. {conan-server-2.1.0 → conan-server-2.2.1}/conan/cli/commands/__init__.py +0 -0
  104. {conan-server-2.1.0 → conan-server-2.2.1}/conan/cli/commands/build.py +0 -0
  105. {conan-server-2.1.0 → conan-server-2.2.1}/conan/cli/commands/download.py +0 -0
  106. {conan-server-2.1.0 → conan-server-2.2.1}/conan/cli/commands/editable.py +0 -0
  107. {conan-server-2.1.0 → conan-server-2.2.1}/conan/cli/commands/export.py +0 -0
  108. {conan-server-2.1.0 → conan-server-2.2.1}/conan/cli/commands/export_pkg.py +0 -0
  109. {conan-server-2.1.0 → conan-server-2.2.1}/conan/cli/commands/inspect.py +0 -0
  110. {conan-server-2.1.0 → conan-server-2.2.1}/conan/cli/commands/install.py +0 -0
  111. {conan-server-2.1.0 → conan-server-2.2.1}/conan/cli/commands/profile.py +0 -0
  112. {conan-server-2.1.0 → conan-server-2.2.1}/conan/cli/commands/remove.py +0 -0
  113. {conan-server-2.1.0 → conan-server-2.2.1}/conan/cli/commands/search.py +0 -0
  114. {conan-server-2.1.0 → conan-server-2.2.1}/conan/cli/commands/source.py +0 -0
  115. {conan-server-2.1.0 → conan-server-2.2.1}/conan/cli/commands/test.py +0 -0
  116. {conan-server-2.1.0 → conan-server-2.2.1}/conan/cli/commands/upload.py +0 -0
  117. {conan-server-2.1.0 → conan-server-2.2.1}/conan/cli/commands/version.py +0 -0
  118. {conan-server-2.1.0 → conan-server-2.2.1}/conan/cli/exit_codes.py +0 -0
  119. {conan-server-2.1.0 → conan-server-2.2.1}/conan/cli/formatters/__init__.py +0 -0
  120. {conan-server-2.1.0 → conan-server-2.2.1}/conan/cli/formatters/graph/__init__.py +0 -0
  121. {conan-server-2.1.0 → conan-server-2.2.1}/conan/cli/formatters/graph/graph_info_text.py +0 -0
  122. {conan-server-2.1.0 → conan-server-2.2.1}/conan/cli/formatters/graph/info_graph_dot.py +0 -0
  123. {conan-server-2.1.0 → conan-server-2.2.1}/conan/cli/formatters/list/__init__.py +0 -0
  124. {conan-server-2.1.0 → conan-server-2.2.1}/conan/cli/formatters/list/binary_html_table.py +0 -0
  125. {conan-server-2.1.0 → conan-server-2.2.1}/conan/cli/formatters/list/list.py +0 -0
  126. {conan-server-2.1.0 → conan-server-2.2.1}/conan/cli/formatters/list/search_table_html.py +0 -0
  127. {conan-server-2.1.0 → conan-server-2.2.1}/conan/cli/printers/__init__.py +0 -0
  128. {conan-server-2.1.0 → conan-server-2.2.1}/conan/errors.py +0 -0
  129. {conan-server-2.1.0 → conan-server-2.2.1}/conan/internal/__init__.py +0 -0
  130. {conan-server-2.1.0 → conan-server-2.2.1}/conan/internal/api/__init__.py +0 -0
  131. {conan-server-2.1.0 → conan-server-2.2.1}/conan/internal/api/new/__init__.py +0 -0
  132. {conan-server-2.1.0 → conan-server-2.2.1}/conan/internal/api/new/alias_new.py +0 -0
  133. {conan-server-2.1.0 → conan-server-2.2.1}/conan/internal/api/new/autoools_exe.py +0 -0
  134. {conan-server-2.1.0 → conan-server-2.2.1}/conan/internal/api/new/autotools_lib.py +0 -0
  135. {conan-server-2.1.0 → conan-server-2.2.1}/conan/internal/api/new/basic.py +0 -0
  136. {conan-server-2.1.0 → conan-server-2.2.1}/conan/internal/api/new/bazel_exe.py +0 -0
  137. {conan-server-2.1.0 → conan-server-2.2.1}/conan/internal/api/new/bazel_lib.py +0 -0
  138. {conan-server-2.1.0 → conan-server-2.2.1}/conan/internal/api/new/cmake_exe.py +0 -0
  139. {conan-server-2.1.0 → conan-server-2.2.1}/conan/internal/api/new/cmake_lib.py +0 -0
  140. {conan-server-2.1.0 → conan-server-2.2.1}/conan/internal/api/new/meson_exe.py +0 -0
  141. {conan-server-2.1.0 → conan-server-2.2.1}/conan/internal/api/new/meson_lib.py +0 -0
  142. {conan-server-2.1.0 → conan-server-2.2.1}/conan/internal/api/new/msbuild_exe.py +0 -0
  143. {conan-server-2.1.0 → conan-server-2.2.1}/conan/internal/cache/__init__.py +0 -0
  144. {conan-server-2.1.0 → conan-server-2.2.1}/conan/internal/cache/cache.py +0 -0
  145. {conan-server-2.1.0 → conan-server-2.2.1}/conan/internal/cache/conan_reference_layout.py +0 -0
  146. {conan-server-2.1.0 → conan-server-2.2.1}/conan/internal/cache/db/__init__.py +0 -0
  147. {conan-server-2.1.0 → conan-server-2.2.1}/conan/internal/cache/db/cache_database.py +0 -0
  148. {conan-server-2.1.0 → conan-server-2.2.1}/conan/internal/cache/db/packages_table.py +0 -0
  149. {conan-server-2.1.0 → conan-server-2.2.1}/conan/internal/cache/db/recipes_table.py +0 -0
  150. {conan-server-2.1.0 → conan-server-2.2.1}/conan/internal/cache/db/table.py +0 -0
  151. {conan-server-2.1.0 → conan-server-2.2.1}/conan/internal/conan_app.py +0 -0
  152. {conan-server-2.1.0 → conan-server-2.2.1}/conan/internal/integrity_check.py +0 -0
  153. {conan-server-2.1.0 → conan-server-2.2.1}/conan/internal/upload_metadata.py +0 -0
  154. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/__init__.py +0 -0
  155. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/android/__init__.py +0 -0
  156. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/android/utils.py +0 -0
  157. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/apple/__init__.py +0 -0
  158. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/apple/apple.py +0 -0
  159. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/apple/xcodebuild.py +0 -0
  160. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/apple/xcodedeps.py +0 -0
  161. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/build/cppstd.py +0 -0
  162. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/build/cpu.py +0 -0
  163. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/build/cross_building.py +0 -0
  164. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/build/stdcpp_library.py +0 -0
  165. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/cmake/__init__.py +0 -0
  166. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/cmake/cmake.py +0 -0
  167. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/cmake/cmakedeps/__init__.py +0 -0
  168. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/cmake/cmakedeps/cmakedeps.py +0 -0
  169. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/cmake/cmakedeps/templates/__init__.py +0 -0
  170. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/cmake/cmakedeps/templates/config.py +0 -0
  171. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/cmake/cmakedeps/templates/config_version.py +0 -0
  172. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/cmake/cmakedeps/templates/targets.py +0 -0
  173. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/cmake/presets.py +0 -0
  174. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/cmake/toolchain/__init__.py +0 -0
  175. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/cmake/utils.py +0 -0
  176. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/env/__init__.py +0 -0
  177. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/env/environment.py +0 -0
  178. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/env/virtualbuildenv.py +0 -0
  179. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/env/virtualrunenv.py +0 -0
  180. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/files/__init__.py +0 -0
  181. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/files/files.py +0 -0
  182. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/files/packager.py +0 -0
  183. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/files/symlinks/__init__.py +0 -0
  184. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/files/symlinks/symlinks.py +0 -0
  185. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/gnu/__init__.py +0 -0
  186. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/gnu/autotools.py +0 -0
  187. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/gnu/autotoolsdeps.py +0 -0
  188. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/gnu/gnudeps_flags.py +0 -0
  189. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/gnu/makedeps.py +0 -0
  190. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/gnu/pkgconfig.py +0 -0
  191. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/google/__init__.py +0 -0
  192. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/google/bazel.py +0 -0
  193. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/google/bazeldeps.py +0 -0
  194. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/google/layout.py +0 -0
  195. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/intel/__init__.py +0 -0
  196. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/intel/intel_cc.py +0 -0
  197. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/layout/__init__.py +0 -0
  198. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/meson/__init__.py +0 -0
  199. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/microsoft/__init__.py +0 -0
  200. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/microsoft/layout.py +0 -0
  201. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/microsoft/msbuild.py +0 -0
  202. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/microsoft/msbuilddeps.py +0 -0
  203. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/microsoft/nmakedeps.py +0 -0
  204. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/microsoft/subsystems.py +0 -0
  205. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/microsoft/toolchain.py +0 -0
  206. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/premake/__init__.py +0 -0
  207. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/premake/premake.py +0 -0
  208. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/premake/premakedeps.py +0 -0
  209. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/qbs/__init__.py +0 -0
  210. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/qbs/qbs.py +0 -0
  211. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/qbs/qbsprofile.py +0 -0
  212. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/scm/__init__.py +0 -0
  213. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/scm/git.py +0 -0
  214. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/scons/__init__.py +0 -0
  215. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/scons/sconsdeps.py +0 -0
  216. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/system/__init__.py +0 -0
  217. {conan-server-2.1.0 → conan-server-2.2.1}/conan/tools/system/package_manager.py +0 -0
  218. {conan-server-2.1.0 → conan-server-2.2.1}/conan_server.egg-info/dependency_links.txt +0 -0
  219. {conan-server-2.1.0 → conan-server-2.2.1}/conan_server.egg-info/entry_points.txt +0 -0
  220. {conan-server-2.1.0 → conan-server-2.2.1}/conan_server.egg-info/requires.txt +0 -0
  221. {conan-server-2.1.0 → conan-server-2.2.1}/conan_server.egg-info/top_level.txt +0 -0
  222. {conan-server-2.1.0 → conan-server-2.2.1}/conans/client/__init__.py +0 -0
  223. {conan-server-2.1.0 → conan-server-2.2.1}/conans/client/cache/__init__.py +0 -0
  224. {conan-server-2.1.0 → conan-server-2.2.1}/conans/client/cache/cache.py +0 -0
  225. {conan-server-2.1.0 → conan-server-2.2.1}/conans/client/cache/editable.py +0 -0
  226. {conan-server-2.1.0 → conan-server-2.2.1}/conans/client/cmd/__init__.py +0 -0
  227. {conan-server-2.1.0 → conan-server-2.2.1}/conans/client/cmd/export.py +0 -0
  228. {conan-server-2.1.0 → conan-server-2.2.1}/conans/client/cmd/uploader.py +0 -0
  229. {conan-server-2.1.0 → conan-server-2.2.1}/conans/client/conanfile/__init__.py +0 -0
  230. {conan-server-2.1.0 → conan-server-2.2.1}/conans/client/conanfile/build.py +0 -0
  231. {conan-server-2.1.0 → conan-server-2.2.1}/conans/client/conanfile/implementations.py +0 -0
  232. {conan-server-2.1.0 → conan-server-2.2.1}/conans/client/conanfile/package.py +0 -0
  233. {conan-server-2.1.0 → conan-server-2.2.1}/conans/client/conf/detect.py +0 -0
  234. {conan-server-2.1.0 → conan-server-2.2.1}/conans/client/conf/detect_vs.py +0 -0
  235. {conan-server-2.1.0 → conan-server-2.2.1}/conans/client/conf/required_version.py +0 -0
  236. {conan-server-2.1.0 → conan-server-2.2.1}/conans/client/downloaders/__init__.py +0 -0
  237. {conan-server-2.1.0 → conan-server-2.2.1}/conans/client/downloaders/caching_file_downloader.py +0 -0
  238. {conan-server-2.1.0 → conan-server-2.2.1}/conans/client/downloaders/file_downloader.py +0 -0
  239. {conan-server-2.1.0 → conan-server-2.2.1}/conans/client/graph/__init__.py +0 -0
  240. {conan-server-2.1.0 → conan-server-2.2.1}/conans/client/graph/build_mode.py +0 -0
  241. {conan-server-2.1.0 → conan-server-2.2.1}/conans/client/graph/compatibility.py +0 -0
  242. {conan-server-2.1.0 → conan-server-2.2.1}/conans/client/graph/profile_node_definer.py +0 -0
  243. {conan-server-2.1.0 → conan-server-2.2.1}/conans/client/graph/provides.py +0 -0
  244. {conan-server-2.1.0 → conan-server-2.2.1}/conans/client/graph/python_requires.py +0 -0
  245. {conan-server-2.1.0 → conan-server-2.2.1}/conans/client/graph/range_resolver.py +0 -0
  246. {conan-server-2.1.0 → conan-server-2.2.1}/conans/client/hook_manager.py +0 -0
  247. {conan-server-2.1.0 → conan-server-2.2.1}/conans/client/installer.py +0 -0
  248. {conan-server-2.1.0 → conan-server-2.2.1}/conans/client/loader_txt.py +0 -0
  249. {conan-server-2.1.0 → conan-server-2.2.1}/conans/client/migrations.py +0 -0
  250. {conan-server-2.1.0 → conan-server-2.2.1}/conans/client/pkg_sign.py +0 -0
  251. {conan-server-2.1.0 → conan-server-2.2.1}/conans/client/profile_loader.py +0 -0
  252. {conan-server-2.1.0 → conan-server-2.2.1}/conans/client/rest/__init__.py +0 -0
  253. {conan-server-2.1.0 → conan-server-2.2.1}/conans/client/rest/auth_manager.py +0 -0
  254. {conan-server-2.1.0 → conan-server-2.2.1}/conans/client/rest/client_routes.py +0 -0
  255. {conan-server-2.1.0 → conan-server-2.2.1}/conans/client/rest/conan_requester.py +0 -0
  256. {conan-server-2.1.0 → conan-server-2.2.1}/conans/client/rest/file_uploader.py +0 -0
  257. {conan-server-2.1.0 → conan-server-2.2.1}/conans/client/rest/remote_credentials.py +0 -0
  258. {conan-server-2.1.0 → conan-server-2.2.1}/conans/client/rest/rest_client.py +0 -0
  259. {conan-server-2.1.0 → conan-server-2.2.1}/conans/client/rest/rest_client_common.py +0 -0
  260. {conan-server-2.1.0 → conan-server-2.2.1}/conans/client/rest/rest_client_v2.py +0 -0
  261. {conan-server-2.1.0 → conan-server-2.2.1}/conans/client/source.py +0 -0
  262. {conan-server-2.1.0 → conan-server-2.2.1}/conans/client/store/__init__.py +0 -0
  263. {conan-server-2.1.0 → conan-server-2.2.1}/conans/client/store/localdb.py +0 -0
  264. {conan-server-2.1.0 → conan-server-2.2.1}/conans/client/subsystems.py +0 -0
  265. {conan-server-2.1.0 → conan-server-2.2.1}/conans/client/userio.py +0 -0
  266. {conan-server-2.1.0 → conan-server-2.2.1}/conans/conan.py +0 -0
  267. {conan-server-2.1.0 → conan-server-2.2.1}/conans/conan_server.py +0 -0
  268. {conan-server-2.1.0 → conan-server-2.2.1}/conans/errors.py +0 -0
  269. {conan-server-2.1.0 → conan-server-2.2.1}/conans/migrations.py +0 -0
  270. {conan-server-2.1.0 → conan-server-2.2.1}/conans/model/__init__.py +0 -0
  271. {conan-server-2.1.0 → conan-server-2.2.1}/conans/model/build_info.py +0 -0
  272. {conan-server-2.1.0 → conan-server-2.2.1}/conans/model/conan_file.py +0 -0
  273. {conan-server-2.1.0 → conan-server-2.2.1}/conans/model/conanfile_interface.py +0 -0
  274. {conan-server-2.1.0 → conan-server-2.2.1}/conans/model/dependencies.py +0 -0
  275. {conan-server-2.1.0 → conan-server-2.2.1}/conans/model/layout.py +0 -0
  276. {conan-server-2.1.0 → conan-server-2.2.1}/conans/model/manifest.py +0 -0
  277. {conan-server-2.1.0 → conan-server-2.2.1}/conans/model/package_ref.py +0 -0
  278. {conan-server-2.1.0 → conan-server-2.2.1}/conans/model/profile.py +0 -0
  279. {conan-server-2.1.0 → conan-server-2.2.1}/conans/model/recipe_ref.py +0 -0
  280. {conan-server-2.1.0 → conan-server-2.2.1}/conans/model/rest_routes.py +0 -0
  281. {conan-server-2.1.0 → conan-server-2.2.1}/conans/model/version.py +0 -0
  282. {conan-server-2.1.0 → conan-server-2.2.1}/conans/paths/__init__.py +0 -0
  283. {conan-server-2.1.0 → conan-server-2.2.1}/conans/requirements.txt +0 -0
  284. {conan-server-2.1.0 → conan-server-2.2.1}/conans/requirements_dev.txt +0 -0
  285. {conan-server-2.1.0 → conan-server-2.2.1}/conans/requirements_server.txt +0 -0
  286. {conan-server-2.1.0 → conan-server-2.2.1}/conans/search/__init__.py +0 -0
  287. {conan-server-2.1.0 → conan-server-2.2.1}/conans/search/query_parse.py +0 -0
  288. {conan-server-2.1.0 → conan-server-2.2.1}/conans/search/search.py +0 -0
  289. {conan-server-2.1.0 → conan-server-2.2.1}/conans/server/__init__.py +0 -0
  290. {conan-server-2.1.0 → conan-server-2.2.1}/conans/server/conf/__init__.py +0 -0
  291. {conan-server-2.1.0 → conan-server-2.2.1}/conans/server/conf/default_server_conf.py +0 -0
  292. {conan-server-2.1.0 → conan-server-2.2.1}/conans/server/crypto/__init__.py +0 -0
  293. {conan-server-2.1.0 → conan-server-2.2.1}/conans/server/crypto/jwt/__init__.py +0 -0
  294. {conan-server-2.1.0 → conan-server-2.2.1}/conans/server/crypto/jwt/jwt_credentials_manager.py +0 -0
  295. {conan-server-2.1.0 → conan-server-2.2.1}/conans/server/crypto/jwt/jwt_manager.py +0 -0
  296. {conan-server-2.1.0 → conan-server-2.2.1}/conans/server/launcher.py +0 -0
  297. {conan-server-2.1.0 → conan-server-2.2.1}/conans/server/migrate.py +0 -0
  298. {conan-server-2.1.0 → conan-server-2.2.1}/conans/server/migrations.py +0 -0
  299. {conan-server-2.1.0 → conan-server-2.2.1}/conans/server/plugin_loader.py +0 -0
  300. {conan-server-2.1.0 → conan-server-2.2.1}/conans/server/rest/__init__.py +0 -0
  301. {conan-server-2.1.0 → conan-server-2.2.1}/conans/server/rest/api_v2.py +0 -0
  302. {conan-server-2.1.0 → conan-server-2.2.1}/conans/server/rest/bottle_plugins/__init__.py +0 -0
  303. {conan-server-2.1.0 → conan-server-2.2.1}/conans/server/rest/bottle_plugins/authorization_header.py +0 -0
  304. {conan-server-2.1.0 → conan-server-2.2.1}/conans/server/rest/bottle_plugins/http_basic_authentication.py +0 -0
  305. {conan-server-2.1.0 → conan-server-2.2.1}/conans/server/rest/bottle_plugins/jwt_authentication.py +0 -0
  306. {conan-server-2.1.0 → conan-server-2.2.1}/conans/server/rest/bottle_plugins/return_handler.py +0 -0
  307. {conan-server-2.1.0 → conan-server-2.2.1}/conans/server/rest/bottle_routes.py +0 -0
  308. {conan-server-2.1.0 → conan-server-2.2.1}/conans/server/rest/controller/__init__.py +0 -0
  309. {conan-server-2.1.0 → conan-server-2.2.1}/conans/server/rest/controller/v2/__init__.py +0 -0
  310. {conan-server-2.1.0 → conan-server-2.2.1}/conans/server/rest/controller/v2/conan.py +0 -0
  311. {conan-server-2.1.0 → conan-server-2.2.1}/conans/server/rest/controller/v2/delete.py +0 -0
  312. {conan-server-2.1.0 → conan-server-2.2.1}/conans/server/rest/controller/v2/ping.py +0 -0
  313. {conan-server-2.1.0 → conan-server-2.2.1}/conans/server/rest/controller/v2/revisions.py +0 -0
  314. {conan-server-2.1.0 → conan-server-2.2.1}/conans/server/rest/controller/v2/search.py +0 -0
  315. {conan-server-2.1.0 → conan-server-2.2.1}/conans/server/rest/controller/v2/users.py +0 -0
  316. {conan-server-2.1.0 → conan-server-2.2.1}/conans/server/rest/server.py +0 -0
  317. {conan-server-2.1.0 → conan-server-2.2.1}/conans/server/revision_list.py +0 -0
  318. {conan-server-2.1.0 → conan-server-2.2.1}/conans/server/server_launcher.py +0 -0
  319. {conan-server-2.1.0 → conan-server-2.2.1}/conans/server/service/__init__.py +0 -0
  320. {conan-server-2.1.0 → conan-server-2.2.1}/conans/server/service/authorize.py +0 -0
  321. {conan-server-2.1.0 → conan-server-2.2.1}/conans/server/service/mime.py +0 -0
  322. {conan-server-2.1.0 → conan-server-2.2.1}/conans/server/service/user_service.py +0 -0
  323. {conan-server-2.1.0 → conan-server-2.2.1}/conans/server/service/v2/__init__.py +0 -0
  324. {conan-server-2.1.0 → conan-server-2.2.1}/conans/server/service/v2/search.py +0 -0
  325. {conan-server-2.1.0 → conan-server-2.2.1}/conans/server/service/v2/service_v2.py +0 -0
  326. {conan-server-2.1.0 → conan-server-2.2.1}/conans/server/store/__init__.py +0 -0
  327. {conan-server-2.1.0 → conan-server-2.2.1}/conans/server/store/disk_adapter.py +0 -0
  328. {conan-server-2.1.0 → conan-server-2.2.1}/conans/server/store/server_store.py +0 -0
  329. {conan-server-2.1.0 → conan-server-2.2.1}/conans/server/utils/__init__.py +0 -0
  330. {conan-server-2.1.0 → conan-server-2.2.1}/conans/server/utils/files.py +0 -0
  331. {conan-server-2.1.0 → conan-server-2.2.1}/conans/test/__init__.py +0 -0
  332. {conan-server-2.1.0 → conan-server-2.2.1}/conans/test/assets/__init__.py +0 -0
  333. {conan-server-2.1.0 → conan-server-2.2.1}/conans/test/assets/autotools.py +0 -0
  334. {conan-server-2.1.0 → conan-server-2.2.1}/conans/test/assets/cmake.py +0 -0
  335. {conan-server-2.1.0 → conan-server-2.2.1}/conans/test/assets/pkg_cmake.py +0 -0
  336. {conan-server-2.1.0 → conan-server-2.2.1}/conans/test/assets/sources.py +0 -0
  337. {conan-server-2.1.0 → conan-server-2.2.1}/conans/test/assets/visual_project_files.py +0 -0
  338. {conan-server-2.1.0 → conan-server-2.2.1}/conans/test/utils/__init__.py +0 -0
  339. {conan-server-2.1.0 → conan-server-2.2.1}/conans/test/utils/artifactory.py +0 -0
  340. {conan-server-2.1.0 → conan-server-2.2.1}/conans/test/utils/file_server.py +0 -0
  341. {conan-server-2.1.0 → conan-server-2.2.1}/conans/test/utils/profiles.py +0 -0
  342. {conan-server-2.1.0 → conan-server-2.2.1}/conans/test/utils/scm.py +0 -0
  343. {conan-server-2.1.0 → conan-server-2.2.1}/conans/test/utils/server_launcher.py +0 -0
  344. {conan-server-2.1.0 → conan-server-2.2.1}/conans/test/utils/test_files.py +0 -0
  345. {conan-server-2.1.0 → conan-server-2.2.1}/conans/test/utils/tools.py +0 -0
  346. {conan-server-2.1.0 → conan-server-2.2.1}/conans/util/__init__.py +0 -0
  347. {conan-server-2.1.0 → conan-server-2.2.1}/conans/util/config_parser.py +0 -0
  348. {conan-server-2.1.0 → conan-server-2.2.1}/conans/util/encrypt.py +0 -0
  349. {conan-server-2.1.0 → conan-server-2.2.1}/conans/util/env.py +0 -0
  350. {conan-server-2.1.0 → conan-server-2.2.1}/conans/util/locks.py +0 -0
  351. {conan-server-2.1.0 → conan-server-2.2.1}/conans/util/sha.py +0 -0
  352. {conan-server-2.1.0 → conan-server-2.2.1}/conans/util/thread.py +0 -0
  353. {conan-server-2.1.0 → conan-server-2.2.1}/conans/util/windows.py +0 -0
  354. {conan-server-2.1.0 → conan-server-2.2.1}/pyproject.toml +0 -0
  355. {conan-server-2.1.0 → conan-server-2.2.1}/setup.cfg +0 -0
  356. {conan-server-2.1.0 → conan-server-2.2.1}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: conan-server
3
- Version: 2.1.0
3
+ Version: 2.2.1
4
4
  Summary: Conan Server of Conan C/C++ package manager
5
5
  Home-page: https://conan.io
6
6
  Author: JFrog LTD
@@ -1,6 +1,7 @@
1
1
  import sys
2
2
 
3
3
  from conan.api.subapi.cache import CacheAPI
4
+ from conan.api.subapi.command import CommandAPI
4
5
  from conan.api.subapi.local import LocalAPI
5
6
  from conan.api.subapi.lockfile import LockfileAPI
6
7
  from conans import __version__ as client_version
@@ -39,6 +40,7 @@ class ConanAPI(object):
39
40
  migrator = ClientMigrator(self.cache_folder, Version(client_version))
40
41
  migrator.migrate()
41
42
 
43
+ self.command = CommandAPI(self)
42
44
  self.remotes = RemotesAPI(self)
43
45
  # Search recipes by wildcard and packages filtering by configuracion
44
46
  self.search = SearchAPI(self)
@@ -3,21 +3,25 @@ import json
3
3
 
4
4
  from conans.client.graph.graph import RECIPE_EDITABLE, RECIPE_CONSUMER, RECIPE_PLATFORM, \
5
5
  RECIPE_VIRTUAL, BINARY_SKIP, BINARY_MISSING, BINARY_INVALID
6
- from conans.errors import ConanException
6
+ from conans.errors import ConanException, NotFoundException
7
7
  from conans.model.package_ref import PkgReference
8
8
  from conans.model.recipe_ref import RecipeReference
9
9
  from conans.util.files import load
10
10
  from conans.model.version_range import VersionRange
11
11
 
12
+ LOCAL_RECIPES_INDEX = "local-recipes-index"
13
+
12
14
 
13
15
  class Remote:
14
16
 
15
- def __init__(self, name, url, verify_ssl=True, disabled=False, allowed_packages=None):
17
+ def __init__(self, name, url, verify_ssl=True, disabled=False, allowed_packages=None,
18
+ remote_type=None):
16
19
  self.name = name # Read only, is the key
17
20
  self.url = url
18
21
  self.verify_ssl = verify_ssl
19
22
  self.disabled = disabled
20
23
  self.allowed_packages = allowed_packages
24
+ self.remote_type = remote_type
21
25
 
22
26
  def __eq__(self, other):
23
27
  if other is None:
@@ -29,6 +33,9 @@ class Remote:
29
33
  allowed_msg = ""
30
34
  if self.allowed_packages:
31
35
  allowed_msg = ", Allowed packages: {}".format(", ".join(self.allowed_packages))
36
+ if self.remote_type == LOCAL_RECIPES_INDEX:
37
+ return "{}: {} [{}, Enabled: {}{}]".format(self.name, self.url, LOCAL_RECIPES_INDEX,
38
+ not self.disabled, allowed_msg)
32
39
  return "{}: {} [Verify SSL: {}, Enabled: {}{}]".format(self.name, self.url, self.verify_ssl,
33
40
  not self.disabled, allowed_msg)
34
41
 
@@ -278,7 +285,7 @@ class ListPattern:
278
285
 
279
286
  def check_refs(self, refs):
280
287
  if not refs and self.ref and "*" not in self.ref:
281
- raise ConanException(f"Recipe '{self.ref}' not found")
288
+ raise NotFoundException(f"Recipe '{self.ref}' not found")
282
289
 
283
290
  def filter_rrevs(self, rrevs):
284
291
  if self._only_latest(self.rrev):
@@ -6,14 +6,16 @@ from io import BytesIO
6
6
 
7
7
  from conan.api.model import PackagesList
8
8
  from conan.api.output import ConanOutput
9
+ from conan.internal.cache.home_paths import HomePaths
9
10
  from conan.internal.conan_app import ConanApp
10
11
  from conan.internal.integrity_check import IntegrityChecker
11
12
  from conans.client.cache.cache import ClientCache
13
+ from conans.client.downloaders.download_cache import DownloadCache
12
14
  from conans.errors import ConanException
13
15
  from conans.model.package_ref import PkgReference
14
16
  from conans.model.recipe_ref import RecipeReference
15
17
  from conans.util.dates import revision_timestamp_now
16
- from conans.util.files import rmdir, gzopen_without_timestamps, mkdir
18
+ from conans.util.files import rmdir, gzopen_without_timestamps, mkdir, remove
17
19
 
18
20
 
19
21
  class CacheAPI:
@@ -69,15 +71,17 @@ class CacheAPI:
69
71
  checker = IntegrityChecker(app)
70
72
  checker.check(package_list)
71
73
 
72
- def clean(self, package_list, source=True, build=True, download=True, temp=True):
74
+ def clean(self, package_list, source=True, build=True, download=True, temp=True,
75
+ backup_sources=False):
73
76
  """
74
77
  Remove non critical folders from the cache, like source, build and download (.tgz store)
75
78
  folders.
76
79
  :param package_list: the package lists that should be cleaned
77
80
  :param source: boolean, remove the "source" folder if True
78
81
  :param build: boolean, remove the "build" folder if True
79
- :param download: boolen, remove the "download (.tgz)" folder if True
82
+ :param download: boolean, remove the "download (.tgz)" folder if True
80
83
  :param temp: boolean, remove the temporary folders
84
+ :param backup_sources: boolean, remove the "source" folder if True
81
85
  :return:
82
86
  """
83
87
 
@@ -93,6 +97,10 @@ class CacheAPI:
93
97
  info = os.path.join(folder, "p", "conaninfo.txt")
94
98
  if not os.path.exists(manifest) or not os.path.exists(info):
95
99
  rmdir(folder)
100
+ if backup_sources:
101
+ backup_files = self.conan_api.cache.get_backup_sources(package_list, exclude=False, only_upload=False)
102
+ for f in backup_files:
103
+ remove(f)
96
104
 
97
105
  for ref, ref_bundle in package_list.refs().items():
98
106
  ref_layout = app.cache.recipe_layout(ref)
@@ -183,6 +191,22 @@ class CacheAPI:
183
191
 
184
192
  return package_list
185
193
 
194
+ def get_backup_sources(self, package_list=None, exclude=True, only_upload=True):
195
+ """Get list of backup source files currently present in the cache,
196
+ either all of them if no argument, or filtered by those belonging to the references in the package_list
197
+
198
+ @param package_list: a PackagesList object to filter backup files from (The files should have been downloaded form any of the references in the package_list)
199
+ @param exclude: if True, exclude the sources that come from URLs present the core.sources:exclude_urls global conf
200
+ @param only_upload: if True, only return the files for packages that are set to be uploaded
201
+ """
202
+ config = self.conan_api.config.global_conf
203
+ download_cache_path = config.get("core.sources:download_cache")
204
+ download_cache_path = download_cache_path or HomePaths(
205
+ self.conan_api.cache_folder).default_sources_backup_folder
206
+ excluded_urls = config.get("core.sources:exclude_urls", check_type=list, default=[]) if exclude else []
207
+ download_cache = DownloadCache(download_cache_path)
208
+ return download_cache.get_backup_sources_files(excluded_urls, package_list, only_upload)
209
+
186
210
 
187
211
  def _resolve_latest_ref(app, ref):
188
212
  if ref.revision is None or ref.revision == "latest":
@@ -0,0 +1,24 @@
1
+ from conans.errors import ConanException
2
+
3
+
4
+ class CommandAPI:
5
+
6
+ def __init__(self, conan_api):
7
+ self.conan_api = conan_api
8
+ self.cli = None
9
+
10
+ def run(self, cmd):
11
+ if isinstance(cmd, str):
12
+ cmd = cmd.split()
13
+ if isinstance(cmd, list):
14
+ current_cmd = cmd[0]
15
+ args = cmd[1:]
16
+ else:
17
+ raise ConanException("Input of conan_api.command.run() should be a list or a string")
18
+ commands = getattr(self.cli, "_commands") # to no make it public to users of Cli class
19
+ try:
20
+ command = commands[current_cmd]
21
+ except KeyError:
22
+ raise ConanException(f"Command {current_cmd} does not exist")
23
+
24
+ return command.run_cli(self.conan_api, args)
@@ -1,3 +1,4 @@
1
+ import json
1
2
  import os
2
3
  import platform
3
4
  import textwrap
@@ -5,12 +6,18 @@ import yaml
5
6
  from jinja2 import Environment, FileSystemLoader
6
7
 
7
8
  from conan import conan_version
9
+ from conan.api.output import ConanOutput
8
10
  from conans.client.conf import default_settings_yml
9
11
  from conan.internal.api import detect_api
10
12
  from conan.internal.cache.home_paths import HomePaths
11
13
  from conan.internal.conan_app import ConanApp
14
+ from conans.client.graph.graph import CONTEXT_HOST, RECIPE_VIRTUAL, Node
15
+ from conans.client.graph.graph_builder import DepsGraphBuilder
16
+ from conans.client.graph.profile_node_definer import consumer_definer
12
17
  from conans.errors import ConanException
13
18
  from conans.model.conf import ConfDefinition, BUILT_IN_CONFS
19
+ from conans.model.pkg_type import PackageType
20
+ from conans.model.recipe_ref import RecipeReference
14
21
  from conans.model.settings import Settings
15
22
  from conans.util.files import load, save
16
23
 
@@ -32,6 +39,66 @@ class ConfigAPI:
32
39
  configuration_install(app, path_or_url, verify_ssl, config_type=config_type, args=args,
33
40
  source_folder=source_folder, target_folder=target_folder)
34
41
 
42
+ def install_pkg(self, ref, lockfile=None, force=False):
43
+ ConanOutput().warning("The 'conan config install-pkg' is experimental",
44
+ warn_tag="experimental")
45
+ conan_api = self.conan_api
46
+ remotes = conan_api.remotes.list() # ready to use remotes arguments
47
+ # Ready to use profiles as inputs, but NOT using profiles yet, empty ones
48
+ profile_host = profile_build = conan_api.profiles.get_profile([])
49
+
50
+ app = ConanApp(self.conan_api)
51
+
52
+ # Computation of a very simple graph that requires "ref"
53
+ conanfile = app.loader.load_virtual(requires=[RecipeReference.loads(ref)])
54
+ consumer_definer(conanfile, profile_build, profile_host)
55
+ root_node = Node(ref=None, conanfile=conanfile, context=CONTEXT_HOST, recipe=RECIPE_VIRTUAL)
56
+ root_node.is_conf = True
57
+ update = ["*"]
58
+ builder = DepsGraphBuilder(app.proxy, app.loader, app.range_resolver, app.cache, remotes,
59
+ update, update, self.conan_api.config.global_conf)
60
+ deps_graph = builder.load_graph(root_node, profile_host, profile_build, lockfile)
61
+
62
+ # Basic checks of the package: correct package_type and no-dependencies
63
+ deps_graph.report_graph_error()
64
+ pkg = deps_graph.root.dependencies[0].dst
65
+ ConanOutput().info(f"Configuration from package: {pkg}")
66
+ if pkg.conanfile.package_type is not PackageType.CONF:
67
+ raise ConanException(f'{pkg.conanfile} is not of package_type="configuration"')
68
+ if pkg.dependencies:
69
+ raise ConanException(f"Configuration package {pkg.ref} cannot have dependencies")
70
+
71
+ # The computation of the "package_id" and the download of the package is done as usual
72
+ # By default we allow all remotes, and build_mode=None, always updating
73
+ conan_api.graph.analyze_binaries(deps_graph, None, remotes, update=update, lockfile=lockfile)
74
+ conan_api.install.install_binaries(deps_graph=deps_graph, remotes=remotes)
75
+
76
+ # We check if this specific version is already installed
77
+ config_pref = pkg.pref.repr_notime()
78
+ config_versions = []
79
+ config_version_file = HomePaths(conan_api.home_folder).config_version_path
80
+ if os.path.exists(config_version_file):
81
+ config_versions = json.loads(load(config_version_file))
82
+ config_versions = config_versions["config_version"]
83
+ if config_pref in config_versions:
84
+ if force:
85
+ ConanOutput().info(f"Package '{pkg}' already configured, "
86
+ "but re-installation forced")
87
+ else:
88
+ ConanOutput().info(f"Package '{pkg}' already configured, "
89
+ "skipping configuration install")
90
+ return pkg.pref # Already installed, we can skip repeating the install
91
+
92
+ from conans.client.conf.config_installer import configuration_install
93
+ configuration_install(app, uri=pkg.conanfile.package_folder, verify_ssl=False,
94
+ config_type="dir", ignore=["conaninfo.txt", "conanmanifest.txt"])
95
+ # We save the current package full reference in the file for future
96
+ # And for ``package_id`` computation
97
+ config_versions = {ref.split("/", 1)[0]: ref for ref in config_versions}
98
+ config_versions[pkg.pref.ref.name] = pkg.pref.repr_notime()
99
+ save(config_version_file, json.dumps({"config_version": list(config_versions.values())}))
100
+ return pkg.pref
101
+
35
102
  def get(self, name, default=None, check_type=None):
36
103
  return self.global_conf.get(name, default=default, check_type=check_type)
37
104
 
@@ -61,6 +128,7 @@ class ConfigAPI:
61
128
  if platform.system() in ["Linux", "FreeBSD"]:
62
129
  import distro
63
130
  template = Environment(loader=FileSystemLoader(home_folder)).from_string(text)
131
+ home_folder = home_folder.replace("\\", "/")
64
132
  content = template.render({"platform": platform, "os": os, "distro": distro,
65
133
  "conan_version": conan_version,
66
134
  "conan_home_folder": home_folder,
@@ -6,7 +6,7 @@ from conan.internal.conan_app import ConanApp
6
6
  from conans.errors import ConanException, NotFoundException
7
7
  from conans.model.info import load_binary_info
8
8
  from conans.model.package_ref import PkgReference
9
- from conans.model.recipe_ref import RecipeReference
9
+ from conans.model.recipe_ref import RecipeReference, ref_matches
10
10
  from conans.search.search import get_cache_packages_binary_info, filter_packages
11
11
  from conans.util.dates import timelimit
12
12
 
@@ -87,7 +87,35 @@ class ListAPI:
87
87
  """
88
88
  return filter_packages(query, pkg_configurations)
89
89
 
90
- def select(self, pattern, package_query=None, remote=None, lru=None):
90
+ @staticmethod
91
+ def filter_packages_profile(packages, profile, ref):
92
+ result = {}
93
+ profile_settings = profile.processed_settings.serialize()
94
+ # Options are those for dependencies, like *:shared=True
95
+ profile_options = profile.options._deps_package_options
96
+ for pref, data in packages.items():
97
+ settings = data.get("settings", {})
98
+ settings_match = options_match = True
99
+ for k, v in settings.items(): # Only the defined settings that don't match
100
+ value = profile_settings.get(k)
101
+ if value is not None and value != v:
102
+ settings_match = False
103
+ break
104
+ options = data.get("options", {})
105
+ for k, v in options.items():
106
+ for pattern, pattern_options in profile_options.items():
107
+ if ref_matches(ref, pattern, None):
108
+ value = pattern_options.get_safe(k)
109
+ if value is not None and value != v:
110
+ options_match = False
111
+ break
112
+
113
+ if settings_match and options_match:
114
+ result[pref] = data
115
+
116
+ return result
117
+
118
+ def select(self, pattern, package_query=None, remote=None, lru=None, profile=None):
91
119
  if package_query and pattern.package_id and "*" not in pattern.package_id:
92
120
  raise ConanException("Cannot specify '-p' package queries, "
93
121
  "if 'package_id' is not a pattern")
@@ -150,6 +178,8 @@ class ListAPI:
150
178
  packages = self.packages_configurations(rrev, remote)
151
179
  if package_query is not None:
152
180
  packages = self.filter_packages_configurations(packages, package_query)
181
+ if profile is not None:
182
+ packages = self.filter_packages_profile(packages, profile, rrev)
153
183
  prefs = packages.keys()
154
184
  prefs = pattern.filter_prefs(prefs)
155
185
  packages = {pref: conf for pref, conf in packages.items() if pref in prefs}
@@ -193,7 +223,6 @@ class ListAPI:
193
223
  ConanOutput().info(f"Finding binaries in remote {remote.name}")
194
224
  pkg_configurations = self.packages_configurations(ref, remote=remote)
195
225
  except Exception as e:
196
- pass
197
226
  ConanOutput(f"ERROR IN REMOTE {remote.name}: {e}")
198
227
  else:
199
228
  candidates.extend(_BinaryDistance(pref, data, conaninfo, remote)
@@ -202,8 +231,7 @@ class ListAPI:
202
231
  candidates.sort()
203
232
  pkglist = PackagesList()
204
233
  pkglist.add_refs([ref])
205
- # If there are exact matches, only return the matches
206
- # else, limit to the number specified
234
+ # Return the closest matches, stop adding when distance is increased
207
235
  candidate_distance = None
208
236
  for candidate in candidates:
209
237
  if candidate_distance and candidate.distance != candidate_distance:
@@ -79,19 +79,21 @@ class LockfileAPI:
79
79
  return lockfile
80
80
 
81
81
  @staticmethod
82
- def add_lockfile(lockfile=None, requires=None, build_requires=None, python_requires=None):
82
+ def add_lockfile(lockfile=None, requires=None, build_requires=None, python_requires=None,
83
+ config_requires=None):
83
84
  if lockfile is None:
84
85
  lockfile = Lockfile() # create a new lockfile
85
86
  lockfile.partial = True
86
87
 
87
88
  lockfile.add(requires=requires, build_requires=build_requires,
88
- python_requires=python_requires)
89
+ python_requires=python_requires, config_requires=config_requires)
89
90
  return lockfile
90
91
 
91
92
  @staticmethod
92
- def remove_lockfile(lockfile, requires=None, build_requires=None, python_requires=None):
93
+ def remove_lockfile(lockfile, requires=None, build_requires=None, python_requires=None,
94
+ config_requires=None):
93
95
  lockfile.remove(requires=requires, build_requires=build_requires,
94
- python_requires=python_requires)
96
+ python_requires=python_requires, config_requires=config_requires)
95
97
  return lockfile
96
98
 
97
99
  @staticmethod
@@ -28,6 +28,7 @@ class NewAPI:
28
28
  from conan.internal.api.new.bazel_exe import bazel_exe_files
29
29
  from conan.internal.api.new.autotools_lib import autotools_lib_files
30
30
  from conan.internal.api.new.autoools_exe import autotools_exe_files
31
+ from conan.internal.api.new.local_recipes_index import local_recipes_index_files
31
32
  new_templates = {"basic": basic_file,
32
33
  "cmake_lib": cmake_lib_files,
33
34
  "cmake_exe": cmake_exe_files,
@@ -39,7 +40,8 @@ class NewAPI:
39
40
  "bazel_exe": bazel_exe_files,
40
41
  "autotools_lib": autotools_lib_files,
41
42
  "autotools_exe": autotools_exe_files,
42
- "alias": alias_file}
43
+ "alias": alias_file,
44
+ "local_recipes_index": local_recipes_index_files}
43
45
  template_files = new_templates.get(template_name)
44
46
  return template_files
45
47
 
@@ -3,11 +3,12 @@ import json
3
3
  import os
4
4
  from urllib.parse import urlparse
5
5
 
6
- from conan.api.model import Remote
6
+ from conan.api.model import Remote, LOCAL_RECIPES_INDEX
7
7
  from conan.api.output import ConanOutput
8
8
  from conan.internal.cache.home_paths import HomePaths
9
9
  from conan.internal.conan_app import ConanApp
10
-
10
+ from conans.client.rest_client_local_recipe_index import add_local_recipes_index_remote, \
11
+ remove_local_recipes_index_remote
11
12
  from conans.errors import ConanException
12
13
  from conans.util.files import save, load
13
14
 
@@ -99,13 +100,16 @@ class RemotesAPI:
99
100
  """
100
101
  Add a new ``Remote`` object to the existing ones
101
102
 
103
+
102
104
  :param remote: a ``Remote`` object to be added
103
105
  :param force: do not fail if the remote already exist (but default it failes)
104
106
  :param index: if not defined, the new remote will be last one. Pass an integer to insert
105
107
  the remote in that position instead of the last one
106
108
  """
109
+ add_local_recipes_index_remote(self.conan_api, remote)
107
110
  remotes = _load(self._remotes_file)
108
- _validate_url(remote.url)
111
+ if remote.remote_type != LOCAL_RECIPES_INDEX:
112
+ _validate_url(remote.url)
109
113
  current = {r.name: r for r in remotes}.get(remote.name)
110
114
  if current: # same name remote existing!
111
115
  if not force:
@@ -139,6 +143,7 @@ class RemotesAPI:
139
143
  _save(self._remotes_file, remotes)
140
144
  app = ConanApp(self.conan_api)
141
145
  for remote in removed:
146
+ remove_local_recipes_index_remote(self.conan_api, remote)
142
147
  app.cache.localdb.clean(remote_url=remote.url)
143
148
  return removed
144
149
 
@@ -160,7 +165,8 @@ class RemotesAPI:
160
165
  except KeyError:
161
166
  raise ConanException(f"Remote '{remote_name}' doesn't exist")
162
167
  if url is not None:
163
- _validate_url(url)
168
+ if remote.remote_type != LOCAL_RECIPES_INDEX:
169
+ _validate_url(url)
164
170
  _check_urls(remotes, url, force=False, current=remote)
165
171
  remote.url = url
166
172
  if secure is not None:
@@ -255,7 +261,7 @@ def _load(remotes_file):
255
261
  result = []
256
262
  for r in data.get("remotes", []):
257
263
  remote = Remote(r["name"], r["url"], r["verify_ssl"], r.get("disabled", False),
258
- r.get("allowed_packages"))
264
+ r.get("allowed_packages"), r.get("remote_type"))
259
265
  result.append(remote)
260
266
  return result
261
267
 
@@ -268,6 +274,8 @@ def _save(remotes_file, remotes):
268
274
  remote["disabled"] = True
269
275
  if r.allowed_packages:
270
276
  remote["allowed_packages"] = r.allowed_packages
277
+ if r.remote_type:
278
+ remote["remote_type"] = r.remote_type
271
279
  remote_list.append(remote)
272
280
  save(remotes_file, json.dumps({"remotes": remote_list}, indent=True))
273
281
 
@@ -3,11 +3,9 @@ import time
3
3
  from multiprocessing.pool import ThreadPool
4
4
 
5
5
  from conan.api.output import ConanOutput
6
- from conan.internal.cache.home_paths import HomePaths
7
6
  from conan.internal.conan_app import ConanApp
8
7
  from conan.internal.upload_metadata import gather_metadata
9
8
  from conans.client.cmd.uploader import PackagePreparator, UploadExecutor, UploadUpstreamChecker
10
- from conans.client.downloaders.download_cache import DownloadCache
11
9
  from conans.client.pkg_sign import PkgSignaturesPlugin
12
10
  from conans.client.rest.file_uploader import FileUploader
13
11
  from conans.errors import ConanException, AuthenticationException, ForbiddenException
@@ -83,7 +81,7 @@ class UploadAPI:
83
81
  if not dry_run:
84
82
  subtitle("Uploading artifacts")
85
83
  self.upload(pkglist, remote)
86
- backup_files = self.get_backup_sources(pkglist)
84
+ backup_files = self.conan_api.cache.get_backup_sources(pkglist)
87
85
  self.upload_backup_sources(backup_files)
88
86
 
89
87
  t = time.time()
@@ -101,17 +99,6 @@ class UploadAPI:
101
99
  elapsed = time.time() - t
102
100
  ConanOutput().success(f"Upload completed in {int(elapsed)}s\n")
103
101
 
104
- def get_backup_sources(self, package_list=None):
105
- """Get list of backup source files currently present in the cache,
106
- either all of them if no argument, else filter by those belonging to the references in the package_list"""
107
- config = self.conan_api.config.global_conf
108
- download_cache_path = config.get("core.sources:download_cache")
109
- download_cache_path = download_cache_path or HomePaths(
110
- self.conan_api.cache_folder).default_sources_backup_folder
111
- excluded_urls = config.get("core.sources:exclude_urls", check_type=list, default=[])
112
- download_cache = DownloadCache(download_cache_path)
113
- return download_cache.get_backup_sources_files_to_upload(excluded_urls, package_list)
114
-
115
102
  def upload_backup_sources(self, files):
116
103
  config = self.conan_api.config.global_conf
117
104
  url = config.get("core.sources:upload_url", check_type=str)
@@ -130,8 +130,6 @@ def validate_common_graph_args(args):
130
130
  if args.requires and (args.name or args.version or args.user or args.channel):
131
131
  raise ConanException("Can't use --name, --version, --user or --channel arguments with "
132
132
  "--requires")
133
- if args.channel and not args.user:
134
- raise ConanException("Can't specify --channel without --user")
135
133
  if not args.path and not args.requires and not args.tool_requires:
136
134
  raise ConanException("Please specify a path to a conanfile or a '--requires=<ref>'")
137
135
  if args.path and (args.requires or args.tool_requires):
@@ -22,6 +22,7 @@ from conans.util.files import exception_message_safe
22
22
 
23
23
  _CONAN_INTERNAL_CUSTOM_COMMANDS_PATH = "_CONAN_INTERNAL_CUSTOM_COMMANDS_PATH"
24
24
 
25
+
25
26
  class Cli:
26
27
  """A single command of the conan application, with all the first level commands. Manages the
27
28
  parsing of parameters and delegates functionality to the conan python api. It can also show the
@@ -33,6 +34,7 @@ class Cli:
33
34
  assert isinstance(conan_api, ConanAPI), \
34
35
  "Expected 'Conan' type, got '{}'".format(type(conan_api))
35
36
  self._conan_api = conan_api
37
+ self._conan_api.command.cli = self
36
38
  self._groups = defaultdict(list)
37
39
  self._commands = {}
38
40
 
@@ -132,6 +132,28 @@ class ConanCommand(BaseConanCommand):
132
132
  subcommand.set_name(self.name)
133
133
  self._subcommands[subcommand.name] = subcommand
134
134
 
135
+ def run_cli(self, conan_api, *args):
136
+ parser = ConanArgumentParser(conan_api, description=self._doc,
137
+ prog="conan {}".format(self._name),
138
+ formatter_class=SmartFormatter)
139
+ self._init_log_levels(parser)
140
+ self._init_formatters(parser)
141
+ info = self._method(conan_api, parser, *args)
142
+ if not self._subcommands:
143
+ return info
144
+
145
+ subcommand_parser = parser.add_subparsers(dest='subcommand', help='sub-command help')
146
+ subcommand_parser.required = True
147
+
148
+ subcmd = args[0][0]
149
+ try:
150
+ sub = self._subcommands[subcmd]
151
+ except (KeyError, IndexError): # display help
152
+ raise ConanException(f"Sub command {subcmd} does not exist")
153
+ else:
154
+ sub.set_parser(subcommand_parser, conan_api)
155
+ return sub.run_cli(conan_api, parser, *args)
156
+
135
157
  def run(self, conan_api, *args):
136
158
  parser = ConanArgumentParser(conan_api, description=self._doc,
137
159
  prog="conan {}".format(self._name),
@@ -168,6 +190,9 @@ class ConanSubCommand(BaseConanCommand):
168
190
  self._parser = None
169
191
  self._subcommand_name = method.__name__.replace('_', '-')
170
192
 
193
+ def run_cli(self, conan_api, parent_parser, *args):
194
+ return self._method(conan_api, parent_parser, self._parser, *args)
195
+
171
196
  def run(self, conan_api, parent_parser, *args):
172
197
  info = self._method(conan_api, parent_parser, self._parser, *args)
173
198
  # It is necessary to do it after calling the "method" otherwise parser not complete
@@ -79,6 +79,8 @@ def cache_clean(conan_api: ConanAPI, parser, subparser, *args):
79
79
  help="Clean download and metadata folders")
80
80
  subparser.add_argument("-t", "--temp", action='store_true', default=False,
81
81
  help="Clean temporary folders")
82
+ subparser.add_argument("-bs", "--backup-sources", action='store_true', default=False,
83
+ help="Clean backup sources")
82
84
  subparser.add_argument('-p', '--package-query', action=OnceArgument,
83
85
  help="Remove only the packages matching a specific query, e.g., "
84
86
  "os=Windows AND (arch=x86 OR compiler=gcc)")
@@ -86,9 +88,10 @@ def cache_clean(conan_api: ConanAPI, parser, subparser, *args):
86
88
 
87
89
  ref_pattern = ListPattern(args.pattern or "*", rrev="*", package_id="*", prev="*")
88
90
  package_list = conan_api.list.select(ref_pattern, package_query=args.package_query)
89
- if args.build or args.source or args.download or args.temp:
91
+ if args.build or args.source or args.download or args.temp or args.backup_sources:
90
92
  conan_api.cache.clean(package_list, source=args.source, build=args.build,
91
- download=args.download, temp=args.temp)
93
+ download=args.download, temp=args.temp,
94
+ backup_sources=args.backup_sources)
92
95
  else:
93
96
  conan_api.cache.clean(package_list)
94
97
 
@@ -159,5 +162,5 @@ def cache_backup_upload(conan_api: ConanAPI, parser, subparser, *args):
159
162
  """
160
163
  Upload all the source backups present in the cache
161
164
  """
162
- files = conan_api.upload.get_backup_sources()
165
+ files = conan_api.cache.get_backup_sources()
163
166
  conan_api.upload.upload_backup_sources(files)
@@ -1,5 +1,5 @@
1
1
  from conan.api.output import cli_out_write
2
- from conan.cli.command import conan_command, conan_subcommand
2
+ from conan.cli.command import conan_command, conan_subcommand, OnceArgument
3
3
  from conan.cli.formatters import default_json_formatter
4
4
  from conans.util.config_parser import get_bool_from_text
5
5
 
@@ -37,13 +37,39 @@ def config_install(conan_api, parser, subparser, *args):
37
37
  'specified origin')
38
38
  subparser.add_argument("-tf", "--target-folder",
39
39
  help='Install to that path in the conan cache')
40
+
40
41
  args = parser.parse_args(*args)
41
- verify_ssl = args.verify_ssl if isinstance(args.verify_ssl, bool) else get_bool_from_text(args.verify_ssl)
42
+ verify_ssl = args.verify_ssl if isinstance(args.verify_ssl, bool) \
43
+ else get_bool_from_text(args.verify_ssl)
42
44
  conan_api.config.install(args.item, verify_ssl, args.type, args.args,
43
45
  source_folder=args.source_folder,
44
46
  target_folder=args.target_folder)
45
47
 
46
48
 
49
+ @conan_subcommand()
50
+ def config_install_pkg(conan_api, parser, subparser, *args):
51
+ """
52
+ (Experimental) Install the configuration (remotes, profiles, conf), from a Conan package
53
+ """
54
+ subparser.add_argument("item", help="Conan require")
55
+ subparser.add_argument("-l", "--lockfile", action=OnceArgument,
56
+ help="Path to a lockfile. Use --lockfile=\"\" to avoid automatic use of "
57
+ "existing 'conan.lock' file")
58
+ subparser.add_argument("--lockfile-partial", action="store_true",
59
+ help="Do not raise an error if some dependency is not found in lockfile")
60
+ subparser.add_argument("--lockfile-out", action=OnceArgument,
61
+ help="Filename of the updated lockfile")
62
+ subparser.add_argument("-f", "--force", action='store_true',
63
+ help="Force the re-installation of configuration")
64
+ args = parser.parse_args(*args)
65
+
66
+ lockfile = conan_api.lockfile.get_lockfile(lockfile=args.lockfile,
67
+ partial=args.lockfile_partial)
68
+ config_pref = conan_api.config.install_pkg(args.item, lockfile=lockfile, force=args.force)
69
+ lockfile = conan_api.lockfile.add_lockfile(lockfile, config_requires=[config_pref.ref])
70
+ conan_api.lockfile.save_lockfile(lockfile, args.lockfile_out)
71
+
72
+
47
73
  def list_text_formatter(confs):
48
74
  for k, v in confs.items():
49
75
  cli_out_write(f"{k}: {v}")