Changeset View
Changeset View
Standalone View
Standalone View
mercurial/dirstatemap.py
Show First 20 Lines • Show All 634 Lines • ▼ Show 20 Line(s) | class dirstatemap(object): | ||||
if self._use_dirstate_v2: | if self._use_dirstate_v2: | ||||
if self.docket.uuid: | if self.docket.uuid: | ||||
# TODO: use mmap when possible | # TODO: use mmap when possible | ||||
data = self._opener.read(self.docket.data_filename()) | data = self._opener.read(self.docket.data_filename()) | ||||
else: | else: | ||||
data = b'' | data = b'' | ||||
self._rustmap = rustmod.DirstateMap.new_v2( | self._rustmap = rustmod.DirstateMap.new_v2( | ||||
data, self.docket.data_size | data, self.docket.data_size, self.docket.tree_metadata | ||||
) | ) | ||||
parents = self.docket.parents | parents = self.docket.parents | ||||
else: | else: | ||||
self._rustmap, parents = rustmod.DirstateMap.new_v1( | self._rustmap, parents = rustmod.DirstateMap.new_v1( | ||||
self._use_dirstate_tree, self._readdirstatefile() | self._use_dirstate_tree, self._readdirstatefile() | ||||
) | ) | ||||
if parents and not self._dirtyparents: | if parents and not self._dirtyparents: | ||||
Show All 10 Lines | class dirstatemap(object): | ||||
packed = self._rustmap.write_v1(p1, p2, now) | packed = self._rustmap.write_v1(p1, p2, now) | ||||
st.write(packed) | st.write(packed) | ||||
st.close() | st.close() | ||||
self._dirtyparents = False | self._dirtyparents = False | ||||
return | return | ||||
# We can only append to an existing data file if there is one | # We can only append to an existing data file if there is one | ||||
can_append = self.docket.uuid is not None | can_append = self.docket.uuid is not None | ||||
packed, append = self._rustmap.write_v2(now, can_append) | packed, meta, append = self._rustmap.write_v2(now, can_append) | ||||
if append: | if append: | ||||
docket = self.docket | docket = self.docket | ||||
data_filename = docket.data_filename() | data_filename = docket.data_filename() | ||||
if tr: | if tr: | ||||
tr.add(data_filename, docket.data_size) | tr.add(data_filename, docket.data_size) | ||||
with self._opener(data_filename, b'r+b') as fp: | with self._opener(data_filename, b'r+b') as fp: | ||||
fp.seek(docket.data_size) | fp.seek(docket.data_size) | ||||
assert fp.tell() == docket.data_size | assert fp.tell() == docket.data_size | ||||
written = fp.write(packed) | written = fp.write(packed) | ||||
if written is not None: # py2 may return None | if written is not None: # py2 may return None | ||||
assert written == len(packed), (written, len(packed)) | assert written == len(packed), (written, len(packed)) | ||||
docket.data_size += len(packed) | docket.data_size += len(packed) | ||||
docket.parents = self.parents() | docket.parents = self.parents() | ||||
docket.tree_metadata = meta | |||||
st.write(docket.serialize()) | st.write(docket.serialize()) | ||||
st.close() | st.close() | ||||
else: | else: | ||||
old_docket = self.docket | old_docket = self.docket | ||||
new_docket = docketmod.DirstateDocket.with_new_uuid( | new_docket = docketmod.DirstateDocket.with_new_uuid( | ||||
self.parents(), len(packed) | self.parents(), len(packed), meta | ||||
) | ) | ||||
data_filename = new_docket.data_filename() | data_filename = new_docket.data_filename() | ||||
if tr: | if tr: | ||||
tr.add(data_filename, 0) | tr.add(data_filename, 0) | ||||
self._opener.write(data_filename, packed) | self._opener.write(data_filename, packed) | ||||
# Write the new docket after the new data file has been | # Write the new docket after the new data file has been | ||||
# written. Because `st` was opened with `atomictemp=True`, | # written. Because `st` was opened with `atomictemp=True`, | ||||
# the actual `.hg/dirstate` file is only affected on close. | # the actual `.hg/dirstate` file is only affected on close. | ||||
▲ Show 20 Lines • Show All 55 Lines • Show Last 20 Lines |