diff --git a/swh/model/identifiers.py b/swh/model/identifiers.py --- a/swh/model/identifiers.py +++ b/swh/model/identifiers.py @@ -857,6 +857,7 @@ ``` extid_type $StrWithoutSpaces + [extid_version $Str] extid $Bytes target $CoreSwhid ``` @@ -866,6 +867,8 @@ 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 @@ 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 --- a/swh/model/model.py +++ b/swh/model/model.py @@ -1133,6 +1133,7 @@ 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 @@ 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 --- a/swh/model/tests/swh_model_data.py +++ b/swh/model/tests/swh_model_data.py @@ -138,6 +138,12 @@ 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 --- a/swh/model/tests/test_identifiers.py +++ b/swh/model/tests/test_identifiers.py @@ -1811,6 +1811,29 @@ ) == 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: