conan-server 2.0.17__tar.gz → 2.2.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 (360) hide show
  1. {conan-server-2.0.17 → conan-server-2.2.0}/PKG-INFO +1 -1
  2. {conan-server-2.0.17 → conan-server-2.2.0}/conan/api/conan_api.py +2 -0
  3. {conan-server-2.0.17 → conan-server-2.2.0}/conan/api/model.py +37 -10
  4. {conan-server-2.0.17 → conan-server-2.2.0}/conan/api/output.py +27 -4
  5. {conan-server-2.0.17 → conan-server-2.2.0}/conan/api/subapi/cache.py +37 -13
  6. conan-server-2.2.0/conan/api/subapi/command.py +24 -0
  7. {conan-server-2.0.17 → conan-server-2.2.0}/conan/api/subapi/config.py +71 -4
  8. {conan-server-2.0.17 → conan-server-2.2.0}/conan/api/subapi/download.py +43 -6
  9. {conan-server-2.0.17 → conan-server-2.2.0}/conan/api/subapi/export.py +4 -3
  10. {conan-server-2.0.17 → conan-server-2.2.0}/conan/api/subapi/graph.py +6 -6
  11. {conan-server-2.0.17 → conan-server-2.2.0}/conan/api/subapi/install.py +25 -10
  12. {conan-server-2.0.17 → conan-server-2.2.0}/conan/api/subapi/list.py +126 -45
  13. {conan-server-2.0.17 → conan-server-2.2.0}/conan/api/subapi/local.py +12 -10
  14. {conan-server-2.0.17 → conan-server-2.2.0}/conan/api/subapi/lockfile.py +6 -4
  15. {conan-server-2.0.17 → conan-server-2.2.0}/conan/api/subapi/new.py +5 -2
  16. conan-server-2.2.0/conan/api/subapi/remotes.py +329 -0
  17. {conan-server-2.0.17 → conan-server-2.2.0}/conan/api/subapi/remove.py +3 -3
  18. {conan-server-2.0.17 → conan-server-2.2.0}/conan/api/subapi/search.py +1 -1
  19. {conan-server-2.0.17 → conan-server-2.2.0}/conan/api/subapi/upload.py +47 -16
  20. {conan-server-2.0.17 → conan-server-2.2.0}/conan/cli/args.py +5 -7
  21. {conan-server-2.0.17 → conan-server-2.2.0}/conan/cli/cli.py +4 -1
  22. {conan-server-2.0.17 → conan-server-2.2.0}/conan/cli/command.py +47 -6
  23. {conan-server-2.0.17 → conan-server-2.2.0}/conan/cli/commands/build.py +3 -2
  24. {conan-server-2.0.17 → conan-server-2.2.0}/conan/cli/commands/cache.py +15 -5
  25. {conan-server-2.0.17 → conan-server-2.2.0}/conan/cli/commands/config.py +28 -2
  26. {conan-server-2.0.17 → conan-server-2.2.0}/conan/cli/commands/create.py +12 -14
  27. {conan-server-2.0.17 → conan-server-2.2.0}/conan/cli/commands/download.py +5 -36
  28. {conan-server-2.0.17 → conan-server-2.2.0}/conan/cli/commands/export_pkg.py +4 -3
  29. {conan-server-2.0.17 → conan-server-2.2.0}/conan/cli/commands/graph.py +171 -18
  30. {conan-server-2.0.17 → conan-server-2.2.0}/conan/cli/commands/install.py +0 -1
  31. {conan-server-2.0.17 → conan-server-2.2.0}/conan/cli/commands/list.py +24 -6
  32. {conan-server-2.0.17 → conan-server-2.2.0}/conan/cli/commands/lock.py +9 -2
  33. {conan-server-2.0.17 → conan-server-2.2.0}/conan/cli/commands/new.py +1 -1
  34. {conan-server-2.0.17 → conan-server-2.2.0}/conan/cli/commands/remote.py +31 -13
  35. {conan-server-2.0.17 → conan-server-2.2.0}/conan/cli/commands/test.py +7 -2
  36. {conan-server-2.0.17 → conan-server-2.2.0}/conan/cli/commands/upload.py +5 -10
  37. {conan-server-2.0.17 → conan-server-2.2.0}/conan/cli/formatters/graph/graph.py +14 -10
  38. conan-server-2.2.0/conan/cli/formatters/graph/info_graph_html.py +316 -0
  39. {conan-server-2.0.17 → conan-server-2.2.0}/conan/cli/printers/graph.py +11 -0
  40. {conan-server-2.0.17 → conan-server-2.2.0}/conan/internal/api/detect_api.py +122 -3
  41. conan-server-2.2.0/conan/internal/api/new/local_recipes_index.py +113 -0
  42. {conan-server-2.0.17 → conan-server-2.2.0}/conan/internal/api/new/msbuild_lib.py +1 -0
  43. {conan-server-2.0.17 → conan-server-2.2.0}/conan/internal/cache/conan_reference_layout.py +23 -28
  44. {conan-server-2.0.17 → conan-server-2.2.0}/conan/internal/cache/home_paths.py +8 -0
  45. {conan-server-2.0.17 → conan-server-2.2.0}/conan/internal/conan_app.py +6 -4
  46. {conan-server-2.0.17 → conan-server-2.2.0}/conan/internal/deploy.py +12 -5
  47. conan-server-2.2.0/conan/internal/internal_tools.py +24 -0
  48. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/apple/xcodebuild.py +0 -1
  49. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/apple/xcodetoolchain.py +1 -1
  50. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/build/__init__.py +1 -0
  51. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/build/cross_building.py +6 -2
  52. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/build/flags.py +18 -5
  53. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/cmake/cmake.py +22 -12
  54. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/cmake/cmakedeps/templates/macros.py +1 -1
  55. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/cmake/cmakedeps/templates/target_configuration.py +37 -40
  56. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/cmake/cmakedeps/templates/target_data.py +6 -6
  57. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/cmake/cmakedeps/templates/targets.py +2 -4
  58. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/cmake/layout.py +16 -2
  59. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/cmake/presets.py +18 -8
  60. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/cmake/toolchain/blocks.py +144 -20
  61. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/cmake/toolchain/toolchain.py +52 -13
  62. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/env/environment.py +22 -10
  63. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/env/virtualbuildenv.py +12 -8
  64. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/env/virtualrunenv.py +10 -6
  65. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/files/conandata.py +7 -3
  66. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/files/copy_pattern.py +24 -11
  67. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/files/patches.py +6 -0
  68. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/gnu/autotoolstoolchain.py +23 -6
  69. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/gnu/get_gnu_triplet.py +1 -1
  70. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/gnu/pkgconfigdeps.py +121 -123
  71. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/google/toolchain.py +4 -1
  72. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/meson/helpers.py +1 -0
  73. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/meson/meson.py +11 -11
  74. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/meson/toolchain.py +18 -11
  75. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/microsoft/msbuilddeps.py +4 -3
  76. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/microsoft/nmaketoolchain.py +1 -1
  77. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/microsoft/visual.py +46 -9
  78. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/scm/git.py +67 -12
  79. {conan-server-2.0.17 → conan-server-2.2.0}/conan_server.egg-info/PKG-INFO +1 -1
  80. {conan-server-2.0.17 → conan-server-2.2.0}/conan_server.egg-info/SOURCES.txt +11 -3
  81. {conan-server-2.0.17 → conan-server-2.2.0}/conans/__init__.py +1 -1
  82. {conan-server-2.0.17 → conan-server-2.2.0}/conans/client/cache/cache.py +3 -5
  83. {conan-server-2.0.17 → conan-server-2.2.0}/conans/client/cmd/export.py +16 -18
  84. {conan-server-2.0.17 → conan-server-2.2.0}/conans/client/cmd/uploader.py +6 -9
  85. {conan-server-2.0.17 → conan-server-2.2.0}/conans/client/conanfile/configure.py +5 -0
  86. {conan-server-2.0.17 → conan-server-2.2.0}/conans/client/conf/__init__.py +4 -3
  87. {conan-server-2.0.17 → conan-server-2.2.0}/conans/client/conf/config_installer.py +35 -73
  88. {conan-server-2.0.17 → conan-server-2.2.0}/conans/client/conf/detect_vs.py +30 -37
  89. {conan-server-2.0.17 → conan-server-2.2.0}/conans/client/downloaders/download_cache.py +37 -19
  90. {conan-server-2.0.17 → conan-server-2.2.0}/conans/client/downloaders/file_downloader.py +8 -8
  91. {conan-server-2.0.17 → conan-server-2.2.0}/conans/client/generators/__init__.py +19 -6
  92. {conan-server-2.0.17 → conan-server-2.2.0}/conans/client/graph/build_mode.py +0 -4
  93. {conan-server-2.0.17 → conan-server-2.2.0}/conans/client/graph/compatibility.py +3 -1
  94. {conan-server-2.0.17 → conan-server-2.2.0}/conans/client/graph/compute_pid.py +5 -3
  95. {conan-server-2.0.17 → conan-server-2.2.0}/conans/client/graph/graph.py +4 -0
  96. {conan-server-2.0.17 → conan-server-2.2.0}/conans/client/graph/graph_binaries.py +94 -35
  97. {conan-server-2.0.17 → conan-server-2.2.0}/conans/client/graph/graph_builder.py +73 -33
  98. {conan-server-2.0.17 → conan-server-2.2.0}/conans/client/graph/graph_error.py +11 -1
  99. {conan-server-2.0.17 → conan-server-2.2.0}/conans/client/graph/install_graph.py +190 -10
  100. {conan-server-2.0.17 → conan-server-2.2.0}/conans/client/graph/provides.py +7 -2
  101. {conan-server-2.0.17 → conan-server-2.2.0}/conans/client/graph/proxy.py +34 -23
  102. {conan-server-2.0.17 → conan-server-2.2.0}/conans/client/graph/python_requires.py +7 -1
  103. {conan-server-2.0.17 → conan-server-2.2.0}/conans/client/graph/range_resolver.py +9 -4
  104. {conan-server-2.0.17 → conan-server-2.2.0}/conans/client/installer.py +13 -15
  105. {conan-server-2.0.17 → conan-server-2.2.0}/conans/client/loader.py +31 -8
  106. {conan-server-2.0.17 → conan-server-2.2.0}/conans/client/remote_manager.py +27 -6
  107. {conan-server-2.0.17 → conan-server-2.2.0}/conans/client/rest/auth_manager.py +1 -4
  108. conan-server-2.2.0/conans/client/rest_client_local_recipe_index.py +228 -0
  109. {conan-server-2.0.17 → conan-server-2.2.0}/conans/client/store/localdb.py +17 -24
  110. {conan-server-2.0.17 → conan-server-2.2.0}/conans/errors.py +1 -9
  111. {conan-server-2.0.17 → conan-server-2.2.0}/conans/model/conan_file.py +2 -0
  112. {conan-server-2.0.17 → conan-server-2.2.0}/conans/model/conf.py +24 -15
  113. {conan-server-2.0.17 → conan-server-2.2.0}/conans/model/graph_lock.py +16 -2
  114. {conan-server-2.0.17 → conan-server-2.2.0}/conans/model/info.py +47 -5
  115. {conan-server-2.0.17 → conan-server-2.2.0}/conans/model/options.py +18 -5
  116. {conan-server-2.0.17 → conan-server-2.2.0}/conans/model/pkg_type.py +1 -0
  117. {conan-server-2.0.17 → conan-server-2.2.0}/conans/model/requires.py +12 -7
  118. {conan-server-2.0.17 → conan-server-2.2.0}/conans/model/settings.py +14 -8
  119. {conan-server-2.0.17 → conan-server-2.2.0}/conans/model/version_range.py +1 -1
  120. {conan-server-2.0.17 → conan-server-2.2.0}/conans/server/rest/bottle_plugins/return_handler.py +0 -2
  121. conan-server-2.2.0/conans/test/assets/__init__.py +16 -0
  122. conan-server-2.2.0/conans/test/assets/autotools.py +68 -0
  123. conan-server-2.2.0/conans/test/assets/cmake.py +107 -0
  124. conan-server-2.2.0/conans/test/assets/genconanfile.py +482 -0
  125. conan-server-2.2.0/conans/test/assets/pkg_cmake.py +156 -0
  126. conan-server-2.2.0/conans/test/assets/sources.py +265 -0
  127. conan-server-2.2.0/conans/test/assets/visual_project_files.py +289 -0
  128. {conan-server-2.0.17 → conan-server-2.2.0}/conans/test/conftest.py +5 -4
  129. {conan-server-2.0.17 → conan-server-2.2.0}/conans/test/utils/mocks.py +5 -4
  130. {conan-server-2.0.17 → conan-server-2.2.0}/conans/test/utils/profiles.py +0 -1
  131. {conan-server-2.0.17 → conan-server-2.2.0}/conans/test/utils/test_files.py +5 -1
  132. {conan-server-2.0.17 → conan-server-2.2.0}/conans/test/utils/tools.py +14 -9
  133. conan-server-2.2.0/conans/util/__init__.py +0 -0
  134. {conan-server-2.0.17 → conan-server-2.2.0}/conans/util/dates.py +1 -1
  135. {conan-server-2.0.17 → conan-server-2.2.0}/conans/util/files.py +4 -2
  136. {conan-server-2.0.17 → conan-server-2.2.0}/conans/util/runners.py +2 -2
  137. {conan-server-2.0.17 → conan-server-2.2.0}/setup.py +2 -1
  138. conan-server-2.0.17/conan/api/subapi/remotes.py +0 -110
  139. conan-server-2.0.17/conan/cli/formatters/graph/info_graph_html.py +0 -194
  140. conan-server-2.0.17/conans/client/cache/remote_registry.py +0 -186
  141. conan-server-2.0.17/conans/client/cmd/user.py +0 -32
  142. conan-server-2.0.17/conans/pylint_plugin.py +0 -85
  143. conan-server-2.0.17/conans/test/__init__.py +0 -7
  144. {conan-server-2.0.17 → conan-server-2.2.0}/LICENSE.md +0 -0
  145. {conan-server-2.0.17 → conan-server-2.2.0}/MANIFEST.in +0 -0
  146. {conan-server-2.0.17 → conan-server-2.2.0}/README.md +0 -0
  147. {conan-server-2.0.17 → conan-server-2.2.0}/conan/__init__.py +0 -0
  148. {conan-server-2.0.17 → conan-server-2.2.0}/conan/api/__init__.py +0 -0
  149. {conan-server-2.0.17 → conan-server-2.2.0}/conan/api/subapi/__init__.py +0 -0
  150. {conan-server-2.0.17 → conan-server-2.2.0}/conan/api/subapi/profiles.py +0 -0
  151. {conan-server-2.0.17 → conan-server-2.2.0}/conan/cli/__init__.py +0 -0
  152. {conan-server-2.0.17 → conan-server-2.2.0}/conan/cli/commands/__init__.py +0 -0
  153. {conan-server-2.0.17 → conan-server-2.2.0}/conan/cli/commands/editable.py +0 -0
  154. {conan-server-2.0.17 → conan-server-2.2.0}/conan/cli/commands/export.py +0 -0
  155. {conan-server-2.0.17 → conan-server-2.2.0}/conan/cli/commands/inspect.py +0 -0
  156. {conan-server-2.0.17 → conan-server-2.2.0}/conan/cli/commands/profile.py +0 -0
  157. {conan-server-2.0.17 → conan-server-2.2.0}/conan/cli/commands/remove.py +0 -0
  158. {conan-server-2.0.17 → conan-server-2.2.0}/conan/cli/commands/search.py +0 -0
  159. {conan-server-2.0.17 → conan-server-2.2.0}/conan/cli/commands/source.py +0 -0
  160. {conan-server-2.0.17 → conan-server-2.2.0}/conan/cli/commands/version.py +0 -0
  161. {conan-server-2.0.17 → conan-server-2.2.0}/conan/cli/exit_codes.py +0 -0
  162. {conan-server-2.0.17 → conan-server-2.2.0}/conan/cli/formatters/__init__.py +0 -0
  163. {conan-server-2.0.17 → conan-server-2.2.0}/conan/cli/formatters/graph/__init__.py +0 -0
  164. {conan-server-2.0.17 → conan-server-2.2.0}/conan/cli/formatters/graph/graph_info_text.py +0 -0
  165. {conan-server-2.0.17 → conan-server-2.2.0}/conan/cli/formatters/graph/info_graph_dot.py +0 -0
  166. {conan-server-2.0.17 → conan-server-2.2.0}/conan/cli/formatters/list/__init__.py +0 -0
  167. {conan-server-2.0.17 → conan-server-2.2.0}/conan/cli/formatters/list/binary_html_table.py +0 -0
  168. {conan-server-2.0.17 → conan-server-2.2.0}/conan/cli/formatters/list/list.py +0 -0
  169. {conan-server-2.0.17 → conan-server-2.2.0}/conan/cli/formatters/list/search_table_html.py +0 -0
  170. {conan-server-2.0.17 → conan-server-2.2.0}/conan/cli/printers/__init__.py +0 -0
  171. {conan-server-2.0.17 → conan-server-2.2.0}/conan/errors.py +0 -0
  172. {conan-server-2.0.17 → conan-server-2.2.0}/conan/internal/__init__.py +0 -0
  173. {conan-server-2.0.17 → conan-server-2.2.0}/conan/internal/api/__init__.py +0 -0
  174. {conan-server-2.0.17 → conan-server-2.2.0}/conan/internal/api/new/__init__.py +0 -0
  175. {conan-server-2.0.17 → conan-server-2.2.0}/conan/internal/api/new/alias_new.py +0 -0
  176. {conan-server-2.0.17 → conan-server-2.2.0}/conan/internal/api/new/autoools_exe.py +0 -0
  177. {conan-server-2.0.17 → conan-server-2.2.0}/conan/internal/api/new/autotools_lib.py +0 -0
  178. {conan-server-2.0.17 → conan-server-2.2.0}/conan/internal/api/new/basic.py +0 -0
  179. {conan-server-2.0.17 → conan-server-2.2.0}/conan/internal/api/new/bazel_exe.py +0 -0
  180. {conan-server-2.0.17 → conan-server-2.2.0}/conan/internal/api/new/bazel_lib.py +0 -0
  181. {conan-server-2.0.17 → conan-server-2.2.0}/conan/internal/api/new/cmake_exe.py +0 -0
  182. {conan-server-2.0.17 → conan-server-2.2.0}/conan/internal/api/new/cmake_lib.py +0 -0
  183. {conan-server-2.0.17 → conan-server-2.2.0}/conan/internal/api/new/meson_exe.py +0 -0
  184. {conan-server-2.0.17 → conan-server-2.2.0}/conan/internal/api/new/meson_lib.py +0 -0
  185. {conan-server-2.0.17 → conan-server-2.2.0}/conan/internal/api/new/msbuild_exe.py +0 -0
  186. {conan-server-2.0.17 → conan-server-2.2.0}/conan/internal/cache/__init__.py +0 -0
  187. {conan-server-2.0.17 → conan-server-2.2.0}/conan/internal/cache/cache.py +0 -0
  188. {conan-server-2.0.17 → conan-server-2.2.0}/conan/internal/cache/db/__init__.py +0 -0
  189. {conan-server-2.0.17 → conan-server-2.2.0}/conan/internal/cache/db/cache_database.py +0 -0
  190. {conan-server-2.0.17 → conan-server-2.2.0}/conan/internal/cache/db/packages_table.py +0 -0
  191. {conan-server-2.0.17 → conan-server-2.2.0}/conan/internal/cache/db/recipes_table.py +0 -0
  192. {conan-server-2.0.17 → conan-server-2.2.0}/conan/internal/cache/db/table.py +0 -0
  193. {conan-server-2.0.17 → conan-server-2.2.0}/conan/internal/integrity_check.py +0 -0
  194. {conan-server-2.0.17 → conan-server-2.2.0}/conan/internal/upload_metadata.py +0 -0
  195. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/__init__.py +0 -0
  196. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/android/__init__.py +0 -0
  197. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/android/utils.py +0 -0
  198. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/apple/__init__.py +0 -0
  199. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/apple/apple.py +0 -0
  200. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/apple/xcodedeps.py +0 -0
  201. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/build/cppstd.py +0 -0
  202. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/build/cpu.py +0 -0
  203. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/build/stdcpp_library.py +0 -0
  204. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/cmake/__init__.py +0 -0
  205. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/cmake/cmakedeps/__init__.py +0 -0
  206. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/cmake/cmakedeps/cmakedeps.py +0 -0
  207. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/cmake/cmakedeps/templates/__init__.py +0 -0
  208. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/cmake/cmakedeps/templates/config.py +0 -0
  209. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/cmake/cmakedeps/templates/config_version.py +0 -0
  210. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/cmake/toolchain/__init__.py +0 -0
  211. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/cmake/utils.py +0 -0
  212. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/env/__init__.py +0 -0
  213. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/files/__init__.py +0 -0
  214. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/files/files.py +0 -0
  215. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/files/packager.py +0 -0
  216. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/files/symlinks/__init__.py +0 -0
  217. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/files/symlinks/symlinks.py +0 -0
  218. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/gnu/__init__.py +0 -0
  219. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/gnu/autotools.py +0 -0
  220. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/gnu/autotoolsdeps.py +0 -0
  221. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/gnu/gnudeps_flags.py +0 -0
  222. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/gnu/makedeps.py +0 -0
  223. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/gnu/pkgconfig.py +0 -0
  224. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/google/__init__.py +0 -0
  225. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/google/bazel.py +0 -0
  226. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/google/bazeldeps.py +0 -0
  227. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/google/layout.py +0 -0
  228. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/intel/__init__.py +0 -0
  229. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/intel/intel_cc.py +0 -0
  230. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/layout/__init__.py +0 -0
  231. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/meson/__init__.py +0 -0
  232. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/microsoft/__init__.py +0 -0
  233. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/microsoft/layout.py +0 -0
  234. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/microsoft/msbuild.py +0 -0
  235. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/microsoft/nmakedeps.py +0 -0
  236. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/microsoft/subsystems.py +0 -0
  237. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/microsoft/toolchain.py +0 -0
  238. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/premake/__init__.py +0 -0
  239. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/premake/premake.py +0 -0
  240. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/premake/premakedeps.py +0 -0
  241. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/qbs/__init__.py +0 -0
  242. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/qbs/qbs.py +0 -0
  243. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/qbs/qbsprofile.py +0 -0
  244. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/scm/__init__.py +0 -0
  245. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/scons/__init__.py +0 -0
  246. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/scons/sconsdeps.py +0 -0
  247. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/system/__init__.py +0 -0
  248. {conan-server-2.0.17 → conan-server-2.2.0}/conan/tools/system/package_manager.py +0 -0
  249. {conan-server-2.0.17 → conan-server-2.2.0}/conan_server.egg-info/dependency_links.txt +0 -0
  250. {conan-server-2.0.17 → conan-server-2.2.0}/conan_server.egg-info/entry_points.txt +0 -0
  251. {conan-server-2.0.17 → conan-server-2.2.0}/conan_server.egg-info/requires.txt +0 -0
  252. {conan-server-2.0.17 → conan-server-2.2.0}/conan_server.egg-info/top_level.txt +0 -0
  253. {conan-server-2.0.17 → conan-server-2.2.0}/conans/client/__init__.py +0 -0
  254. {conan-server-2.0.17 → conan-server-2.2.0}/conans/client/cache/__init__.py +0 -0
  255. {conan-server-2.0.17 → conan-server-2.2.0}/conans/client/cache/editable.py +0 -0
  256. {conan-server-2.0.17 → conan-server-2.2.0}/conans/client/cmd/__init__.py +0 -0
  257. {conan-server-2.0.17 → conan-server-2.2.0}/conans/client/conanfile/__init__.py +0 -0
  258. {conan-server-2.0.17 → conan-server-2.2.0}/conans/client/conanfile/build.py +0 -0
  259. {conan-server-2.0.17 → conan-server-2.2.0}/conans/client/conanfile/implementations.py +0 -0
  260. {conan-server-2.0.17 → conan-server-2.2.0}/conans/client/conanfile/package.py +0 -0
  261. {conan-server-2.0.17 → conan-server-2.2.0}/conans/client/conf/detect.py +0 -0
  262. {conan-server-2.0.17 → conan-server-2.2.0}/conans/client/conf/required_version.py +0 -0
  263. {conan-server-2.0.17 → conan-server-2.2.0}/conans/client/downloaders/__init__.py +0 -0
  264. {conan-server-2.0.17 → conan-server-2.2.0}/conans/client/downloaders/caching_file_downloader.py +0 -0
  265. {conan-server-2.0.17 → conan-server-2.2.0}/conans/client/graph/__init__.py +0 -0
  266. {conan-server-2.0.17 → conan-server-2.2.0}/conans/client/graph/profile_node_definer.py +0 -0
  267. {conan-server-2.0.17 → conan-server-2.2.0}/conans/client/hook_manager.py +0 -0
  268. {conan-server-2.0.17 → conan-server-2.2.0}/conans/client/loader_txt.py +0 -0
  269. {conan-server-2.0.17 → conan-server-2.2.0}/conans/client/migrations.py +0 -0
  270. {conan-server-2.0.17 → conan-server-2.2.0}/conans/client/pkg_sign.py +0 -0
  271. {conan-server-2.0.17 → conan-server-2.2.0}/conans/client/profile_loader.py +0 -0
  272. {conan-server-2.0.17 → conan-server-2.2.0}/conans/client/rest/__init__.py +0 -0
  273. {conan-server-2.0.17 → conan-server-2.2.0}/conans/client/rest/client_routes.py +0 -0
  274. {conan-server-2.0.17 → conan-server-2.2.0}/conans/client/rest/conan_requester.py +0 -0
  275. {conan-server-2.0.17 → conan-server-2.2.0}/conans/client/rest/file_uploader.py +0 -0
  276. {conan-server-2.0.17 → conan-server-2.2.0}/conans/client/rest/remote_credentials.py +0 -0
  277. {conan-server-2.0.17 → conan-server-2.2.0}/conans/client/rest/rest_client.py +0 -0
  278. {conan-server-2.0.17 → conan-server-2.2.0}/conans/client/rest/rest_client_common.py +0 -0
  279. {conan-server-2.0.17 → conan-server-2.2.0}/conans/client/rest/rest_client_v2.py +0 -0
  280. {conan-server-2.0.17 → conan-server-2.2.0}/conans/client/source.py +0 -0
  281. {conan-server-2.0.17 → conan-server-2.2.0}/conans/client/store/__init__.py +0 -0
  282. {conan-server-2.0.17 → conan-server-2.2.0}/conans/client/subsystems.py +0 -0
  283. {conan-server-2.0.17 → conan-server-2.2.0}/conans/client/userio.py +0 -0
  284. {conan-server-2.0.17 → conan-server-2.2.0}/conans/conan.py +0 -0
  285. {conan-server-2.0.17 → conan-server-2.2.0}/conans/conan_server.py +0 -0
  286. {conan-server-2.0.17 → conan-server-2.2.0}/conans/migrations.py +0 -0
  287. {conan-server-2.0.17 → conan-server-2.2.0}/conans/model/__init__.py +0 -0
  288. {conan-server-2.0.17 → conan-server-2.2.0}/conans/model/build_info.py +0 -0
  289. {conan-server-2.0.17 → conan-server-2.2.0}/conans/model/conanfile_interface.py +0 -0
  290. {conan-server-2.0.17 → conan-server-2.2.0}/conans/model/dependencies.py +0 -0
  291. {conan-server-2.0.17 → conan-server-2.2.0}/conans/model/layout.py +0 -0
  292. {conan-server-2.0.17 → conan-server-2.2.0}/conans/model/manifest.py +0 -0
  293. {conan-server-2.0.17 → conan-server-2.2.0}/conans/model/package_ref.py +0 -0
  294. {conan-server-2.0.17 → conan-server-2.2.0}/conans/model/profile.py +0 -0
  295. {conan-server-2.0.17 → conan-server-2.2.0}/conans/model/recipe_ref.py +0 -0
  296. {conan-server-2.0.17 → conan-server-2.2.0}/conans/model/rest_routes.py +0 -0
  297. {conan-server-2.0.17 → conan-server-2.2.0}/conans/model/version.py +0 -0
  298. {conan-server-2.0.17 → conan-server-2.2.0}/conans/paths/__init__.py +0 -0
  299. {conan-server-2.0.17 → conan-server-2.2.0}/conans/requirements.txt +0 -0
  300. {conan-server-2.0.17 → conan-server-2.2.0}/conans/requirements_dev.txt +0 -0
  301. {conan-server-2.0.17 → conan-server-2.2.0}/conans/requirements_server.txt +0 -0
  302. {conan-server-2.0.17 → conan-server-2.2.0}/conans/search/__init__.py +0 -0
  303. {conan-server-2.0.17 → conan-server-2.2.0}/conans/search/query_parse.py +0 -0
  304. {conan-server-2.0.17 → conan-server-2.2.0}/conans/search/search.py +0 -0
  305. {conan-server-2.0.17 → conan-server-2.2.0}/conans/server/__init__.py +0 -0
  306. {conan-server-2.0.17 → conan-server-2.2.0}/conans/server/conf/__init__.py +0 -0
  307. {conan-server-2.0.17 → conan-server-2.2.0}/conans/server/conf/default_server_conf.py +0 -0
  308. {conan-server-2.0.17 → conan-server-2.2.0}/conans/server/crypto/__init__.py +0 -0
  309. {conan-server-2.0.17 → conan-server-2.2.0}/conans/server/crypto/jwt/__init__.py +0 -0
  310. {conan-server-2.0.17 → conan-server-2.2.0}/conans/server/crypto/jwt/jwt_credentials_manager.py +0 -0
  311. {conan-server-2.0.17 → conan-server-2.2.0}/conans/server/crypto/jwt/jwt_manager.py +0 -0
  312. {conan-server-2.0.17 → conan-server-2.2.0}/conans/server/launcher.py +0 -0
  313. {conan-server-2.0.17 → conan-server-2.2.0}/conans/server/migrate.py +0 -0
  314. {conan-server-2.0.17 → conan-server-2.2.0}/conans/server/migrations.py +0 -0
  315. {conan-server-2.0.17 → conan-server-2.2.0}/conans/server/plugin_loader.py +0 -0
  316. {conan-server-2.0.17 → conan-server-2.2.0}/conans/server/rest/__init__.py +0 -0
  317. {conan-server-2.0.17 → conan-server-2.2.0}/conans/server/rest/api_v2.py +0 -0
  318. {conan-server-2.0.17 → conan-server-2.2.0}/conans/server/rest/bottle_plugins/__init__.py +0 -0
  319. {conan-server-2.0.17 → conan-server-2.2.0}/conans/server/rest/bottle_plugins/authorization_header.py +0 -0
  320. {conan-server-2.0.17 → conan-server-2.2.0}/conans/server/rest/bottle_plugins/http_basic_authentication.py +0 -0
  321. {conan-server-2.0.17 → conan-server-2.2.0}/conans/server/rest/bottle_plugins/jwt_authentication.py +0 -0
  322. {conan-server-2.0.17 → conan-server-2.2.0}/conans/server/rest/bottle_routes.py +0 -0
  323. {conan-server-2.0.17 → conan-server-2.2.0}/conans/server/rest/controller/__init__.py +0 -0
  324. {conan-server-2.0.17 → conan-server-2.2.0}/conans/server/rest/controller/v2/__init__.py +0 -0
  325. {conan-server-2.0.17 → conan-server-2.2.0}/conans/server/rest/controller/v2/conan.py +0 -0
  326. {conan-server-2.0.17 → conan-server-2.2.0}/conans/server/rest/controller/v2/delete.py +0 -0
  327. {conan-server-2.0.17 → conan-server-2.2.0}/conans/server/rest/controller/v2/ping.py +0 -0
  328. {conan-server-2.0.17 → conan-server-2.2.0}/conans/server/rest/controller/v2/revisions.py +0 -0
  329. {conan-server-2.0.17 → conan-server-2.2.0}/conans/server/rest/controller/v2/search.py +0 -0
  330. {conan-server-2.0.17 → conan-server-2.2.0}/conans/server/rest/controller/v2/users.py +0 -0
  331. {conan-server-2.0.17 → conan-server-2.2.0}/conans/server/rest/server.py +0 -0
  332. {conan-server-2.0.17 → conan-server-2.2.0}/conans/server/revision_list.py +0 -0
  333. {conan-server-2.0.17 → conan-server-2.2.0}/conans/server/server_launcher.py +0 -0
  334. {conan-server-2.0.17 → conan-server-2.2.0}/conans/server/service/__init__.py +0 -0
  335. {conan-server-2.0.17 → conan-server-2.2.0}/conans/server/service/authorize.py +0 -0
  336. {conan-server-2.0.17 → conan-server-2.2.0}/conans/server/service/mime.py +0 -0
  337. {conan-server-2.0.17 → conan-server-2.2.0}/conans/server/service/user_service.py +0 -0
  338. {conan-server-2.0.17 → conan-server-2.2.0}/conans/server/service/v2/__init__.py +0 -0
  339. {conan-server-2.0.17 → conan-server-2.2.0}/conans/server/service/v2/search.py +0 -0
  340. {conan-server-2.0.17 → conan-server-2.2.0}/conans/server/service/v2/service_v2.py +0 -0
  341. {conan-server-2.0.17 → conan-server-2.2.0}/conans/server/store/__init__.py +0 -0
  342. {conan-server-2.0.17 → conan-server-2.2.0}/conans/server/store/disk_adapter.py +0 -0
  343. {conan-server-2.0.17 → conan-server-2.2.0}/conans/server/store/server_store.py +0 -0
  344. {conan-server-2.0.17 → conan-server-2.2.0}/conans/server/utils/__init__.py +0 -0
  345. {conan-server-2.0.17 → conan-server-2.2.0}/conans/server/utils/files.py +0 -0
  346. {conan-server-2.0.17/conans/test/utils → conan-server-2.2.0/conans/test}/__init__.py +0 -0
  347. {conan-server-2.0.17/conans/util → conan-server-2.2.0/conans/test/utils}/__init__.py +0 -0
  348. {conan-server-2.0.17 → conan-server-2.2.0}/conans/test/utils/artifactory.py +0 -0
  349. {conan-server-2.0.17 → conan-server-2.2.0}/conans/test/utils/file_server.py +0 -0
  350. {conan-server-2.0.17 → conan-server-2.2.0}/conans/test/utils/scm.py +0 -0
  351. {conan-server-2.0.17 → conan-server-2.2.0}/conans/test/utils/server_launcher.py +0 -0
  352. {conan-server-2.0.17 → conan-server-2.2.0}/conans/util/config_parser.py +0 -0
  353. {conan-server-2.0.17 → conan-server-2.2.0}/conans/util/encrypt.py +0 -0
  354. {conan-server-2.0.17 → conan-server-2.2.0}/conans/util/env.py +0 -0
  355. {conan-server-2.0.17 → conan-server-2.2.0}/conans/util/locks.py +0 -0
  356. {conan-server-2.0.17 → conan-server-2.2.0}/conans/util/sha.py +0 -0
  357. {conan-server-2.0.17 → conan-server-2.2.0}/conans/util/thread.py +0 -0
  358. {conan-server-2.0.17 → conan-server-2.2.0}/conans/util/windows.py +0 -0
  359. {conan-server-2.0.17 → conan-server-2.2.0}/pyproject.toml +0 -0
  360. {conan-server-2.0.17 → conan-server-2.2.0}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: conan-server
