diff --git a/swh/loader/package/cpan/loader.py b/swh/loader/package/cpan/loader.py --- a/swh/loader/package/cpan/loader.py +++ b/swh/loader/package/cpan/loader.py @@ -5,6 +5,7 @@ from datetime import datetime import logging +import string from typing import Any, Dict, Iterator, List, Optional, Sequence, Tuple import attr @@ -34,6 +35,13 @@ @attr.s class CpanPackageInfo(BasePackageInfo): + EXTID_TYPE = "cpan-manifest-sha256" + EXTID_VERSION = 0 + + MANIFEST_FORMAT = string.Template( + "name $name\nversion $version\ndate $last_modified\nshasum $sha256sum" + ) + name = attr.ib(type=str) """Name of the package""" @@ -46,6 +54,9 @@ author = attr.ib(type=Person) """Author""" + sha256sum = attr.ib(type=str) + """sha256 checksum of package tarball""" + class CpanLoader(PackageLoader[CpanPackageInfo]): visit_type = "cpan" @@ -157,6 +168,7 @@ author=author, checksums=artifact["checksums"], directory_extrinsic_metadata=directory_extrinsic_metadata, + sha256sum=artifact["checksums"]["sha256"], ) yield release_name(version), p_info diff --git a/swh/loader/package/cpan/tests/test_cpan.py b/swh/loader/package/cpan/tests/test_cpan.py --- a/swh/loader/package/cpan/tests/test_cpan.py +++ b/swh/loader/package/cpan/tests/test_cpan.py @@ -11,7 +11,7 @@ import pytest from swh.loader.package import __version__ -from swh.loader.package.cpan.loader import CpanLoader +from swh.loader.package.cpan.loader import CpanLoader, CpanPackageInfo from swh.loader.tests import assert_last_visit_matches, check_snapshot, get_stats from swh.model.hashutil import hash_to_bytes from swh.model.model import ( @@ -207,3 +207,23 @@ ).results == expected_metadata ) + + package_extids = [ + package_info.extid() + for version in cpan_loader.get_versions() + for _, package_info in cpan_loader.get_package_info(version) + ] + + extids = storage.extid_get_from_extid( + id_type=CpanPackageInfo.EXTID_TYPE, + ids=[extid for (_, _, extid) in package_extids], + version=CpanPackageInfo.EXTID_VERSION, + ) + + release_swhids = { + CoreSWHID(object_type=ObjectType.RELEASE, object_id=branch.target) + for branch in expected_snapshot.branches.values() + if branch.target_type == TargetType.RELEASE + } + + assert {extid.target for extid in extids} == release_swhids