diff --git a/swh/loader/package/opam/loader.py b/swh/loader/package/opam/loader.py --- a/swh/loader/package/opam/loader.py +++ b/swh/loader/package/opam/loader.py @@ -130,11 +130,13 @@ # TODO: use `opam show` instead of this workaround when it support the `--repo` # flag package_dir = self.get_package_dir() + if not os.path.exists(package_dir): raise ValueError( f"can't get versions for package {self.opam_package} " f"(at url {self.url})." ) + versions = [ ".".join(version.split(".")[1:]) for version in os.listdir(package_dir) ] @@ -165,7 +167,6 @@ "--reinit", "--bare", "--no-setup", - "--yes", "--root", self.opam_root, self.opam_instance, diff --git a/swh/loader/package/opam/tests/data/fake_opam_repo/repo b/swh/loader/package/opam/tests/data/fake_opam_repo/_repo rename from swh/loader/package/opam/tests/data/fake_opam_repo/repo rename to swh/loader/package/opam/tests/data/fake_opam_repo/_repo diff --git a/swh/loader/package/opam/tests/data/fake_opam_repo/repo/loadertest/lock b/swh/loader/package/opam/tests/data/fake_opam_repo/repo/loadertest/lock new file mode 100644 diff --git a/swh/loader/package/opam/tests/data/fake_opam_repo/packages/agrid/agrid.0.1/opam b/swh/loader/package/opam/tests/data/fake_opam_repo/repo/loadertest/packages/agrid/agrid.0.1/opam rename from swh/loader/package/opam/tests/data/fake_opam_repo/packages/agrid/agrid.0.1/opam rename to swh/loader/package/opam/tests/data/fake_opam_repo/repo/loadertest/packages/agrid/agrid.0.1/opam diff --git a/swh/loader/package/opam/tests/data/fake_opam_repo/packages/directories/directories.0.1/opam b/swh/loader/package/opam/tests/data/fake_opam_repo/repo/loadertest/packages/directories/directories.0.1/opam rename from swh/loader/package/opam/tests/data/fake_opam_repo/packages/directories/directories.0.1/opam rename to swh/loader/package/opam/tests/data/fake_opam_repo/repo/loadertest/packages/directories/directories.0.1/opam diff --git a/swh/loader/package/opam/tests/data/fake_opam_repo/packages/directories/directories.0.2/opam b/swh/loader/package/opam/tests/data/fake_opam_repo/repo/loadertest/packages/directories/directories.0.2/opam rename from swh/loader/package/opam/tests/data/fake_opam_repo/packages/directories/directories.0.2/opam rename to swh/loader/package/opam/tests/data/fake_opam_repo/repo/loadertest/packages/directories/directories.0.2/opam diff --git a/swh/loader/package/opam/tests/data/fake_opam_repo/packages/directories/directories.0.3/opam b/swh/loader/package/opam/tests/data/fake_opam_repo/repo/loadertest/packages/directories/directories.0.3/opam rename from swh/loader/package/opam/tests/data/fake_opam_repo/packages/directories/directories.0.3/opam rename to swh/loader/package/opam/tests/data/fake_opam_repo/repo/loadertest/packages/directories/directories.0.3/opam diff --git a/swh/loader/package/opam/tests/data/fake_opam_repo/packages/ocb/ocb.0.1/opam b/swh/loader/package/opam/tests/data/fake_opam_repo/repo/loadertest/packages/ocb/ocb.0.1/opam rename from swh/loader/package/opam/tests/data/fake_opam_repo/packages/ocb/ocb.0.1/opam rename to swh/loader/package/opam/tests/data/fake_opam_repo/repo/loadertest/packages/ocb/ocb.0.1/opam diff --git a/swh/loader/package/opam/tests/data/fake_opam_repo/repo/loadertest/repos-config b/swh/loader/package/opam/tests/data/fake_opam_repo/repo/loadertest/repos-config new file mode 100644 --- /dev/null +++ b/swh/loader/package/opam/tests/data/fake_opam_repo/repo/loadertest/repos-config @@ -0,0 +1 @@ +repositories: "opam.ocaml.org" {"https://opam.ocaml.org"} diff --git a/swh/loader/package/opam/tests/test_opam.py b/swh/loader/package/opam/tests/test_opam.py --- a/swh/loader/package/opam/tests/test_opam.py +++ b/swh/loader/package/opam/tests/test_opam.py @@ -1,8 +1,13 @@ -# Copyright (C) 2019-2021 The Software Heritage developers +# Copyright (C) 2019-2022 The Software Heritage developers # See the AUTHORS file at the top-level directory of this distribution # License: GNU General Public License version 3, or any later version # See top-level LICENSE file for more information +from os.path import exists +import shutil + +import pytest + from swh.loader.package import __version__ from swh.loader.package.loader import RawExtrinsicMetadataCore from swh.loader.package.opam.loader import OpamLoader, OpamPackageInfo @@ -64,6 +69,33 @@ """ # noqa +@pytest.fixture +def fake_opam_root(mocker, tmpdir, datadir): + """Fixture to initialize the actual opam in test context. It mocks the actual opam init + calls and installs a fake opam root out of the one present in datadir. + + """ + # inhibits the real `subprocess.call` which prepares the required internal opam + # state + module_name = "swh.loader.package.opam.loader" + mock_init = mocker.patch(f"{module_name}.call", return_value=None) + + # Installs the fake opam root for the tests to use + fake_opam_root_src = f"{datadir}/fake_opam_repo" + fake_opam_root_dst = f"{tmpdir}/opam" + # old version does not support dirs_exist_ok... + # TypeError: copytree() got an unexpected keyword argument 'dirs_exist_ok' + # see: https://docs.python.org/3.7/library/shutil.html + if exists(fake_opam_root_dst): + shutil.rmtree(fake_opam_root_dst) + shutil.copytree(fake_opam_root_src, fake_opam_root_dst) + + yield fake_opam_root_dst + + # loader are initialized with `initialize_opam_root=True` so this should be called + assert mock_init.called, "This should be called when loader use this fixture" + + def test_opam_loader_no_opam_repository_fails(swh_storage, tmpdir, datadir): """Running opam loader without a prepared opam repository fails""" opam_url = f"file://{datadir}/fake_opam_repo" @@ -79,7 +111,7 @@ opam_instance, opam_url, opam_package, - initialize_opam_root=False, # The opam directory must be present + initialize_opam_root=False, # The opam directory must be present and no init... ) # No opam root directory init directory from loader. So, at the opam root does not @@ -90,10 +122,11 @@ assert actual_load_status == {"status": "failed"} -def test_opam_loader_one_version(tmpdir, requests_mock_datadir, datadir, swh_storage): - +def test_opam_loader_one_version( + tmpdir, requests_mock_datadir, fake_opam_root, datadir, swh_storage +): opam_url = f"file://{datadir}/fake_opam_repo" - opam_root = tmpdir + opam_root = fake_opam_root opam_instance = "loadertest" opam_package = "agrid" url = f"opam+{opam_url}/packages/{opam_package}" @@ -105,7 +138,7 @@ opam_instance, opam_url, opam_package, - initialize_opam_root=True, + initialize_opam_root=True, # go through the initialization while mocking it ) actual_load_status = loader.load() @@ -159,10 +192,12 @@ } == stats -def test_opam_loader_many_version(tmpdir, requests_mock_datadir, datadir, swh_storage): +def test_opam_loader_many_version( + tmpdir, requests_mock_datadir, fake_opam_root, datadir, swh_storage +): opam_url = f"file://{datadir}/fake_opam_repo" - opam_root = tmpdir + opam_root = fake_opam_root opam_instance = "loadertest" opam_package = "directories" url = f"opam+{opam_url}/packages/{opam_package}" @@ -213,10 +248,12 @@ check_snapshot(expected_snapshot, swh_storage) -def test_opam_release(tmpdir, requests_mock_datadir, swh_storage, datadir): +def test_opam_release( + tmpdir, requests_mock_datadir, fake_opam_root, swh_storage, datadir +): opam_url = f"file://{datadir}/fake_opam_repo" - opam_root = tmpdir + opam_root = fake_opam_root opam_instance = "loadertest" opam_package = "ocb" @@ -284,9 +321,11 @@ assert release.author == expected_package_info.author -def test_opam_metadata(tmpdir, requests_mock_datadir, swh_storage, datadir): +def test_opam_metadata( + tmpdir, requests_mock_datadir, fake_opam_root, swh_storage, datadir +): opam_url = f"file://{datadir}/fake_opam_repo" - opam_root = tmpdir + opam_root = fake_opam_root opam_instance = "loadertest" opam_package = "ocb"