3
- Version: 2.0.17
3
+ Version: 2.2.0
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,24 +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):
16
- self._name = name # Read only, is the key
17
+ def __init__(self, name, url, verify_ssl=True, disabled=False, allowed_packages=None,
18
+ remote_type=None):
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
-
21
- @property
22
- def name(self):
23
- return self._name
23
+ self.allowed_packages = allowed_packages
24
+ self.remote_type = remote_type
24
25
 
25
26
  def __eq__(self, other):
26
27
  if other is None:
@@ -29,8 +30,14 @@ class Remote:
29
30
  self.verify_ssl == other.verify_ssl and self.disabled == other.disabled)
30
31
 
31
32
  def __str__(self):
32
- return "{}: {} [Verify SSL: {}, Enabled: {}]".format(self.name, self.url, self.verify_ssl,
33
- not self.disabled)
33
+ allowed_msg = ""
34
+ if self.allowed_packages:
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)
39
+ return "{}: {} [Verify SSL: {}, Enabled: {}{}]".format(self.name, self.url, self.verify_ssl,
40
+ not self.disabled, allowed_msg)
34
41
 
35
42
  def __repr__(self):
36
43
  return str(self)
@@ -128,6 +135,7 @@ class MultiPackagesList:
128
135
  if any(b == "*" or b == binary for b in binaries):
