diff --git a/libmamba/src/api/list.cpp b/libmamba/src/api/list.cpp index 01a5300a20..caab6e3dad 100644 --- a/libmamba/src/api/list.cpp +++ b/libmamba/src/api/list.cpp @@ -26,11 +26,12 @@ namespace mamba bool no_pip; bool reverse; bool explicit_; + bool md5; }; struct formatted_pkg { - std::string name, version, build, channel, url; + std::string name, version, build, channel, url, md5; }; bool compare_alphabetically(const formatted_pkg& a, const formatted_pkg& b) @@ -199,6 +200,7 @@ namespace mamba formatted_pkgs.version = package.second.version; formatted_pkgs.build = package.second.build_string; formatted_pkgs.url = package.second.package_url; + formatted_pkgs.md5 = package.second.md5; packages.push_back(formatted_pkgs); } } @@ -212,7 +214,14 @@ namespace mamba { for (auto p : packages) { - std::cout << p.url << std::endl; + if (options.md5) + { + std::cout << p.url << "#" << p.md5 << std::endl; + } + else + { + std::cout << p.url << std::endl; + } } } else @@ -258,6 +267,7 @@ namespace mamba options.no_pip = config.at("no_pip").value(); options.reverse = config.at("reverse").value(); options.explicit_ = config.at("explicit").value(); + options.md5 = config.at("md5").value(); auto channel_context = ChannelContext::make_conda_compatible(config.context()); detail::list_packages(config.context(), regex, channel_context, std::move(options)); diff --git a/micromamba/src/list.cpp b/micromamba/src/list.cpp index 354da91cdb..5d6776f7ec 100644 --- a/micromamba/src/list.cpp +++ b/micromamba/src/list.cpp @@ -45,6 +45,11 @@ init_list_parser(CLI::App* subcom, Configuration& config) )); subcom->add_flag("--explicit", explicit_.get_cli_config(), explicit_.description()); + auto& md5 = config.insert( + Configurable("md5", false).group("cli").description("Add MD5 hashsum when using --explicit") + ); + subcom->add_flag("--md5", md5.get_cli_config(), md5.description()); + // TODO: implement this in libmamba/list.cpp /*auto& canonical = config.insert(Configurable("canonical", false) diff --git a/micromamba/tests/test_create.py b/micromamba/tests/test_create.py index 0cbb0c3787..56b0089c4d 100644 --- a/micromamba/tests/test_create.py +++ b/micromamba/tests/test_create.py @@ -1675,6 +1675,7 @@ def test_glob_in_build_string(monkeypatch, tmp_path): for package in out["actions"]["FETCH"] ) + def test_non_url_encoding(tmp_path): # Non-regression test for https://github.com/mamba-org/mamba/issues/3737 env_prefix = tmp_path / "env-non_url_encoding" @@ -1692,4 +1693,3 @@ def test_non_url_encoding(tmp_path): non_encoded_url_start = "https://conda.anaconda.org/conda-forge/linux-64/x264-1!" out = helpers.run_env("export", "-p", env_prefix, "--explicit") assert non_encoded_url_start in out - diff --git a/micromamba/tests/test_list.py b/micromamba/tests/test_list.py index 51bc0c3745..b4530e107f 100644 --- a/micromamba/tests/test_list.py +++ b/micromamba/tests/test_list.py @@ -80,22 +80,27 @@ def test_list_no_json( @pytest.mark.parametrize("explicit_flag", ["", "--explicit"]) +@pytest.mark.parametrize("md5_flag", ["", "--md5"]) @pytest.mark.parametrize("env_selector", ["", "name", "prefix"]) @pytest.mark.parametrize("shared_pkgs_dirs", [True], indirect=True) -def test_list_explicit_no_json( - tmp_home, tmp_root_prefix, tmp_env_name, tmp_xtensor_env, env_selector, explicit_flag +def test_list_explicit( + tmp_home, tmp_root_prefix, tmp_env_name, tmp_xtensor_env, env_selector, explicit_flag, md5_flag ): if env_selector == "prefix": - res = helpers.umamba_list("-p", tmp_xtensor_env, explicit_flag) + res = helpers.umamba_list("-p", tmp_xtensor_env, explicit_flag, md5_flag) elif env_selector == "name": - res = helpers.umamba_list("-n", tmp_env_name, explicit_flag) + res = helpers.umamba_list("-n", tmp_env_name, explicit_flag, md5_flag) else: - res = helpers.umamba_list(explicit_flag) + res = helpers.umamba_list(explicit_flag, md5_flag) - packages_url_list = res.strip().split("\n")[2:] + outputs_list = res.strip().split("\n")[2:] if explicit_flag == "--explicit": - for url in packages_url_list: - assert "conda-forge" in url + for output in outputs_list: + assert "/conda-forge/" in output + if md5_flag == "--md5": + assert "#" in output + else: + assert "#" not in output @pytest.mark.parametrize("quiet_flag", ["", "-q", "--quiet"])