conan 2.20.1__tar.gz → 2.22.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.1/conan.egg-info → conan-2.22.0}/PKG-INFO +1 -1
- {conan-2.20.1 → conan-2.22.0}/conan/__init__.py +1 -1
- {conan-2.20.1 → conan-2.22.0}/conan/api/conan_api.py +17 -4
- {conan-2.20.1 → conan-2.22.0}/conan/api/model/list.py +110 -43
- {conan-2.20.1 → conan-2.22.0}/conan/api/model/remote.py +4 -1
- {conan-2.20.1 → conan-2.22.0}/conan/api/output.py +16 -12
- {conan-2.20.1 → conan-2.22.0}/conan/api/subapi/audit.py +5 -2
- {conan-2.20.1 → conan-2.22.0}/conan/api/subapi/cache.py +14 -10
- {conan-2.20.1 → conan-2.22.0}/conan/api/subapi/config.py +39 -2
- {conan-2.20.1 → conan-2.22.0}/conan/api/subapi/download.py +11 -5
- conan-2.22.0/conan/api/subapi/export.py +153 -0
- {conan-2.20.1 → conan-2.22.0}/conan/api/subapi/list.py +37 -35
- {conan-2.20.1 → conan-2.22.0}/conan/api/subapi/profiles.py +5 -2
- {conan-2.20.1 → conan-2.22.0}/conan/api/subapi/remotes.py +9 -12
- {conan-2.20.1 → conan-2.22.0}/conan/api/subapi/upload.py +4 -4
- {conan-2.20.1 → conan-2.22.0}/conan/api/subapi/workspace.py +10 -2
- {conan-2.20.1 → conan-2.22.0}/conan/cli/args.py +67 -56
- {conan-2.20.1 → conan-2.22.0}/conan/cli/command.py +15 -6
- {conan-2.20.1 → conan-2.22.0}/conan/cli/commands/audit.py +7 -4
- {conan-2.20.1 → conan-2.22.0}/conan/cli/commands/build.py +3 -1
- {conan-2.20.1 → conan-2.22.0}/conan/cli/commands/config.py +1 -1
- {conan-2.20.1 → conan-2.22.0}/conan/cli/commands/download.py +1 -1
- {conan-2.20.1 → conan-2.22.0}/conan/cli/commands/editable.py +9 -4
- {conan-2.20.1 → conan-2.22.0}/conan/cli/commands/export.py +4 -2
- {conan-2.20.1 → conan-2.22.0}/conan/cli/commands/export_pkg.py +17 -34
- {conan-2.20.1 → conan-2.22.0}/conan/cli/commands/graph.py +1 -6
- {conan-2.20.1 → conan-2.22.0}/conan/cli/commands/inspect.py +3 -1
- {conan-2.20.1 → conan-2.22.0}/conan/cli/commands/list.py +8 -1
- {conan-2.20.1 → conan-2.22.0}/conan/cli/commands/lock.py +0 -3
- {conan-2.20.1 → conan-2.22.0}/conan/cli/commands/remote.py +18 -4
- {conan-2.20.1 → conan-2.22.0}/conan/cli/commands/remove.py +24 -30
- {conan-2.20.1 → conan-2.22.0}/conan/cli/commands/search.py +2 -3
- {conan-2.20.1 → conan-2.22.0}/conan/cli/commands/source.py +3 -1
- {conan-2.20.1 → conan-2.22.0}/conan/cli/commands/test.py +3 -1
- {conan-2.20.1 → conan-2.22.0}/conan/cli/commands/upload.py +18 -21
- {conan-2.20.1 → conan-2.22.0}/conan/cli/commands/workspace.py +1 -1
- {conan-2.20.1 → conan-2.22.0}/conan/cli/formatters/audit/vulnerabilities.py +1 -1
- {conan-2.20.1 → conan-2.22.0}/conan/cli/formatters/graph/graph_info_text.py +17 -1
- {conan-2.20.1 → conan-2.22.0}/conan/cli/formatters/report/diff.py +47 -4
- conan-2.22.0/conan/cli/formatters/report/diff_html.py +714 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/api/audit/providers.py +2 -2
- {conan-2.20.1 → conan-2.22.0}/conan/internal/api/detect/detect_api.py +3 -2
- {conan-2.20.1 → conan-2.22.0}/conan/internal/api/detect/detect_vs.py +1 -1
- {conan-2.20.1 → conan-2.22.0}/conan/internal/api/export.py +20 -2
- {conan-2.20.1 → conan-2.22.0}/conan/internal/api/install/generators.py +27 -6
- {conan-2.20.1 → conan-2.22.0}/conan/internal/api/list/query_parse.py +2 -2
- {conan-2.20.1 → conan-2.22.0}/conan/internal/api/profile/profile_loader.py +4 -0
- conan-2.22.0/conan/internal/api/upload.py +18 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/api/uploader.py +26 -13
- {conan-2.20.1 → conan-2.22.0}/conan/internal/cache/cache.py +5 -5
- {conan-2.20.1 → conan-2.22.0}/conan/internal/cache/db/cache_database.py +6 -5
- {conan-2.20.1 → conan-2.22.0}/conan/internal/cache/integrity_check.py +2 -2
- {conan-2.20.1 → conan-2.22.0}/conan/internal/conan_app.py +4 -4
- {conan-2.20.1 → conan-2.22.0}/conan/internal/default_settings.py +22 -12
- {conan-2.20.1 → conan-2.22.0}/conan/internal/graph/compatibility.py +11 -7
- {conan-2.20.1 → conan-2.22.0}/conan/internal/graph/compute_pid.py +12 -6
- {conan-2.20.1 → conan-2.22.0}/conan/internal/graph/graph.py +6 -4
- {conan-2.20.1 → conan-2.22.0}/conan/internal/graph/graph_binaries.py +76 -55
- {conan-2.20.1 → conan-2.22.0}/conan/internal/graph/graph_builder.py +20 -25
- {conan-2.20.1 → conan-2.22.0}/conan/internal/graph/install_graph.py +1 -1
- {conan-2.20.1 → conan-2.22.0}/conan/internal/graph/installer.py +11 -6
- {conan-2.20.1 → conan-2.22.0}/conan/internal/graph/proxy.py +4 -4
- {conan-2.20.1 → conan-2.22.0}/conan/internal/graph/python_requires.py +1 -1
- {conan-2.20.1 → conan-2.22.0}/conan/internal/graph/range_resolver.py +8 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/hook_manager.py +6 -1
- {conan-2.20.1 → conan-2.22.0}/conan/internal/internal_tools.py +2 -1
- {conan-2.20.1 → conan-2.22.0}/conan/internal/model/conanfile_interface.py +10 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/model/conf.py +4 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/model/cpp_info.py +7 -4
- {conan-2.20.1 → conan-2.22.0}/conan/internal/model/dependencies.py +3 -5
- {conan-2.20.1 → conan-2.22.0}/conan/internal/model/info.py +8 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/model/lockfile.py +1 -1
- {conan-2.20.1 → conan-2.22.0}/conan/internal/model/profile.py +3 -2
- {conan-2.20.1 → conan-2.22.0}/conan/internal/model/requires.py +3 -1
- {conan-2.20.1 → conan-2.22.0}/conan/internal/model/workspace.py +7 -4
- {conan-2.20.1 → conan-2.22.0}/conan/internal/rest/caching_file_downloader.py +0 -1
- {conan-2.20.1 → conan-2.22.0}/conan/internal/rest/download_cache.py +8 -8
- {conan-2.20.1 → conan-2.22.0}/conan/internal/rest/file_downloader.py +2 -2
- {conan-2.20.1 → conan-2.22.0}/conan/internal/rest/pkg_sign.py +4 -2
- {conan-2.20.1 → conan-2.22.0}/conan/internal/rest/remote_manager.py +45 -18
- {conan-2.20.1 → conan-2.22.0}/conan/internal/rest/rest_client.py +2 -2
- {conan-2.20.1 → conan-2.22.0}/conan/internal/rest/rest_client_local_recipe_index.py +5 -4
- {conan-2.20.1 → conan-2.22.0}/conan/internal/rest/rest_client_v2.py +4 -11
- {conan-2.20.1 → conan-2.22.0}/conan/internal/runner/docker.py +2 -1
- conan-2.20.1/conan/tools/build/cpu.py → conan-2.22.0/conan/internal/util/__init__.py +1 -24
- {conan-2.20.1 → conan-2.22.0}/conan/internal/util/files.py +0 -1
- {conan-2.20.1 → conan-2.22.0}/conan/test/assets/premake.py +2 -2
- {conan-2.20.1 → conan-2.22.0}/conan/test/utils/server_launcher.py +2 -2
- {conan-2.20.1 → conan-2.22.0}/conan/test/utils/tools.py +7 -7
- {conan-2.20.1 → conan-2.22.0}/conan/tools/apple/apple.py +35 -18
- {conan-2.20.1 → conan-2.22.0}/conan/tools/apple/xcodebuild.py +12 -3
- {conan-2.20.1 → conan-2.22.0}/conan/tools/apple/xcodedeps.py +8 -5
- {conan-2.20.1 → conan-2.22.0}/conan/tools/apple/xcodetoolchain.py +6 -3
- conan-2.22.0/conan/tools/build/cpu.py +21 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/build/flags.py +32 -1
- {conan-2.20.1 → conan-2.22.0}/conan/tools/cmake/cmake.py +31 -9
- {conan-2.20.1 → conan-2.22.0}/conan/tools/cmake/cmakedeps/cmakedeps.py +7 -7
- {conan-2.20.1 → conan-2.22.0}/conan/tools/cmake/cmakedeps/templates/config.py +25 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/cmake/cmakedeps/templates/target_data.py +3 -5
- {conan-2.20.1 → conan-2.22.0}/conan/tools/cmake/cmakedeps2/cmakedeps.py +24 -2
- {conan-2.20.1 → conan-2.22.0}/conan/tools/cmake/cmakedeps2/config.py +81 -13
- {conan-2.20.1 → conan-2.22.0}/conan/tools/cmake/cmakedeps2/target_configuration.py +20 -52
- {conan-2.20.1 → conan-2.22.0}/conan/tools/cmake/presets.py +12 -7
- {conan-2.20.1 → conan-2.22.0}/conan/tools/cmake/toolchain/blocks.py +7 -34
- {conan-2.20.1 → conan-2.22.0}/conan/tools/cmake/toolchain/toolchain.py +2 -1
- conan-2.22.0/conan/tools/cmake/utils.py +45 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/env/environment.py +137 -52
- {conan-2.20.1 → conan-2.22.0}/conan/tools/files/__init__.py +0 -1
- {conan-2.20.1 → conan-2.22.0}/conan/tools/files/conandata.py +2 -1
- {conan-2.20.1 → conan-2.22.0}/conan/tools/gnu/autotoolstoolchain.py +15 -7
- {conan-2.20.1 → conan-2.22.0}/conan/tools/gnu/gnutoolchain.py +17 -7
- {conan-2.20.1 → conan-2.22.0}/conan/tools/google/bazeldeps.py +10 -2
- {conan-2.20.1 → conan-2.22.0}/conan/tools/layout/__init__.py +3 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/meson/helpers.py +9 -6
- {conan-2.20.1 → conan-2.22.0}/conan/tools/meson/toolchain.py +3 -3
- {conan-2.20.1 → conan-2.22.0}/conan/tools/microsoft/msbuild.py +4 -4
- {conan-2.20.1 → conan-2.22.0}/conan/tools/microsoft/toolchain.py +35 -3
- {conan-2.20.1 → conan-2.22.0}/conan/tools/microsoft/visual.py +6 -3
- {conan-2.20.1 → conan-2.22.0}/conan/tools/premake/premake.py +1 -0
- conan-2.22.0/conan/tools/ros/rosenv.py +78 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/sbom/cyclonedx.py +34 -19
- conan-2.22.0/conan/tools/system/__init__.py +1 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/system/package_manager.py +4 -2
- conan-2.22.0/conan/tools/system/pip_manager.py +61 -0
- {conan-2.20.1 → conan-2.22.0/conan.egg-info}/PKG-INFO +1 -1
- {conan-2.20.1 → conan-2.22.0}/conan.egg-info/SOURCES.txt +2 -5
- conan-2.20.1/conan/api/subapi/export.py +0 -64
- conan-2.20.1/conan/cli/formatters/report/diff_html.py +0 -154
- conan-2.20.1/conan/internal/api/upload.py +0 -16
- conan-2.20.1/conan/tools/cmake/utils.py +0 -5
- conan-2.20.1/conan/tools/files/packager.py +0 -99
- conan-2.20.1/conan/tools/ros/rosenv.py +0 -53
- conan-2.20.1/conan/tools/system/__init__.py +0 -0
- conan-2.20.1/conans/__init__.py +0 -0
- conan-2.20.1/conans/model/__init__.py +0 -0
- conan-2.20.1/conans/model/package_ref.py +0 -31
- conan-2.20.1/conans/model/recipe_ref.py +0 -31
- {conan-2.20.1 → conan-2.22.0}/LICENSE.md +0 -0
- {conan-2.20.1 → conan-2.22.0}/MANIFEST.in +0 -0
- {conan-2.20.1 → conan-2.22.0}/README.md +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/api/__init__.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/api/input.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/api/model/__init__.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/api/model/refs.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/api/subapi/__init__.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/api/subapi/command.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/api/subapi/graph.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/api/subapi/install.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/api/subapi/local.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/api/subapi/lockfile.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/api/subapi/new.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/api/subapi/remove.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/api/subapi/report.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/cli/__init__.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/cli/cli.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/cli/commands/__init__.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/cli/commands/cache.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/cli/commands/create.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/cli/commands/install.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/cli/commands/new.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/cli/commands/pkglist.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/cli/commands/profile.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/cli/commands/report.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/cli/commands/version.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/cli/exit_codes.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/cli/formatters/__init__.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/cli/formatters/audit/__init__.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/cli/formatters/graph/__init__.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/cli/formatters/graph/build_order_html.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/cli/formatters/graph/graph.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/cli/formatters/graph/info_graph_dot.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/cli/formatters/graph/info_graph_html.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/cli/formatters/list/__init__.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/cli/formatters/list/list.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/cli/formatters/list/search_table_html.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/cli/formatters/report/__init__.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/cli/printers/__init__.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/cli/printers/graph.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/cps/__init__.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/cps/cps.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/errors.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/__init__.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/api/__init__.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/api/audit/__init__.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/api/config/__init__.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/api/config/config_installer.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/api/detect/__init__.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/api/install/__init__.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/api/list/__init__.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/api/local/__init__.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/api/local/editable.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/api/migrations.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/api/new/__init__.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/api/new/alias_new.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/api/new/autoools_exe.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/api/new/autotools_lib.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/api/new/basic.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/api/new/bazel_7_exe.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/api/new/bazel_7_lib.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/api/new/bazel_exe.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/api/new/bazel_lib.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/api/new/cmake_exe.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/api/new/cmake_lib.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/api/new/header_lib.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/api/new/local_recipes_index.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/api/new/meson_exe.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/api/new/meson_lib.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/api/new/msbuild_exe.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/api/new/msbuild_lib.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/api/new/premake_exe.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/api/new/premake_lib.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/api/new/qbs_lib.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/api/new/workspace.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/api/profile/__init__.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/api/profile/detect.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/api/remotes/__init__.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/api/remotes/encrypt.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/api/remotes/localdb.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/cache/__init__.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/cache/conan_reference_layout.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/cache/db/__init__.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/cache/db/packages_table.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/cache/db/recipes_table.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/cache/db/table.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/cache/home_paths.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/deploy.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/errors.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/graph/__init__.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/graph/build_mode.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/graph/graph_error.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/graph/profile_node_definer.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/graph/provides.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/loader.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/methods.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/model/__init__.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/model/conan_file.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/model/layout.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/model/manifest.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/model/options.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/model/pkg_type.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/model/recipe_ref.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/model/settings.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/model/version.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/model/version_range.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/paths.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/rest/__init__.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/rest/auth_manager.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/rest/client_routes.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/rest/conan_requester.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/rest/file_uploader.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/rest/remote_credentials.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/rest/rest_routes.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/runner/__init__.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/runner/output.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/runner/ssh.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/runner/wsl.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/source.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/subsystems.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/util/config_parser.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/util/dates.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/internal/util/runners.py +0 -0
- {conan-2.20.1/conan/internal/util → conan-2.22.0/conan/test}/__init__.py +0 -0
- {conan-2.20.1/conan/test → conan-2.22.0/conan/test/assets}/__init__.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/test/assets/autotools.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/test/assets/cmake.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/test/assets/genconanfile.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/test/assets/sources.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/test/assets/visual_project_files.py +0 -0
- {conan-2.20.1/conan/test/assets → conan-2.22.0/conan/test/utils}/__init__.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/test/utils/artifactory.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/test/utils/env.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/test/utils/file_server.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/test/utils/mocks.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/test/utils/profiles.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/test/utils/scm.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/test/utils/test_files.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/__init__.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/android/__init__.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/android/utils.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/apple/__init__.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/build/__init__.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/build/compiler.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/build/cppstd.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/build/cross_building.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/build/cstd.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/build/stdcpp_library.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/cmake/__init__.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/cmake/cmakedeps/__init__.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/cmake/cmakedeps/templates/__init__.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/cmake/cmakedeps/templates/config_version.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/cmake/cmakedeps/templates/macros.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/cmake/cmakedeps/templates/target_configuration.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/cmake/cmakedeps/templates/targets.py +0 -0
- {conan-2.20.1/conan/test/utils → conan-2.22.0/conan/tools/cmake/cmakedeps2}/__init__.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/cmake/cmakedeps2/config_version.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/cmake/cmakedeps2/targets.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/cmake/layout.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/cmake/toolchain/__init__.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/cps/__init__.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/cps/cps_deps.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/env/__init__.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/env/virtualbuildenv.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/env/virtualrunenv.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/files/copy_pattern.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/files/files.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/files/patches.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/files/symlinks/__init__.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/files/symlinks/symlinks.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/gnu/__init__.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/gnu/autotools.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/gnu/autotoolsdeps.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/gnu/get_gnu_triplet.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/gnu/gnudeps_flags.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/gnu/makedeps.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/gnu/pkgconfig.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/gnu/pkgconfigdeps.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/google/__init__.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/google/bazel.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/google/layout.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/google/toolchain.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/intel/__init__.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/intel/intel_cc.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/meson/__init__.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/meson/meson.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/microsoft/__init__.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/microsoft/layout.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/microsoft/msbuilddeps.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/microsoft/nmakedeps.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/microsoft/nmaketoolchain.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/microsoft/subsystems.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/premake/__init__.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/premake/constants.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/premake/premakedeps.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/premake/toolchain.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/qbs/__init__.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/qbs/common.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/qbs/qbs.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/qbs/qbsdeps.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/qbs/qbsprofile.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/ros/__init__.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/sbom/__init__.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/sbom/spdx_licenses.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/scm/__init__.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/scm/git.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/scons/__init__.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan/tools/scons/sconsdeps.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan.egg-info/dependency_links.txt +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan.egg-info/entry_points.txt +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan.egg-info/requires.txt +0 -0
- {conan-2.20.1 → conan-2.22.0}/conan.egg-info/top_level.txt +0 -0
- {conan-2.20.1/conan/tools/cmake/cmakedeps2 → conan-2.22.0/conans}/__init__.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conans/conan.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conans/conan_server.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conans/migrations.py +0 -0
- {conan-2.20.1 → conan-2.22.0}/conans/requirements.txt +0 -0
- {conan-2.20.1 → conan-2.22.0}/conans/requirements_dev.txt +0 -0
- {conan-2.20.1 → conan-2.22.0}/conans/requirements_runner.txt +0 -0
- {conan-2.20.1 → conan-2.22.0}/conans/requirements_server.txt +0 -0
- {conan-2.20.1 → conan-2.22.0}/pyproject.toml +0 -0
- {conan-2.20.1 → conan-2.22.0}/setup.cfg +0 -0
- {conan-2.20.1 → conan-2.22.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:
|
|
@@ -65,7 +66,8 @@ class ConanAPI:
|
|
|
65
66
|
self.profiles = ProfilesAPI(self, self._api_helpers)
|
|
66
67
|
self.install = InstallAPI(self, self._api_helpers)
|
|
67
68
|
self.graph = GraphAPI(self, self._api_helpers)
|
|
68
|
-
|
|
69
|
+
#: Used to export recipes and pre-compiled package binaries to the Conan cache
|
|
70
|
+
self.export: ExportAPI = ExportAPI(self, self._api_helpers)
|
|
69
71
|
self.remove = RemoveAPI(self)
|
|
70
72
|
self.new = NewAPI(self)
|
|
71
73
|
#: Used to upload recipes and packages to remotes
|
|
@@ -81,7 +83,7 @@ class ConanAPI:
|
|
|
81
83
|
self.report = ReportAPI(self, self._api_helpers)
|
|
82
84
|
|
|
83
85
|
@property
|
|
84
|
-
def home_folder(self):
|
|
86
|
+
def home_folder(self) -> str:
|
|
85
87
|
""" Where the Conan user home is located. Read only.
|
|
86
88
|
Can be modified by the ``CONAN_HOME`` environment variable or by the
|
|
87
89
|
``.conanrc`` file in the current directory or any parent directory
|
|
@@ -94,7 +96,6 @@ class ConanAPI:
|
|
|
94
96
|
Reinitialize the Conan API. This is useful when the configuration changes.
|
|
95
97
|
"""
|
|
96
98
|
self._api_helpers.reinit()
|
|
97
|
-
self.remotes.reinit()
|
|
98
99
|
self.local.reinit()
|
|
99
100
|
|
|
100
101
|
def migrate(self):
|
|
@@ -110,6 +111,9 @@ class ConanAPI:
|
|
|
110
111
|
self._cli_core_confs = None
|
|
111
112
|
self._init_global_conf()
|
|
112
113
|
self.hook_manager = HookManager(HomePaths(self._conan_api.home_folder).hooks_path)
|
|
114
|
+
# Wraps an http_requester to inject proxies, certs, etc
|
|
115
|
+
self._requester = ConanRequester(self.global_conf, self._conan_api.home_folder)
|
|
116
|
+
self._settings_yml = None
|
|
113
117
|
|
|
114
118
|
def set_core_confs(self, core_confs):
|
|
115
119
|
confs = ConfDefinition()
|
|
@@ -134,7 +138,16 @@ class ConanAPI:
|
|
|
134
138
|
def reinit(self):
|
|
135
139
|
self._init_global_conf()
|
|
136
140
|
self.hook_manager.reinit()
|
|
141
|
+
self._requester = ConanRequester(self.global_conf, self._conan_api.home_folder)
|
|
142
|
+
self._settings_yml = None
|
|
137
143
|
|
|
138
144
|
@property
|
|
139
145
|
def settings_yml(self):
|
|
140
|
-
|
|
146
|
+
if self._settings_yml is None:
|
|
147
|
+
self._settings_yml = load_settings_yml(self._conan_api.home_folder)
|
|
148
|
+
return self._settings_yml
|
|
149
|
+
|
|
150
|
+
@property
|
|
151
|
+
def requester(self):
|
|
152
|
+
return self._requester
|
|
153
|
+
|
|
@@ -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)
|
|
@@ -124,22 +124,26 @@ class ConanOutput:
|
|
|
124
124
|
def set_warnings_as_errors(cls, value):
|
|
125
125
|
cls._warnings_as_errors = value
|
|
126
126
|
|
|
127
|
+
@classmethod
|
|
128
|
+
def valid_log_levels(cls):
|
|
129
|
+
return {"quiet": LEVEL_QUIET, # -vquiet 80
|
|
130
|
+
"error": LEVEL_ERROR, # -verror 70
|
|
131
|
+
"warning": LEVEL_WARNING, # -vwaring 60
|
|
132
|
+
"notice": LEVEL_NOTICE, # -vnotice 50
|
|
133
|
+
"status": LEVEL_STATUS, # -vstatus 40
|
|
134
|
+
None: LEVEL_VERBOSE, # -v 30
|
|
135
|
+
"verbose": LEVEL_VERBOSE, # -vverbose 30
|
|
136
|
+
"debug": LEVEL_DEBUG, # -vdebug 20
|
|
137
|
+
"v": LEVEL_DEBUG, # -vv 20
|
|
138
|
+
"trace": LEVEL_TRACE, # -vtrace 10
|
|
139
|
+
"vv": LEVEL_TRACE # -vvv 10
|
|
140
|
+
}
|
|
141
|
+
|
|
127
142
|
@classmethod
|
|
128
143
|
def define_log_level(cls, v):
|
|
129
144
|
env_level = os.getenv("CONAN_LOG_LEVEL")
|
|
130
145
|
v = env_level or v
|
|
131
|
-
levels =
|
|
132
|
-
"error": LEVEL_ERROR, # -verror 70
|
|
133
|
-
"warning": LEVEL_WARNING, # -vwaring 60
|
|
134
|
-
"notice": LEVEL_NOTICE, # -vnotice 50
|
|
135
|
-
"status": LEVEL_STATUS, # -vstatus 40
|
|
136
|
-
None: LEVEL_VERBOSE, # -v 30
|
|
137
|
-
"verbose": LEVEL_VERBOSE, # -vverbose 30
|
|
138
|
-
"debug": LEVEL_DEBUG, # -vdebug 20
|
|
139
|
-
"v": LEVEL_DEBUG, # -vv 20
|
|
140
|
-
"trace": LEVEL_TRACE, # -vtrace 10
|
|
141
|
-
"vv": LEVEL_TRACE # -vvv 10
|
|
142
|
-
}
|
|
146
|
+
levels = cls.valid_log_levels()
|
|
143
147
|
try:
|
|
144
148
|
level = levels[v]
|
|
145
149
|
except KeyError:
|
|
@@ -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)
|
|
@@ -272,7 +276,7 @@ class CacheAPI:
|
|
|
272
276
|
def _resolve_latest_ref(cache, ref):
|
|
273
277
|
if ref.revision is None or ref.revision == "latest":
|
|
274
278
|
ref.revision = None
|
|
275
|
-
result = cache.
|
|
279
|
+
result = cache.get_latest_recipe_revision(ref)
|
|
276
280
|
if result is None:
|
|
277
281
|
raise ConanException(f"'{ref}' not found in cache")
|
|
278
282
|
ref = result
|
|
@@ -283,7 +287,7 @@ def _resolve_latest_pref(cache, pref):
|
|
|
283
287
|
pref.ref = _resolve_latest_ref(cache, pref.ref)
|
|
284
288
|
if pref.revision is None or pref.revision == "latest":
|
|
285
289
|
pref.revision = None
|
|
286
|
-
result = cache.
|
|
290
|
+
result = cache.get_latest_package_revision(pref)
|
|
287
291
|
if result is None:
|
|
288
292
|
raise ConanException(f"'{pref.repr_notime()}' not found in cache")
|
|
289
293
|
pref = result
|
|
@@ -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"])
|
|
@@ -150,3 +150,40 @@ class ConfigAPI:
|
|
|
150
150
|
self._conan_api.reinit()
|
|
151
151
|
# CHECK: This also generates a remotes.json that is not there after a conan profile show?
|
|
152
152
|
self._conan_api.migrate()
|
|
153
|
+
|
|
154
|
+
@property
|
|
155
|
+
def settings_yml(self):
|
|
156
|
+
""" Get the contents of the settings.yml and user_settings.yml files,
|
|
157
|
+
which define the possible values for settings.
|
|
158
|
+
|
|
159
|
+
Note that this is different from the settings present in a conanfile,
|
|
160
|
+
which represent the actual values for a specific package, while this
|
|
161
|
+
property represents the possible values for each setting.
|
|
162
|
+
|
|
163
|
+
:returns: A read-only object representing the settings scheme, with a
|
|
164
|
+
``possible_values()`` method that returns a dictionary with the possible values for each setting,
|
|
165
|
+
and a ``fields`` property that returns an ordered list with the fields of each setting.
|
|
166
|
+
Note that it's possible to access nested settings using attribute access,
|
|
167
|
+
such as ``settings_yml.compiler.possible_values()``.
|
|
168
|
+
"""
|
|
169
|
+
|
|
170
|
+
class SettingsYmlInterface:
|
|
171
|
+
def __init__(self, settings):
|
|
172
|
+
self._settings = settings
|
|
173
|
+
|
|
174
|
+
def possible_values(self):
|
|
175
|
+
""" returns a dict with the possible values for each setting """
|
|
176
|
+
return self._settings.possible_values()
|
|
177
|
+
|
|
178
|
+
@property
|
|
179
|
+
def fields(self):
|
|
180
|
+
""" returns a dict with the fields of each setting """
|
|
181
|
+
return self._settings.fields
|
|
182
|
+
|
|
183
|
+
def __getattr__(self, item):
|
|
184
|
+
return SettingsYmlInterface(getattr(self._settings, item))
|
|
185
|
+
|
|
186
|
+
def __str__(self):
|
|
187
|
+
return str(self._settings)
|
|
188
|
+
|
|
189
|
+
return SettingsYmlInterface(self._helpers.settings_yml)
|
|
@@ -37,7 +37,7 @@ class DownloadAPI:
|
|
|
37
37
|
if ref.timestamp is None: # we didnt obtain the timestamp before (in general it should be)
|
|
38
38
|
# Respect the timestamp of the server, the ``get_recipe()`` doesn't do it internally
|
|
39
39
|
# Best would be that ``get_recipe()`` returns the timestamp in the same call
|
|
40
|
-
server_ref = app.remote_manager.
|
|
40
|
+
server_ref = app.remote_manager.get_recipe_revision(ref, remote)
|
|
41
41
|
assert server_ref == ref
|
|
42
42
|
ref.timestamp = server_ref.timestamp
|
|
43
43
|
app.remote_manager.get_recipe(ref, remote, metadata)
|
|
@@ -70,7 +70,7 @@ class DownloadAPI:
|
|
|
70
70
|
|
|
71
71
|
if pref.timestamp is None: # we didn't obtain the timestamp before (in general it should be)
|
|
72
72
|
# Respect the timestamp of the server
|
|
73
|
-
server_pref = app.remote_manager.
|
|
73
|
+
server_pref = app.remote_manager.get_package_revision(pref, remote)
|
|
74
74
|
assert server_pref == pref
|
|
75
75
|
pref.timestamp = server_pref.timestamp
|
|
76
76
|
|
|
@@ -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")
|