129
136
  cache_list.add_refs([ref]) # Binary listed forces recipe listed
130
137
  cache_list.add_prefs(ref, [pref])
138
+ cache_list.add_configurations({pref: node["info"]})
131
139
  return pkglist
132
140
 
133
141
 
@@ -135,6 +143,25 @@ class PackagesList:
135
143
  def __init__(self):
136
144
  self.recipes = {}
137
145
 
146
+ def split(self):
147
+ """
148
+ Returns a list of PackageList, splitted one per reference.
149
+ This can be useful to parallelize things like upload, parallelizing per-reference
150
+ """
151
+ result = []
152
+ for r, content in self.recipes.items():
153
+ subpkglist = PackagesList()
154
+ subpkglist.recipes[r] = content
155
+ result.append(subpkglist)
156
+ return result
157
+
158
+ def only_recipes(self):
159
+ result = {}
160
+ for ref, ref_dict in self.recipes.items():
161
+ for rrev_dict in ref_dict.get("revisions", {}).values():
162
+ rrev_dict.pop("packages", None)
163
+ return result
164
+
138
165
  def add_refs(self, refs):
139
166
  # RREVS alreday come in ASCENDING order, so upload does older revisions first
140
167
  for ref in refs:
@@ -258,7 +285,7 @@ class ListPattern:
258
285
 
