Skip to content
Snippets Groups Projects
Commit 8fd0fe66 authored by Jenkins for Software Heritage's avatar Jenkins for Software Heritage
Browse files

Merge tag 'debian/6.5.0-1_swh1' into debian/buster-swh

parents fb292c62 5150b93b
No related branches found
No related tags found
No related merge requests found
Daniele Serafini
Ishan Bhanuka
Antoine Cezar
Pierre-Yves David
Metadata-Version: 2.1
Name: swh.model
Version: 6.4.1
Version: 6.5.0
Summary: Software Heritage data model
Home-page: https://forge.softwareheritage.org/diffusion/DMOD/
Author: Software Heritage developers
......
swh-model (6.4.1-1~swh1~bpo10+1) buster-swh; urgency=medium
swh-model (6.5.0-1~swh1) unstable-swh; urgency=medium
* Rebuild for buster-swh
* New upstream release 6.5.0 - (tagged by Nicolas Dandrimont
<nicolas@dandrimont.eu> on 2022-09-26 18:11:53 +0200)
* Upstream changes: - Release swh.model v6.5.0 - Bundle a lot
of performance improvements in swh.model.model.
-- Software Heritage autobuilder (on jenkins-debian1) <jenkins@jenkins-debian1.internal.softwareheritage.org> Wed, 31 Aug 2022 08:33:00 +0000
-- Software Heritage autobuilder (on jenkins-debian1) <jenkins@jenkins-debian1.internal.softwareheritage.org> Mon, 26 Sep 2022 16:16:05 +0000
swh-model (6.4.1-1~swh1) unstable-swh; urgency=medium
......
Metadata-Version: 2.1
Name: swh.model
Version: 6.4.1
Version: 6.5.0
Summary: Software Heritage data model
Home-page: https://forge.softwareheritage.org/diffusion/DMOD/
Author: Software Heritage developers
......
......@@ -401,7 +401,7 @@ class Directory(MerkleNode):
for instance when the client is applying diffs.
"""
__slots__ = ["__entries"]
__slots__ = ["__entries", "__model_object"]
object_type: Final = "directory"
@classmethod
......@@ -447,9 +447,11 @@ class Directory(MerkleNode):
def __init__(self, data=None):
super().__init__(data=data)
self.__entries = None
self.__model_object = None
def invalidate_hash(self):
self.__entries = None
self.__model_object = None
super().invalidate_hash()
@staticmethod
......@@ -497,12 +499,37 @@ class Directory(MerkleNode):
return CoreSWHID(object_type=ObjectType.DIRECTORY, object_id=self.hash)
def compute_hash(self):
return model.Directory.from_dict({"entries": self.entries}).id
return self.to_model().id
def to_model(self) -> model.Directory:
"""Builds a `model.Directory` object based on this node;
ignoring its children."""
return model.Directory.from_dict(self.get_data())
if self.__model_object is None:
DirectoryEntry = model.DirectoryEntry
entries = []
for name, child in self.items():
if child.object_type == "directory":
e = DirectoryEntry(
type="dir",
perms=DentryPerms.directory,
target=child.hash,
name=name,
)
elif child.object_type == "content":
e = DirectoryEntry(
type="file",
perms=child.data["perms"],
target=child.hash,
name=name,
)
else:
raise ValueError(f"unknown child {child}")
entries.append(e)
entries.sort(key=directory_entry_sort_key)
self.__model_object = model.Directory(entries=tuple(entries))
return self.__model_object
def __getitem__(self, key):
if not isinstance(key, bytes):
......
......@@ -55,12 +55,16 @@ def content_git_object(content: model.Content) -> bytes:
def directory_entry_sort_key(entry: model.DirectoryEntry):
"""The sorting key for tree entries"""
if isinstance(entry, dict):
# For backward compatibility
entry = model.DirectoryEntry.from_dict(entry)
if entry.type == "dir":
return entry.name + b"/"
type_ = entry["type"]
name = entry["name"]
else:
type_ = entry.type
name = entry.name
if type_ == "dir":
return name + b"/"
else:
return entry.name
return name
@lru_cache()
......
This diff is collapsed.
......@@ -43,7 +43,7 @@ from swh.model.model import (
TargetType,
Timestamp,
TimestampWithTimezone,
type_validator,
optimized_validator,
)
import swh.model.swhids
from swh.model.swhids import CoreSWHID, ExtendedSWHID, ObjectType
......@@ -167,6 +167,16 @@ _TYPE_VALIDATOR_PARAMETERS: List[Tuple[Any, List[Any], List[Any]]] = [
[("foo", "bar"), ("", ""), _custom_namedtuple("", ""), _custom_tuple(("", ""))],
[("foo",), ("foo", "bar", "baz"), ("foo", 42), (42, "foo")],
),
(
Tuple[bytes, bytes],
[
(b"foo", b"bar"),
(b"", b""),
_custom_namedtuple(b"", b""),
_custom_tuple((b"", b"")),
],
[(b"foo",), (b"foo", b"bar", b"baz"), (b"foo", 42), (42, b"foo")],
),
(
Tuple[str, ...],
[
......@@ -275,8 +285,9 @@ _TYPE_VALIDATOR_PARAMETERS: List[Tuple[Any, List[Any], List[Any]]] = [
for value in values
],
)
def test_type_validator_valid(type_, value):
type_validator()(None, attr.ib(type=type_), value)
def test_optimized_type_validator_valid(type_, value):
validator = optimized_validator(type_)
validator(None, attr.ib(type=type_), value)
@pytest.mark.parametrize(
......@@ -287,9 +298,10 @@ def test_type_validator_valid(type_, value):
for value in values
],
)
def test_type_validator_invalid(type_, value):
def test_optimized_type_validator_invalid(type_, value):
validator = optimized_validator(type_)
with pytest.raises(AttributeTypeError):
type_validator()(None, attr.ib(type=type_), value)
validator(None, attr.ib(type=type_), value)
@pytest.mark.parametrize("object_type, objects", TEST_OBJECTS.items())
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment