125 |
126 |
126 self._mode = None |
127 self._mode = None |
127 self._size = None |
128 self._size = None |
128 self._mtime_s = None |
129 self._mtime_s = None |
129 self._mtime_ns = None |
130 self._mtime_ns = None |
|
131 self._mtime_second_ambiguous = False |
130 if parentfiledata is None: |
132 if parentfiledata is None: |
131 has_meaningful_mtime = False |
133 has_meaningful_mtime = False |
132 has_meaningful_data = False |
134 has_meaningful_data = False |
133 elif parentfiledata[2] is None: |
135 elif parentfiledata[2] is None: |
134 has_meaningful_mtime = False |
136 has_meaningful_mtime = False |
135 if has_meaningful_data: |
137 if has_meaningful_data: |
136 self._mode = parentfiledata[0] |
138 self._mode = parentfiledata[0] |
137 self._size = parentfiledata[1] |
139 self._size = parentfiledata[1] |
138 if has_meaningful_mtime: |
140 if has_meaningful_mtime: |
139 self._mtime_s, self._mtime_ns = parentfiledata[2] |
141 ( |
|
142 self._mtime_s, |
|
143 self._mtime_ns, |
|
144 self._mtime_second_ambiguous, |
|
145 ) = parentfiledata[2] |
140 |
146 |
141 @classmethod |
147 @classmethod |
142 def from_v2_data(cls, flags, size, mtime_s, mtime_ns): |
148 def from_v2_data(cls, flags, size, mtime_s, mtime_ns): |
143 """Build a new DirstateItem object from V2 data""" |
149 """Build a new DirstateItem object from V2 data""" |
144 has_mode_size = bool(flags & DIRSTATE_V2_HAS_MODE_AND_SIZE) |
150 has_mode_size = bool(flags & DIRSTATE_V2_HAS_MODE_AND_SIZE) |
177 wc_tracked=bool(flags & DIRSTATE_V2_WDIR_TRACKED), |
183 wc_tracked=bool(flags & DIRSTATE_V2_WDIR_TRACKED), |
178 p1_tracked=bool(flags & DIRSTATE_V2_P1_TRACKED), |
184 p1_tracked=bool(flags & DIRSTATE_V2_P1_TRACKED), |
179 p2_info=bool(flags & DIRSTATE_V2_P2_INFO), |
185 p2_info=bool(flags & DIRSTATE_V2_P2_INFO), |
180 has_meaningful_data=has_mode_size, |
186 has_meaningful_data=has_mode_size, |
181 has_meaningful_mtime=has_meaningful_mtime, |
187 has_meaningful_mtime=has_meaningful_mtime, |
182 parentfiledata=(mode, size, (mtime_s, mtime_ns)), |
188 parentfiledata=(mode, size, (mtime_s, mtime_ns, False)), |
183 fallback_exec=fallback_exec, |
189 fallback_exec=fallback_exec, |
184 fallback_symlink=fallback_symlink, |
190 fallback_symlink=fallback_symlink, |
185 ) |
191 ) |
186 |
192 |
187 @classmethod |
193 @classmethod |
214 elif mtime == AMBIGUOUS_TIME: |
220 elif mtime == AMBIGUOUS_TIME: |
215 return cls( |
221 return cls( |
216 wc_tracked=True, |
222 wc_tracked=True, |
217 p1_tracked=True, |
223 p1_tracked=True, |
218 has_meaningful_mtime=False, |
224 has_meaningful_mtime=False, |
219 parentfiledata=(mode, size, (42, 0)), |
225 parentfiledata=(mode, size, (42, 0, False)), |
220 ) |
226 ) |
221 else: |
227 else: |
222 return cls( |
228 return cls( |
223 wc_tracked=True, |
229 wc_tracked=True, |
224 p1_tracked=True, |
230 p1_tracked=True, |
225 parentfiledata=(mode, size, (mtime, 0)), |
231 parentfiledata=(mode, size, (mtime, 0, False)), |
226 ) |
232 ) |
227 else: |
233 else: |
228 raise RuntimeError(b'unknown state: %s' % state) |
234 raise RuntimeError(b'unknown state: %s' % state) |
229 |
235 |
230 def set_possibly_dirty(self): |
236 def set_possibly_dirty(self): |
246 """ |
252 """ |
247 self._wc_tracked = True |
253 self._wc_tracked = True |
248 self._p1_tracked = True |
254 self._p1_tracked = True |
249 self._mode = mode |
255 self._mode = mode |
250 self._size = size |
256 self._size = size |
251 self._mtime_s, self._mtime_ns = mtime |
257 self._mtime_s, self._mtime_ns, self._mtime_second_ambiguous = mtime |
252 |
258 |
253 def set_tracked(self): |
259 def set_tracked(self): |
254 """mark a file as tracked in the working copy |
260 """mark a file as tracked in the working copy |
255 |
261 |
256 This will ultimately be called by command like `hg add`. |
262 This will ultimately be called by command like `hg add`. |
301 def mtime_likely_equal_to(self, other_mtime): |
307 def mtime_likely_equal_to(self, other_mtime): |
302 self_sec = self._mtime_s |
308 self_sec = self._mtime_s |
303 if self_sec is None: |
309 if self_sec is None: |
304 return False |
310 return False |
305 self_ns = self._mtime_ns |
311 self_ns = self._mtime_ns |
306 other_sec, other_ns = other_mtime |
312 other_sec, other_ns, second_ambiguous = other_mtime |
307 return self_sec == other_sec and ( |
313 return self_sec == other_sec and ( |
308 self_ns == other_ns or self_ns == 0 or other_ns == 0 |
314 self_ns == other_ns or self_ns == 0 or other_ns == 0 |
309 ) |
315 ) |
310 |
316 |
311 @property |
317 @property |