259
286
  def check_refs(self, refs):
260
287
  if not refs and self.ref and "*" not in self.ref:
261
- raise ConanException(f"Recipe '{self.ref}' not found")
288
+ raise NotFoundException(f"Recipe '{self.ref}' not found")
262
289
 
263
290
  def filter_rrevs(self, rrevs):
264
291
  if self._only_latest(self.rrev):
@@ -1,5 +1,7 @@
1
1
  import fnmatch
2
2
  import sys
3
+ import time
4
+ from threading import Lock
3
5
 
4
6
  from colorama import Fore, Style
5
7
 
@@ -53,6 +55,7 @@ class ConanOutput:
53
55
  _conan_output_level = LEVEL_STATUS
54
56
  _silent_warn_tags = []
55
57
  _warnings_as_errors = []
58
+ lock = Lock()
56
59
 
57
60
  def __init__(self, scope=""):
58
61
  self.stream = sys.stderr
@@ -126,8 +129,11 @@ class ConanOutput:
126
129
 
127
130
  if newline:
128
131
  data = "%s\n" % data
129
- self.stream.write(data)
130
- self.stream.flush()
132
+
133
+ with self.lock:
134
+ self.stream.write(data)
135
+ self.stream.flush()
136
+
131
137
  return self
132
138
 
