diff --git a/swh/model/identifiers.py b/swh/model/identifiers.py index 04bd407807e1dfa1c171c485fee94349d9113780..421d2e77cd0111f35b8a787a0f5b3d41443973c2 100644 --- a/swh/model/identifiers.py +++ b/swh/model/identifiers.py @@ -857,6 +857,7 @@ def extid_identifier(extid: Dict[str, Any]) -> str: ``` extid_type $StrWithoutSpaces + [extid_version $Str] extid $Bytes target $CoreSwhid ``` @@ -866,6 +867,8 @@ def extid_identifier(extid: Dict[str, Any]) -> str: Newlines in $Bytes are escaped as with other git fields, ie. by adding a space after them. + The extid_version line is only generated if the version is non-zero. + Returns: str: the intrinsic identifier for `extid` @@ -873,9 +876,14 @@ def extid_identifier(extid: Dict[str, Any]) -> str: headers = [ (b"extid_type", extid["extid_type"].encode("ascii")), - (b"extid", extid["extid"]), - (b"target", str(extid["target"]).encode("ascii")), ] + extid_version = extid.get("extid_version", 0) + if extid_version != 0: + headers.append((b"extid_version", str(extid_version).encode("ascii"))) + + headers.extend( + [(b"extid", extid["extid"]), (b"target", str(extid["target"]).encode("ascii")),] + ) git_object = format_git_object_from_headers("extid", headers) return hashlib.new("sha1", git_object).hexdigest() diff --git a/swh/model/model.py b/swh/model/model.py index 1d1c1ce571d777d7cde69eedcc6d3d9b7ecc76a7..e34eea10e1da955393d739b9f3498ee8d82ee6e6 100644 --- a/swh/model/model.py +++ b/swh/model/model.py @@ -1133,6 +1133,7 @@ class ExtID(HashableObject, BaseModel): extid_type = attr.ib(type=str, validator=type_validator()) extid = attr.ib(type=bytes, validator=type_validator()) target = attr.ib(type=CoreSWHID, validator=type_validator()) + extid_version = attr.ib(type=int, validator=type_validator(), default=0) id = attr.ib(type=Sha1Git, validator=type_validator(), default=b"") @@ -1142,6 +1143,7 @@ class ExtID(HashableObject, BaseModel): extid=d["extid"], extid_type=d["extid_type"], target=CoreSWHID.from_string(d["target"]), + extid_version=d.get("extid_version", 0), ) def compute_hash(self) -> bytes: diff --git a/swh/model/tests/swh_model_data.py b/swh/model/tests/swh_model_data.py index 8db2a2856ae797bb41714fc858c161d63bb0c011..1f5dded97c45274e19f48e5d277254ba4c1ab0da 100644 --- a/swh/model/tests/swh_model_data.py +++ b/swh/model/tests/swh_model_data.py @@ -138,6 +138,12 @@ REVISIONS = [ EXTIDS = [ ExtID(extid_type="git256", extid=b"\x03" * 32, target=REVISIONS[0].swhid(),), ExtID(extid_type="hg", extid=b"\x04" * 20, target=REVISIONS[1].swhid(),), + ExtID( + extid_type="hg-nodeid", + extid=b"\x05" * 20, + target=REVISIONS[1].swhid(), + extid_version=1, + ), ] RELEASES = [ diff --git a/swh/model/tests/test_identifiers.py b/swh/model/tests/test_identifiers.py index 7a236ac9036f47a27deb79411d630983bf1b48af..01d2b70bf2ef8b04dbefb3873424dff553db3088 100644 --- a/swh/model/tests/test_identifiers.py +++ b/swh/model/tests/test_identifiers.py @@ -1811,6 +1811,29 @@ def test_ExtendedSWHID_eq(): ) == ExtendedSWHID(object_type=ExtendedObjectType.DIRECTORY, object_id=object_id,) +def test_extid_identifier_bwcompat(): + extid_dict = { + "extid_type": "test-type", + "extid": b"extid", + "target": ExtendedSWHID( + object_type=ExtendedObjectType.DIRECTORY, object_id=b"\x00" * 20 + ), + } + + assert ( + identifiers.extid_identifier(extid_dict) + == "b9295e1931c31e40a7e3e1e967decd1c89426455" + ) + + assert identifiers.extid_identifier( + {**extid_dict, "extid_version": 0} + ) == identifiers.extid_identifier(extid_dict) + + assert identifiers.extid_identifier( + {**extid_dict, "extid_version": 1} + ) != identifiers.extid_identifier(extid_dict) + + def test_object_types(): """Checks ExtendedObjectType is a superset of ObjectType""" for member in ObjectType: