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