133
139
  def rewrite_line(self, line):
@@ -161,8 +167,9 @@ class ConanOutput:
161
167
  else:
162
168
  ret += "{}".format(msg)
163
169
 
164
- self.stream.write("{}\n".format(ret))
165
- self.stream.flush()
170
+ with self.lock:
171
+ self.stream.write("{}\n".format(ret))
172
+ self.stream.flush()
166
173
 
167
174
  def trace(self, msg):
168
175
  if self._conan_output_level <= LEVEL_TRACE:
@@ -252,3 +259,19 @@ def cli_out_write(data, fg=None, bg=None, endline="\n", indentation=0):
252
259
  data = f"{' ' * indentation}{data}{endline}"
253
260
 
254
261
  sys.stdout.write(data)
262
+
263
+
264
+ class TimedOutput:
265
+ def __init__(self, interval, out=None, msg_format=None):
266
+ self._interval = interval
267
+ self._msg_format = msg_format
268
+ self._t = time.time()
269
+ self._out = out or ConanOutput()
270
+
271
+ def info(self, msg, *args, **kwargs):
272
+ t = time.time()
273
+ if t - self._t > self._interval:
274
+ self._t = t
275
+ if self._msg_format:
276
+ msg = self._msg_format(msg, *args, **kwargs)
277
+ self._out.info(msg)
@@ -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:
@@ -22,66 +24,68 @@ class CacheAPI:
22
24
  self.conan_api = conan_api
