Show More
@@ -72,6 +72,17 def _getfsnow(vfs): | |||||
72 | vfs.unlink(tmpname) |
|
72 | vfs.unlink(tmpname) | |
73 |
|
73 | |||
74 |
|
74 | |||
|
75 | def requires_parents_change(func): | |||
|
76 | def wrap(self, *args, **kwargs): | |||
|
77 | if not self.pendingparentchange(): | |||
|
78 | msg = 'calling `%s` outside of a parentchange context' | |||
|
79 | msg %= func.__name__ | |||
|
80 | raise error.ProgrammingError(msg) | |||
|
81 | return func(self, *args, **kwargs) | |||
|
82 | ||||
|
83 | return wrap | |||
|
84 | ||||
|
85 | ||||
75 | @interfaceutil.implementer(intdirstate.idirstate) |
|
86 | @interfaceutil.implementer(intdirstate.idirstate) | |
76 | class dirstate(object): |
|
87 | class dirstate(object): | |
77 | def __init__( |
|
88 | def __init__( | |
@@ -440,6 +451,44 class dirstate(object): | |||||
440 | def copies(self): |
|
451 | def copies(self): | |
441 | return self._map.copymap |
|
452 | return self._map.copymap | |
442 |
|
453 | |||
|
454 | @requires_parents_change | |||
|
455 | def update_file_reference( | |||
|
456 | self, | |||
|
457 | filename, | |||
|
458 | p1_tracked, | |||
|
459 | ): | |||
|
460 | """Set a file as tracked in the parent (or not) | |||
|
461 | ||||
|
462 | This is to be called when adjust the dirstate to a new parent after an history | |||
|
463 | rewriting operation. | |||
|
464 | ||||
|
465 | It should not be called during a merge (p2 != nullid) and only within | |||
|
466 | a `with dirstate.parentchange():` context. | |||
|
467 | """ | |||
|
468 | if self.in_merge: | |||
|
469 | msg = b'update_file_reference should not be called when merging' | |||
|
470 | raise error.ProgrammingError(msg) | |||
|
471 | entry = self._map.get(filename) | |||
|
472 | if entry is None: | |||
|
473 | wc_tracked = False | |||
|
474 | else: | |||
|
475 | wc_tracked = entry.tracked | |||
|
476 | if p1_tracked and wc_tracked: | |||
|
477 | # the underlying reference might have changed, we will have to | |||
|
478 | # check it. | |||
|
479 | self.normallookup(filename) | |||
|
480 | elif not (p1_tracked or wc_tracked): | |||
|
481 | # the file is no longer relevant to anyone | |||
|
482 | self._drop(filename) | |||
|
483 | elif (not p1_tracked) and wc_tracked: | |||
|
484 | if not entry.added: | |||
|
485 | self._add(filename) | |||
|
486 | elif p1_tracked and not wc_tracked: | |||
|
487 | if entry is None or not entry.removed: | |||
|
488 | self._remove(filename) | |||
|
489 | else: | |||
|
490 | assert False, 'unreachable' | |||
|
491 | ||||
443 | def _addpath( |
|
492 | def _addpath( | |
444 | self, |
|
493 | self, | |
445 | f, |
|
494 | f, |
@@ -1485,25 +1485,15 def movedirstate(repo, newctx, match=Non | |||||
1485 | copies = dict(ds.copies()) |
|
1485 | copies = dict(ds.copies()) | |
1486 | ds.setparents(newctx.node(), repo.nullid) |
|
1486 | ds.setparents(newctx.node(), repo.nullid) | |
1487 | s = newctx.status(oldctx, match=match) |
|
1487 | s = newctx.status(oldctx, match=match) | |
|
1488 | ||||
1488 | for f in s.modified: |
|
1489 | for f in s.modified: | |
1489 | if ds[f] == b'r': |
|
1490 | ds.update_file_reference(f, p1_tracked=True) | |
1490 | # modified + removed -> removed |
|
|||
1491 | continue |
|
|||
1492 | ds.normallookup(f) |
|
|||
1493 |
|
1491 | |||
1494 | for f in s.added: |
|
1492 | for f in s.added: | |
1495 | if ds[f] == b'r': |
|
1493 | ds.update_file_reference(f, p1_tracked=False) | |
1496 | # added + removed -> unknown |
|
|||
1497 | ds.drop(f) |
|
|||
1498 | elif ds[f] != b'a': |
|
|||
1499 | ds.add(f) |
|
|||
1500 |
|
1494 | |||
1501 | for f in s.removed: |
|
1495 | for f in s.removed: | |
1502 | if ds[f] == b'a': |
|
1496 | ds.update_file_reference(f, p1_tracked=True) | |
1503 | # removed + added -> normal |
|
|||
1504 | ds.normallookup(f) |
|
|||
1505 | elif ds[f] != b'r': |
|
|||
1506 | ds.remove(f) |
|
|||
1507 |
|
1497 | |||
1508 | # Merge old parent and old working dir copies |
|
1498 | # Merge old parent and old working dir copies | |
1509 | oldcopies = copiesmod.pathcopies(newctx, oldctx, match) |
|
1499 | oldcopies = copiesmod.pathcopies(newctx, oldctx, match) |
General Comments 0
You need to be logged in to leave comments.
Login now