D11782: dirstate-item: allow mtime to be None in "parentdata"
marmoute (Pierre-Yves David)
phabricator at mercurial-scm.org
Wed Nov 24 11:13:05 UTC 2021
marmoute created this revision.
Herald added a reviewer: hg-reviewers.
Herald added a subscriber: mercurial-patches.
REPOSITORY
rHG Mercurial
BRANCH
default
REVISION DETAIL
https://phab.mercurial-scm.org/D11782
AFFECTED FILES
mercurial/cext/parsers.c
mercurial/dirstate.py
mercurial/pure/parsers.py
rust/hg-cpython/src/dirstate/item.rs
CHANGE DETAILS
diff --git a/rust/hg-cpython/src/dirstate/item.rs b/rust/hg-cpython/src/dirstate/item.rs
--- a/rust/hg-cpython/src/dirstate/item.rs
+++ b/rust/hg-cpython/src/dirstate/item.rs
@@ -23,7 +23,7 @@
p2_info: bool = false,
has_meaningful_data: bool = true,
has_meaningful_mtime: bool = true,
- parentfiledata: Option<(u32, u32, (u32, u32))> = None,
+ parentfiledata: Option<(u32, u32, Option<(u32, u32)>)> = None,
fallback_exec: Option<bool> = None,
fallback_symlink: Option<bool> = None,
@@ -35,7 +35,9 @@
mode_size_opt = Some((mode, size))
}
if has_meaningful_mtime {
- mtime_opt = Some(timestamp(py, mtime)?)
+ if let Some(m) = mtime {
+ mtime_opt = Some(timestamp(py, m)?);
+ }
}
}
let entry = DirstateEntry::from_v2_data(
diff --git a/mercurial/pure/parsers.py b/mercurial/pure/parsers.py
--- a/mercurial/pure/parsers.py
+++ b/mercurial/pure/parsers.py
@@ -130,6 +130,8 @@
if parentfiledata is None:
has_meaningful_mtime = False
has_meaningful_data = False
+ elif parentfiledata[2] is None:
+ has_meaningful_mtime = False
if has_meaningful_data:
self._mode = parentfiledata[0]
self._size = parentfiledata[1]
diff --git a/mercurial/dirstate.py b/mercurial/dirstate.py
--- a/mercurial/dirstate.py
+++ b/mercurial/dirstate.py
@@ -611,6 +611,7 @@
)
if (
parentfiledata is not None
+ and parentfiledata[2] is not None
and parentfiledata[2] > self._lastnormaltime
):
# Remember the most recent modification timeslot for status(),
diff --git a/mercurial/cext/parsers.c b/mercurial/cext/parsers.c
--- a/mercurial/cext/parsers.c
+++ b/mercurial/cext/parsers.c
@@ -66,6 +66,7 @@
int mtime_s;
int mtime_ns;
PyObject *parentfiledata;
+ PyObject *mtime;
PyObject *fallback_exec;
PyObject *fallback_symlink;
static char *keywords_name[] = {
@@ -118,10 +119,18 @@
}
if (parentfiledata != Py_None) {
- if (!PyArg_ParseTuple(parentfiledata, "ii(ii)", &mode, &size,
- &mtime_s, &mtime_ns)) {
+ if (!PyArg_ParseTuple(parentfiledata, "iiO", &mode, &size,
+ &mtime)) {
return NULL;
}
+ if (mtime != Py_None) {
+ if (!PyArg_ParseTuple(mtime, "ii", &mtime_s,
+ &mtime_ns)) {
+ return NULL;
+ }
+ } else {
+ has_meaningful_mtime = 0;
+ }
} else {
has_meaningful_data = 0;
has_meaningful_mtime = 0;
@@ -475,10 +484,19 @@
PyObject *args)
{
int size, mode, mtime_s, mtime_ns;
- if (!PyArg_ParseTuple(args, "ii(ii)", &mode, &size, &mtime_s,
- &mtime_ns)) {
+ PyObject *mtime;
+ mtime_s = 0;
+ mtime_ns = 0;
+ if (!PyArg_ParseTuple(args, "iiO", &mode, &size, &mtime)) {
return NULL;
}
+ if (mtime != Py_None) {
+ if (!PyArg_ParseTuple(mtime, "ii", &mtime_s, &mtime_ns)) {
+ return NULL;
+ }
+ } else {
+ self->flags &= ~dirstate_flag_has_mtime;
+ }
self->flags = dirstate_flag_wc_tracked | dirstate_flag_p1_tracked |
dirstate_flag_has_meaningful_data |
dirstate_flag_has_mtime;
To: marmoute, #hg-reviewers
Cc: mercurial-patches, mercurial-devel
More information about the Mercurial-devel
mailing list