23
25
 
24
26
  def export_path(self, ref: RecipeReference):
25
- app = ConanApp(self.conan_api.cache_folder, self.conan_api.config.global_conf)
27
+ app = ConanApp(self.conan_api)
26
28
  ref.revision = None if ref.revision == "latest" else ref.revision
27
29
  ref_layout = app.cache.recipe_layout(ref)
28
30
  return _check_folder_existence(ref, "export", ref_layout.export())
29
31
 
30
32
  def recipe_metadata_path(self, ref: RecipeReference):
31
- app = ConanApp(self.conan_api.cache_folder, self.conan_api.config.global_conf)
33
+ app = ConanApp(self.conan_api)
32
34
  ref = _resolve_latest_ref(app, ref)
33
35
  ref_layout = app.cache.recipe_layout(ref)
34
36
  return _check_folder_existence(ref, "metadata", ref_layout.metadata())
35
37
 
36
38
  def export_source_path(self, ref: RecipeReference):
37
- app = ConanApp(self.conan_api.cache_folder, self.conan_api.config.global_conf)
39
+ app = ConanApp(self.conan_api)
38
40
  ref.revision = None if ref.revision == "latest" else ref.revision
39
41
  ref_layout = app.cache.recipe_layout(ref)
40
42
  return _check_folder_existence(ref, "export_sources", ref_layout.export_sources())
