comparison mercurial/phases.py @ 51514:4ee50d98d35c stable

phases: update the phase set as we go during retract boundary Apparently iterating over the `changed_revs` dictionary is very expensive. On mozilla-try-2019-02-18, a perf::unbundle call with a 10 000 changesets bundle gives give use the following timing. e57d4b868a3e: 4.6 seconds ac1c75188440: 102.5 seconds prev-changeset: 30.0 seconds this-changeset: 4.6 seconds So, the performance regression is gone. Once again: thanks to marvelous Python!
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Mon, 25 Mar 2024 02:09:15 +0100
parents e0f92bd98c24
children 231a92eb1936
comparison
equal deleted inserted replaced
51513:e0f92bd98c24 51514:4ee50d98d35c
867 replaced_roots = set() # older roots replaced by this call 867 replaced_roots = set() # older roots replaced by this call
868 currentroots = self._phaseroots[targetphase] 868 currentroots = self._phaseroots[targetphase]
869 start = min(new_revs) 869 start = min(new_revs)
870 end = len(cl) 870 end = len(cl)
871 rev_phases = [None] * (end - start) 871 rev_phases = [None] * (end - start)
872
873 this_phase_set = self._phasesets[targetphase]
872 for r in range(start, end): 874 for r in range(start, end):
873 875
874 # gather information about the current_rev 876 # gather information about the current_rev
875 r_phase = phase(repo, r) 877 r_phase = phase(repo, r)
876 p_phase = None # phase inherited from parents 878 p_phase = None # phase inherited from parents
891 if r in new_revs and r_phase < targetphase: 893 if r in new_revs and r_phase < targetphase:
892 if p_phase is None or p_phase < targetphase: 894 if p_phase is None or p_phase < targetphase:
893 new_roots.add(r) 895 new_roots.add(r)
894 rev_phases[r - start] = targetphase 896 rev_phases[r - start] = targetphase
895 changed_revs[r] = r_phase 897 changed_revs[r] = r_phase
898 this_phase_set.add(r)
896 elif p_phase is None: 899 elif p_phase is None:
897 rev_phases[r - start] = r_phase 900 rev_phases[r - start] = r_phase
898 else: 901 else:
899 if p_phase > r_phase: 902 if p_phase > r_phase:
900 rev_phases[r - start] = p_phase 903 rev_phases[r - start] = p_phase
901 else: 904 else:
902 rev_phases[r - start] = r_phase 905 rev_phases[r - start] = r_phase
903 if p_phase == targetphase: 906 if p_phase == targetphase:
904 if p_phase > r_phase: 907 if p_phase > r_phase:
905 changed_revs[r] = r_phase 908 changed_revs[r] = r_phase
909 this_phase_set.add(r)
906 elif r in currentroots: 910 elif r in currentroots:
907 replaced_roots.add(r) 911 replaced_roots.add(r)
908 sets = self._phasesets 912 sets = self._phasesets
909 sets[targetphase].update(changed_revs)
910 if targetphase > draft: 913 if targetphase > draft:
911 for r, old in changed_revs.items(): 914 for r, old in changed_revs.items():
912 if old > public: 915 if old > public:
913 sets[old].discard(r) 916 sets[old].discard(r)
914 917