Show More
@@ -175,6 +175,74 b' class _dirstatemapcommon(object):' | |||
|
175 | 175 | self._refresh_entry(f, entry) |
|
176 | 176 | return True |
|
177 | 177 | |
|
178 | def reset_state( | |
|
179 | self, | |
|
180 | filename, | |
|
181 | wc_tracked=False, | |
|
182 | p1_tracked=False, | |
|
183 | p2_tracked=False, | |
|
184 | merged=False, | |
|
185 | clean_p1=False, | |
|
186 | clean_p2=False, | |
|
187 | possibly_dirty=False, | |
|
188 | parentfiledata=None, | |
|
189 | ): | |
|
190 | """Set a entry to a given state, diregarding all previous state | |
|
191 | ||
|
192 | This is to be used by the part of the dirstate API dedicated to | |
|
193 | adjusting the dirstate after a update/merge. | |
|
194 | ||
|
195 | note: calling this might result to no entry existing at all if the | |
|
196 | dirstate map does not see any point at having one for this file | |
|
197 | anymore. | |
|
198 | """ | |
|
199 | if merged and (clean_p1 or clean_p2): | |
|
200 | msg = b'`merged` argument incompatible with `clean_p1`/`clean_p2`' | |
|
201 | raise error.ProgrammingError(msg) | |
|
202 | # copy information are now outdated | |
|
203 | # (maybe new information should be in directly passed to this function) | |
|
204 | self.copymap.pop(filename, None) | |
|
205 | ||
|
206 | if not (p1_tracked or p2_tracked or wc_tracked): | |
|
207 | old_entry = self._map.get(filename) | |
|
208 | self._drop_entry(filename) | |
|
209 | self._dirs_decr(filename, old_entry=old_entry) | |
|
210 | return | |
|
211 | elif merged: | |
|
212 | pass | |
|
213 | elif not (p1_tracked or p2_tracked) and wc_tracked: | |
|
214 | pass # file is added, nothing special to adjust | |
|
215 | elif (p1_tracked or p2_tracked) and not wc_tracked: | |
|
216 | pass | |
|
217 | elif clean_p2 and wc_tracked: | |
|
218 | pass | |
|
219 | elif not p1_tracked and p2_tracked and wc_tracked: | |
|
220 | clean_p2 = True | |
|
221 | elif possibly_dirty: | |
|
222 | pass | |
|
223 | elif wc_tracked: | |
|
224 | # this is a "normal" file | |
|
225 | if parentfiledata is None: | |
|
226 | msg = b'failed to pass parentfiledata for a normal file: %s' | |
|
227 | msg %= filename | |
|
228 | raise error.ProgrammingError(msg) | |
|
229 | else: | |
|
230 | assert False, 'unreachable' | |
|
231 | ||
|
232 | old_entry = self._map.get(filename) | |
|
233 | self._dirs_incr(filename, old_entry) | |
|
234 | entry = DirstateItem( | |
|
235 | wc_tracked=wc_tracked, | |
|
236 | p1_tracked=p1_tracked, | |
|
237 | p2_tracked=p2_tracked, | |
|
238 | merged=merged, | |
|
239 | clean_p1=clean_p1, | |
|
240 | clean_p2=clean_p2, | |
|
241 | possibly_dirty=possibly_dirty, | |
|
242 | parentfiledata=parentfiledata, | |
|
243 | ) | |
|
244 | self._insert_entry(filename, entry) | |
|
245 | ||
|
178 | 246 | |
|
179 | 247 | class dirstatemap(_dirstatemapcommon): |
|
180 | 248 | """Map encapsulating the dirstate's contents. |
@@ -465,77 +533,9 b' class dirstatemap(_dirstatemapcommon):' | |||
|
465 | 533 | def _insert_entry(self, f, entry): |
|
466 | 534 | self._map[f] = entry |
|
467 | 535 | |
|
468 | def reset_state( | |
|
469 | self, | |
|
470 | filename, | |
|
471 | wc_tracked=False, | |
|
472 | p1_tracked=False, | |
|
473 | p2_tracked=False, | |
|
474 | merged=False, | |
|
475 | clean_p1=False, | |
|
476 | clean_p2=False, | |
|
477 | possibly_dirty=False, | |
|
478 | parentfiledata=None, | |
|
479 | ): | |
|
480 | """Set a entry to a given state, diregarding all previous state | |
|
481 | ||
|
482 | This is to be used by the part of the dirstate API dedicated to | |
|
483 | adjusting the dirstate after a update/merge. | |
|
484 | ||
|
485 | note: calling this might result to no entry existing at all if the | |
|
486 | dirstate map does not see any point at having one for this file | |
|
487 | anymore. | |
|
488 | """ | |
|
489 | if merged and (clean_p1 or clean_p2): | |
|
490 | msg = b'`merged` argument incompatible with `clean_p1`/`clean_p2`' | |
|
491 | raise error.ProgrammingError(msg) | |
|
492 | # copy information are now outdated | |
|
493 | # (maybe new information should be in directly passed to this function) | |
|
494 | self.copymap.pop(filename, None) | |
|
495 | ||
|
496 | if not (p1_tracked or p2_tracked or wc_tracked): | |
|
497 | old_entry = self._map.pop(filename, None) | |
|
498 | self._dirs_decr(filename, old_entry=old_entry) | |
|
499 | self.copymap.pop(filename, None) | |
|
500 | return | |
|
501 | elif merged: | |
|
502 | pass | |
|
503 | elif not (p1_tracked or p2_tracked) and wc_tracked: | |
|
504 | pass # file is added, nothing special to adjust | |
|
505 | elif (p1_tracked or p2_tracked) and not wc_tracked: | |
|
506 | pass | |
|
507 | elif clean_p2 and wc_tracked: | |
|
508 | pass | |
|
509 | elif not p1_tracked and p2_tracked and wc_tracked: | |
|
510 | clean_p2 = True | |
|
511 | elif possibly_dirty: | |
|
512 | pass | |
|
513 | elif wc_tracked: | |
|
514 | # this is a "normal" file | |
|
515 | if parentfiledata is None: | |
|
516 | msg = b'failed to pass parentfiledata for a normal file: %s' | |
|
517 | msg %= filename | |
|
518 | raise error.ProgrammingError(msg) | |
|
519 | else: | |
|
520 | assert False, 'unreachable' | |
|
521 | ||
|
522 | old_entry = self._map.get(filename) | |
|
523 | self._dirs_incr(filename, old_entry) | |
|
524 | entry = DirstateItem( | |
|
525 | wc_tracked=wc_tracked, | |
|
526 | p1_tracked=p1_tracked, | |
|
527 | p2_tracked=p2_tracked, | |
|
528 | merged=merged, | |
|
529 | clean_p1=clean_p1, | |
|
530 | clean_p2=clean_p2, | |
|
531 | possibly_dirty=possibly_dirty, | |
|
532 | parentfiledata=parentfiledata, | |
|
533 | ) | |
|
534 | self._map[filename] = entry | |
|
535 | ||
|
536 | 536 | def _drop_entry(self, f): |
|
537 | 537 | self._map.pop(f, None) |
|
538 |
self. |
|
|
538 | self.copymap.pop(f, None) | |
|
539 | 539 | |
|
540 | 540 | |
|
541 | 541 | if rustmod is not None: |
@@ -820,85 +820,6 b' if rustmod is not None:' | |||
|
820 | 820 | assert isinstance(value, DirstateItem) |
|
821 | 821 | self._map.set_dirstate_item(key, value) |
|
822 | 822 | |
|
823 | def reset_state( | |
|
824 | self, | |
|
825 | filename, | |
|
826 | wc_tracked=False, | |
|
827 | p1_tracked=False, | |
|
828 | p2_tracked=False, | |
|
829 | merged=False, | |
|
830 | clean_p1=False, | |
|
831 | clean_p2=False, | |
|
832 | possibly_dirty=False, | |
|
833 | parentfiledata=None, | |
|
834 | ): | |
|
835 | """Set a entry to a given state, disregarding all previous state | |
|
836 | ||
|
837 | This is to be used by the part of the dirstate API dedicated to | |
|
838 | adjusting the dirstate after a update/merge. | |
|
839 | ||
|
840 | note: calling this might result to no entry existing at all if the | |
|
841 | dirstate map does not see any point at having one for this file | |
|
842 | anymore. | |
|
843 | """ | |
|
844 | if merged and (clean_p1 or clean_p2): | |
|
845 | msg = ( | |
|
846 | b'`merged` argument incompatible with `clean_p1`/`clean_p2`' | |
|
847 | ) | |
|
848 | raise error.ProgrammingError(msg) | |
|
849 | # copy information are now outdated | |
|
850 | # (maybe new information should be in directly passed to this function) | |
|
851 | self.copymap.pop(filename, None) | |
|
852 | ||
|
853 | if not (p1_tracked or p2_tracked or wc_tracked): | |
|
854 | self._map.drop_item_and_copy_source(filename) | |
|
855 | elif merged: | |
|
856 | # XXX might be merged and removed ? | |
|
857 | entry = self.get(filename) | |
|
858 | if entry is not None and entry.tracked: | |
|
859 | # XXX mostly replicate dirstate.other parent. We should get | |
|
860 | # the higher layer to pass us more reliable data where `merged` | |
|
861 | # actually mean merged. Dropping the else clause will show | |
|
862 | # failure in `test-graft.t` | |
|
863 | self.addfile(filename, merged=True) | |
|
864 | else: | |
|
865 | self.addfile(filename, from_p2=True) | |
|
866 | elif not (p1_tracked or p2_tracked) and wc_tracked: | |
|
867 | self.addfile( | |
|
868 | filename, added=True, possibly_dirty=possibly_dirty | |
|
869 | ) | |
|
870 | elif (p1_tracked or p2_tracked) and not wc_tracked: | |
|
871 | # XXX might be merged and removed ? | |
|
872 | self[filename] = DirstateItem.from_v1_data(b'r', 0, 0, 0) | |
|
873 | elif clean_p2 and wc_tracked: | |
|
874 | if p1_tracked or self.get(filename) is not None: | |
|
875 | # XXX the `self.get` call is catching some case in | |
|
876 | # `test-merge-remove.t` where the file is tracked in p1, the | |
|
877 | # p1_tracked argument is False. | |
|
878 | # | |
|
879 | # In addition, this seems to be a case where the file is marked | |
|
880 | # as merged without actually being the result of a merge | |
|
881 | # action. So thing are not ideal here. | |
|
882 | self.addfile(filename, merged=True) | |
|
883 | else: | |
|
884 | self.addfile(filename, from_p2=True) | |
|
885 | elif not p1_tracked and p2_tracked and wc_tracked: | |
|
886 | self.addfile( | |
|
887 | filename, from_p2=True, possibly_dirty=possibly_dirty | |
|
888 | ) | |
|
889 | elif possibly_dirty: | |
|
890 | self.addfile(filename, possibly_dirty=possibly_dirty) | |
|
891 | elif wc_tracked: | |
|
892 | # this is a "normal" file | |
|
893 | if parentfiledata is None: | |
|
894 | msg = b'failed to pass parentfiledata for a normal file: %s' | |
|
895 | msg %= filename | |
|
896 | raise error.ProgrammingError(msg) | |
|
897 | mode, size, mtime = parentfiledata | |
|
898 | self.addfile(filename, mode=mode, size=size, mtime=mtime) | |
|
899 | else: | |
|
900 | assert False, 'unreachable' | |
|
901 | ||
|
902 | 823 | ### Legacy method we need to get rid of |
|
903 | 824 | |
|
904 | 825 | def addfile( |
General Comments 0
You need to be logged in to leave comments.
Login now