41
43
 
42
44
  def source_path(self, ref: RecipeReference):
43
- app = ConanApp(self.conan_api.cache_folder, self.conan_api.config.global_conf)
45
+ app = ConanApp(self.conan_api)
44
46
  ref.revision = None if ref.revision == "latest" else ref.revision
45
47
  ref_layout = app.cache.recipe_layout(ref)
46
48
  return _check_folder_existence(ref, "source", ref_layout.source())
47
49
 
48
50
  def build_path(self, pref: PkgReference):
49
- app = ConanApp(self.conan_api.cache_folder, self.conan_api.config.global_conf)
51
+ app = ConanApp(self.conan_api)
50
52
  pref = _resolve_latest_pref(app, pref)
51
53
  ref_layout = app.cache.pkg_layout(pref)
52
54
  return _check_folder_existence(pref, "build", ref_layout.build())
53
55
 
54
56
  def package_metadata_path(self, pref: PkgReference):
55
- app = ConanApp(self.conan_api.cache_folder, self.conan_api.config.global_conf)
57
+ app = ConanApp(self.conan_api)
56
58
  pref = _resolve_latest_pref(app, pref)
57
59
  ref_layout = app.cache.pkg_layout(pref)
58
60
  return _check_folder_existence(pref, "metadata", ref_layout.metadata())
59
61
 
60
62
  def package_path(self, pref: PkgReference):
61
- app = ConanApp(self.conan_api.cache_folder, self.conan_api.config.global_conf)
63
+ app = ConanApp(self.conan_api)
62
64
  pref = _resolve_latest_pref(app, pref)
63
65
  ref_layout = app.cache.pkg_layout(pref)
64
66
  return _check_folder_existence(pref, "package", ref_layout.package())
65
67
 
66
68
  def check_integrity(self, package_list):
67
69
  """Check if the recipes and packages are corrupted (it will raise a ConanExcepcion)"""
68
- app = ConanApp(self.conan_api.cache_folder, self.conan_api.config.global_conf)
70
+ app = ConanApp(self.conan_api)
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
 
84
- app = ConanApp(self.conan_api.cache_folder, self.conan_api.config.global_conf)
88
+ app = ConanApp(self.conan_api)
85
89
  if temp:
86
90
  rmdir(app.cache.temp_folder)
87
91
  # Clean those build folders that didn't succeed to create a package and wont be in DB
@@ -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)
@@ -111,7 +119,7 @@ class CacheAPI:
111
119
 
112
120
  def save(self, package_list, tgz_path):
113
121
  cache_folder = self.conan_api.cache_folder
114
- app = ConanApp(cache_folder, self.conan_api.config.global_conf)
122
+ app = ConanApp(self.conan_api)
115
123
  out = ConanOutput()
116
124
  mkdir(os.path.dirname(tgz_path))
117
125
  name = os.path.basename(tgz_path)
@@ -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
 
@@ -28,10 +35,69 @@ class ConfigAPI:
28
35
  source_folder=None, target_folder=None):
29
36
  # TODO: We probably want to split this into git-folder-http cases?
30
37
  from conans.client.conf.config_installer import configuration_install
31
- app = ConanApp(self.conan_api.cache_folder, self.conan_api.config.global_conf)
32
- return configuration_install(app, path_or_url, verify_ssl,
33
- config_type=config_type, args=args,
34
- source_folder=source_folder, target_folder=target_folder)
38
+ app = ConanApp(self.conan_api)
39
+ configuration_install(app, path_or_url, verify_ssl, config_type=config_type, args=args,
40
+ source_folder=source_folder, target_folder=target_folder)
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
35
101
 
36
102
  def get(self, name, default=None, check_type=None):
37
103
  return self.global_conf.get(name, default=default, check_type=check_type)
@@ -62,6 +128,7 @@ class ConfigAPI:
62
128
  if platform.system() in ["Linux", "FreeBSD"]:
63
129
  import distro
64
130
  template = Environment(loader=FileSystemLoader(home_folder)).from_string(text)
