59 _state = attr.ib() |
59 _state = attr.ib() |
60 _mode = attr.ib() |
60 _mode = attr.ib() |
61 _size = attr.ib() |
61 _size = attr.ib() |
62 _mtime = attr.ib() |
62 _mtime = attr.ib() |
63 |
63 |
64 def __init__(self, state, mode, size, mtime): |
64 def __init__( |
65 self._state = state |
65 self, |
66 self._mode = mode |
66 wc_tracked=False, |
67 self._size = size |
67 p1_tracked=False, |
68 self._mtime = mtime |
68 p2_tracked=False, |
|
69 merged=False, |
|
70 clean_p1=False, |
|
71 clean_p2=False, |
|
72 possibly_dirty=False, |
|
73 parentfiledata=None, |
|
74 ): |
|
75 if merged and (clean_p1 or clean_p2): |
|
76 msg = b'`merged` argument incompatible with `clean_p1`/`clean_p2`' |
|
77 raise error.ProgrammingError(msg) |
|
78 |
|
79 self._state = None |
|
80 self._mode = 0 |
|
81 self._size = NONNORMAL |
|
82 self._mtime = AMBIGUOUS_TIME |
|
83 if not (p1_tracked or p2_tracked or wc_tracked): |
|
84 pass # the object has no state to record |
|
85 elif merged: |
|
86 self._state = b'm' |
|
87 self._size = FROM_P2 |
|
88 self._mtime = AMBIGUOUS_TIME |
|
89 elif not (p1_tracked or p2_tracked) and wc_tracked: |
|
90 self._state = b'a' |
|
91 self._size = NONNORMAL |
|
92 self._mtime = AMBIGUOUS_TIME |
|
93 elif (p1_tracked or p2_tracked) and not wc_tracked: |
|
94 self._state = b'r' |
|
95 self._size = 0 |
|
96 self._mtime = 0 |
|
97 elif clean_p2 and wc_tracked: |
|
98 self._state = b'n' |
|
99 self._size = FROM_P2 |
|
100 self._mtime = AMBIGUOUS_TIME |
|
101 elif not p1_tracked and p2_tracked and wc_tracked: |
|
102 self._state = b'n' |
|
103 self._size = FROM_P2 |
|
104 self._mtime = AMBIGUOUS_TIME |
|
105 elif possibly_dirty: |
|
106 self._state = b'n' |
|
107 self._size = NONNORMAL |
|
108 self._mtime = AMBIGUOUS_TIME |
|
109 elif wc_tracked: |
|
110 # this is a "normal" file |
|
111 if parentfiledata is None: |
|
112 msg = b'failed to pass parentfiledata for a normal file' |
|
113 raise error.ProgrammingError(msg) |
|
114 self._state = b'n' |
|
115 self._mode = parentfiledata[0] |
|
116 self._size = parentfiledata[1] |
|
117 self._mtime = parentfiledata[2] |
|
118 else: |
|
119 assert False, 'unreachable' |
69 |
120 |
70 @classmethod |
121 @classmethod |
71 def from_v1_data(cls, state, mode, size, mtime): |
122 def from_v1_data(cls, state, mode, size, mtime): |
72 """Build a new DirstateItem object from V1 data |
123 """Build a new DirstateItem object from V1 data |
73 |
124 |
74 Since the dirstate-v1 format is frozen, the signature of this function |
125 Since the dirstate-v1 format is frozen, the signature of this function |
75 is not expected to change, unlike the __init__ one. |
126 is not expected to change, unlike the __init__ one. |
76 """ |
127 """ |
77 return cls( |
128 instance = cls() |
78 state=state, |
129 instance._state = state |
79 mode=mode, |
130 instance._mode = mode |
80 size=size, |
131 instance._size = size |
81 mtime=mtime, |
132 instance._mtime = mtime |
82 ) |
133 return instance |
83 |
134 |
84 def set_possibly_dirty(self): |
135 def set_possibly_dirty(self): |
85 """Mark a file as "possibly dirty" |
136 """Mark a file as "possibly dirty" |
86 |
137 |
87 This means the next status call will have to actually check its content |
138 This means the next status call will have to actually check its content |