diff -r 226c7dbeea11 -r 22c39f8acf78 mercurial/pure/parsers.py --- a/mercurial/pure/parsers.py Fri Aug 20 22:35:52 2021 +0200 +++ b/mercurial/pure/parsers.py Fri Jul 16 16:52:53 2021 +0200 @@ -61,11 +61,62 @@ _size = attr.ib() _mtime = attr.ib() - def __init__(self, state, mode, size, mtime): - self._state = state - self._mode = mode - self._size = size - self._mtime = mtime + def __init__( + self, + wc_tracked=False, + p1_tracked=False, + p2_tracked=False, + merged=False, + clean_p1=False, + clean_p2=False, + possibly_dirty=False, + parentfiledata=None, + ): + if merged and (clean_p1 or clean_p2): + msg = b'`merged` argument incompatible with `clean_p1`/`clean_p2`' + raise error.ProgrammingError(msg) + + self._state = None + self._mode = 0 + self._size = NONNORMAL + self._mtime = AMBIGUOUS_TIME + if not (p1_tracked or p2_tracked or wc_tracked): + pass # the object has no state to record + elif merged: + self._state = b'm' + self._size = FROM_P2 + self._mtime = AMBIGUOUS_TIME + elif not (p1_tracked or p2_tracked) and wc_tracked: + self._state = b'a' + self._size = NONNORMAL + self._mtime = AMBIGUOUS_TIME + elif (p1_tracked or p2_tracked) and not wc_tracked: + self._state = b'r' + self._size = 0 + self._mtime = 0 + elif clean_p2 and wc_tracked: + self._state = b'n' + self._size = FROM_P2 + self._mtime = AMBIGUOUS_TIME + elif not p1_tracked and p2_tracked and wc_tracked: + self._state = b'n' + self._size = FROM_P2 + self._mtime = AMBIGUOUS_TIME + elif possibly_dirty: + self._state = b'n' + self._size = NONNORMAL + self._mtime = AMBIGUOUS_TIME + elif wc_tracked: + # this is a "normal" file + if parentfiledata is None: + msg = b'failed to pass parentfiledata for a normal file' + raise error.ProgrammingError(msg) + self._state = b'n' + self._mode = parentfiledata[0] + self._size = parentfiledata[1] + self._mtime = parentfiledata[2] + else: + assert False, 'unreachable' @classmethod def from_v1_data(cls, state, mode, size, mtime): @@ -74,12 +125,12 @@ Since the dirstate-v1 format is frozen, the signature of this function is not expected to change, unlike the __init__ one. """ - return cls( - state=state, - mode=mode, - size=size, - mtime=mtime, - ) + instance = cls() + instance._state = state + instance._mode = mode + instance._size = size + instance._mtime = mtime + return instance def set_possibly_dirty(self): """Mark a file as "possibly dirty"