131
+ home_folder = home_folder.replace("\\", "/")
65
132
  content = template.render({"platform": platform, "os": os, "distro": distro,
66
133
  "conan_version": conan_version,
67
134
  "conan_home_folder": home_folder,
@@ -1,4 +1,8 @@
1
- from conan.api.model import Remote
1
+ import time
2
+ from multiprocessing.pool import ThreadPool
3
+ from typing import Optional, List
4
+
5
+ from conan.api.model import Remote, PackagesList
2
6
  from conan.api.output import ConanOutput
3
7
  from conan.internal.conan_app import ConanApp
4
8
  from conans.errors import ConanException
@@ -11,9 +15,12 @@ class DownloadAPI:
11
15
  def __init__(self, conan_api):
12
16
  self.conan_api = conan_api
13
17
 
14
- def recipe(self, ref: RecipeReference, remote: Remote, metadata=None):
18
+ def recipe(self, ref: RecipeReference, remote: Remote, metadata: Optional[List[str]] = None):
19
+ """Download the recipe specified in the ref from the remote.
20
+ If the recipe is already in the cache it will be skipped,
21
+ but the specified metadata will be downloaded."""
15
22
  output = ConanOutput()
16
- app = ConanApp(self.conan_api.cache_folder, self.conan_api.config.global_conf)
23
+ app = ConanApp(self.conan_api)
17
24
  assert ref.revision, f"Reference '{ref}' must have revision"
18
25
  try:
19
26
  app.cache.recipe_layout(ref) # raises if not found
@@ -40,9 +47,13 @@ class DownloadAPI:
40
47
  app.remote_manager.get_recipe_sources(ref, recipe_layout, remote)
41
48
  return True
42
49
 
43
- def package(self, pref: PkgReference, remote: Remote, metadata=None):
50
+ def package(self, pref: PkgReference, remote: Remote, metadata: Optional[List[str]] = None):
51
+ """Download the package specified in the pref from the remote.
52
+ The recipe for this package binary must already exist in the cache.
53
+ If the package is already in the cache it will be skipped,
54
+ but the specified metadata will be downloaded."""
44
55
  output = ConanOutput()
45
- app = ConanApp(self.conan_api.cache_folder, self.conan_api.config.global_conf)
56
+ app = ConanApp(self.conan_api)
46
57
  try:
47
58
  app.cache.recipe_layout(pref.ref) # raises if not found
48
59
  except ConanException:
@@ -56,7 +67,7 @@ class DownloadAPI:
56
67
  app.remote_manager.get_package_metadata(pref, remote, metadata)
57
68
  return False
58
69
 
59
- if pref.timestamp is None: # we didnt obtain the timestamp before (in general it should be)
70
+ if pref.timestamp is None: # we didn't obtain the timestamp before (in general it should be)
60
71
  # Respect the timestamp of the server
61
72
  server_pref = app.remote_manager.get_package_revision_reference(pref, remote)
62
73
  assert server_pref == pref
@@ -65,3 +76,29 @@ class DownloadAPI:
65
76
  output.info(f"Downloading package '{pref.repr_notime()}'")
66
77
  app.remote_manager.get_package(pref, remote, metadata)
67
78
  return True
79
+
80
+ def download_full(self, package_list: PackagesList, remote: Remote,
81
+ metadata: Optional[List[str]] = None):
82
+ """Download the recipes and packages specified in the package_list from the remote,
83
+ parallelized based on `core.download:parallel`"""
84
+ def _download_pkglist(pkglist):
85
+ for ref, recipe_bundle in pkglist.refs().items():
86
+ self.recipe(ref, remote, metadata)
87
+ for pref, _ in pkglist.prefs(ref, recipe_bundle).items():
88
+ self.package(pref, remote, metadata)
89
+
90
+ t = time.time()
91
+ parallel = self.conan_api.config.get("core.download:parallel", default=1, check_type=int)
92
+ thread_pool = ThreadPool(parallel) if parallel > 1 else None
93
+ if not thread_pool or len(package_list.refs()) <= 1:
94
+ _download_pkglist(package_list)
95
+ else:
96
+ ConanOutput().subtitle(f"Downloading with {parallel} parallel threads")
97
+ thread_pool.map(_download_pkglist, package_list.split())
98
+
99
+ if thread_pool:
100
+ thread_pool.close()
101
+ thread_pool.join()
102
+
103
+ elapsed = time.time() - t
104
+ ConanOutput().success(f"Download completed in {int(elapsed)}s\n")
@@ -2,7 +2,7 @@ from conan.api.output import ConanOutput
2
2
  from conan.internal.conan_app import ConanApp
3
3
  from conans.client.cmd.export import cmd_export
4
4
  from conans.client.conanfile.package import run_package_method
5
- from conans.client.graph.graph import BINARY_BUILD
5
+ from conans.client.graph.graph import BINARY_BUILD, RECIPE_INCACHE
6
6
  from conans.model.package_ref import PkgReference
7
7
  from conans.util.files import mkdir
8
8
 
@@ -14,12 +14,12 @@ class ExportAPI:
14
14
 
15
15
  def export(self, path, name, version, user, channel, lockfile=None, remotes=None):
16
16
  ConanOutput().title("Exporting recipe to the cache")
17
- app = ConanApp(self.conan_api.cache_folder, self.conan_api.config.global_conf)
17
+ app = ConanApp(self.conan_api)
18
18
  return cmd_export(app, self.conan_api.config.global_conf, path, name, version, user, channel,
19
19
  graph_lock=lockfile, remotes=remotes)
20
20
 
21
21
  def export_pkg(self, deps_graph, source_folder, output_folder):
22
- app = ConanApp(self.conan_api.cache_folder, self.conan_api.config.global_conf)
22
+ app = ConanApp(self.conan_api)
23
23
  cache, hook_manager = app.cache, app.hook_manager
24
24
 
25
25
  # The graph has to be loaded with build_mode=[ref.name], so that node is not tried
@@ -52,6 +52,7 @@ class ExportAPI:
52
52
  cache.assign_prev(pkg_layout)
53
53
  pkg_node.prev = prev
54
54
  pkg_node.pref_timestamp = pref.timestamp # assigned by assign_prev
55
+ pkg_node.recipe = RECIPE_INCACHE
55
56
  pkg_node.binary = BINARY_BUILD
56
57
  # Make sure folder is updated
57
58
  final_folder = pkg_layout.package()
@@ -18,7 +18,7 @@ class GraphAPI:
18
18
  name=None, version=None, user=None, channel=None,
19
19
  update=None, remotes=None, lockfile=None,
20
20
  is_build_require=False):
21
- app = ConanApp(self.conan_api.cache_folder, self.conan_api.config.global_conf)
21
+ app = ConanApp(self.conan_api)
22
22
 
23
23
  if path.endswith(".py"):
24
24
  conanfile = app.loader.load_consumer(path,
@@ -62,7 +62,7 @@ class GraphAPI:
62
62
  :return: a graph Node, recipe=RECIPE_CONSUMER
63
63
  """
64
64
 
65
- app = ConanApp(self.conan_api.cache_folder, self.conan_api.config.global_conf)
65
+ app = ConanApp(self.conan_api)
66
66
  # necessary for correct resolution and update of remote python_requires
67
67
 
68
68
  loader = app.loader
@@ -88,7 +88,7 @@ class GraphAPI:
88
88
  lockfile, remotes, update, check_updates=False, python_requires=None):
89
89
  if not python_requires and not requires and not tool_requires:
90
90
  raise ConanException("Provide requires or tool_requires")
91
- app = ConanApp(self.conan_api.cache_folder, self.conan_api.config.global_conf)
91
+ app = ConanApp(self.conan_api)
92
92
  conanfile = app.loader.load_virtual(requires=requires,
93
93
  tool_requires=tool_requires,
94
94
  python_requires=python_requires,
@@ -151,7 +151,7 @@ class GraphAPI:
151
151
  return deps_graph
152
152
 
153
153
  def load_graph(self, root_node, profile_host, profile_build, lockfile=None, remotes=None,
154
- update=False, check_update=False):
154
+ update=None, check_update=False):
155
155
  """ Compute the dependency graph, starting from a root package, evaluation the graph with
156
156
  the provided configuration in profile_build, and profile_host. The resulting graph is a
157
157
  graph of recipes, but packages are not computed yet (package_ids) will be empty in the
@@ -169,7 +169,7 @@ class GraphAPI:
169
169
  :param check_update: For "graph info" command, check if there are recipe updates
170
170
  """
171
171
  ConanOutput().title("Computing dependency graph")
172
- app = ConanApp(self.conan_api.cache_folder, self.conan_api.config.global_conf)
172
+ app = ConanApp(self.conan_api)
173
173
 
174
174
  assert profile_host is not None
175
175
  assert profile_build is not None
@@ -196,7 +196,7 @@ class GraphAPI:
196
196
  :param tested_graph: In case of a "test_package", the graph being tested
197
197
  """
198
198
  ConanOutput().title("Computing necessary packages")
199
- conan_app = ConanApp(self.conan_api.cache_folder, self.conan_api.config.global_conf)
199
+ conan_app = ConanApp(self.conan_api)
200
200
  binaries_analyzer = GraphBinariesAnalyzer(conan_app, self.conan_api.config.global_conf)
201
201
  binaries_analyzer.evaluate_graph(graph, build_mode, lockfile, remotes, update,
202
202
  build_modes_test, tested_graph)