conan 2.20.0__tar.gz → 2.21.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.
- {conan-2.20.0/conan.egg-info → conan-2.21.0}/PKG-INFO +1 -1
- {conan-2.20.0 → conan-2.21.0}/conan/__init__.py +1 -1
- {conan-2.20.0 → conan-2.21.0}/conan/api/conan_api.py +9 -1
- {conan-2.20.0 → conan-2.21.0}/conan/api/model/list.py +110 -43
- {conan-2.20.0 → conan-2.21.0}/conan/api/model/remote.py +4 -1
- {conan-2.20.0 → conan-2.21.0}/conan/api/subapi/audit.py +5 -2
- {conan-2.20.0 → conan-2.21.0}/conan/api/subapi/cache.py +12 -8
- {conan-2.20.0 → conan-2.21.0}/conan/api/subapi/config.py +2 -2
- {conan-2.20.0 → conan-2.21.0}/conan/api/subapi/download.py +9 -3
- {conan-2.20.0 → conan-2.21.0}/conan/api/subapi/list.py +25 -19
- {conan-2.20.0 → conan-2.21.0}/conan/api/subapi/remotes.py +9 -12
- {conan-2.20.0 → conan-2.21.0}/conan/api/subapi/upload.py +4 -4
- {conan-2.20.0 → conan-2.21.0}/conan/cli/args.py +10 -4
- {conan-2.20.0 → conan-2.21.0}/conan/cli/commands/audit.py +7 -4
- {conan-2.20.0 → conan-2.21.0}/conan/cli/commands/build.py +3 -1
- {conan-2.20.0 → conan-2.21.0}/conan/cli/commands/download.py +1 -1
- {conan-2.20.0 → conan-2.21.0}/conan/cli/commands/editable.py +9 -4
- {conan-2.20.0 → conan-2.21.0}/conan/cli/commands/export.py +4 -2
- {conan-2.20.0 → conan-2.21.0}/conan/cli/commands/export_pkg.py +3 -1
- {conan-2.20.0 → conan-2.21.0}/conan/cli/commands/graph.py +1 -6
- {conan-2.20.0 → conan-2.21.0}/conan/cli/commands/inspect.py +3 -1
- {conan-2.20.0 → conan-2.21.0}/conan/cli/commands/list.py +1 -1
- {conan-2.20.0 → conan-2.21.0}/conan/cli/commands/lock.py +0 -3
- {conan-2.20.0 → conan-2.21.0}/conan/cli/commands/remote.py +18 -4
- {conan-2.20.0 → conan-2.21.0}/conan/cli/commands/remove.py +24 -30
- {conan-2.20.0 → conan-2.21.0}/conan/cli/commands/search.py +2 -3
- {conan-2.20.0 → conan-2.21.0}/conan/cli/commands/source.py +3 -1
- {conan-2.20.0 → conan-2.21.0}/conan/cli/commands/test.py +3 -1
- {conan-2.20.0 → conan-2.21.0}/conan/cli/commands/upload.py +18 -21
- {conan-2.20.0 → conan-2.21.0}/conan/cli/commands/workspace.py +1 -1
- {conan-2.20.0 → conan-2.21.0}/conan/cli/formatters/audit/vulnerabilities.py +1 -1
- {conan-2.20.0 → conan-2.21.0}/conan/cli/formatters/report/diff.py +53 -0
- conan-2.21.0/conan/cli/formatters/report/diff_html.py +248 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/api/audit/providers.py +2 -2
- {conan-2.20.0 → conan-2.21.0}/conan/internal/api/detect/detect_api.py +3 -2
- {conan-2.20.0 → conan-2.21.0}/conan/internal/api/detect/detect_vs.py +1 -1
- {conan-2.20.0 → conan-2.21.0}/conan/internal/api/export.py +19 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/api/list/query_parse.py +2 -2
- conan-2.21.0/conan/internal/api/upload.py +18 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/api/uploader.py +24 -11
- {conan-2.20.0 → conan-2.21.0}/conan/internal/cache/integrity_check.py +2 -2
- {conan-2.20.0 → conan-2.21.0}/conan/internal/conan_app.py +4 -4
- {conan-2.20.0 → conan-2.21.0}/conan/internal/default_settings.py +21 -11
- {conan-2.20.0 → conan-2.21.0}/conan/internal/graph/compatibility.py +11 -7
- {conan-2.20.0 → conan-2.21.0}/conan/internal/graph/compute_pid.py +12 -6
- {conan-2.20.0 → conan-2.21.0}/conan/internal/graph/graph_binaries.py +5 -5
- {conan-2.20.0 → conan-2.21.0}/conan/internal/graph/graph_builder.py +8 -3
- {conan-2.20.0 → conan-2.21.0}/conan/internal/graph/install_graph.py +1 -1
- {conan-2.20.0 → conan-2.21.0}/conan/internal/graph/installer.py +5 -3
- {conan-2.20.0 → conan-2.21.0}/conan/internal/graph/python_requires.py +1 -1
- {conan-2.20.0 → conan-2.21.0}/conan/internal/hook_manager.py +6 -1
- {conan-2.20.0 → conan-2.21.0}/conan/internal/internal_tools.py +2 -1
- {conan-2.20.0 → conan-2.21.0}/conan/internal/model/conanfile_interface.py +4 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/model/conf.py +1 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/model/info.py +8 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/model/profile.py +3 -2
- {conan-2.20.0 → conan-2.21.0}/conan/internal/model/requires.py +3 -1
- {conan-2.20.0 → conan-2.21.0}/conan/internal/model/workspace.py +7 -4
- {conan-2.20.0 → conan-2.21.0}/conan/internal/rest/caching_file_downloader.py +0 -1
- {conan-2.20.0 → conan-2.21.0}/conan/internal/rest/download_cache.py +8 -8
- {conan-2.20.0 → conan-2.21.0}/conan/internal/rest/file_downloader.py +2 -2
- {conan-2.20.0 → conan-2.21.0}/conan/internal/rest/pkg_sign.py +4 -2
- {conan-2.20.0 → conan-2.21.0}/conan/internal/rest/remote_manager.py +16 -4
- {conan-2.20.0 → conan-2.21.0}/conan/internal/rest/rest_client_local_recipe_index.py +2 -2
- {conan-2.20.0 → conan-2.21.0}/conan/internal/runner/docker.py +2 -1
- {conan-2.20.0 → conan-2.21.0}/conan/internal/util/files.py +0 -1
- {conan-2.20.0 → conan-2.21.0}/conan/test/assets/premake.py +2 -2
- {conan-2.20.0 → conan-2.21.0}/conan/test/utils/server_launcher.py +2 -2
- {conan-2.20.0 → conan-2.21.0}/conan/tools/apple/apple.py +35 -18
- {conan-2.20.0 → conan-2.21.0}/conan/tools/apple/xcodebuild.py +12 -3
- {conan-2.20.0 → conan-2.21.0}/conan/tools/apple/xcodedeps.py +1 -1
- {conan-2.20.0 → conan-2.21.0}/conan/tools/apple/xcodetoolchain.py +6 -3
- {conan-2.20.0 → conan-2.21.0}/conan/tools/cmake/cmake.py +31 -9
- {conan-2.20.0 → conan-2.21.0}/conan/tools/cmake/cmakedeps/cmakedeps.py +7 -7
- {conan-2.20.0 → conan-2.21.0}/conan/tools/cmake/cmakedeps/templates/config.py +25 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/cmake/cmakedeps2/cmakedeps.py +3 -2
- {conan-2.20.0 → conan-2.21.0}/conan/tools/cmake/cmakedeps2/config.py +73 -7
- {conan-2.20.0 → conan-2.21.0}/conan/tools/cmake/cmakedeps2/target_configuration.py +4 -40
- {conan-2.20.0 → conan-2.21.0}/conan/tools/cmake/presets.py +9 -7
- {conan-2.20.0 → conan-2.21.0}/conan/tools/cmake/toolchain/blocks.py +7 -34
- conan-2.21.0/conan/tools/cmake/utils.py +41 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/env/environment.py +21 -1
- {conan-2.20.0 → conan-2.21.0}/conan/tools/files/__init__.py +0 -1
- {conan-2.20.0 → conan-2.21.0}/conan/tools/files/conandata.py +2 -1
- {conan-2.20.0 → conan-2.21.0}/conan/tools/gnu/autotoolstoolchain.py +15 -7
- {conan-2.20.0 → conan-2.21.0}/conan/tools/gnu/gnutoolchain.py +17 -7
- {conan-2.20.0 → conan-2.21.0}/conan/tools/google/bazeldeps.py +7 -1
- {conan-2.20.0 → conan-2.21.0}/conan/tools/layout/__init__.py +3 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/meson/toolchain.py +1 -1
- {conan-2.20.0 → conan-2.21.0}/conan/tools/microsoft/msbuild.py +4 -4
- {conan-2.20.0 → conan-2.21.0}/conan/tools/microsoft/visual.py +5 -2
- {conan-2.20.0 → conan-2.21.0}/conan/tools/premake/premake.py +1 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/ros/rosenv.py +1 -2
- {conan-2.20.0 → conan-2.21.0}/conan/tools/sbom/cyclonedx.py +34 -19
- conan-2.21.0/conan/tools/system/__init__.py +1 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/system/package_manager.py +6 -4
- conan-2.21.0/conan/tools/system/pip_manager.py +43 -0
- {conan-2.20.0 → conan-2.21.0/conan.egg-info}/PKG-INFO +1 -1
- {conan-2.20.0 → conan-2.21.0}/conan.egg-info/SOURCES.txt +2 -5
- conan-2.20.0/conan/cli/formatters/report/diff_html.py +0 -154
- conan-2.20.0/conan/internal/api/upload.py +0 -16
- conan-2.20.0/conan/tools/cmake/utils.py +0 -5
- conan-2.20.0/conan/tools/files/packager.py +0 -99
- conan-2.20.0/conans/__init__.py +0 -0
- conan-2.20.0/conans/model/__init__.py +0 -0
- conan-2.20.0/conans/model/package_ref.py +0 -31
- conan-2.20.0/conans/model/recipe_ref.py +0 -31
- {conan-2.20.0 → conan-2.21.0}/LICENSE.md +0 -0
- {conan-2.20.0 → conan-2.21.0}/MANIFEST.in +0 -0
- {conan-2.20.0 → conan-2.21.0}/README.md +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/api/__init__.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/api/input.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/api/model/__init__.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/api/model/refs.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/api/output.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/api/subapi/__init__.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/api/subapi/command.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/api/subapi/export.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/api/subapi/graph.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/api/subapi/install.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/api/subapi/local.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/api/subapi/lockfile.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/api/subapi/new.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/api/subapi/profiles.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/api/subapi/remove.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/api/subapi/report.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/api/subapi/workspace.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/cli/__init__.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/cli/cli.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/cli/command.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/cli/commands/__init__.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/cli/commands/cache.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/cli/commands/config.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/cli/commands/create.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/cli/commands/install.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/cli/commands/new.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/cli/commands/pkglist.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/cli/commands/profile.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/cli/commands/report.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/cli/commands/version.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/cli/exit_codes.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/cli/formatters/__init__.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/cli/formatters/audit/__init__.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/cli/formatters/graph/__init__.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/cli/formatters/graph/build_order_html.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/cli/formatters/graph/graph.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/cli/formatters/graph/graph_info_text.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/cli/formatters/graph/info_graph_dot.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/cli/formatters/graph/info_graph_html.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/cli/formatters/list/__init__.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/cli/formatters/list/list.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/cli/formatters/list/search_table_html.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/cli/formatters/report/__init__.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/cli/printers/__init__.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/cli/printers/graph.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/cps/__init__.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/cps/cps.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/errors.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/__init__.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/api/__init__.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/api/audit/__init__.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/api/config/__init__.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/api/config/config_installer.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/api/detect/__init__.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/api/install/__init__.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/api/install/generators.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/api/list/__init__.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/api/local/__init__.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/api/local/editable.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/api/migrations.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/api/new/__init__.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/api/new/alias_new.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/api/new/autoools_exe.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/api/new/autotools_lib.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/api/new/basic.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/api/new/bazel_7_exe.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/api/new/bazel_7_lib.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/api/new/bazel_exe.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/api/new/bazel_lib.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/api/new/cmake_exe.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/api/new/cmake_lib.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/api/new/header_lib.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/api/new/local_recipes_index.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/api/new/meson_exe.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/api/new/meson_lib.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/api/new/msbuild_exe.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/api/new/msbuild_lib.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/api/new/premake_exe.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/api/new/premake_lib.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/api/new/qbs_lib.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/api/new/workspace.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/api/profile/__init__.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/api/profile/detect.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/api/profile/profile_loader.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/api/remotes/__init__.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/api/remotes/encrypt.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/api/remotes/localdb.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/cache/__init__.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/cache/cache.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/cache/conan_reference_layout.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/cache/db/__init__.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/cache/db/cache_database.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/cache/db/packages_table.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/cache/db/recipes_table.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/cache/db/table.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/cache/home_paths.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/deploy.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/errors.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/graph/__init__.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/graph/build_mode.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/graph/graph.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/graph/graph_error.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/graph/profile_node_definer.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/graph/provides.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/graph/proxy.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/graph/range_resolver.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/loader.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/methods.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/model/__init__.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/model/conan_file.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/model/cpp_info.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/model/dependencies.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/model/layout.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/model/lockfile.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/model/manifest.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/model/options.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/model/pkg_type.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/model/recipe_ref.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/model/settings.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/model/version.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/model/version_range.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/paths.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/rest/__init__.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/rest/auth_manager.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/rest/client_routes.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/rest/conan_requester.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/rest/file_uploader.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/rest/remote_credentials.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/rest/rest_client.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/rest/rest_client_v2.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/rest/rest_routes.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/runner/__init__.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/runner/output.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/runner/ssh.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/runner/wsl.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/source.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/subsystems.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/util/__init__.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/util/config_parser.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/util/dates.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/internal/util/runners.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/test/__init__.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/test/assets/__init__.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/test/assets/autotools.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/test/assets/cmake.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/test/assets/genconanfile.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/test/assets/sources.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/test/assets/visual_project_files.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/test/utils/__init__.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/test/utils/artifactory.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/test/utils/env.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/test/utils/file_server.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/test/utils/mocks.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/test/utils/profiles.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/test/utils/scm.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/test/utils/test_files.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/test/utils/tools.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/__init__.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/android/__init__.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/android/utils.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/apple/__init__.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/build/__init__.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/build/compiler.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/build/cppstd.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/build/cpu.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/build/cross_building.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/build/cstd.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/build/flags.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/build/stdcpp_library.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/cmake/__init__.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/cmake/cmakedeps/__init__.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/cmake/cmakedeps/templates/__init__.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/cmake/cmakedeps/templates/config_version.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/cmake/cmakedeps/templates/macros.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/cmake/cmakedeps/templates/target_configuration.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/cmake/cmakedeps/templates/target_data.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/cmake/cmakedeps/templates/targets.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/cmake/cmakedeps2/__init__.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/cmake/cmakedeps2/config_version.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/cmake/cmakedeps2/targets.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/cmake/layout.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/cmake/toolchain/__init__.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/cmake/toolchain/toolchain.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/cps/__init__.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/cps/cps_deps.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/env/__init__.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/env/virtualbuildenv.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/env/virtualrunenv.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/files/copy_pattern.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/files/files.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/files/patches.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/files/symlinks/__init__.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/files/symlinks/symlinks.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/gnu/__init__.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/gnu/autotools.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/gnu/autotoolsdeps.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/gnu/get_gnu_triplet.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/gnu/gnudeps_flags.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/gnu/makedeps.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/gnu/pkgconfig.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/gnu/pkgconfigdeps.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/google/__init__.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/google/bazel.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/google/layout.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/google/toolchain.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/intel/__init__.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/intel/intel_cc.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/meson/__init__.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/meson/helpers.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/meson/meson.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/microsoft/__init__.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/microsoft/layout.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/microsoft/msbuilddeps.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/microsoft/nmakedeps.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/microsoft/nmaketoolchain.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/microsoft/subsystems.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/microsoft/toolchain.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/premake/__init__.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/premake/constants.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/premake/premakedeps.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/premake/toolchain.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/qbs/__init__.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/qbs/common.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/qbs/qbs.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/qbs/qbsdeps.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/qbs/qbsprofile.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/ros/__init__.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/sbom/__init__.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/sbom/spdx_licenses.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/scm/__init__.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/scm/git.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/scons/__init__.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan/tools/scons/sconsdeps.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan.egg-info/dependency_links.txt +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan.egg-info/entry_points.txt +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan.egg-info/requires.txt +0 -0
- {conan-2.20.0 → conan-2.21.0}/conan.egg-info/top_level.txt +0 -0
- {conan-2.20.0/conan/tools/system → conan-2.21.0/conans}/__init__.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conans/conan.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conans/conan_server.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conans/migrations.py +0 -0
- {conan-2.20.0 → conan-2.21.0}/conans/requirements.txt +0 -0
- {conan-2.20.0 → conan-2.21.0}/conans/requirements_dev.txt +0 -0
- {conan-2.20.0 → conan-2.21.0}/conans/requirements_runner.txt +0 -0
- {conan-2.20.0 → conan-2.21.0}/conans/requirements_server.txt +0 -0
- {conan-2.20.0 → conan-2.21.0}/pyproject.toml +0 -0
- {conan-2.20.0 → conan-2.21.0}/setup.cfg +0 -0
- {conan-2.20.0 → conan-2.21.0}/setup.py +0 -0
|
@@ -28,6 +28,7 @@ from conan.internal.model.settings import load_settings_yml
|
|
|
28
28
|
from conan.internal.paths import get_conan_user_home
|
|
29
29
|
from conan.internal.api.migrations import ClientMigrator
|
|
30
30
|
from conan.internal.model.version_range import validate_conan_version
|
|
31
|
+
from conan.internal.rest.conan_requester import ConanRequester
|
|
31
32
|
|
|
32
33
|
|
|
33
34
|
class ConanAPI:
|
|
@@ -94,7 +95,6 @@ class ConanAPI:
|
|
|
94
95
|
Reinitialize the Conan API. This is useful when the configuration changes.
|
|
95
96
|
"""
|
|
96
97
|
self._api_helpers.reinit()
|
|
97
|
-
self.remotes.reinit()
|
|
98
98
|
self.local.reinit()
|
|
99
99
|
|
|
100
100
|
def migrate(self):
|
|
@@ -110,6 +110,8 @@ class ConanAPI:
|
|
|
110
110
|
self._cli_core_confs = None
|
|
111
111
|
self._init_global_conf()
|
|
112
112
|
self.hook_manager = HookManager(HomePaths(self._conan_api.home_folder).hooks_path)
|
|
113
|
+
# Wraps an http_requester to inject proxies, certs, etc
|
|
114
|
+
self._requester = ConanRequester(self.global_conf, self._conan_api.home_folder)
|
|
113
115
|
|
|
114
116
|
def set_core_confs(self, core_confs):
|
|
115
117
|
confs = ConfDefinition()
|
|
@@ -134,7 +136,13 @@ class ConanAPI:
|
|
|
134
136
|
def reinit(self):
|
|
135
137
|
self._init_global_conf()
|
|
136
138
|
self.hook_manager.reinit()
|
|
139
|
+
self._requester = ConanRequester(self.global_conf, self._conan_api.home_folder)
|
|
137
140
|
|
|
138
141
|
@property
|
|
139
142
|
def settings_yml(self):
|
|
140
143
|
return load_settings_yml(self._conan_api.home_folder)
|
|
144
|
+
|
|
145
|
+
@property
|
|
146
|
+
def requester(self):
|
|
147
|
+
return self._requester
|
|
148
|
+
|
|
@@ -1,9 +1,12 @@
|
|
|
1
|
+
import copy
|
|
1
2
|
import fnmatch
|
|
2
3
|
import json
|
|
3
4
|
import os
|
|
4
5
|
from json import JSONDecodeError
|
|
6
|
+
from typing import Iterable, Tuple, Dict
|
|
5
7
|
|
|
6
8
|
from conan.api.model import RecipeReference, PkgReference
|
|
9
|
+
from conan.api.output import ConanOutput
|
|
7
10
|
from conan.errors import ConanException
|
|
8
11
|
from conan.internal.errors import NotFoundException
|
|
9
12
|
from conan.internal.model.version_range import VersionRange
|
|
@@ -104,7 +107,7 @@ class MultiPackagesList:
|
|
|
104
107
|
)
|
|
105
108
|
|
|
106
109
|
mpkglist = MultiPackagesList._define_graph(graph, graph_recipes, graph_binaries,
|
|
107
|
-
|
|
110
|
+
context=base_context)
|
|
108
111
|
if context == "build-only":
|
|
109
112
|
host = MultiPackagesList._define_graph(graph, graph_recipes, graph_binaries,
|
|
110
113
|
context="host")
|
|
@@ -150,11 +153,11 @@ class MultiPackagesList:
|
|
|
150
153
|
continue
|
|
151
154
|
pyref = RecipeReference.loads(pyref)
|
|
152
155
|
if any(r == "*" or r == pyrecipe for r in recipes):
|
|
153
|
-
cache_list.
|
|
156
|
+
cache_list.add_ref(pyref)
|
|
154
157
|
pyremote = pyreq["remote"]
|
|
155
158
|
if pyremote:
|
|
156
159
|
remote_list = pkglist.lists.setdefault(pyremote, PackagesList())
|
|
157
|
-
remote_list.
|
|
160
|
+
remote_list.add_ref(pyref)
|
|
158
161
|
|
|
159
162
|
recipe = node["recipe"]
|
|
160
163
|
if recipe in (RECIPE_EDITABLE, RECIPE_CONSUMER, RECIPE_VIRTUAL, RECIPE_PLATFORM):
|
|
@@ -165,18 +168,18 @@ class MultiPackagesList:
|
|
|
165
168
|
ref.timestamp = node["rrev_timestamp"]
|
|
166
169
|
recipe = recipe.lower()
|
|
167
170
|
if any(r == "*" or r == recipe for r in recipes):
|
|
168
|
-
cache_list.
|
|
171
|
+
cache_list.add_ref(ref)
|
|
169
172
|
|
|
170
173
|
remote = node["remote"]
|
|
171
174
|
if remote:
|
|
172
175
|
remote_list = pkglist.lists.setdefault(remote, PackagesList())
|
|
173
|
-
remote_list.
|
|
176
|
+
remote_list.add_ref(ref)
|
|
174
177
|
pref = PkgReference(ref, node["package_id"], node["prev"], node["prev_timestamp"])
|
|
175
178
|
binary_remote = node["binary_remote"]
|
|
176
179
|
if binary_remote:
|
|
177
180
|
remote_list = pkglist.lists.setdefault(binary_remote, PackagesList())
|
|
178
|
-
remote_list.
|
|
179
|
-
remote_list.
|
|
181
|
+
remote_list.add_ref(ref) # Binary listed forces recipe listed
|
|
182
|
+
remote_list.add_pref(pref)
|
|
180
183
|
|
|
181
184
|
binary = node["binary"]
|
|
182
185
|
if binary in (BINARY_SKIP, BINARY_INVALID, BINARY_MISSING):
|
|
@@ -184,18 +187,22 @@ class MultiPackagesList:
|
|
|
184
187
|
|
|
185
188
|
binary = binary.lower()
|
|
186
189
|
if any(b == "*" or b == binary for b in binaries):
|
|
187
|
-
cache_list.
|
|
188
|
-
cache_list.
|
|
189
|
-
cache_list.add_configurations({pref: node["info"]})
|
|
190
|
+
cache_list.add_ref(ref) # Binary listed forces recipe listed
|
|
191
|
+
cache_list.add_pref(pref, node["info"])
|
|
190
192
|
return pkglist
|
|
191
193
|
|
|
192
194
|
|
|
193
195
|
class PackagesList:
|
|
194
196
|
""" A collection of recipes, revisions and packages."""
|
|
195
197
|
def __init__(self):
|
|
196
|
-
self.
|
|
198
|
+
self._data = {}
|
|
199
|
+
|
|
200
|
+
def __bool__(self):
|
|
201
|
+
""" Whether the package list contains any recipe"""
|
|
202
|
+
return bool(self._data)
|
|
197
203
|
|
|
198
204
|
def merge(self, other):
|
|
205
|
+
assert isinstance(other, PackagesList)
|
|
199
206
|
def recursive_dict_update(d, u): # TODO: repeated from conandata.py
|
|
200
207
|
for k, v in u.items():
|
|
201
208
|
if isinstance(v, dict):
|
|
@@ -203,71 +210,94 @@ class PackagesList:
|
|
|
203
210
|
else:
|
|
204
211
|
d[k] = v
|
|
205
212
|
return d
|
|
206
|
-
recursive_dict_update(self.
|
|
213
|
+
recursive_dict_update(self._data, other._data)
|
|
207
214
|
|
|
208
215
|
def keep_outer(self, other):
|
|
209
|
-
|
|
216
|
+
assert isinstance(other, PackagesList)
|
|
217
|
+
if not self._data:
|
|
210
218
|
return
|
|
211
219
|
|
|
212
|
-
for ref, info in other.
|
|
213
|
-
if self.
|
|
214
|
-
self.
|
|
220
|
+
for ref, info in other._data.items():
|
|
221
|
+
if self._data.get(ref, {}) == info:
|
|
222
|
+
self._data.pop(ref)
|
|
215
223
|
|
|
216
224
|
def split(self):
|
|
217
225
|
"""
|
|
218
|
-
Returns a list of PackageList,
|
|
226
|
+
Returns a list of PackageList, split one per reference.
|
|
219
227
|
This can be useful to parallelize things like upload, parallelizing per-reference
|
|
220
228
|
"""
|
|
221
229
|
result = []
|
|
222
|
-
for r, content in self.
|
|
230
|
+
for r, content in self._data.items():
|
|
223
231
|
subpkglist = PackagesList()
|
|
224
|
-
subpkglist.
|
|
232
|
+
subpkglist._data[r] = content
|
|
225
233
|
result.append(subpkglist)
|
|
226
234
|
return result
|
|
227
235
|
|
|
228
236
|
def only_recipes(self) -> None:
|
|
229
237
|
""" Filter out all the packages and package revisions, keep only the recipes and
|
|
230
|
-
recipe revisions in self.
|
|
238
|
+
recipe revisions in self._data.
|
|
231
239
|
"""
|
|
232
|
-
for ref, ref_dict in self.
|
|
240
|
+
for ref, ref_dict in self._data.items():
|
|
233
241
|
for rrev_dict in ref_dict.get("revisions", {}).values():
|
|
234
242
|
rrev_dict.pop("packages", None)
|
|
235
243
|
|
|
236
244
|
def add_refs(self, refs):
|
|
245
|
+
ConanOutput().warning("PackagesLists.add_refs() non-public, non-documented method will be "
|
|
246
|
+
"removed, use .add_ref() instead", warn_tag="deprecated")
|
|
237
247
|
# RREVS alreday come in ASCENDING order, so upload does older revisions first
|
|
238
248
|
for ref in refs:
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
249
|
+
self.add_ref(ref)
|
|
250
|
+
|
|
251
|
+
def add_ref(self, ref: RecipeReference) -> None:
|
|
252
|
+
"""
|
|
253
|
+
Adds a new RecipeReference to a package list
|
|
254
|
+
"""
|
|
255
|
+
ref_dict = self._data.setdefault(str(ref), {})
|
|
256
|
+
if ref.revision:
|
|
257
|
+
revs_dict = ref_dict.setdefault("revisions", {})
|
|
258
|
+
rev_dict = revs_dict.setdefault(ref.revision, {})
|
|
259
|
+
if ref.timestamp:
|
|
260
|
+
rev_dict["timestamp"] = ref.timestamp
|
|
245
261
|
|
|
246
262
|
def add_prefs(self, rrev, prefs):
|
|
263
|
+
ConanOutput().warning("PackageLists.add_prefs() non-public, non-documented method will be "
|
|
264
|
+
"removed, use .add_pref() instead", warn_tag="deprecated")
|
|
247
265
|
# Prevs already come in ASCENDING order, so upload does older revisions first
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
packages_dict = rev_dict.setdefault("packages", {})
|
|
266
|
+
for p in prefs:
|
|
267
|
+
self.add_pref(p)
|
|
251
268
|
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
269
|
+
def add_pref(self, pref: PkgReference, pkg_info: dict = None) -> None:
|
|
270
|
+
"""
|
|
271
|
+
Add a PkgReference to an already existing RecipeReference inside a package list
|
|
272
|
+
"""
|
|
273
|
+
# Prevs already come in ASCENDING order, so upload does older revisions first
|
|
274
|
+
rev_dict = self.recipe_dict(pref.ref)
|
|
275
|
+
packages_dict = rev_dict.setdefault("packages", {})
|
|
276
|
+
package_dict = packages_dict.setdefault(pref.package_id, {})
|
|
277
|
+
if pref.revision:
|
|
278
|
+
prevs_dict = package_dict.setdefault("revisions", {})
|
|
279
|
+
prev_dict = prevs_dict.setdefault(pref.revision, {})
|
|
280
|
+
if pref.timestamp:
|
|
281
|
+
prev_dict["timestamp"] = pref.timestamp
|
|
282
|
+
if pkg_info is not None:
|
|
283
|
+
package_dict["info"] = pkg_info
|
|
259
284
|
|
|
260
285
|
def add_configurations(self, confs):
|
|
286
|
+
ConanOutput().warning("PackageLists.add_configurations() non-public, non-documented method "
|
|
287
|
+
"will be removed, use .add_pref() instead",
|
|
288
|
+
warn_tag="deprecated")
|
|
261
289
|
for pref, conf in confs.items():
|
|
262
|
-
rev_dict = self.
|
|
290
|
+
rev_dict = self.recipe_dict(pref.ref)
|
|
263
291
|
try:
|
|
264
292
|
rev_dict["packages"][pref.package_id]["info"] = conf
|
|
265
293
|
except KeyError: # If package_id does not exist, do nothing, only add to existing prefs
|
|
266
294
|
pass
|
|
267
295
|
|
|
268
296
|
def refs(self):
|
|
297
|
+
ConanOutput().warning("PackageLists.refs() non-public, non-documented method will be "
|
|
298
|
+
"removed, use .items() instead", warn_tag="deprecated")
|
|
269
299
|
result = {}
|
|
270
|
-
for ref, ref_dict in self.
|
|
300
|
+
for ref, ref_dict in self._data.items():
|
|
271
301
|
for rrev, rrev_dict in ref_dict.get("revisions", {}).items():
|
|
272
302
|
t = rrev_dict.get("timestamp")
|
|
273
303
|
recipe = RecipeReference.loads(f"{ref}#{rrev}") # TODO: optimize this
|
|
@@ -276,8 +306,45 @@ class PackagesList:
|
|
|
276
306
|
result[recipe] = rrev_dict
|
|
277
307
|
return result
|
|
278
308
|
|
|
309
|
+
def items(self) -> Iterable[Tuple[RecipeReference, Dict[PkgReference, Dict]]]:
|
|
310
|
+
""" Iterate the contents of the package list.
|
|
311
|
+
|
|
312
|
+
The first dictionary is the information directly belonging to the recipe-revision.
|
|
313
|
+
The second dictionary contains PkgReference as keys, and a dictionary with the values
|
|
314
|
+
belonging to that specific package reference (settings, options, etc.).
|
|
315
|
+
"""
|
|
316
|
+
for ref, ref_dict in self._data.items():
|
|
317
|
+
for rrev, rrev_dict in ref_dict.get("revisions", {}).items():
|
|
318
|
+
recipe = RecipeReference.loads(f"{ref}#{rrev}") # TODO: optimize this
|
|
319
|
+
t = rrev_dict.get("timestamp")
|
|
320
|
+
if t is not None:
|
|
321
|
+
recipe.timestamp = t
|
|
322
|
+
packages = {}
|
|
323
|
+
for package_id, pkg_info in rrev_dict.get("packages", {}).items():
|
|
324
|
+
prevs = pkg_info.get("revisions", {})
|
|
325
|
+
for prev, prev_info in prevs.items():
|
|
326
|
+
t = prev_info.get("timestamp")
|
|
327
|
+
pref = PkgReference(recipe, package_id, prev, t)
|
|
328
|
+
packages[pref] = prev_info
|
|
329
|
+
yield recipe, packages
|
|
330
|
+
|
|
331
|
+
def recipe_dict(self, ref: RecipeReference):
|
|
332
|
+
""" Gives read/write access to the dictionary containing a specific RecipeReference
|
|
333
|
+
information.
|
|
334
|
+
"""
|
|
335
|
+
return self._data[str(ref)]["revisions"][ref.revision]
|
|
336
|
+
|
|
337
|
+
def package_dict(self, pref: PkgReference):
|
|
338
|
+
""" Gives read/write access to the dictionary containing a specific PkgReference
|
|
339
|
+
information
|
|
340
|
+
"""
|
|
341
|
+
ref_dict = self.recipe_dict(pref.ref)
|
|
342
|
+
return ref_dict["packages"][pref.package_id]["revisions"][pref.revision]
|
|
343
|
+
|
|
279
344
|
@staticmethod
|
|
280
345
|
def prefs(ref, recipe_bundle):
|
|
346
|
+
ConanOutput().warning("PackageLists.prefs() non-public, non-documented method will be "
|
|
347
|
+
"removed, use .items() instead", warn_tag="deprecated")
|
|
281
348
|
result = {}
|
|
282
349
|
for package_id, pkg_bundle in recipe_bundle.get("packages", {}).items():
|
|
283
350
|
prevs = pkg_bundle.get("revisions", {})
|
|
@@ -289,13 +356,13 @@ class PackagesList:
|
|
|
289
356
|
|
|
290
357
|
def serialize(self):
|
|
291
358
|
""" Serialize the instance to a dictionary."""
|
|
292
|
-
return self.
|
|
359
|
+
return copy.deepcopy(self._data)
|
|
293
360
|
|
|
294
361
|
@staticmethod
|
|
295
362
|
def deserialize(data):
|
|
296
363
|
""" Loads the data from a serialized dictionary."""
|
|
297
364
|
result = PackagesList()
|
|
298
|
-
result.
|
|
365
|
+
result._data = copy.deepcopy(data)
|
|
299
366
|
return result
|
|
300
367
|
|
|
301
368
|
|
|
@@ -358,10 +425,10 @@ class ListPattern:
|
|
|
358
425
|
if self.version and self.version.startswith("[") and self.version.endswith("]"):
|
|
359
426
|
return VersionRange(self.version[1:-1])
|
|
360
427
|
|
|
361
|
-
def filter_versions(self, refs):
|
|
428
|
+
def filter_versions(self, refs, resolve_prereleases=None):
|
|
362
429
|
vrange = self._version_range
|
|
363
430
|
if vrange:
|
|
364
|
-
refs = [r for r in refs if vrange.contains(r.version,
|
|
431
|
+
refs = [r for r in refs if vrange.contains(r.version, resolve_prereleases)]
|
|
365
432
|
return refs
|
|
366
433
|
|
|
367
434
|
@property
|
|
@@ -7,12 +7,13 @@ class Remote:
|
|
|
7
7
|
should not be created directly, but obtained from the relevant ``RemotesAPI`` subapi methods.
|
|
8
8
|
"""
|
|
9
9
|
def __init__(self, name, url, verify_ssl=True, disabled=False, allowed_packages=None,
|
|
10
|
-
remote_type=None):
|
|
10
|
+
remote_type=None, recipes_only=False):
|
|
11
11
|
self.name = name # Read only, is the key
|
|
12
12
|
self.url = url
|
|
13
13
|
self.verify_ssl = verify_ssl
|
|
14
14
|
self.disabled = disabled
|
|
15
15
|
self.allowed_packages = allowed_packages
|
|
16
|
+
self.recipes_only = recipes_only
|
|
16
17
|
self.remote_type = remote_type
|
|
17
18
|
self._caching = {}
|
|
18
19
|
|
|
@@ -26,6 +27,8 @@ class Remote:
|
|
|
26
27
|
allowed_msg = ""
|
|
27
28
|
if self.allowed_packages:
|
|
28
29
|
allowed_msg = ", Allowed packages: {}".format(", ".join(self.allowed_packages))
|
|
30
|
+
if self.recipes_only:
|
|
31
|
+
allowed_msg += ", Recipes only"
|
|
29
32
|
if self.remote_type == LOCAL_RECIPES_INDEX:
|
|
30
33
|
return "{}: {} [{}, Enabled: {}{}]".format(self.name, self.url, LOCAL_RECIPES_INDEX,
|
|
31
34
|
not self.disabled, allowed_msg)
|
|
@@ -3,6 +3,7 @@ import json
|
|
|
3
3
|
import os
|
|
4
4
|
import base64
|
|
5
5
|
|
|
6
|
+
from conan.api.output import ConanOutput
|
|
6
7
|
from conan.internal.api.audit.providers import ConanCenterProvider, PrivateProvider
|
|
7
8
|
from conan.errors import ConanException
|
|
8
9
|
from conan.internal.api.remotes.encrypt import encode, decode
|
|
@@ -28,12 +29,14 @@ class AuditAPI:
|
|
|
28
29
|
}
|
|
29
30
|
|
|
30
31
|
@staticmethod
|
|
31
|
-
def scan(deps_graph, provider):
|
|
32
|
+
def scan(deps_graph, provider, context=None):
|
|
32
33
|
"""
|
|
33
34
|
Scan a given recipe for vulnerabilities in its dependencies.
|
|
34
35
|
"""
|
|
35
36
|
refs = sorted(set(RecipeReference.loads(f"{node.ref.name}/{node.ref.version}")
|
|
36
|
-
for node in deps_graph.nodes[1:]
|
|
37
|
+
for node in deps_graph.nodes[1:]
|
|
38
|
+
if context is None or node.context == context),
|
|
39
|
+
key=lambda ref: ref.name)
|
|
37
40
|
return provider.get_cves(refs)
|
|
38
41
|
|
|
39
42
|
@staticmethod
|
|
@@ -109,14 +109,14 @@ class CacheAPI:
|
|
|
109
109
|
for f in backup_files:
|
|
110
110
|
remove(f)
|
|
111
111
|
|
|
112
|
-
for ref,
|
|
112
|
+
for ref, packages in package_list.items():
|
|
113
113
|
ConanOutput(ref.repr_notime()).verbose("Cleaning recipe cache contents")
|
|
114
114
|
ref_layout = cache.recipe_layout(ref)
|
|
115
115
|
if source:
|
|
116
116
|
rmdir(ref_layout.source())
|
|
117
117
|
if download:
|
|
118
118
|
rmdir(ref_layout.download_export())
|
|
119
|
-
for pref
|
|
119
|
+
for pref in packages:
|
|
120
120
|
ConanOutput(pref).verbose("Cleaning package cache contents")
|
|
121
121
|
pref_layout = cache.pkg_layout(pref)
|
|
122
122
|
if build:
|
|
@@ -135,10 +135,11 @@ class CacheAPI:
|
|
|
135
135
|
compresslevel = global_conf.get("core.gzip:compresslevel", check_type=int)
|
|
136
136
|
tar_files: dict[str, str] = {} # {path_in_tar: abs_path}
|
|
137
137
|
|
|
138
|
-
for ref,
|
|
138
|
+
for ref, packages in package_list.items():
|
|
139
139
|
ref_layout = cache.recipe_layout(ref)
|
|
140
140
|
recipe_folder = os.path.relpath(ref_layout.base_folder, cache_folder)
|
|
141
141
|
recipe_folder = recipe_folder.replace("\\", "/") # make win paths portable
|
|
142
|
+
ref_bundle = package_list.recipe_dict(ref)
|
|
142
143
|
ref_bundle["recipe_folder"] = recipe_folder
|
|
143
144
|
out.info(f"Saving {ref}: {recipe_folder}")
|
|
144
145
|
# Package only selected folders, not DOWNLOAD one
|
|
@@ -152,19 +153,20 @@ class CacheAPI:
|
|
|
152
153
|
if os.path.exists(path):
|
|
153
154
|
tar_files[f"{recipe_folder}/{DOWNLOAD_EXPORT_FOLDER}/{METADATA}"] = path
|
|
154
155
|
|
|
155
|
-
for pref
|
|
156
|
+
for pref in packages:
|
|
156
157
|
pref_layout = cache.pkg_layout(pref)
|
|
157
158
|
pkg_folder = pref_layout.package()
|
|
158
159
|
folder = os.path.relpath(pkg_folder, cache_folder)
|
|
159
160
|
folder = folder.replace("\\", "/") # make win paths portable
|
|
160
|
-
|
|
161
|
+
pkg_dict = package_list.package_dict(pref)
|
|
162
|
+
pkg_dict["package_folder"] = folder
|
|
161
163
|
out.info(f"Saving {pref}: {folder}")
|
|
162
164
|
tar_files[folder] = os.path.join(cache_folder, folder)
|
|
163
165
|
|
|
164
166
|
if os.path.exists(pref_layout.metadata()):
|
|
165
167
|
metadata_folder = os.path.relpath(pref_layout.metadata(), cache_folder)
|
|
166
168
|
metadata_folder = metadata_folder.replace("\\", "/") # make paths portable
|
|
167
|
-
|
|
169
|
+
pkg_dict["metadata_folder"] = metadata_folder
|
|
168
170
|
out.info(f"Saving {pref} metadata: {metadata_folder}")
|
|
169
171
|
tar_files[metadata_folder] = os.path.join(cache_folder, metadata_folder)
|
|
170
172
|
|
|
@@ -194,7 +196,8 @@ class CacheAPI:
|
|
|
194
196
|
# After unzipping the files, we need to update the DB that references these files
|
|
195
197
|
out = ConanOutput()
|
|
196
198
|
package_list = PackagesList.deserialize(json.loads(pkglist))
|
|
197
|
-
for ref,
|
|
199
|
+
for ref, packages in package_list.items():
|
|
200
|
+
ref_bundle = package_list.recipe_dict(ref)
|
|
198
201
|
ref.timestamp = revision_timestamp_now()
|
|
199
202
|
ref_bundle["timestamp"] = ref.timestamp
|
|
200
203
|
try:
|
|
@@ -207,8 +210,9 @@ class CacheAPI:
|
|
|
207
210
|
# In the case of recipes, they are always "in place", so just checking it
|
|
208
211
|
assert rel_path == recipe_folder, f"{rel_path}!={recipe_folder}"
|
|
209
212
|
out.info(f"Restore: {ref} in {recipe_folder}")
|
|
210
|
-
for pref
|
|
213
|
+
for pref in packages:
|
|
211
214
|
pref.timestamp = revision_timestamp_now()
|
|
215
|
+
pref_bundle = package_list.package_dict(pref)
|
|
212
216
|
pref_bundle["timestamp"] = pref.timestamp
|
|
213
217
|
try:
|
|
214
218
|
pkg_layout = cache.pkg_layout(pref)
|
|
@@ -42,7 +42,7 @@ class ConfigAPI:
|
|
|
42
42
|
"""
|
|
43
43
|
from conan.internal.api.config.config_installer import configuration_install
|
|
44
44
|
cache_folder = self._conan_api.cache_folder
|
|
45
|
-
requester = self.
|
|
45
|
+
requester = self._helpers.requester
|
|
46
46
|
configuration_install(cache_folder, requester, path_or_url, verify_ssl,
|
|
47
47
|
config_type=config_type, args=args,
|
|
48
48
|
source_folder=source_folder, target_folder=target_folder)
|
|
@@ -103,7 +103,7 @@ class ConfigAPI:
|
|
|
103
103
|
|
|
104
104
|
from conan.internal.api.config.config_installer import configuration_install
|
|
105
105
|
cache_folder = self._conan_api.cache_folder
|
|
106
|
-
requester = self.
|
|
106
|
+
requester = self._helpers.requester
|
|
107
107
|
configuration_install(cache_folder, requester, uri=pkg.conanfile.package_folder,
|
|
108
108
|
verify_ssl=False, config_type="dir",
|
|
109
109
|
ignore=["conaninfo.txt", "conanmanifest.txt"])
|
|
@@ -83,15 +83,21 @@ class DownloadAPI:
|
|
|
83
83
|
"""Download the recipes and packages specified in the ``package_list`` from the remote,
|
|
84
84
|
parallelized based on ``core.download:parallel``"""
|
|
85
85
|
def _download_pkglist(pkglist):
|
|
86
|
-
for ref,
|
|
86
|
+
for ref, packages in pkglist.items():
|
|
87
87
|
self.recipe(ref, remote, metadata)
|
|
88
|
-
|
|
88
|
+
ref_dict = pkglist.recipe_dict(ref)
|
|
89
|
+
ref_dict.pop("files", None)
|
|
90
|
+
ref_dict.pop("upload-urls", None)
|
|
91
|
+
for pref in packages:
|
|
89
92
|
self.package(pref, remote, metadata)
|
|
93
|
+
pkg_dict = pkglist.package_dict(pref)
|
|
94
|
+
pkg_dict.pop("files", None)
|
|
95
|
+
pkg_dict.pop("upload-urls", None)
|
|
90
96
|
|
|
91
97
|
t = time.time()
|
|
92
98
|
parallel = self._conan_api.config.get("core.download:parallel", default=1, check_type=int)
|
|
93
99
|
thread_pool = ThreadPool(parallel) if parallel > 1 else None
|
|
94
|
-
if not thread_pool or len(package_list.
|
|
100
|
+
if not thread_pool or len(package_list._data) <= 1: # FIXME: Iteration when multiple rrevs
|
|
95
101
|
_download_pkglist(package_list)
|
|
96
102
|
else:
|
|
97
103
|
ConanOutput().subtitle(f"Downloading with {parallel} parallel threads")
|
|
@@ -163,7 +163,8 @@ class ListAPI:
|
|
|
163
163
|
|
|
164
164
|
return result
|
|
165
165
|
|
|
166
|
-
def select(self, pattern: ListPattern, package_query=None, remote: Remote = None, lru=None,
|
|
166
|
+
def select(self, pattern: ListPattern, package_query=None, remote: Remote = None, lru=None,
|
|
167
|
+
profile=None) -> PackagesList:
|
|
167
168
|
"""For a given pattern, return a list of recipes and packages matching the provided filters.
|
|
168
169
|
|
|
169
170
|
:parameter ListPattern pattern: Search criteria
|
|
@@ -192,7 +193,9 @@ class ListAPI:
|
|
|
192
193
|
remote_name = "local cache" if not remote else remote.name
|
|
193
194
|
if search_ref:
|
|
194
195
|
refs = _search_recipes(app, search_ref, remote=remote)
|
|
195
|
-
|
|
196
|
+
global_conf = self._conan_api._api_helpers.global_conf # noqa
|
|
197
|
+
resolve_prereleases = global_conf.get("core.version_ranges:resolve_prereleases")
|
|
198
|
+
refs = pattern.filter_versions(refs, resolve_prereleases)
|
|
196
199
|
pattern.check_refs(refs)
|
|
197
200
|
out.info(f"Found {len(refs)} pkg/version recipes matching {search_ref} in {remote_name}")
|
|
198
201
|
else:
|
|
@@ -200,7 +203,8 @@ class ListAPI:
|
|
|
200
203
|
|
|
201
204
|
# Show only the recipe references
|
|
202
205
|
if pattern.package_id is None and pattern.rrev is None:
|
|
203
|
-
|
|
206
|
+
for r in refs:
|
|
207
|
+
select_bundle.add_ref(r)
|
|
204
208
|
return select_bundle
|
|
205
209
|
|
|
206
210
|
def msg_format(msg, item, total):
|
|
@@ -222,7 +226,8 @@ class ListAPI:
|
|
|
222
226
|
if lru and pattern.package_id is None: # Filter LRUs
|
|
223
227
|
rrevs = [r for r in rrevs if app.cache.get_recipe_lru(r) < limit_time]
|
|
224
228
|
|
|
225
|
-
|
|
229
|
+
for rr in rrevs:
|
|
230
|
+
select_bundle.add_ref(rr)
|
|
226
231
|
|
|
227
232
|
if pattern.package_id is None: # Stop if not displaying binaries
|
|
228
233
|
continue
|
|
@@ -263,8 +268,12 @@ class ListAPI:
|
|
|
263
268
|
if lru: # Filter LRUs
|
|
264
269
|
prefs = [r for r in prefs if app.cache.get_package_lru(r) < limit_time]
|
|
265
270
|
|
|
266
|
-
|
|
267
|
-
select_bundle.
|
|
271
|
+
# Packages dict has been listed, even if empty
|
|
272
|
+
select_bundle.recipe_dict(rrev)["packages"] = {}
|
|
273
|
+
for p in prefs:
|
|
274
|
+
# the "packages" dict is not using the package-revision
|
|
275
|
+
pkg_info = packages.get(PkgReference(p.ref, p.package_id))
|
|
276
|
+
select_bundle.add_pref(p, pkg_info)
|
|
268
277
|
return select_bundle
|
|
269
278
|
|
|
270
279
|
def explain_missing_binaries(self, ref, conaninfo, remotes):
|
|
@@ -292,7 +301,7 @@ class ListAPI:
|
|
|
292
301
|
|
|
293
302
|
candidates.sort()
|
|
294
303
|
pkglist = PackagesList()
|
|
295
|
-
pkglist.
|
|
304
|
+
pkglist.add_ref(ref)
|
|
296
305
|
# Return the closest matches, stop adding when distance is increased
|
|
297
306
|
candidate_distance = None
|
|
298
307
|
for candidate in candidates:
|
|
@@ -300,10 +309,9 @@ class ListAPI:
|
|
|
300
309
|
break
|
|
301
310
|
candidate_distance = candidate.distance
|
|
302
311
|
pref = candidate.pref
|
|
303
|
-
pkglist.
|
|
304
|
-
pkglist.add_configurations({pref: candidate.binary_config})
|
|
312
|
+
pkglist.add_pref(pref, candidate.binary_config)
|
|
305
313
|
# Add the diff data
|
|
306
|
-
rev_dict = pkglist.
|
|
314
|
+
rev_dict = pkglist.recipe_dict(ref)
|
|
307
315
|
rev_dict["packages"][pref.package_id]["diff"] = candidate.serialize()
|
|
308
316
|
remote = candidate.remote.name if candidate.remote else "Local Cache"
|
|
309
317
|
rev_dict["packages"][pref.package_id]["remote"] = remote
|
|
@@ -316,7 +324,7 @@ class ListAPI:
|
|
|
316
324
|
result = MultiPackagesList()
|
|
317
325
|
for r in remotes:
|
|
318
326
|
result_pkg_list = PackagesList()
|
|
319
|
-
for ref,
|
|
327
|
+
for ref, packages in package_list.items():
|
|
320
328
|
ref_no_rev = copy.copy(ref) # TODO: Improve ugly API
|
|
321
329
|
ref_no_rev.revision = None
|
|
322
330
|
try:
|
|
@@ -325,8 +333,8 @@ class ListAPI:
|
|
|
325
333
|
continue
|
|
326
334
|
if ref not in revs: # not found
|
|
327
335
|
continue
|
|
328
|
-
result_pkg_list.
|
|
329
|
-
for pref,
|
|
336
|
+
result_pkg_list.add_ref(ref)
|
|
337
|
+
for pref, pkg_info in packages.items():
|
|
330
338
|
pref_no_rev = copy.copy(pref) # TODO: Improve ugly API
|
|
331
339
|
pref_no_rev.revision = None
|
|
332
340
|
try:
|
|
@@ -334,10 +342,8 @@ class ListAPI:
|
|
|
334
342
|
except NotFoundException:
|
|
335
343
|
continue
|
|
336
344
|
if pref in prevs:
|
|
337
|
-
result_pkg_list.
|
|
338
|
-
|
|
339
|
-
result_pkg_list.add_configurations({pref: info})
|
|
340
|
-
if result_pkg_list.recipes:
|
|
345
|
+
result_pkg_list.add_pref(pref, pkg_info)
|
|
346
|
+
if result_pkg_list:
|
|
341
347
|
result.add(r.name, result_pkg_list)
|
|
342
348
|
return result
|
|
343
349
|
|
|
@@ -368,9 +374,9 @@ class ListAPI:
|
|
|
368
374
|
remote_ref_list = self.select(ref_pattern, package_query=None, remote=remote)
|
|
369
375
|
except NotFoundException:
|
|
370
376
|
continue
|
|
371
|
-
if not remote_ref_list
|
|
377
|
+
if not remote_ref_list:
|
|
372
378
|
continue
|
|
373
|
-
str_latest_ref = list(remote_ref_list.
|
|
379
|
+
str_latest_ref = list(remote_ref_list.serialize().keys())[-1]
|
|
374
380
|
recipe_ref = RecipeReference.loads(str_latest_ref)
|
|
375
381
|
if (node_info["latest_remote"] is None
|
|
376
382
|
or node_info["latest_remote"]["ref"] < recipe_ref):
|