##// END OF EJS Templates
tests: enable pytype checking on `mercurial/interfaces` package...
tests: enable pytype checking on `mercurial/interfaces` package I might regret this, but the files currently scan OK, with the exception of one place where an `attribute-error` is now disabled. We should fix this somehow, but the rest of this package needs to be converted to Protocol classes first. I'm enabling checking on this now because I got to the tail end of the series converting this to Protocol classes, and suddenly one of the commits is causing pytype to fail with an error message that doesn't really jive with the few code changes in it. Then when I ran `pytype-single` on it to get a result faster, I got a host of other unexpected errors that were likely from earlier in the series. So first things first, strictly check the content of these files going forward.

File last commit:

r52756:f4733654 default
r53329:b2821a84 default
Show More
docket.py
71 lines | 2.3 KiB | text/x-python | PythonLexer
# dirstatedocket.py - docket file for dirstate-v2
#
# Copyright Mercurial Contributors
#
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.
from __future__ import annotations
import struct
from ..revlogutils import docket as docket_mod
from . import v2
V2_FORMAT_MARKER = b"dirstate-v2\n"
# * 12 bytes: format marker
# * 32 bytes: node ID of the working directory's first parent
# * 32 bytes: node ID of the working directory's second parent
# * {TREE_METADATA_SIZE} bytes: tree metadata, parsed separately
# * 4 bytes: big-endian used size of the data file
# * 1 byte: length of the data file's UUID
# * variable: data file's UUID
#
# Node IDs are null-padded if shorter than 32 bytes.
# A data file shorter than the specified used size is corrupted (truncated)
HEADER = struct.Struct(
">{}s32s32s{}sLB".format(len(V2_FORMAT_MARKER), v2.TREE_METADATA_SIZE)
)
class DirstateDocket:
data_filename_pattern = b'dirstate.%s'
def __init__(self, parents, data_size, tree_metadata, uuid):
self.parents = parents
self.data_size = data_size
self.tree_metadata = tree_metadata
self.uuid = uuid
@classmethod
def with_new_uuid(cls, parents, data_size, tree_metadata):
return cls(parents, data_size, tree_metadata, docket_mod.make_uid())
@classmethod
def parse(cls, data, nodeconstants):
if not data:
parents = (nodeconstants.nullid, nodeconstants.nullid)
return cls(parents, 0, b'', None)
marker, p1, p2, meta, data_size, uuid_size = HEADER.unpack_from(data)
if marker != V2_FORMAT_MARKER:
raise ValueError("expected dirstate-v2 marker")
uuid = data[HEADER.size : HEADER.size + uuid_size]
p1 = p1[: nodeconstants.nodelen]
p2 = p2[: nodeconstants.nodelen]
return cls((p1, p2), data_size, meta, uuid)
def serialize(self):
p1, p2 = self.parents
header = HEADER.pack(
V2_FORMAT_MARKER,
p1,
p2,
self.tree_metadata,
self.data_size,
len(self.uuid),
)
return header + self.uuid
def data_filename(self):
return self.data_filename_pattern % self.uuid