Mercurial > hg
annotate mercurial/phases.py @ 51583:22cc679a7312
phases: move RemotePhasesSummary to revision number
This continue our quest to align more logic on revision number instead of
node-ids. The motivation is similar to the change to `new_heads` and
`analyze_remote_phases` a few changeset earlier.
Again, we take this as an opportunity to rename the class, and the attribute to
the new naming scheme. This will highlight the need for code update for any
code using it an expecting node-ids.
Many of the rev-num → node-id conversion we had to introduce in the previous
changesets can now be removed. More will be removed in the future as we continue
to align code toward rev-num usage.
time saved in the 100 milliseconds order of magnitude for the mozilla-try
benchmark I have been using.
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Fri, 05 Apr 2024 14:11:02 +0200 |
parents | d8287e43540f |
children | c11d21faa73c |
rev | line source |
---|---|
15659
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
1 """ Mercurial phases support code |
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
2 |
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
3 --- |
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
4 |
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
5 Copyright 2011 Pierre-Yves David <pierre-yves.david@ens-lyon.org> |
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
6 Logilab SA <contact@logilab.fr> |
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
7 Augie Fackler <durin42@gmail.com> |
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
8 |
16725
b0fb4f57d076
phases: wrap docstrings at 70 characters
Martin Geisler <martin@geisler.net>
parents:
16724
diff
changeset
|
9 This software may be used and distributed according to the terms |
b0fb4f57d076
phases: wrap docstrings at 70 characters
Martin Geisler <martin@geisler.net>
parents:
16724
diff
changeset
|
10 of the GNU General Public License version 2 or any later version. |
15659
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
11 |
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
12 --- |
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
13 |
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
14 This module implements most phase logic in mercurial. |
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
15 |
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
16 |
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
17 Basic Concept |
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
18 ============= |
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
19 |
16724
00535da82faf
phases: fix typos in docstrings
Martin Geisler <martin@geisler.net>
parents:
16659
diff
changeset
|
20 A 'changeset phase' is an indicator that tells us how a changeset is |
16725
b0fb4f57d076
phases: wrap docstrings at 70 characters
Martin Geisler <martin@geisler.net>
parents:
16724
diff
changeset
|
21 manipulated and communicated. The details of each phase is described |
b0fb4f57d076
phases: wrap docstrings at 70 characters
Martin Geisler <martin@geisler.net>
parents:
16724
diff
changeset
|
22 below, here we describe the properties they have in common. |
15659
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
23 |
16725
b0fb4f57d076
phases: wrap docstrings at 70 characters
Martin Geisler <martin@geisler.net>
parents:
16724
diff
changeset
|
24 Like bookmarks, phases are not stored in history and thus are not |
b0fb4f57d076
phases: wrap docstrings at 70 characters
Martin Geisler <martin@geisler.net>
parents:
16724
diff
changeset
|
25 permanent and leave no audit trail. |
15659
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
26 |
16725
b0fb4f57d076
phases: wrap docstrings at 70 characters
Martin Geisler <martin@geisler.net>
parents:
16724
diff
changeset
|
27 First, no changeset can be in two phases at once. Phases are ordered, |
b0fb4f57d076
phases: wrap docstrings at 70 characters
Martin Geisler <martin@geisler.net>
parents:
16724
diff
changeset
|
28 so they can be considered from lowest to highest. The default, lowest |
b0fb4f57d076
phases: wrap docstrings at 70 characters
Martin Geisler <martin@geisler.net>
parents:
16724
diff
changeset
|
29 phase is 'public' - this is the normal phase of existing changesets. A |
b0fb4f57d076
phases: wrap docstrings at 70 characters
Martin Geisler <martin@geisler.net>
parents:
16724
diff
changeset
|
30 child changeset can not be in a lower phase than its parents. |
15659
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
31 |
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
32 These phases share a hierarchy of traits: |
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
33 |
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
34 immutable shared |
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
35 public: X X |
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
36 draft: X |
15705
e34f4d1f0dbb
phases: update doc to mention secret phase
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15697
diff
changeset
|
37 secret: |
15659
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
38 |
16724
00535da82faf
phases: fix typos in docstrings
Martin Geisler <martin@geisler.net>
parents:
16659
diff
changeset
|
39 Local commits are draft by default. |
15659
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
40 |
16724
00535da82faf
phases: fix typos in docstrings
Martin Geisler <martin@geisler.net>
parents:
16659
diff
changeset
|
41 Phase Movement and Exchange |
00535da82faf
phases: fix typos in docstrings
Martin Geisler <martin@geisler.net>
parents:
16659
diff
changeset
|
42 =========================== |
15659
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
43 |
16725
b0fb4f57d076
phases: wrap docstrings at 70 characters
Martin Geisler <martin@geisler.net>
parents:
16724
diff
changeset
|
44 Phase data is exchanged by pushkey on pull and push. Some servers have |
b0fb4f57d076
phases: wrap docstrings at 70 characters
Martin Geisler <martin@geisler.net>
parents:
16724
diff
changeset
|
45 a publish option set, we call such a server a "publishing server". |
b0fb4f57d076
phases: wrap docstrings at 70 characters
Martin Geisler <martin@geisler.net>
parents:
16724
diff
changeset
|
46 Pushing a draft changeset to a publishing server changes the phase to |
b0fb4f57d076
phases: wrap docstrings at 70 characters
Martin Geisler <martin@geisler.net>
parents:
16724
diff
changeset
|
47 public. |
15659
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
48 |
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
49 A small list of fact/rules define the exchange of phase: |
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
50 |
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
51 * old client never changes server states |
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
52 * pull never changes server states |
16724
00535da82faf
phases: fix typos in docstrings
Martin Geisler <martin@geisler.net>
parents:
16659
diff
changeset
|
53 * publish and old server changesets are seen as public by client |
16725
b0fb4f57d076
phases: wrap docstrings at 70 characters
Martin Geisler <martin@geisler.net>
parents:
16724
diff
changeset
|
54 * any secret changeset seen in another repository is lowered to at |
b0fb4f57d076
phases: wrap docstrings at 70 characters
Martin Geisler <martin@geisler.net>
parents:
16724
diff
changeset
|
55 least draft |
15659
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
56 |
16725
b0fb4f57d076
phases: wrap docstrings at 70 characters
Martin Geisler <martin@geisler.net>
parents:
16724
diff
changeset
|
57 Here is the final table summing up the 49 possible use cases of phase |
b0fb4f57d076
phases: wrap docstrings at 70 characters
Martin Geisler <martin@geisler.net>
parents:
16724
diff
changeset
|
58 exchange: |
15659
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
59 |
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
60 server |
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
61 old publish non-publish |
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
62 N X N D P N D P |
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
63 old client |
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
64 pull |
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
65 N - X/X - X/D X/P - X/D X/P |
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
66 X - X/X - X/D X/P - X/D X/P |
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
67 push |
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
68 X X/X X/X X/P X/P X/P X/D X/D X/P |
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
69 new client |
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
70 pull |
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
71 N - P/X - P/D P/P - D/D P/P |
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
72 D - P/X - P/D P/P - D/D P/P |
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
73 P - P/X - P/D P/P - P/D P/P |
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
74 push |
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
75 D P/X P/X P/P P/P P/P D/D D/D P/P |
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
76 P P/X P/X P/P P/P P/P P/P P/P P/P |
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
77 |
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
78 Legend: |
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
79 |
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
80 A/B = final state on client / state on server |
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
81 |
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
82 * N = new/not present, |
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
83 * P = public, |
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
84 * D = draft, |
16725
b0fb4f57d076
phases: wrap docstrings at 70 characters
Martin Geisler <martin@geisler.net>
parents:
16724
diff
changeset
|
85 * X = not tracked (i.e., the old client or server has no internal |
b0fb4f57d076
phases: wrap docstrings at 70 characters
Martin Geisler <martin@geisler.net>
parents:
16724
diff
changeset
|
86 way of recording the phase.) |
15659
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
87 |
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
88 passive = only pushes |
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
89 |
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
90 |
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
91 A cell here can be read like this: |
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
92 |
16725
b0fb4f57d076
phases: wrap docstrings at 70 characters
Martin Geisler <martin@geisler.net>
parents:
16724
diff
changeset
|
93 "When a new client pushes a draft changeset (D) to a publishing |
b0fb4f57d076
phases: wrap docstrings at 70 characters
Martin Geisler <martin@geisler.net>
parents:
16724
diff
changeset
|
94 server where it's not present (N), it's marked public on both |
b0fb4f57d076
phases: wrap docstrings at 70 characters
Martin Geisler <martin@geisler.net>
parents:
16724
diff
changeset
|
95 sides (P/P)." |
15659
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
96 |
16724
00535da82faf
phases: fix typos in docstrings
Martin Geisler <martin@geisler.net>
parents:
16659
diff
changeset
|
97 Note: old client behave as a publishing server with draft only content |
15659
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
98 - other people see it as public |
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
99 - content is pushed as draft |
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
100 |
7fba5a245acc
phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15649
diff
changeset
|
101 """ |
15417
5261140d9322
phases: Minimal first add.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
102 |
25966
f14cea32e1d4
phases: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
103 |
51423
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
104 import heapq |
34319
5779d096a696
phases: move binary encoding into a reusable function
Boris Feld <boris.feld@octobus.net>
parents:
33460
diff
changeset
|
105 import struct |
51285
9d3721552b6c
pytype: import typing directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51124
diff
changeset
|
106 import typing |
51404
04111ef08fb0
phases: always write with a repo
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51403
diff
changeset
|
107 import weakref |
51285
9d3721552b6c
pytype: import typing directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51124
diff
changeset
|
108 |
9d3721552b6c
pytype: import typing directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51124
diff
changeset
|
109 from typing import ( |
9d3721552b6c
pytype: import typing directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51124
diff
changeset
|
110 Any, |
9d3721552b6c
pytype: import typing directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51124
diff
changeset
|
111 Callable, |
51580
b70628a9aa7e
phases: use revision number in new_heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51579
diff
changeset
|
112 Collection, |
51285
9d3721552b6c
pytype: import typing directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51124
diff
changeset
|
113 Dict, |
9d3721552b6c
pytype: import typing directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51124
diff
changeset
|
114 Iterable, |
9d3721552b6c
pytype: import typing directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51124
diff
changeset
|
115 List, |
9d3721552b6c
pytype: import typing directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51124
diff
changeset
|
116 Optional, |
9d3721552b6c
pytype: import typing directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51124
diff
changeset
|
117 Set, |
9d3721552b6c
pytype: import typing directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51124
diff
changeset
|
118 Tuple, |
9d3721552b6c
pytype: import typing directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51124
diff
changeset
|
119 ) |
25966
f14cea32e1d4
phases: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
120 |
f14cea32e1d4
phases: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
121 from .i18n import _ |
f14cea32e1d4
phases: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
122 from .node import ( |
f14cea32e1d4
phases: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
123 bin, |
f14cea32e1d4
phases: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
124 hex, |
f14cea32e1d4
phases: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
125 nullrev, |
f14cea32e1d4
phases: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
126 short, |
44004
9c1fd975e9ac
phases: make the working directory consistently a draft
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents:
43730
diff
changeset
|
127 wdirrev, |
25966
f14cea32e1d4
phases: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
128 ) |
f14cea32e1d4
phases: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
129 from . import ( |
f14cea32e1d4
phases: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
130 error, |
45372
77b8588dd84e
requirements: introduce new requirements related module
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45356
diff
changeset
|
131 requirements, |
31016
bf81d3b7b2ba
phases: add a getrevset method to phasecache
Jun Wu <quark@fb.com>
parents:
30634
diff
changeset
|
132 smartset, |
31053
6afd8a87a657
phases: check HG_PENDING strictly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
31016
diff
changeset
|
133 txnutil, |
32000
511a62669f1b
phases: emit phases to pushkey protocol in deterministic order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
31342
diff
changeset
|
134 util, |
25966
f14cea32e1d4
phases: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
135 ) |
15418
cf729af26963
phases: basic I/O logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15417
diff
changeset
|
136 |
51406
f8bf1a8e9181
phases: keep internal state as rev-num instead of node-id
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51405
diff
changeset
|
137 Phaseroots = Dict[int, Set[int]] |
51411
774e4eff6e47
phases: type annotation for `_phasesets`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51410
diff
changeset
|
138 PhaseSets = Dict[int, Set[int]] |
51285
9d3721552b6c
pytype: import typing directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51124
diff
changeset
|
139 |
9d3721552b6c
pytype: import typing directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51124
diff
changeset
|
140 if typing.TYPE_CHECKING: |
46644
77e129be10de
typing: add some type annotations to mercurial/phases.py
Matt Harbison <matt_harbison@yahoo.com>
parents:
45790
diff
changeset
|
141 from . import ( |
77e129be10de
typing: add some type annotations to mercurial/phases.py
Matt Harbison <matt_harbison@yahoo.com>
parents:
45790
diff
changeset
|
142 localrepo, |
77e129be10de
typing: add some type annotations to mercurial/phases.py
Matt Harbison <matt_harbison@yahoo.com>
parents:
45790
diff
changeset
|
143 ui as uimod, |
77e129be10de
typing: add some type annotations to mercurial/phases.py
Matt Harbison <matt_harbison@yahoo.com>
parents:
45790
diff
changeset
|
144 ) |
77e129be10de
typing: add some type annotations to mercurial/phases.py
Matt Harbison <matt_harbison@yahoo.com>
parents:
45790
diff
changeset
|
145 |
51285
9d3721552b6c
pytype: import typing directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51124
diff
changeset
|
146 # keeps pyflakes happy |
9d3721552b6c
pytype: import typing directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51124
diff
changeset
|
147 assert [uimod] |
9d3721552b6c
pytype: import typing directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51124
diff
changeset
|
148 |
46644
77e129be10de
typing: add some type annotations to mercurial/phases.py
Matt Harbison <matt_harbison@yahoo.com>
parents:
45790
diff
changeset
|
149 Phasedefaults = List[ |
77e129be10de
typing: add some type annotations to mercurial/phases.py
Matt Harbison <matt_harbison@yahoo.com>
parents:
45790
diff
changeset
|
150 Callable[[localrepo.localrepository, Phaseroots], Phaseroots] |
77e129be10de
typing: add some type annotations to mercurial/phases.py
Matt Harbison <matt_harbison@yahoo.com>
parents:
45790
diff
changeset
|
151 ] |
77e129be10de
typing: add some type annotations to mercurial/phases.py
Matt Harbison <matt_harbison@yahoo.com>
parents:
45790
diff
changeset
|
152 |
77e129be10de
typing: add some type annotations to mercurial/phases.py
Matt Harbison <matt_harbison@yahoo.com>
parents:
45790
diff
changeset
|
153 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
154 _fphasesentry = struct.Struct(b'>i20s') |
34319
5779d096a696
phases: move binary encoding into a reusable function
Boris Feld <boris.feld@octobus.net>
parents:
33460
diff
changeset
|
155 |
39297
06c976acc581
phases: add an internal phases
Boris Feld <boris.feld@octobus.net>
parents:
39293
diff
changeset
|
156 # record phase index |
51288
8b2ea2246a5f
pytype: convert type comment for inline variable too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51287
diff
changeset
|
157 public: int = 0 |
8b2ea2246a5f
pytype: convert type comment for inline variable too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51287
diff
changeset
|
158 draft: int = 1 |
8b2ea2246a5f
pytype: convert type comment for inline variable too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51287
diff
changeset
|
159 secret: int = 2 |
45117
b1e51ef4e536
phases: sparsify phase lists
Joerg Sonnenberger <joerg@bec.de>
parents:
45116
diff
changeset
|
160 archived = 32 # non-continuous for compatibility |
b1e51ef4e536
phases: sparsify phase lists
Joerg Sonnenberger <joerg@bec.de>
parents:
45116
diff
changeset
|
161 internal = 96 # non-continuous for compatibility |
b1e51ef4e536
phases: sparsify phase lists
Joerg Sonnenberger <joerg@bec.de>
parents:
45116
diff
changeset
|
162 allphases = (public, draft, secret, archived, internal) |
b1e51ef4e536
phases: sparsify phase lists
Joerg Sonnenberger <joerg@bec.de>
parents:
45116
diff
changeset
|
163 trackedphases = (draft, secret, archived, internal) |
50387
92f71d40fc1d
revset: include all non-public phases in _notpublic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49451
diff
changeset
|
164 not_public_phases = trackedphases |
39297
06c976acc581
phases: add an internal phases
Boris Feld <boris.feld@octobus.net>
parents:
39293
diff
changeset
|
165 # record phase names |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
166 cmdphasenames = [b'public', b'draft', b'secret'] # known to `hg phase` command |
45117
b1e51ef4e536
phases: sparsify phase lists
Joerg Sonnenberger <joerg@bec.de>
parents:
45116
diff
changeset
|
167 phasenames = dict(enumerate(cmdphasenames)) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
168 phasenames[archived] = b'archived' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
169 phasenames[internal] = b'internal' |
45117
b1e51ef4e536
phases: sparsify phase lists
Joerg Sonnenberger <joerg@bec.de>
parents:
45116
diff
changeset
|
170 # map phase name to phase number |
b1e51ef4e536
phases: sparsify phase lists
Joerg Sonnenberger <joerg@bec.de>
parents:
45116
diff
changeset
|
171 phasenumber = {name: phase for phase, name in phasenames.items()} |
b1e51ef4e536
phases: sparsify phase lists
Joerg Sonnenberger <joerg@bec.de>
parents:
45116
diff
changeset
|
172 # like phasenumber, but also include maps for the numeric and binary |
b1e51ef4e536
phases: sparsify phase lists
Joerg Sonnenberger <joerg@bec.de>
parents:
45116
diff
changeset
|
173 # phase number to the phase number |
b1e51ef4e536
phases: sparsify phase lists
Joerg Sonnenberger <joerg@bec.de>
parents:
45116
diff
changeset
|
174 phasenumber2 = phasenumber.copy() |
b1e51ef4e536
phases: sparsify phase lists
Joerg Sonnenberger <joerg@bec.de>
parents:
45116
diff
changeset
|
175 phasenumber2.update({phase: phase for phase in phasenames}) |
b1e51ef4e536
phases: sparsify phase lists
Joerg Sonnenberger <joerg@bec.de>
parents:
45116
diff
changeset
|
176 phasenumber2.update({b'%i' % phase: phase for phase in phasenames}) |
39297
06c976acc581
phases: add an internal phases
Boris Feld <boris.feld@octobus.net>
parents:
39293
diff
changeset
|
177 # record phase property |
45117
b1e51ef4e536
phases: sparsify phase lists
Joerg Sonnenberger <joerg@bec.de>
parents:
45116
diff
changeset
|
178 mutablephases = (draft, secret, archived, internal) |
51124
80bda4254b84
unstable: do not consider internal phases when computing unstable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50929
diff
changeset
|
179 relevant_mutable_phases = (draft, secret) # could be obsolete or unstable |
45117
b1e51ef4e536
phases: sparsify phase lists
Joerg Sonnenberger <joerg@bec.de>
parents:
45116
diff
changeset
|
180 remotehiddenphases = (secret, archived, internal) |
b1e51ef4e536
phases: sparsify phase lists
Joerg Sonnenberger <joerg@bec.de>
parents:
45116
diff
changeset
|
181 localhiddenphases = (internal, archived) |
15418
cf729af26963
phases: basic I/O logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15417
diff
changeset
|
182 |
50396
386737600689
revset: add `_internal()` predicate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50392
diff
changeset
|
183 all_internal_phases = tuple(p for p in allphases if p & internal) |
386737600689
revset: add `_internal()` predicate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50392
diff
changeset
|
184 # We do not want any internal content to exit the repository, ever. |
386737600689
revset: add `_internal()` predicate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50392
diff
changeset
|
185 no_bundle_phases = all_internal_phases |
386737600689
revset: add `_internal()` predicate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50392
diff
changeset
|
186 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40580
diff
changeset
|
187 |
51287
f15cb5111a1e
pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51285
diff
changeset
|
188 def supportinternal(repo: "localrepo.localrepository") -> bool: |
39299
7775c1fb8fa0
phases: enforce internal phase support
Boris Feld <boris.feld@octobus.net>
parents:
39297
diff
changeset
|
189 """True if the internal phase can be used on a repository""" |
45372
77b8588dd84e
requirements: introduce new requirements related module
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45356
diff
changeset
|
190 return requirements.INTERNAL_PHASE_REQUIREMENT in repo.requirements |
39299
7775c1fb8fa0
phases: enforce internal phase support
Boris Feld <boris.feld@octobus.net>
parents:
39297
diff
changeset
|
191 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40580
diff
changeset
|
192 |
51287
f15cb5111a1e
pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51285
diff
changeset
|
193 def supportarchived(repo: "localrepo.localrepository") -> bool: |
49450
b57c95a0f5f9
phase: introduce a dedicated function to check for the archived phase
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
194 """True if the archived phase can be used on a repository""" |
49451
0c70d888a484
phase: introduce a dedicated requirement for the `archived` phase
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49450
diff
changeset
|
195 return requirements.ARCHIVED_PHASE_REQUIREMENT in repo.requirements |
49450
b57c95a0f5f9
phase: introduce a dedicated function to check for the archived phase
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
196 |
b57c95a0f5f9
phase: introduce a dedicated function to check for the archived phase
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
197 |
51287
f15cb5111a1e
pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51285
diff
changeset
|
198 def _readroots( |
f15cb5111a1e
pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51285
diff
changeset
|
199 repo: "localrepo.localrepository", |
f15cb5111a1e
pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51285
diff
changeset
|
200 phasedefaults: Optional["Phasedefaults"] = None, |
f15cb5111a1e
pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51285
diff
changeset
|
201 ) -> Tuple[Phaseroots, bool]: |
16625
df9df747070d
phases: stop modifying localrepo in readroots()
Patrick Mezard <patrick@mezard.eu>
parents:
16624
diff
changeset
|
202 """Read phase roots from disk |
df9df747070d
phases: stop modifying localrepo in readroots()
Patrick Mezard <patrick@mezard.eu>
parents:
16624
diff
changeset
|
203 |
df9df747070d
phases: stop modifying localrepo in readroots()
Patrick Mezard <patrick@mezard.eu>
parents:
16624
diff
changeset
|
204 phasedefaults is a list of fn(repo, roots) callable, which are |
df9df747070d
phases: stop modifying localrepo in readroots()
Patrick Mezard <patrick@mezard.eu>
parents:
16624
diff
changeset
|
205 executed if the phase roots file does not exist. When phases are |
df9df747070d
phases: stop modifying localrepo in readroots()
Patrick Mezard <patrick@mezard.eu>
parents:
16624
diff
changeset
|
206 being initialized on an existing repository, this could be used to |
df9df747070d
phases: stop modifying localrepo in readroots()
Patrick Mezard <patrick@mezard.eu>
parents:
16624
diff
changeset
|
207 set selected changesets phase to something else than public. |
df9df747070d
phases: stop modifying localrepo in readroots()
Patrick Mezard <patrick@mezard.eu>
parents:
16624
diff
changeset
|
208 |
df9df747070d
phases: stop modifying localrepo in readroots()
Patrick Mezard <patrick@mezard.eu>
parents:
16624
diff
changeset
|
209 Return (roots, dirty) where dirty is true if roots differ from |
df9df747070d
phases: stop modifying localrepo in readroots()
Patrick Mezard <patrick@mezard.eu>
parents:
16624
diff
changeset
|
210 what is being stored. |
df9df747070d
phases: stop modifying localrepo in readroots()
Patrick Mezard <patrick@mezard.eu>
parents:
16624
diff
changeset
|
211 """ |
18002
9bc5873e52af
clfilter: phases logic should be unfiltered
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17979
diff
changeset
|
212 repo = repo.unfiltered() |
16625
df9df747070d
phases: stop modifying localrepo in readroots()
Patrick Mezard <patrick@mezard.eu>
parents:
16624
diff
changeset
|
213 dirty = False |
45131
61e7464477ac
phases: sparsify phaseroots and phasesets
Joerg Sonnenberger <joerg@bec.de>
parents:
45117
diff
changeset
|
214 roots = {i: set() for i in allphases} |
51406
f8bf1a8e9181
phases: keep internal state as rev-num instead of node-id
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51405
diff
changeset
|
215 to_rev = repo.changelog.index.get_rev |
51405
12881244e48a
phases: do filtering at read time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51404
diff
changeset
|
216 unknown_msg = b'removing unknown node %s from %i-phase boundary\n' |
15418
cf729af26963
phases: basic I/O logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15417
diff
changeset
|
217 try: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
218 f, pending = txnutil.trypending(repo.root, repo.svfs, b'phaseroots') |
15418
cf729af26963
phases: basic I/O logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15417
diff
changeset
|
219 try: |
cf729af26963
phases: basic I/O logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15417
diff
changeset
|
220 for line in f: |
51405
12881244e48a
phases: do filtering at read time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51404
diff
changeset
|
221 str_phase, hex_node = line.split() |
12881244e48a
phases: do filtering at read time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51404
diff
changeset
|
222 phase = int(str_phase) |
12881244e48a
phases: do filtering at read time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51404
diff
changeset
|
223 node = bin(hex_node) |
51406
f8bf1a8e9181
phases: keep internal state as rev-num instead of node-id
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51405
diff
changeset
|
224 rev = to_rev(node) |
f8bf1a8e9181
phases: keep internal state as rev-num instead of node-id
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51405
diff
changeset
|
225 if rev is None: |
51405
12881244e48a
phases: do filtering at read time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51404
diff
changeset
|
226 repo.ui.debug(unknown_msg % (short(hex_node), phase)) |
12881244e48a
phases: do filtering at read time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51404
diff
changeset
|
227 dirty = True |
12881244e48a
phases: do filtering at read time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51404
diff
changeset
|
228 else: |
51406
f8bf1a8e9181
phases: keep internal state as rev-num instead of node-id
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51405
diff
changeset
|
229 roots[phase].add(rev) |
15418
cf729af26963
phases: basic I/O logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15417
diff
changeset
|
230 finally: |
cf729af26963
phases: basic I/O logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15417
diff
changeset
|
231 f.close() |
49306
2e726c934fcd
py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents:
49284
diff
changeset
|
232 except FileNotFoundError: |
16625
df9df747070d
phases: stop modifying localrepo in readroots()
Patrick Mezard <patrick@mezard.eu>
parents:
16624
diff
changeset
|
233 if phasedefaults: |
df9df747070d
phases: stop modifying localrepo in readroots()
Patrick Mezard <patrick@mezard.eu>
parents:
16624
diff
changeset
|
234 for f in phasedefaults: |
df9df747070d
phases: stop modifying localrepo in readroots()
Patrick Mezard <patrick@mezard.eu>
parents:
16624
diff
changeset
|
235 roots = f(repo, roots) |
df9df747070d
phases: stop modifying localrepo in readroots()
Patrick Mezard <patrick@mezard.eu>
parents:
16624
diff
changeset
|
236 dirty = True |
df9df747070d
phases: stop modifying localrepo in readroots()
Patrick Mezard <patrick@mezard.eu>
parents:
16624
diff
changeset
|
237 return roots, dirty |
15418
cf729af26963
phases: basic I/O logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15417
diff
changeset
|
238 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40580
diff
changeset
|
239 |
51287
f15cb5111a1e
pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51285
diff
changeset
|
240 def binaryencode(phasemapping: Dict[int, List[bytes]]) -> bytes: |
34319
5779d096a696
phases: move binary encoding into a reusable function
Boris Feld <boris.feld@octobus.net>
parents:
33460
diff
changeset
|
241 """encode a 'phase -> nodes' mapping into a binary stream |
5779d096a696
phases: move binary encoding into a reusable function
Boris Feld <boris.feld@octobus.net>
parents:
33460
diff
changeset
|
242 |
45117
b1e51ef4e536
phases: sparsify phase lists
Joerg Sonnenberger <joerg@bec.de>
parents:
45116
diff
changeset
|
243 The revision lists are encoded as (phase, root) pairs. |
34319
5779d096a696
phases: move binary encoding into a reusable function
Boris Feld <boris.feld@octobus.net>
parents:
33460
diff
changeset
|
244 """ |
5779d096a696
phases: move binary encoding into a reusable function
Boris Feld <boris.feld@octobus.net>
parents:
33460
diff
changeset
|
245 binarydata = [] |
48913
f254fc73d956
global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48875
diff
changeset
|
246 for phase, nodes in phasemapping.items(): |
34319
5779d096a696
phases: move binary encoding into a reusable function
Boris Feld <boris.feld@octobus.net>
parents:
33460
diff
changeset
|
247 for head in nodes: |
5779d096a696
phases: move binary encoding into a reusable function
Boris Feld <boris.feld@octobus.net>
parents:
33460
diff
changeset
|
248 binarydata.append(_fphasesentry.pack(phase, head)) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
249 return b''.join(binarydata) |
34319
5779d096a696
phases: move binary encoding into a reusable function
Boris Feld <boris.feld@octobus.net>
parents:
33460
diff
changeset
|
250 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40580
diff
changeset
|
251 |
51287
f15cb5111a1e
pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51285
diff
changeset
|
252 def binarydecode(stream) -> Dict[int, List[bytes]]: |
34320
12c42bcd4133
phases: move the binary decoding function in the phases module
Boris Feld <boris.feld@octobus.net>
parents:
34319
diff
changeset
|
253 """decode a binary stream into a 'phase -> nodes' mapping |
12c42bcd4133
phases: move the binary decoding function in the phases module
Boris Feld <boris.feld@octobus.net>
parents:
34319
diff
changeset
|
254 |
45117
b1e51ef4e536
phases: sparsify phase lists
Joerg Sonnenberger <joerg@bec.de>
parents:
45116
diff
changeset
|
255 The (phase, root) pairs are turned back into a dictionary with |
b1e51ef4e536
phases: sparsify phase lists
Joerg Sonnenberger <joerg@bec.de>
parents:
45116
diff
changeset
|
256 the phase as index and the aggregated roots of that phase as value.""" |
b1e51ef4e536
phases: sparsify phase lists
Joerg Sonnenberger <joerg@bec.de>
parents:
45116
diff
changeset
|
257 headsbyphase = {i: [] for i in allphases} |
34320
12c42bcd4133
phases: move the binary decoding function in the phases module
Boris Feld <boris.feld@octobus.net>
parents:
34319
diff
changeset
|
258 entrysize = _fphasesentry.size |
12c42bcd4133
phases: move the binary decoding function in the phases module
Boris Feld <boris.feld@octobus.net>
parents:
34319
diff
changeset
|
259 while True: |
12c42bcd4133
phases: move the binary decoding function in the phases module
Boris Feld <boris.feld@octobus.net>
parents:
34319
diff
changeset
|
260 entry = stream.read(entrysize) |
12c42bcd4133
phases: move the binary decoding function in the phases module
Boris Feld <boris.feld@octobus.net>
parents:
34319
diff
changeset
|
261 if len(entry) < entrysize: |
12c42bcd4133
phases: move the binary decoding function in the phases module
Boris Feld <boris.feld@octobus.net>
parents:
34319
diff
changeset
|
262 if entry: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
263 raise error.Abort(_(b'bad phase-heads stream')) |
34320
12c42bcd4133
phases: move the binary decoding function in the phases module
Boris Feld <boris.feld@octobus.net>
parents:
34319
diff
changeset
|
264 break |
12c42bcd4133
phases: move the binary decoding function in the phases module
Boris Feld <boris.feld@octobus.net>
parents:
34319
diff
changeset
|
265 phase, node = _fphasesentry.unpack(entry) |
12c42bcd4133
phases: move the binary decoding function in the phases module
Boris Feld <boris.feld@octobus.net>
parents:
34319
diff
changeset
|
266 headsbyphase[phase].append(node) |
12c42bcd4133
phases: move the binary decoding function in the phases module
Boris Feld <boris.feld@octobus.net>
parents:
34319
diff
changeset
|
267 return headsbyphase |
12c42bcd4133
phases: move the binary decoding function in the phases module
Boris Feld <boris.feld@octobus.net>
parents:
34319
diff
changeset
|
268 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40580
diff
changeset
|
269 |
44548
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
270 def _sortedrange_insert(data, idx, rev, t): |
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
271 merge_before = False |
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
272 if idx: |
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
273 r1, t1 = data[idx - 1] |
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
274 merge_before = r1[-1] + 1 == rev and t1 == t |
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
275 merge_after = False |
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
276 if idx < len(data): |
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
277 r2, t2 = data[idx] |
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
278 merge_after = r2[0] == rev + 1 and t2 == t |
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
279 |
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
280 if merge_before and merge_after: |
49284
d44e3c45f0e4
py3: replace `pycompat.xrange` by `range`
Manuel Jacob <me@manueljacob.de>
parents:
48946
diff
changeset
|
281 data[idx - 1] = (range(r1[0], r2[-1] + 1), t) |
44548
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
282 data.pop(idx) |
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
283 elif merge_before: |
49284
d44e3c45f0e4
py3: replace `pycompat.xrange` by `range`
Manuel Jacob <me@manueljacob.de>
parents:
48946
diff
changeset
|
284 data[idx - 1] = (range(r1[0], rev + 1), t) |
44548
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
285 elif merge_after: |
49284
d44e3c45f0e4
py3: replace `pycompat.xrange` by `range`
Manuel Jacob <me@manueljacob.de>
parents:
48946
diff
changeset
|
286 data[idx] = (range(rev, r2[-1] + 1), t) |
44548
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
287 else: |
49284
d44e3c45f0e4
py3: replace `pycompat.xrange` by `range`
Manuel Jacob <me@manueljacob.de>
parents:
48946
diff
changeset
|
288 data.insert(idx, (range(rev, rev + 1), t)) |
44548
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
289 |
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
290 |
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
291 def _sortedrange_split(data, idx, rev, t): |
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
292 r1, t1 = data[idx] |
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
293 if t == t1: |
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
294 return |
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
295 t = (t1[0], t[1]) |
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
296 if len(r1) == 1: |
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
297 data.pop(idx) |
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
298 _sortedrange_insert(data, idx, rev, t) |
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
299 elif r1[0] == rev: |
49284
d44e3c45f0e4
py3: replace `pycompat.xrange` by `range`
Manuel Jacob <me@manueljacob.de>
parents:
48946
diff
changeset
|
300 data[idx] = (range(rev + 1, r1[-1] + 1), t1) |
44548
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
301 _sortedrange_insert(data, idx, rev, t) |
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
302 elif r1[-1] == rev: |
49284
d44e3c45f0e4
py3: replace `pycompat.xrange` by `range`
Manuel Jacob <me@manueljacob.de>
parents:
48946
diff
changeset
|
303 data[idx] = (range(r1[0], rev), t1) |
44548
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
304 _sortedrange_insert(data, idx + 1, rev, t) |
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
305 else: |
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
306 data[idx : idx + 1] = [ |
49284
d44e3c45f0e4
py3: replace `pycompat.xrange` by `range`
Manuel Jacob <me@manueljacob.de>
parents:
48946
diff
changeset
|
307 (range(r1[0], rev), t1), |
d44e3c45f0e4
py3: replace `pycompat.xrange` by `range`
Manuel Jacob <me@manueljacob.de>
parents:
48946
diff
changeset
|
308 (range(rev, rev + 1), t), |
d44e3c45f0e4
py3: replace `pycompat.xrange` by `range`
Manuel Jacob <me@manueljacob.de>
parents:
48946
diff
changeset
|
309 (range(rev + 1, r1[-1] + 1), t1), |
44548
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
310 ] |
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
311 |
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
312 |
33451
e44d54260c32
phases: track phase movements in 'advanceboundary'
Boris Feld <boris.feld@octobus.net>
parents:
33450
diff
changeset
|
313 def _trackphasechange(data, rev, old, new): |
44548
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
314 """add a phase move to the <data> list of ranges |
33451
e44d54260c32
phases: track phase movements in 'advanceboundary'
Boris Feld <boris.feld@octobus.net>
parents:
33450
diff
changeset
|
315 |
e44d54260c32
phases: track phase movements in 'advanceboundary'
Boris Feld <boris.feld@octobus.net>
parents:
33450
diff
changeset
|
316 If data is None, nothing happens. |
e44d54260c32
phases: track phase movements in 'advanceboundary'
Boris Feld <boris.feld@octobus.net>
parents:
33450
diff
changeset
|
317 """ |
e44d54260c32
phases: track phase movements in 'advanceboundary'
Boris Feld <boris.feld@octobus.net>
parents:
33450
diff
changeset
|
318 if data is None: |
e44d54260c32
phases: track phase movements in 'advanceboundary'
Boris Feld <boris.feld@octobus.net>
parents:
33450
diff
changeset
|
319 return |
44548
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
320 |
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
321 # If data is empty, create a one-revision range and done |
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
322 if not data: |
49284
d44e3c45f0e4
py3: replace `pycompat.xrange` by `range`
Manuel Jacob <me@manueljacob.de>
parents:
48946
diff
changeset
|
323 data.insert(0, (range(rev, rev + 1), (old, new))) |
44548
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
324 return |
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
325 |
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
326 low = 0 |
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
327 high = len(data) |
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
328 t = (old, new) |
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
329 while low < high: |
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
330 mid = (low + high) // 2 |
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
331 revs = data[mid][0] |
45550
29a259be6424
phases: fix performance regression with Python 2
Joerg Sonnenberger <joerg@bec.de>
parents:
45372
diff
changeset
|
332 revs_low = revs[0] |
29a259be6424
phases: fix performance regression with Python 2
Joerg Sonnenberger <joerg@bec.de>
parents:
45372
diff
changeset
|
333 revs_high = revs[-1] |
44548
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
334 |
45550
29a259be6424
phases: fix performance regression with Python 2
Joerg Sonnenberger <joerg@bec.de>
parents:
45372
diff
changeset
|
335 if rev >= revs_low and rev <= revs_high: |
44548
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
336 _sortedrange_split(data, mid, rev, t) |
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
337 return |
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
338 |
45550
29a259be6424
phases: fix performance regression with Python 2
Joerg Sonnenberger <joerg@bec.de>
parents:
45372
diff
changeset
|
339 if revs_low == rev + 1: |
44548
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
340 if mid and data[mid - 1][0][-1] == rev: |
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
341 _sortedrange_split(data, mid - 1, rev, t) |
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
342 else: |
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
343 _sortedrange_insert(data, mid, rev, t) |
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
344 return |
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
345 |
45550
29a259be6424
phases: fix performance regression with Python 2
Joerg Sonnenberger <joerg@bec.de>
parents:
45372
diff
changeset
|
346 if revs_high == rev - 1: |
44548
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
347 if mid + 1 < len(data) and data[mid + 1][0][0] == rev: |
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
348 _sortedrange_split(data, mid + 1, rev, t) |
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
349 else: |
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
350 _sortedrange_insert(data, mid + 1, rev, t) |
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
351 return |
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
352 |
45550
29a259be6424
phases: fix performance regression with Python 2
Joerg Sonnenberger <joerg@bec.de>
parents:
45372
diff
changeset
|
353 if revs_low > rev: |
44548
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
354 high = mid |
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
355 else: |
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
356 low = mid + 1 |
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
357 |
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
358 if low == len(data): |
49284
d44e3c45f0e4
py3: replace `pycompat.xrange` by `range`
Manuel Jacob <me@manueljacob.de>
parents:
48946
diff
changeset
|
359 data.append((range(rev, rev + 1), t)) |
44548
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
360 return |
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
361 |
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
362 r1, t1 = data[low] |
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
363 if r1[0] > rev: |
49284
d44e3c45f0e4
py3: replace `pycompat.xrange` by `range`
Manuel Jacob <me@manueljacob.de>
parents:
48946
diff
changeset
|
364 data.insert(low, (range(rev, rev + 1), t)) |
44548
fdc802f29b2c
transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents:
44452
diff
changeset
|
365 else: |
49284
d44e3c45f0e4
py3: replace `pycompat.xrange` by `range`
Manuel Jacob <me@manueljacob.de>
parents:
48946
diff
changeset
|
366 data.insert(low + 1, (range(rev, rev + 1), t)) |
33451
e44d54260c32
phases: track phase movements in 'advanceboundary'
Boris Feld <boris.feld@octobus.net>
parents:
33450
diff
changeset
|
367 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40580
diff
changeset
|
368 |
51419
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
369 # consider incrementaly updating the phase set the update set is not bigger |
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
370 # than this size |
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
371 # |
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
372 # Be warned, this number is picked arbitrarily, without any benchmark. It |
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
373 # should blindly pickup "small update" |
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
374 INCREMENTAL_PHASE_SETS_UPDATE_MAX_UPDATE = 100 |
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
375 |
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
376 |
48946
642e31cb55f0
py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48913
diff
changeset
|
377 class phasecache: |
51287
f15cb5111a1e
pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51285
diff
changeset
|
378 def __init__( |
f15cb5111a1e
pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51285
diff
changeset
|
379 self, |
f15cb5111a1e
pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51285
diff
changeset
|
380 repo: "localrepo.localrepository", |
f15cb5111a1e
pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51285
diff
changeset
|
381 phasedefaults: Optional["Phasedefaults"], |
f15cb5111a1e
pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51285
diff
changeset
|
382 _load: bool = True, |
f15cb5111a1e
pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51285
diff
changeset
|
383 ): |
16658
6b3d31d04a69
phases: make advance/retractboundary() atomic
Patrick Mezard <patrick@mezard.eu>
parents:
16657
diff
changeset
|
384 if _load: |
6b3d31d04a69
phases: make advance/retractboundary() atomic
Patrick Mezard <patrick@mezard.eu>
parents:
16657
diff
changeset
|
385 # Cheap trick to allow shallow-copy without copy module |
51405
12881244e48a
phases: do filtering at read time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51404
diff
changeset
|
386 loaded = _readroots(repo, phasedefaults) |
12881244e48a
phases: do filtering at read time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51404
diff
changeset
|
387 self._phaseroots: Phaseroots = loaded[0] |
12881244e48a
phases: do filtering at read time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51404
diff
changeset
|
388 self.dirty: bool = loaded[1] |
35442
56745e58df07
phases: initialize number of loaded revisions to 0
Yuya Nishihara <yuya@tcha.org>
parents:
35441
diff
changeset
|
389 self._loadedrevslen = 0 |
51411
774e4eff6e47
phases: type annotation for `_phasesets`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51410
diff
changeset
|
390 self._phasesets: PhaseSets = None |
16658
6b3d31d04a69
phases: make advance/retractboundary() atomic
Patrick Mezard <patrick@mezard.eu>
parents:
16657
diff
changeset
|
391 |
51287
f15cb5111a1e
pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51285
diff
changeset
|
392 def hasnonpublicphases(self, repo: "localrepo.localrepository") -> bool: |
45114
e2d17974a869
phases: provide a test and accessor for non-public phase roots
Joerg Sonnenberger <joerg@bec.de>
parents:
45063
diff
changeset
|
393 """detect if there are revisions with non-public phase""" |
51416
0c04074f5414
phases: drop set building in `hasnonpublicphases`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51415
diff
changeset
|
394 # XXX deprecate the unused repo argument |
45131
61e7464477ac
phases: sparsify phaseroots and phasesets
Joerg Sonnenberger <joerg@bec.de>
parents:
45117
diff
changeset
|
395 return any( |
51403
68289ed170c7
phases: mark `phasecache.phaseroots` private
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51401
diff
changeset
|
396 revs for phase, revs in self._phaseroots.items() if phase != public |
45131
61e7464477ac
phases: sparsify phaseroots and phasesets
Joerg Sonnenberger <joerg@bec.de>
parents:
45117
diff
changeset
|
397 ) |
45114
e2d17974a869
phases: provide a test and accessor for non-public phase roots
Joerg Sonnenberger <joerg@bec.de>
parents:
45063
diff
changeset
|
398 |
51287
f15cb5111a1e
pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51285
diff
changeset
|
399 def nonpublicphaseroots( |
f15cb5111a1e
pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51285
diff
changeset
|
400 self, repo: "localrepo.localrepository" |
51406
f8bf1a8e9181
phases: keep internal state as rev-num instead of node-id
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51405
diff
changeset
|
401 ) -> Set[int]: |
45114
e2d17974a869
phases: provide a test and accessor for non-public phase roots
Joerg Sonnenberger <joerg@bec.de>
parents:
45063
diff
changeset
|
402 """returns the roots of all non-public phases |
e2d17974a869
phases: provide a test and accessor for non-public phase roots
Joerg Sonnenberger <joerg@bec.de>
parents:
45063
diff
changeset
|
403 |
e2d17974a869
phases: provide a test and accessor for non-public phase roots
Joerg Sonnenberger <joerg@bec.de>
parents:
45063
diff
changeset
|
404 The roots are not minimized, so if the secret revisions are |
e2d17974a869
phases: provide a test and accessor for non-public phase roots
Joerg Sonnenberger <joerg@bec.de>
parents:
45063
diff
changeset
|
405 descendants of draft revisions, their roots will still be present. |
e2d17974a869
phases: provide a test and accessor for non-public phase roots
Joerg Sonnenberger <joerg@bec.de>
parents:
45063
diff
changeset
|
406 """ |
e2d17974a869
phases: provide a test and accessor for non-public phase roots
Joerg Sonnenberger <joerg@bec.de>
parents:
45063
diff
changeset
|
407 repo = repo.unfiltered() |
51415
1df8d84e7c99
phases: gather the logic for phasesets update in a single method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51412
diff
changeset
|
408 self._ensure_phase_sets(repo) |
45131
61e7464477ac
phases: sparsify phaseroots and phasesets
Joerg Sonnenberger <joerg@bec.de>
parents:
45117
diff
changeset
|
409 return set().union( |
61e7464477ac
phases: sparsify phaseroots and phasesets
Joerg Sonnenberger <joerg@bec.de>
parents:
45117
diff
changeset
|
410 *[ |
61e7464477ac
phases: sparsify phaseroots and phasesets
Joerg Sonnenberger <joerg@bec.de>
parents:
45117
diff
changeset
|
411 revs |
51403
68289ed170c7
phases: mark `phasecache.phaseroots` private
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51401
diff
changeset
|
412 for phase, revs in self._phaseroots.items() |
45131
61e7464477ac
phases: sparsify phaseroots and phasesets
Joerg Sonnenberger <joerg@bec.de>
parents:
45117
diff
changeset
|
413 if phase != public |
61e7464477ac
phases: sparsify phaseroots and phasesets
Joerg Sonnenberger <joerg@bec.de>
parents:
45117
diff
changeset
|
414 ] |
61e7464477ac
phases: sparsify phaseroots and phasesets
Joerg Sonnenberger <joerg@bec.de>
parents:
45117
diff
changeset
|
415 ) |
45114
e2d17974a869
phases: provide a test and accessor for non-public phase roots
Joerg Sonnenberger <joerg@bec.de>
parents:
45063
diff
changeset
|
416 |
51287
f15cb5111a1e
pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51285
diff
changeset
|
417 def getrevset( |
f15cb5111a1e
pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51285
diff
changeset
|
418 self, |
f15cb5111a1e
pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51285
diff
changeset
|
419 repo: "localrepo.localrepository", |
f15cb5111a1e
pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51285
diff
changeset
|
420 phases: Iterable[int], |
f15cb5111a1e
pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51285
diff
changeset
|
421 subset: Optional[Any] = None, |
f15cb5111a1e
pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51285
diff
changeset
|
422 ) -> Any: |
46644
77e129be10de
typing: add some type annotations to mercurial/phases.py
Matt Harbison <matt_harbison@yahoo.com>
parents:
45790
diff
changeset
|
423 # TODO: finish typing this |
31016
bf81d3b7b2ba
phases: add a getrevset method to phasecache
Jun Wu <quark@fb.com>
parents:
30634
diff
changeset
|
424 """return a smartset for the given phases""" |
51417
e0d329491709
phases: pass an unfiltered repository to _ensure_phase_sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51416
diff
changeset
|
425 self._ensure_phase_sets(repo.unfiltered()) |
35309
d13526333835
phases: drop the list with phase of each rev, always comput phase sets
Joerg Sonnenberger <joerg@bec.de>
parents:
34876
diff
changeset
|
426 phases = set(phases) |
44064
8eb3c52337a6
phases: reduce code duplication in phasecache.getrevset
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents:
44004
diff
changeset
|
427 publicphase = public in phases |
44004
9c1fd975e9ac
phases: make the working directory consistently a draft
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents:
43730
diff
changeset
|
428 |
44064
8eb3c52337a6
phases: reduce code duplication in phasecache.getrevset
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents:
44004
diff
changeset
|
429 if publicphase: |
8eb3c52337a6
phases: reduce code duplication in phasecache.getrevset
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents:
44004
diff
changeset
|
430 # In this case, phases keeps all the *other* phases. |
8eb3c52337a6
phases: reduce code duplication in phasecache.getrevset
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents:
44004
diff
changeset
|
431 phases = set(allphases).difference(phases) |
8eb3c52337a6
phases: reduce code duplication in phasecache.getrevset
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents:
44004
diff
changeset
|
432 if not phases: |
8eb3c52337a6
phases: reduce code duplication in phasecache.getrevset
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents:
44004
diff
changeset
|
433 return smartset.fullreposet(repo) |
8eb3c52337a6
phases: reduce code duplication in phasecache.getrevset
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents:
44004
diff
changeset
|
434 |
8eb3c52337a6
phases: reduce code duplication in phasecache.getrevset
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents:
44004
diff
changeset
|
435 # fast path: _phasesets contains the interesting sets, |
8eb3c52337a6
phases: reduce code duplication in phasecache.getrevset
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents:
44004
diff
changeset
|
436 # might only need a union and post-filtering. |
44065
ab41dad7345e
phases: make phasecache._phasesets immutable
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents:
44064
diff
changeset
|
437 revsneedscopy = False |
44064
8eb3c52337a6
phases: reduce code duplication in phasecache.getrevset
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents:
44004
diff
changeset
|
438 if len(phases) == 1: |
8eb3c52337a6
phases: reduce code duplication in phasecache.getrevset
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents:
44004
diff
changeset
|
439 [p] = phases |
8eb3c52337a6
phases: reduce code duplication in phasecache.getrevset
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents:
44004
diff
changeset
|
440 revs = self._phasesets[p] |
44065
ab41dad7345e
phases: make phasecache._phasesets immutable
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents:
44064
diff
changeset
|
441 revsneedscopy = True # Don't modify _phasesets |
44064
8eb3c52337a6
phases: reduce code duplication in phasecache.getrevset
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents:
44004
diff
changeset
|
442 else: |
8eb3c52337a6
phases: reduce code duplication in phasecache.getrevset
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents:
44004
diff
changeset
|
443 # revs has the revisions in all *other* phases. |
8eb3c52337a6
phases: reduce code duplication in phasecache.getrevset
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents:
44004
diff
changeset
|
444 revs = set.union(*[self._phasesets[p] for p in phases]) |
8eb3c52337a6
phases: reduce code duplication in phasecache.getrevset
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents:
44004
diff
changeset
|
445 |
8eb3c52337a6
phases: reduce code duplication in phasecache.getrevset
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents:
44004
diff
changeset
|
446 def _addwdir(wdirsubset, wdirrevs): |
8eb3c52337a6
phases: reduce code duplication in phasecache.getrevset
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents:
44004
diff
changeset
|
447 if wdirrev in wdirsubset and repo[None].phase() in phases: |
44065
ab41dad7345e
phases: make phasecache._phasesets immutable
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents:
44064
diff
changeset
|
448 if revsneedscopy: |
ab41dad7345e
phases: make phasecache._phasesets immutable
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents:
44064
diff
changeset
|
449 wdirrevs = wdirrevs.copy() |
44064
8eb3c52337a6
phases: reduce code duplication in phasecache.getrevset
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents:
44004
diff
changeset
|
450 # The working dir would never be in the # cache, but it was in |
8eb3c52337a6
phases: reduce code duplication in phasecache.getrevset
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents:
44004
diff
changeset
|
451 # the subset being filtered for its phase (or filtered out, |
8eb3c52337a6
phases: reduce code duplication in phasecache.getrevset
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents:
44004
diff
changeset
|
452 # depending on publicphase), so add it to the output to be |
8eb3c52337a6
phases: reduce code duplication in phasecache.getrevset
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents:
44004
diff
changeset
|
453 # included (or filtered out). |
8eb3c52337a6
phases: reduce code duplication in phasecache.getrevset
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents:
44004
diff
changeset
|
454 wdirrevs.add(wdirrev) |
8eb3c52337a6
phases: reduce code duplication in phasecache.getrevset
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents:
44004
diff
changeset
|
455 return wdirrevs |
8eb3c52337a6
phases: reduce code duplication in phasecache.getrevset
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents:
44004
diff
changeset
|
456 |
8eb3c52337a6
phases: reduce code duplication in phasecache.getrevset
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents:
44004
diff
changeset
|
457 if not publicphase: |
31016
bf81d3b7b2ba
phases: add a getrevset method to phasecache
Jun Wu <quark@fb.com>
parents:
30634
diff
changeset
|
458 if repo.changelog.filteredrevs: |
bf81d3b7b2ba
phases: add a getrevset method to phasecache
Jun Wu <quark@fb.com>
parents:
30634
diff
changeset
|
459 revs = revs - repo.changelog.filteredrevs |
44004
9c1fd975e9ac
phases: make the working directory consistently a draft
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents:
43730
diff
changeset
|
460 |
35330
0c1aff6d73a7
revset: use phasecache.getrevset to calculate public()
Jun Wu <quark@fb.com>
parents:
35309
diff
changeset
|
461 if subset is None: |
0c1aff6d73a7
revset: use phasecache.getrevset to calculate public()
Jun Wu <quark@fb.com>
parents:
35309
diff
changeset
|
462 return smartset.baseset(revs) |
0c1aff6d73a7
revset: use phasecache.getrevset to calculate public()
Jun Wu <quark@fb.com>
parents:
35309
diff
changeset
|
463 else: |
44064
8eb3c52337a6
phases: reduce code duplication in phasecache.getrevset
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents:
44004
diff
changeset
|
464 revs = _addwdir(subset, revs) |
35330
0c1aff6d73a7
revset: use phasecache.getrevset to calculate public()
Jun Wu <quark@fb.com>
parents:
35309
diff
changeset
|
465 return subset & smartset.baseset(revs) |
31016
bf81d3b7b2ba
phases: add a getrevset method to phasecache
Jun Wu <quark@fb.com>
parents:
30634
diff
changeset
|
466 else: |
35330
0c1aff6d73a7
revset: use phasecache.getrevset to calculate public()
Jun Wu <quark@fb.com>
parents:
35309
diff
changeset
|
467 if subset is None: |
0c1aff6d73a7
revset: use phasecache.getrevset to calculate public()
Jun Wu <quark@fb.com>
parents:
35309
diff
changeset
|
468 subset = smartset.fullreposet(repo) |
44004
9c1fd975e9ac
phases: make the working directory consistently a draft
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents:
43730
diff
changeset
|
469 |
44064
8eb3c52337a6
phases: reduce code duplication in phasecache.getrevset
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents:
44004
diff
changeset
|
470 revs = _addwdir(subset, revs) |
44004
9c1fd975e9ac
phases: make the working directory consistently a draft
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents:
43730
diff
changeset
|
471 |
35309
d13526333835
phases: drop the list with phase of each rev, always comput phase sets
Joerg Sonnenberger <joerg@bec.de>
parents:
34876
diff
changeset
|
472 if not revs: |
35330
0c1aff6d73a7
revset: use phasecache.getrevset to calculate public()
Jun Wu <quark@fb.com>
parents:
35309
diff
changeset
|
473 return subset |
0c1aff6d73a7
revset: use phasecache.getrevset to calculate public()
Jun Wu <quark@fb.com>
parents:
35309
diff
changeset
|
474 return subset.filter(lambda r: r not in revs) |
31016
bf81d3b7b2ba
phases: add a getrevset method to phasecache
Jun Wu <quark@fb.com>
parents:
30634
diff
changeset
|
475 |
16658
6b3d31d04a69
phases: make advance/retractboundary() atomic
Patrick Mezard <patrick@mezard.eu>
parents:
16657
diff
changeset
|
476 def copy(self): |
6b3d31d04a69
phases: make advance/retractboundary() atomic
Patrick Mezard <patrick@mezard.eu>
parents:
16657
diff
changeset
|
477 # Shallow copy meant to ensure isolation in |
6b3d31d04a69
phases: make advance/retractboundary() atomic
Patrick Mezard <patrick@mezard.eu>
parents:
16657
diff
changeset
|
478 # advance/retractboundary(), nothing more. |
23631
b8260abfeb7d
bundlerepo: implement safe phasecache
Eric Sumner <ericsumner@fb.com>
parents:
23361
diff
changeset
|
479 ph = self.__class__(None, None, _load=False) |
51403
68289ed170c7
phases: mark `phasecache.phaseroots` private
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51401
diff
changeset
|
480 ph._phaseroots = self._phaseroots.copy() |
16658
6b3d31d04a69
phases: make advance/retractboundary() atomic
Patrick Mezard <patrick@mezard.eu>
parents:
16657
diff
changeset
|
481 ph.dirty = self.dirty |
35441
98cc121099fe
phases: rename _phasemaxrev to _loadedrevslen to clarify it isn't max value
Yuya Nishihara <yuya@tcha.org>
parents:
35330
diff
changeset
|
482 ph._loadedrevslen = self._loadedrevslen |
51418
c9c017b34464
phasees: properly shallow caopy the phase sets dictionary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51417
diff
changeset
|
483 if self._phasesets is None: |
c9c017b34464
phasees: properly shallow caopy the phase sets dictionary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51417
diff
changeset
|
484 ph._phasesets = None |
c9c017b34464
phasees: properly shallow caopy the phase sets dictionary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51417
diff
changeset
|
485 else: |
c9c017b34464
phasees: properly shallow caopy the phase sets dictionary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51417
diff
changeset
|
486 ph._phasesets = self._phasesets.copy() |
16658
6b3d31d04a69
phases: make advance/retractboundary() atomic
Patrick Mezard <patrick@mezard.eu>
parents:
16657
diff
changeset
|
487 return ph |
6b3d31d04a69
phases: make advance/retractboundary() atomic
Patrick Mezard <patrick@mezard.eu>
parents:
16657
diff
changeset
|
488 |
6b3d31d04a69
phases: make advance/retractboundary() atomic
Patrick Mezard <patrick@mezard.eu>
parents:
16657
diff
changeset
|
489 def replace(self, phcache): |
25613
a13c18c14ade
phase: document the replace method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25611
diff
changeset
|
490 """replace all values in 'self' with content of phcache""" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40580
diff
changeset
|
491 for a in ( |
51403
68289ed170c7
phases: mark `phasecache.phaseroots` private
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51401
diff
changeset
|
492 '_phaseroots', |
50592
0f83dc22efbc
safehasattr: pass attribute name as string instead of bytes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50396
diff
changeset
|
493 'dirty', |
0f83dc22efbc
safehasattr: pass attribute name as string instead of bytes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50396
diff
changeset
|
494 '_loadedrevslen', |
0f83dc22efbc
safehasattr: pass attribute name as string instead of bytes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50396
diff
changeset
|
495 '_phasesets', |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40580
diff
changeset
|
496 ): |
16658
6b3d31d04a69
phases: make advance/retractboundary() atomic
Patrick Mezard <patrick@mezard.eu>
parents:
16657
diff
changeset
|
497 setattr(self, a, getattr(phcache, a)) |
16657
b6081c2c4647
phases: introduce phasecache
Patrick Mezard <patrick@mezard.eu>
parents:
16626
diff
changeset
|
498 |
24599
2a73829ebe17
phases: make two functions private for phase computation
Laurent Charignon <lcharignon@fb.com>
parents:
24520
diff
changeset
|
499 def _getphaserevsnative(self, repo): |
24444
27e3ba73fbb1
phase: default to C implementation for phase computation
Laurent Charignon <lcharignon@fb.com>
parents:
23878
diff
changeset
|
500 repo = repo.unfiltered() |
51403
68289ed170c7
phases: mark `phasecache.phaseroots` private
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51401
diff
changeset
|
501 return repo.changelog.computephases(self._phaseroots) |
24444
27e3ba73fbb1
phase: default to C implementation for phase computation
Laurent Charignon <lcharignon@fb.com>
parents:
23878
diff
changeset
|
502 |
24599
2a73829ebe17
phases: make two functions private for phase computation
Laurent Charignon <lcharignon@fb.com>
parents:
24520
diff
changeset
|
503 def _computephaserevspure(self, repo): |
24519
de3acfabaddc
phases: move pure phase computation in a function
Laurent Charignon <lcharignon@fb.com>
parents:
24444
diff
changeset
|
504 repo = repo.unfiltered() |
35309
d13526333835
phases: drop the list with phase of each rev, always comput phase sets
Joerg Sonnenberger <joerg@bec.de>
parents:
34876
diff
changeset
|
505 cl = repo.changelog |
45131
61e7464477ac
phases: sparsify phaseroots and phasesets
Joerg Sonnenberger <joerg@bec.de>
parents:
45117
diff
changeset
|
506 self._phasesets = {phase: set() for phase in allphases} |
39271
fd7376fa60e7
phase: use `trackedphases` in `_getphaserevsnative`
Boris Feld <boris.feld@octobus.net>
parents:
39262
diff
changeset
|
507 lowerroots = set() |
fd7376fa60e7
phase: use `trackedphases` in `_getphaserevsnative`
Boris Feld <boris.feld@octobus.net>
parents:
39262
diff
changeset
|
508 for phase in reversed(trackedphases): |
51406
f8bf1a8e9181
phases: keep internal state as rev-num instead of node-id
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51405
diff
changeset
|
509 roots = self._phaseroots[phase] |
39271
fd7376fa60e7
phase: use `trackedphases` in `_getphaserevsnative`
Boris Feld <boris.feld@octobus.net>
parents:
39262
diff
changeset
|
510 if roots: |
fd7376fa60e7
phase: use `trackedphases` in `_getphaserevsnative`
Boris Feld <boris.feld@octobus.net>
parents:
39262
diff
changeset
|
511 ps = set(cl.descendants(roots)) |
fd7376fa60e7
phase: use `trackedphases` in `_getphaserevsnative`
Boris Feld <boris.feld@octobus.net>
parents:
39262
diff
changeset
|
512 for root in roots: |
fd7376fa60e7
phase: use `trackedphases` in `_getphaserevsnative`
Boris Feld <boris.feld@octobus.net>
parents:
39262
diff
changeset
|
513 ps.add(root) |
fd7376fa60e7
phase: use `trackedphases` in `_getphaserevsnative`
Boris Feld <boris.feld@octobus.net>
parents:
39262
diff
changeset
|
514 ps.difference_update(lowerroots) |
fd7376fa60e7
phase: use `trackedphases` in `_getphaserevsnative`
Boris Feld <boris.feld@octobus.net>
parents:
39262
diff
changeset
|
515 lowerroots.update(ps) |
fd7376fa60e7
phase: use `trackedphases` in `_getphaserevsnative`
Boris Feld <boris.feld@octobus.net>
parents:
39262
diff
changeset
|
516 self._phasesets[phase] = ps |
35441
98cc121099fe
phases: rename _phasemaxrev to _loadedrevslen to clarify it isn't max value
Yuya Nishihara <yuya@tcha.org>
parents:
35330
diff
changeset
|
517 self._loadedrevslen = len(cl) |
24519
de3acfabaddc
phases: move pure phase computation in a function
Laurent Charignon <lcharignon@fb.com>
parents:
24444
diff
changeset
|
518 |
51415
1df8d84e7c99
phases: gather the logic for phasesets update in a single method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51412
diff
changeset
|
519 def _ensure_phase_sets(self, repo: "localrepo.localrepository") -> None: |
51419
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
520 """ensure phase information is loaded in the object""" |
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
521 assert repo.filtername is None |
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
522 update = -1 |
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
523 cl = repo.changelog |
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
524 cl_size = len(cl) |
35309
d13526333835
phases: drop the list with phase of each rev, always comput phase sets
Joerg Sonnenberger <joerg@bec.de>
parents:
34876
diff
changeset
|
525 if self._phasesets is None: |
51419
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
526 update = 0 |
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
527 else: |
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
528 if cl_size > self._loadedrevslen: |
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
529 # check if an incremental update is worth it. |
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
530 # note we need a tradeoff here because the whole logic is not |
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
531 # stored and implemented in native code nd datastructure. |
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
532 # Otherwise the incremental update woul always be a win. |
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
533 missing = cl_size - self._loadedrevslen |
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
534 if missing <= INCREMENTAL_PHASE_SETS_UPDATE_MAX_UPDATE: |
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
535 update = self._loadedrevslen |
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
536 else: |
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
537 update = 0 |
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
538 |
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
539 if update == 0: |
24444
27e3ba73fbb1
phase: default to C implementation for phase computation
Laurent Charignon <lcharignon@fb.com>
parents:
23878
diff
changeset
|
540 try: |
31152
b7cef987356d
phases: remove experimental.nativephaseskillswitch
Jun Wu <quark@fb.com>
parents:
31053
diff
changeset
|
541 res = self._getphaserevsnative(repo) |
35441
98cc121099fe
phases: rename _phasemaxrev to _loadedrevslen to clarify it isn't max value
Yuya Nishihara <yuya@tcha.org>
parents:
35330
diff
changeset
|
542 self._loadedrevslen, self._phasesets = res |
24444
27e3ba73fbb1
phase: default to C implementation for phase computation
Laurent Charignon <lcharignon@fb.com>
parents:
23878
diff
changeset
|
543 except AttributeError: |
24599
2a73829ebe17
phases: make two functions private for phase computation
Laurent Charignon <lcharignon@fb.com>
parents:
24520
diff
changeset
|
544 self._computephaserevspure(repo) |
51415
1df8d84e7c99
phases: gather the logic for phasesets update in a single method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51412
diff
changeset
|
545 assert self._loadedrevslen == len(repo.changelog) |
51419
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
546 elif update > 0: |
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
547 # good candidate for native code |
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
548 assert update == self._loadedrevslen |
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
549 if self.hasnonpublicphases(repo): |
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
550 start = self._loadedrevslen |
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
551 get_phase = self.phase |
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
552 rev_phases = [0] * missing |
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
553 parents = cl.parentrevs |
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
554 sets = {phase: set() for phase in self._phasesets} |
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
555 for phase, roots in self._phaseroots.items(): |
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
556 # XXX should really store the max somewhere |
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
557 for r in roots: |
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
558 if r >= start: |
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
559 rev_phases[r - start] = phase |
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
560 for rev in range(start, cl_size): |
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
561 phase = rev_phases[rev - start] |
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
562 p1, p2 = parents(rev) |
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
563 if p1 == nullrev: |
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
564 p1_phase = public |
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
565 elif p1 >= start: |
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
566 p1_phase = rev_phases[p1 - start] |
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
567 else: |
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
568 p1_phase = max(phase, get_phase(repo, p1)) |
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
569 if p2 == nullrev: |
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
570 p2_phase = public |
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
571 elif p2 >= start: |
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
572 p2_phase = rev_phases[p2 - start] |
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
573 else: |
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
574 p2_phase = max(phase, get_phase(repo, p2)) |
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
575 phase = max(phase, p1_phase, p2_phase) |
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
576 if phase > public: |
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
577 rev_phases[rev - start] = phase |
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
578 sets[phase].add(rev) |
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
579 |
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
580 # Be careful to preserve shallow-copied values: do not update |
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
581 # phaseroots values, replace them. |
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
582 for phase, extra in sets.items(): |
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
583 if extra: |
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
584 self._phasesets[phase] = self._phasesets[phase] | extra |
e57d4b868a3e
phases: incrementally update the phase sets when reasonable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51418
diff
changeset
|
585 self._loadedrevslen = cl_size |
22894
c40be72dc177
phases: move root phase assignment to it's own function
Durham Goode <durham@fb.com>
parents:
22893
diff
changeset
|
586 |
22893
9672f0b2cdd9
phases: add invalidate function
Durham Goode <durham@fb.com>
parents:
22080
diff
changeset
|
587 def invalidate(self): |
35442
56745e58df07
phases: initialize number of loaded revisions to 0
Yuya Nishihara <yuya@tcha.org>
parents:
35441
diff
changeset
|
588 self._loadedrevslen = 0 |
25593
9e551f155810
phase: invalidate the phase's set cache alongside the revs
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25592
diff
changeset
|
589 self._phasesets = None |
16657
b6081c2c4647
phases: introduce phasecache
Patrick Mezard <patrick@mezard.eu>
parents:
16626
diff
changeset
|
590 |
51287
f15cb5111a1e
pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51285
diff
changeset
|
591 def phase(self, repo: "localrepo.localrepository", rev: int) -> int: |
35309
d13526333835
phases: drop the list with phase of each rev, always comput phase sets
Joerg Sonnenberger <joerg@bec.de>
parents:
34876
diff
changeset
|
592 # We need a repo argument here to be able to build _phasesets |
16657
b6081c2c4647
phases: introduce phasecache
Patrick Mezard <patrick@mezard.eu>
parents:
16626
diff
changeset
|
593 # if necessary. The repository instance is not stored in |
b6081c2c4647
phases: introduce phasecache
Patrick Mezard <patrick@mezard.eu>
parents:
16626
diff
changeset
|
594 # phasecache to avoid reference cycles. The changelog instance |
b6081c2c4647
phases: introduce phasecache
Patrick Mezard <patrick@mezard.eu>
parents:
16626
diff
changeset
|
595 # is not stored because it is a filecache() property and can |
b6081c2c4647
phases: introduce phasecache
Patrick Mezard <patrick@mezard.eu>
parents:
16626
diff
changeset
|
596 # be replaced without us being notified. |
b6081c2c4647
phases: introduce phasecache
Patrick Mezard <patrick@mezard.eu>
parents:
16626
diff
changeset
|
597 if rev == nullrev: |
b6081c2c4647
phases: introduce phasecache
Patrick Mezard <patrick@mezard.eu>
parents:
16626
diff
changeset
|
598 return public |
19984
7d5e7799a29f
rebase: fix rebase aborts when 'tip-1' is public (issue4082)
Durham Goode <durham@fb.com>
parents:
19951
diff
changeset
|
599 if rev < nullrev: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
600 raise ValueError(_(b'cannot lookup negative revision')) |
51415
1df8d84e7c99
phases: gather the logic for phasesets update in a single method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51412
diff
changeset
|
601 # double check self._loadedrevslen to avoid an extra method call as |
1df8d84e7c99
phases: gather the logic for phasesets update in a single method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51412
diff
changeset
|
602 # python is slow for that. |
35441
98cc121099fe
phases: rename _phasemaxrev to _loadedrevslen to clarify it isn't max value
Yuya Nishihara <yuya@tcha.org>
parents:
35330
diff
changeset
|
603 if rev >= self._loadedrevslen: |
51417
e0d329491709
phases: pass an unfiltered repository to _ensure_phase_sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51416
diff
changeset
|
604 self._ensure_phase_sets(repo.unfiltered()) |
35309
d13526333835
phases: drop the list with phase of each rev, always comput phase sets
Joerg Sonnenberger <joerg@bec.de>
parents:
34876
diff
changeset
|
605 for phase in trackedphases: |
d13526333835
phases: drop the list with phase of each rev, always comput phase sets
Joerg Sonnenberger <joerg@bec.de>
parents:
34876
diff
changeset
|
606 if rev in self._phasesets[phase]: |
d13526333835
phases: drop the list with phase of each rev, always comput phase sets
Joerg Sonnenberger <joerg@bec.de>
parents:
34876
diff
changeset
|
607 return phase |
d13526333835
phases: drop the list with phase of each rev, always comput phase sets
Joerg Sonnenberger <joerg@bec.de>
parents:
34876
diff
changeset
|
608 return public |
16657
b6081c2c4647
phases: introduce phasecache
Patrick Mezard <patrick@mezard.eu>
parents:
16626
diff
changeset
|
609 |
51404
04111ef08fb0
phases: always write with a repo
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51403
diff
changeset
|
610 def write(self, repo): |
16657
b6081c2c4647
phases: introduce phasecache
Patrick Mezard <patrick@mezard.eu>
parents:
16626
diff
changeset
|
611 if not self.dirty: |
b6081c2c4647
phases: introduce phasecache
Patrick Mezard <patrick@mezard.eu>
parents:
16626
diff
changeset
|
612 return |
51404
04111ef08fb0
phases: always write with a repo
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51403
diff
changeset
|
613 f = repo.svfs(b'phaseroots', b'w', atomictemp=True, checkambig=True) |
16657
b6081c2c4647
phases: introduce phasecache
Patrick Mezard <patrick@mezard.eu>
parents:
16626
diff
changeset
|
614 try: |
51404
04111ef08fb0
phases: always write with a repo
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51403
diff
changeset
|
615 self._write(repo.unfiltered(), f) |
16657
b6081c2c4647
phases: introduce phasecache
Patrick Mezard <patrick@mezard.eu>
parents:
16626
diff
changeset
|
616 finally: |
b6081c2c4647
phases: introduce phasecache
Patrick Mezard <patrick@mezard.eu>
parents:
16626
diff
changeset
|
617 f.close() |
22079
5dcc58649b1a
phase: extract the phaseroots serialization in a dedicated method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22070
diff
changeset
|
618 |
51404
04111ef08fb0
phases: always write with a repo
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51403
diff
changeset
|
619 def _write(self, repo, fp): |
04111ef08fb0
phases: always write with a repo
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51403
diff
changeset
|
620 assert repo.filtername is None |
51406
f8bf1a8e9181
phases: keep internal state as rev-num instead of node-id
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51405
diff
changeset
|
621 to_node = repo.changelog.node |
51403
68289ed170c7
phases: mark `phasecache.phaseroots` private
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51401
diff
changeset
|
622 for phase, roots in self._phaseroots.items(): |
51406
f8bf1a8e9181
phases: keep internal state as rev-num instead of node-id
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51405
diff
changeset
|
623 for r in sorted(roots): |
f8bf1a8e9181
phases: keep internal state as rev-num instead of node-id
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51405
diff
changeset
|
624 h = to_node(r) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
625 fp.write(b'%i %s\n' % (phase, hex(h))) |
16657
b6081c2c4647
phases: introduce phasecache
Patrick Mezard <patrick@mezard.eu>
parents:
16626
diff
changeset
|
626 self.dirty = False |
15454
5a7dde5adec8
phases: add a moveboundary function to move phases boundaries
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15419
diff
changeset
|
627 |
51420
ac1c75188440
phases: invalidate the phases set less often on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51419
diff
changeset
|
628 def _updateroots(self, repo, phase, newroots, tr, invalidate=True): |
51403
68289ed170c7
phases: mark `phasecache.phaseroots` private
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51401
diff
changeset
|
629 self._phaseroots[phase] = newroots |
16658
6b3d31d04a69
phases: make advance/retractboundary() atomic
Patrick Mezard <patrick@mezard.eu>
parents:
16657
diff
changeset
|
630 self.dirty = True |
51420
ac1c75188440
phases: invalidate the phases set less often on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51419
diff
changeset
|
631 if invalidate: |
ac1c75188440
phases: invalidate the phases set less often on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51419
diff
changeset
|
632 self.invalidate() |
16658
6b3d31d04a69
phases: make advance/retractboundary() atomic
Patrick Mezard <patrick@mezard.eu>
parents:
16657
diff
changeset
|
633 |
51404
04111ef08fb0
phases: always write with a repo
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51403
diff
changeset
|
634 assert repo.filtername is None |
04111ef08fb0
phases: always write with a repo
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51403
diff
changeset
|
635 wrepo = weakref.ref(repo) |
04111ef08fb0
phases: always write with a repo
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51403
diff
changeset
|
636 |
04111ef08fb0
phases: always write with a repo
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51403
diff
changeset
|
637 def tr_write(fp): |
04111ef08fb0
phases: always write with a repo
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51403
diff
changeset
|
638 repo = wrepo() |
04111ef08fb0
phases: always write with a repo
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51403
diff
changeset
|
639 assert repo is not None |
04111ef08fb0
phases: always write with a repo
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51403
diff
changeset
|
640 self._write(repo, fp) |
04111ef08fb0
phases: always write with a repo
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51403
diff
changeset
|
641 |
04111ef08fb0
phases: always write with a repo
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51403
diff
changeset
|
642 tr.addfilegenerator(b'phase', (b'phaseroots',), tr_write) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
643 tr.hookargs[b'phases_moved'] = b'1' |
22080
37f46575d9c2
phase: attach phase to the transaction instead of the lock
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22079
diff
changeset
|
644 |
45790
5d65e04b6a80
phases: convert registernew users to use revision sets
Joerg Sonnenberger <joerg@bec.de>
parents:
45789
diff
changeset
|
645 def registernew(self, repo, tr, targetphase, revs): |
33453
f6b7617a85bb
phases: add a 'registernew' method to set new phases
Boris Feld <boris.feld@octobus.net>
parents:
33452
diff
changeset
|
646 repo = repo.unfiltered() |
45790
5d65e04b6a80
phases: convert registernew users to use revision sets
Joerg Sonnenberger <joerg@bec.de>
parents:
45789
diff
changeset
|
647 self._retractboundary(repo, tr, targetphase, [], revs=revs) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
648 if tr is not None and b'phases' in tr.changes: |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
649 phasetracking = tr.changes[b'phases'] |
33453
f6b7617a85bb
phases: add a 'registernew' method to set new phases
Boris Feld <boris.feld@octobus.net>
parents:
33452
diff
changeset
|
650 phase = self.phase |
45790
5d65e04b6a80
phases: convert registernew users to use revision sets
Joerg Sonnenberger <joerg@bec.de>
parents:
45789
diff
changeset
|
651 for rev in sorted(revs): |
33453
f6b7617a85bb
phases: add a 'registernew' method to set new phases
Boris Feld <boris.feld@octobus.net>
parents:
33452
diff
changeset
|
652 revphase = phase(repo, rev) |
f6b7617a85bb
phases: add a 'registernew' method to set new phases
Boris Feld <boris.feld@octobus.net>
parents:
33452
diff
changeset
|
653 _trackphasechange(phasetracking, rev, None, revphase) |
f6b7617a85bb
phases: add a 'registernew' method to set new phases
Boris Feld <boris.feld@octobus.net>
parents:
33452
diff
changeset
|
654 repo.invalidatevolatilesets() |
f6b7617a85bb
phases: add a 'registernew' method to set new phases
Boris Feld <boris.feld@octobus.net>
parents:
33452
diff
changeset
|
655 |
45789
09735cde6275
phases: allow registration and boundary advancement with revision sets
Joerg Sonnenberger <joerg@bec.de>
parents:
45550
diff
changeset
|
656 def advanceboundary( |
51406
f8bf1a8e9181
phases: keep internal state as rev-num instead of node-id
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51405
diff
changeset
|
657 self, repo, tr, targetphase, nodes=None, revs=None, dryrun=None |
45789
09735cde6275
phases: allow registration and boundary advancement with revision sets
Joerg Sonnenberger <joerg@bec.de>
parents:
45550
diff
changeset
|
658 ): |
33450
d017f1d37378
phases: extract the intermediate set of affected revs
Boris Feld <boris.feld@octobus.net>
parents:
33449
diff
changeset
|
659 """Set all 'nodes' to phase 'targetphase' |
d017f1d37378
phases: extract the intermediate set of affected revs
Boris Feld <boris.feld@octobus.net>
parents:
33449
diff
changeset
|
660 |
d017f1d37378
phases: extract the intermediate set of affected revs
Boris Feld <boris.feld@octobus.net>
parents:
33449
diff
changeset
|
661 Nodes with a phase lower than 'targetphase' are not affected. |
38218
36ba5dba372d
advanceboundary: add dryrun parameter
Sushil khanchi <sushilkhanchi97@gmail.com>
parents:
38158
diff
changeset
|
662 |
36ba5dba372d
advanceboundary: add dryrun parameter
Sushil khanchi <sushilkhanchi97@gmail.com>
parents:
38158
diff
changeset
|
663 If dryrun is True, no actions will be performed |
36ba5dba372d
advanceboundary: add dryrun parameter
Sushil khanchi <sushilkhanchi97@gmail.com>
parents:
38158
diff
changeset
|
664 |
36ba5dba372d
advanceboundary: add dryrun parameter
Sushil khanchi <sushilkhanchi97@gmail.com>
parents:
38158
diff
changeset
|
665 Returns a set of revs whose phase is changed or should be changed |
33450
d017f1d37378
phases: extract the intermediate set of affected revs
Boris Feld <boris.feld@octobus.net>
parents:
33449
diff
changeset
|
666 """ |
51408
330d74750668
phases: fast path public phase advance when everything is public
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51407
diff
changeset
|
667 if targetphase == public and not self.hasnonpublicphases(repo): |
330d74750668
phases: fast path public phase advance when everything is public
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51407
diff
changeset
|
668 return set() |
51422
709525b26cf5
phases: apply similar early filtering to advanceboundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51421
diff
changeset
|
669 repo = repo.unfiltered() |
709525b26cf5
phases: apply similar early filtering to advanceboundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51421
diff
changeset
|
670 cl = repo.changelog |
709525b26cf5
phases: apply similar early filtering to advanceboundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51421
diff
changeset
|
671 torev = cl.index.rev |
16658
6b3d31d04a69
phases: make advance/retractboundary() atomic
Patrick Mezard <patrick@mezard.eu>
parents:
16657
diff
changeset
|
672 # Be careful to preserve shallow-copied values: do not update |
6b3d31d04a69
phases: make advance/retractboundary() atomic
Patrick Mezard <patrick@mezard.eu>
parents:
16657
diff
changeset
|
673 # phaseroots values, replace them. |
51422
709525b26cf5
phases: apply similar early filtering to advanceboundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51421
diff
changeset
|
674 new_revs = set() |
709525b26cf5
phases: apply similar early filtering to advanceboundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51421
diff
changeset
|
675 if revs is not None: |
709525b26cf5
phases: apply similar early filtering to advanceboundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51421
diff
changeset
|
676 new_revs.update(revs) |
709525b26cf5
phases: apply similar early filtering to advanceboundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51421
diff
changeset
|
677 if nodes is not None: |
709525b26cf5
phases: apply similar early filtering to advanceboundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51421
diff
changeset
|
678 new_revs.update(torev(node) for node in nodes) |
709525b26cf5
phases: apply similar early filtering to advanceboundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51421
diff
changeset
|
679 if not new_revs: # bail out early to avoid the loadphaserevs call |
709525b26cf5
phases: apply similar early filtering to advanceboundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51421
diff
changeset
|
680 return ( |
709525b26cf5
phases: apply similar early filtering to advanceboundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51421
diff
changeset
|
681 set() |
709525b26cf5
phases: apply similar early filtering to advanceboundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51421
diff
changeset
|
682 ) # note: why do people call advanceboundary with nothing? |
709525b26cf5
phases: apply similar early filtering to advanceboundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51421
diff
changeset
|
683 |
33451
e44d54260c32
phases: track phase movements in 'advanceboundary'
Boris Feld <boris.feld@octobus.net>
parents:
33450
diff
changeset
|
684 if tr is None: |
e44d54260c32
phases: track phase movements in 'advanceboundary'
Boris Feld <boris.feld@octobus.net>
parents:
33450
diff
changeset
|
685 phasetracking = None |
e44d54260c32
phases: track phase movements in 'advanceboundary'
Boris Feld <boris.feld@octobus.net>
parents:
33450
diff
changeset
|
686 else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
687 phasetracking = tr.changes.get(b'phases') |
16658
6b3d31d04a69
phases: make advance/retractboundary() atomic
Patrick Mezard <patrick@mezard.eu>
parents:
16657
diff
changeset
|
688 |
51423
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
689 affectable_phases = sorted( |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
690 p for p in allphases if p > targetphase and self._phaseroots[p] |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
691 ) |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
692 # filter revision already in the right phases |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
693 candidates = new_revs |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
694 new_revs = set() |
51422
709525b26cf5
phases: apply similar early filtering to advanceboundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51421
diff
changeset
|
695 self._ensure_phase_sets(repo) |
51423
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
696 for phase in affectable_phases: |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
697 found = candidates & self._phasesets[phase] |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
698 new_revs |= found |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
699 candidates -= found |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
700 if not candidates: |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
701 break |
51422
709525b26cf5
phases: apply similar early filtering to advanceboundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51421
diff
changeset
|
702 if not new_revs: |
709525b26cf5
phases: apply similar early filtering to advanceboundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51421
diff
changeset
|
703 return set() |
33451
e44d54260c32
phases: track phase movements in 'advanceboundary'
Boris Feld <boris.feld@octobus.net>
parents:
33450
diff
changeset
|
704 |
51422
709525b26cf5
phases: apply similar early filtering to advanceboundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51421
diff
changeset
|
705 # search for affected high phase changesets and roots |
51505
c9ceb4f60256
phases: avoid N² behavior in `advanceboundary`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51424
diff
changeset
|
706 seen = set(new_revs) |
51423
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
707 push = heapq.heappush |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
708 pop = heapq.heappop |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
709 parents = cl.parentrevs |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
710 get_phase = self.phase |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
711 changed = {} # set of revisions to be changed |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
712 # set of root deleted by this path |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
713 delroots = set() |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
714 new_roots = {p: set() for p in affectable_phases} |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
715 new_target_roots = set() |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
716 # revision to walk down |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
717 revs = [-r for r in new_revs] |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
718 heapq.heapify(revs) |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
719 while revs: |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
720 current = -pop(revs) |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
721 current_phase = get_phase(repo, current) |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
722 changed[current] = current_phase |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
723 p1, p2 = parents(current) |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
724 if p1 == nullrev: |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
725 p1_phase = public |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
726 else: |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
727 p1_phase = get_phase(repo, p1) |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
728 if p2 == nullrev: |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
729 p2_phase = public |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
730 else: |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
731 p2_phase = get_phase(repo, p2) |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
732 # do we have a root ? |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
733 if current_phase != p1_phase and current_phase != p2_phase: |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
734 # do not record phase, because we could have "duplicated" |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
735 # roots, were one root is shadowed by the very same roots of an |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
736 # higher phases |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
737 delroots.add(current) |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
738 # schedule a walk down if needed |
51505
c9ceb4f60256
phases: avoid N² behavior in `advanceboundary`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51424
diff
changeset
|
739 if p1_phase > targetphase and p1 not in seen: |
c9ceb4f60256
phases: avoid N² behavior in `advanceboundary`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51424
diff
changeset
|
740 seen.add(p1) |
51423
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
741 push(revs, -p1) |
51505
c9ceb4f60256
phases: avoid N² behavior in `advanceboundary`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51424
diff
changeset
|
742 if p2_phase > targetphase and p2 not in seen: |
c9ceb4f60256
phases: avoid N² behavior in `advanceboundary`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51424
diff
changeset
|
743 seen.add(p2) |
51423
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
744 push(revs, -p2) |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
745 if p1_phase < targetphase and p2_phase < targetphase: |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
746 new_target_roots.add(current) |
33451
e44d54260c32
phases: track phase movements in 'advanceboundary'
Boris Feld <boris.feld@octobus.net>
parents:
33450
diff
changeset
|
747 |
51423
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
748 # the last iteration was done with the smallest value |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
749 min_current = current |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
750 # do we have unwalked children that might be new roots |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
751 if (min_current + len(changed)) < len(cl): |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
752 for r in range(min_current, len(cl)): |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
753 if r in changed: |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
754 continue |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
755 phase = get_phase(repo, r) |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
756 if phase <= targetphase: |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
757 continue |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
758 p1, p2 = parents(r) |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
759 if not (p1 in changed or p2 in changed): |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
760 continue # not affected |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
761 if p1 != nullrev and p1 not in changed: |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
762 p1_phase = get_phase(repo, p1) |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
763 if p1_phase == phase: |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
764 continue # not a root |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
765 if p2 != nullrev and p2 not in changed: |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
766 p2_phase = get_phase(repo, p2) |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
767 if p2_phase == phase: |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
768 continue # not a root |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
769 new_roots[phase].add(r) |
33450
d017f1d37378
phases: extract the intermediate set of affected revs
Boris Feld <boris.feld@octobus.net>
parents:
33449
diff
changeset
|
770 |
51423
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
771 # apply the changes |
38218
36ba5dba372d
advanceboundary: add dryrun parameter
Sushil khanchi <sushilkhanchi97@gmail.com>
parents:
38158
diff
changeset
|
772 if not dryrun: |
51423
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
773 for r, p in changed.items(): |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
774 _trackphasechange(phasetracking, r, p, targetphase) |
51424
3cee8706f53b
phases: directly update the phase sets in advanceboundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51423
diff
changeset
|
775 if targetphase > public: |
3cee8706f53b
phases: directly update the phase sets in advanceboundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51423
diff
changeset
|
776 self._phasesets[targetphase].update(changed) |
51423
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
777 for phase in affectable_phases: |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
778 roots = self._phaseroots[phase] |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
779 removed = roots & delroots |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
780 if removed or new_roots[phase]: |
51424
3cee8706f53b
phases: directly update the phase sets in advanceboundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51423
diff
changeset
|
781 self._phasesets[phase].difference_update(changed) |
51423
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
782 # Be careful to preserve shallow-copied values: do not |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
783 # update phaseroots values, replace them. |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
784 final_roots = roots - delroots | new_roots[phase] |
51424
3cee8706f53b
phases: directly update the phase sets in advanceboundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51423
diff
changeset
|
785 self._updateroots( |
3cee8706f53b
phases: directly update the phase sets in advanceboundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51423
diff
changeset
|
786 repo, phase, final_roots, tr, invalidate=False |
3cee8706f53b
phases: directly update the phase sets in advanceboundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51423
diff
changeset
|
787 ) |
51423
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
788 if new_target_roots: |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
789 # Thanks for previous filtering, we can't replace existing |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
790 # roots |
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
791 new_target_roots |= self._phaseroots[targetphase] |
51424
3cee8706f53b
phases: directly update the phase sets in advanceboundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51423
diff
changeset
|
792 self._updateroots( |
3cee8706f53b
phases: directly update the phase sets in advanceboundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51423
diff
changeset
|
793 repo, targetphase, new_target_roots, tr, invalidate=False |
3cee8706f53b
phases: directly update the phase sets in advanceboundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51423
diff
changeset
|
794 ) |
38218
36ba5dba372d
advanceboundary: add dryrun parameter
Sushil khanchi <sushilkhanchi97@gmail.com>
parents:
38158
diff
changeset
|
795 repo.invalidatevolatilesets() |
51423
23950e39281f
phases: large rework of advance boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51422
diff
changeset
|
796 return changed |
16658
6b3d31d04a69
phases: make advance/retractboundary() atomic
Patrick Mezard <patrick@mezard.eu>
parents:
16657
diff
changeset
|
797 |
22070
c1ca47204590
phase: add a transaction argument to retractboundary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22069
diff
changeset
|
798 def retractboundary(self, repo, tr, targetphase, nodes): |
33458
cf694e6422f0
phases: track phase changes from 'retractboundary'
Boris Feld <boris.feld@octobus.net>
parents:
33457
diff
changeset
|
799 if tr is None: |
cf694e6422f0
phases: track phase changes from 'retractboundary'
Boris Feld <boris.feld@octobus.net>
parents:
33457
diff
changeset
|
800 phasetracking = None |
cf694e6422f0
phases: track phase changes from 'retractboundary'
Boris Feld <boris.feld@octobus.net>
parents:
33457
diff
changeset
|
801 else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
802 phasetracking = tr.changes.get(b'phases') |
33458
cf694e6422f0
phases: track phase changes from 'retractboundary'
Boris Feld <boris.feld@octobus.net>
parents:
33457
diff
changeset
|
803 repo = repo.unfiltered() |
51406
f8bf1a8e9181
phases: keep internal state as rev-num instead of node-id
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51405
diff
changeset
|
804 retracted = self._retractboundary(repo, tr, targetphase, nodes) |
f8bf1a8e9181
phases: keep internal state as rev-num instead of node-id
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51405
diff
changeset
|
805 if retracted and phasetracking is not None: |
51410
eababb7b4a82
phases: leverage the collected information to record phase update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51409
diff
changeset
|
806 for r, old_phase in sorted(retracted.items()): |
eababb7b4a82
phases: leverage the collected information to record phase update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51409
diff
changeset
|
807 _trackphasechange(phasetracking, r, old_phase, targetphase) |
33452
7b25a56366cf
phases: extract the core of boundary retraction in '_retractboundary'
Boris Feld <boris.feld@octobus.net>
parents:
33451
diff
changeset
|
808 repo.invalidatevolatilesets() |
7b25a56366cf
phases: extract the core of boundary retraction in '_retractboundary'
Boris Feld <boris.feld@octobus.net>
parents:
33451
diff
changeset
|
809 |
51406
f8bf1a8e9181
phases: keep internal state as rev-num instead of node-id
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51405
diff
changeset
|
810 def _retractboundary(self, repo, tr, targetphase, nodes=None, revs=None): |
51407
71ae6fee2b9d
phases: fast path retract of public phase
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51406
diff
changeset
|
811 if targetphase == public: |
51409
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
812 return {} |
49450
b57c95a0f5f9
phase: introduce a dedicated function to check for the archived phase
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
813 if ( |
b57c95a0f5f9
phase: introduce a dedicated function to check for the archived phase
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
814 targetphase == internal |
b57c95a0f5f9
phase: introduce a dedicated function to check for the archived phase
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
815 and not supportinternal(repo) |
b57c95a0f5f9
phase: introduce a dedicated function to check for the archived phase
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
816 or targetphase == archived |
b57c95a0f5f9
phase: introduce a dedicated function to check for the archived phase
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
817 and not supportarchived(repo) |
b57c95a0f5f9
phase: introduce a dedicated function to check for the archived phase
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
818 ): |
40417
49c7b701fdc2
phase: add an archived phase
Boris Feld <boris.feld@octobus.net>
parents:
39299
diff
changeset
|
819 name = phasenames[targetphase] |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
820 msg = b'this repository does not support the %s phase' % name |
39299
7775c1fb8fa0
phases: enforce internal phase support
Boris Feld <boris.feld@octobus.net>
parents:
39297
diff
changeset
|
821 raise error.ProgrammingError(msg) |
51409
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
822 assert repo.filtername is None |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
823 cl = repo.changelog |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
824 torev = cl.index.rev |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
825 new_revs = set() |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
826 if revs is not None: |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
827 new_revs.update(revs) |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
828 if nodes is not None: |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
829 new_revs.update(torev(node) for node in nodes) |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
830 if not new_revs: # bail out early to avoid the loadphaserevs call |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
831 return {} # note: why do people call retractboundary with nothing ? |
16658
6b3d31d04a69
phases: make advance/retractboundary() atomic
Patrick Mezard <patrick@mezard.eu>
parents:
16657
diff
changeset
|
832 |
51409
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
833 if nullrev in new_revs: |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
834 raise error.Abort(_(b'cannot change null revision phase')) |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
835 |
51421
2eb93812d2a5
phases: filter revision that are already in the right phase
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51420
diff
changeset
|
836 # Filter revision that are already in the right phase |
2eb93812d2a5
phases: filter revision that are already in the right phase
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51420
diff
changeset
|
837 self._ensure_phase_sets(repo) |
2eb93812d2a5
phases: filter revision that are already in the right phase
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51420
diff
changeset
|
838 for phase, revs in self._phasesets.items(): |
2eb93812d2a5
phases: filter revision that are already in the right phase
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51420
diff
changeset
|
839 if phase >= targetphase: |
2eb93812d2a5
phases: filter revision that are already in the right phase
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51420
diff
changeset
|
840 new_revs -= revs |
2eb93812d2a5
phases: filter revision that are already in the right phase
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51420
diff
changeset
|
841 if not new_revs: # all revisions already in the right phases |
2eb93812d2a5
phases: filter revision that are already in the right phase
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51420
diff
changeset
|
842 return {} |
2eb93812d2a5
phases: filter revision that are already in the right phase
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51420
diff
changeset
|
843 |
51409
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
844 # Compute change in phase roots by walking the graph |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
845 # |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
846 # note: If we had a cheap parent → children mapping we could do |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
847 # something even cheaper/more-bounded |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
848 # |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
849 # The idea would be to walk from item in new_revs stopping at |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
850 # descendant with phases >= target_phase. |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
851 # |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
852 # 1) This detect new_revs that are not new_roots (either already >= |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
853 # target_phase or reachable though another new_revs |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
854 # 2) This detect replaced current_roots as we reach them |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
855 # 3) This can avoid walking to the tip if we retract over a small |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
856 # branch. |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
857 # |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
858 # So instead, we do a variation of this, we walk from the smaller new |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
859 # revision to the tip to avoid missing any potential children. |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
860 # |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
861 # The following code would be a good candidate for native code… if only |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
862 # we could knew the phase of a changeset efficiently in native code. |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
863 parents = cl.parentrevs |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
864 phase = self.phase |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
865 new_roots = set() # roots added by this phases |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
866 changed_revs = {} # revision affected by this call |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
867 replaced_roots = set() # older roots replaced by this call |
51406
f8bf1a8e9181
phases: keep internal state as rev-num instead of node-id
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51405
diff
changeset
|
868 currentroots = self._phaseroots[targetphase] |
51409
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
869 start = min(new_revs) |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
870 end = len(cl) |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
871 rev_phases = [None] * (end - start) |
51517
4ee50d98d35c
phases: update the phase set as we go during retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51516
diff
changeset
|
872 |
4ee50d98d35c
phases: update the phase set as we go during retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51516
diff
changeset
|
873 this_phase_set = self._phasesets[targetphase] |
51409
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
874 for r in range(start, end): |
44988
fa151f7af275
phases: improve performance of _retractboundary
Joerg Sonnenberger <joerg@bec.de>
parents:
44548
diff
changeset
|
875 |
51409
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
876 # gather information about the current_rev |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
877 r_phase = phase(repo, r) |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
878 p_phase = None # phase inherited from parents |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
879 p1, p2 = parents(r) |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
880 if p1 >= start: |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
881 p1_phase = rev_phases[p1 - start] |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
882 if p1_phase is not None: |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
883 p_phase = p1_phase |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
884 if p2 >= start: |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
885 p2_phase = rev_phases[p2 - start] |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
886 if p2_phase is not None: |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
887 if p_phase is not None: |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
888 p_phase = max(p_phase, p2_phase) |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
889 else: |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
890 p_phase = p2_phase |
26909
e36118815a39
phase: improve retractboundary perf
Durham Goode <durham@fb.com>
parents:
26587
diff
changeset
|
891 |
51409
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
892 # assess the situation |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
893 if r in new_revs and r_phase < targetphase: |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
894 if p_phase is None or p_phase < targetphase: |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
895 new_roots.add(r) |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
896 rev_phases[r - start] = targetphase |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
897 changed_revs[r] = r_phase |
51517
4ee50d98d35c
phases: update the phase set as we go during retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51516
diff
changeset
|
898 this_phase_set.add(r) |
51409
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
899 elif p_phase is None: |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
900 rev_phases[r - start] = r_phase |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
901 else: |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
902 if p_phase > r_phase: |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
903 rev_phases[r - start] = p_phase |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
904 else: |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
905 rev_phases[r - start] = r_phase |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
906 if p_phase == targetphase: |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
907 if p_phase > r_phase: |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
908 changed_revs[r] = r_phase |
51517
4ee50d98d35c
phases: update the phase set as we go during retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51516
diff
changeset
|
909 this_phase_set.add(r) |
51409
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
910 elif r in currentroots: |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
911 replaced_roots.add(r) |
51420
ac1c75188440
phases: invalidate the phases set less often on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51419
diff
changeset
|
912 sets = self._phasesets |
51516
e0f92bd98c24
phases: avoid a potentially costly dictionary interation in some case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51505
diff
changeset
|
913 if targetphase > draft: |
e0f92bd98c24
phases: avoid a potentially costly dictionary interation in some case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51505
diff
changeset
|
914 for r, old in changed_revs.items(): |
e0f92bd98c24
phases: avoid a potentially costly dictionary interation in some case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51505
diff
changeset
|
915 if old > public: |
e0f92bd98c24
phases: avoid a potentially costly dictionary interation in some case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51505
diff
changeset
|
916 sets[old].discard(r) |
26909
e36118815a39
phase: improve retractboundary perf
Durham Goode <durham@fb.com>
parents:
26587
diff
changeset
|
917 |
51409
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
918 if new_roots: |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
919 assert changed_revs |
51420
ac1c75188440
phases: invalidate the phases set less often on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51419
diff
changeset
|
920 |
51409
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
921 final_roots = new_roots | currentroots - replaced_roots |
51420
ac1c75188440
phases: invalidate the phases set less often on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51419
diff
changeset
|
922 self._updateroots( |
ac1c75188440
phases: invalidate the phases set less often on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51419
diff
changeset
|
923 repo, |
ac1c75188440
phases: invalidate the phases set less often on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51419
diff
changeset
|
924 targetphase, |
ac1c75188440
phases: invalidate the phases set less often on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51419
diff
changeset
|
925 final_roots, |
ac1c75188440
phases: invalidate the phases set less often on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51419
diff
changeset
|
926 tr, |
ac1c75188440
phases: invalidate the phases set less often on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51419
diff
changeset
|
927 invalidate=False, |
ac1c75188440
phases: invalidate the phases set less often on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51419
diff
changeset
|
928 ) |
51409
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
929 if targetphase > 1: |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
930 retracted = set(changed_revs) |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
931 for lower_phase in range(1, targetphase): |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
932 lower_roots = self._phaseroots.get(lower_phase) |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
933 if lower_roots is None: |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
934 continue |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
935 if lower_roots & retracted: |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
936 simpler_roots = lower_roots - retracted |
51420
ac1c75188440
phases: invalidate the phases set less often on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51419
diff
changeset
|
937 self._updateroots( |
ac1c75188440
phases: invalidate the phases set less often on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51419
diff
changeset
|
938 repo, |
ac1c75188440
phases: invalidate the phases set less often on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51419
diff
changeset
|
939 lower_phase, |
ac1c75188440
phases: invalidate the phases set less often on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51419
diff
changeset
|
940 simpler_roots, |
ac1c75188440
phases: invalidate the phases set less often on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51419
diff
changeset
|
941 tr, |
ac1c75188440
phases: invalidate the phases set less often on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51419
diff
changeset
|
942 invalidate=False, |
ac1c75188440
phases: invalidate the phases set less often on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51419
diff
changeset
|
943 ) |
51409
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
944 return changed_revs |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
945 else: |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
946 assert not changed_revs |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
947 assert not replaced_roots |
2f39c7aeb549
phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51408
diff
changeset
|
948 return {} |
16658
6b3d31d04a69
phases: make advance/retractboundary() atomic
Patrick Mezard <patrick@mezard.eu>
parents:
16657
diff
changeset
|
949 |
51401
8f2ea3fa50fd
phases: explicitly filter stripped revision at strip time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51290
diff
changeset
|
950 def register_strip( |
8f2ea3fa50fd
phases: explicitly filter stripped revision at strip time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51290
diff
changeset
|
951 self, |
51406
f8bf1a8e9181
phases: keep internal state as rev-num instead of node-id
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51405
diff
changeset
|
952 repo, |
51401
8f2ea3fa50fd
phases: explicitly filter stripped revision at strip time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51290
diff
changeset
|
953 tr, |
8f2ea3fa50fd
phases: explicitly filter stripped revision at strip time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51290
diff
changeset
|
954 strip_rev: int, |
8f2ea3fa50fd
phases: explicitly filter stripped revision at strip time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51290
diff
changeset
|
955 ): |
8f2ea3fa50fd
phases: explicitly filter stripped revision at strip time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51290
diff
changeset
|
956 """announce a strip to the phase cache |
8f2ea3fa50fd
phases: explicitly filter stripped revision at strip time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51290
diff
changeset
|
957 |
8f2ea3fa50fd
phases: explicitly filter stripped revision at strip time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51290
diff
changeset
|
958 Any roots higher than the stripped revision should be dropped. |
8f2ea3fa50fd
phases: explicitly filter stripped revision at strip time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51290
diff
changeset
|
959 """ |
51406
f8bf1a8e9181
phases: keep internal state as rev-num instead of node-id
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51405
diff
changeset
|
960 for targetphase, roots in list(self._phaseroots.items()): |
f8bf1a8e9181
phases: keep internal state as rev-num instead of node-id
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51405
diff
changeset
|
961 filtered = {r for r in roots if r >= strip_rev} |
51401
8f2ea3fa50fd
phases: explicitly filter stripped revision at strip time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51290
diff
changeset
|
962 if filtered: |
51406
f8bf1a8e9181
phases: keep internal state as rev-num instead of node-id
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51405
diff
changeset
|
963 self._updateroots(repo, targetphase, roots - filtered, tr) |
51401
8f2ea3fa50fd
phases: explicitly filter stripped revision at strip time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51290
diff
changeset
|
964 self.invalidate() |
8f2ea3fa50fd
phases: explicitly filter stripped revision at strip time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51290
diff
changeset
|
965 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40580
diff
changeset
|
966 |
45789
09735cde6275
phases: allow registration and boundary advancement with revision sets
Joerg Sonnenberger <joerg@bec.de>
parents:
45550
diff
changeset
|
967 def advanceboundary(repo, tr, targetphase, nodes, revs=None, dryrun=None): |
15454
5a7dde5adec8
phases: add a moveboundary function to move phases boundaries
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15419
diff
changeset
|
968 """Add nodes to a phase changing other nodes phases if necessary. |
5a7dde5adec8
phases: add a moveboundary function to move phases boundaries
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15419
diff
changeset
|
969 |
16725
b0fb4f57d076
phases: wrap docstrings at 70 characters
Martin Geisler <martin@geisler.net>
parents:
16724
diff
changeset
|
970 This function move boundary *forward* this means that all nodes |
b0fb4f57d076
phases: wrap docstrings at 70 characters
Martin Geisler <martin@geisler.net>
parents:
16724
diff
changeset
|
971 are set in the target phase or kept in a *lower* phase. |
15454
5a7dde5adec8
phases: add a moveboundary function to move phases boundaries
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15419
diff
changeset
|
972 |
38218
36ba5dba372d
advanceboundary: add dryrun parameter
Sushil khanchi <sushilkhanchi97@gmail.com>
parents:
38158
diff
changeset
|
973 Simplify boundary to contains phase roots only. |
36ba5dba372d
advanceboundary: add dryrun parameter
Sushil khanchi <sushilkhanchi97@gmail.com>
parents:
38158
diff
changeset
|
974 |
36ba5dba372d
advanceboundary: add dryrun parameter
Sushil khanchi <sushilkhanchi97@gmail.com>
parents:
38158
diff
changeset
|
975 If dryrun is True, no actions will be performed |
36ba5dba372d
advanceboundary: add dryrun parameter
Sushil khanchi <sushilkhanchi97@gmail.com>
parents:
38158
diff
changeset
|
976 |
36ba5dba372d
advanceboundary: add dryrun parameter
Sushil khanchi <sushilkhanchi97@gmail.com>
parents:
38158
diff
changeset
|
977 Returns a set of revs whose phase is changed or should be changed |
36ba5dba372d
advanceboundary: add dryrun parameter
Sushil khanchi <sushilkhanchi97@gmail.com>
parents:
38158
diff
changeset
|
978 """ |
45789
09735cde6275
phases: allow registration and boundary advancement with revision sets
Joerg Sonnenberger <joerg@bec.de>
parents:
45550
diff
changeset
|
979 if revs is None: |
09735cde6275
phases: allow registration and boundary advancement with revision sets
Joerg Sonnenberger <joerg@bec.de>
parents:
45550
diff
changeset
|
980 revs = [] |
16658
6b3d31d04a69
phases: make advance/retractboundary() atomic
Patrick Mezard <patrick@mezard.eu>
parents:
16657
diff
changeset
|
981 phcache = repo._phasecache.copy() |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40580
diff
changeset
|
982 changes = phcache.advanceboundary( |
45789
09735cde6275
phases: allow registration and boundary advancement with revision sets
Joerg Sonnenberger <joerg@bec.de>
parents:
45550
diff
changeset
|
983 repo, tr, targetphase, nodes, revs=revs, dryrun=dryrun |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40580
diff
changeset
|
984 ) |
38218
36ba5dba372d
advanceboundary: add dryrun parameter
Sushil khanchi <sushilkhanchi97@gmail.com>
parents:
38158
diff
changeset
|
985 if not dryrun: |
36ba5dba372d
advanceboundary: add dryrun parameter
Sushil khanchi <sushilkhanchi97@gmail.com>
parents:
38158
diff
changeset
|
986 repo._phasecache.replace(phcache) |
36ba5dba372d
advanceboundary: add dryrun parameter
Sushil khanchi <sushilkhanchi97@gmail.com>
parents:
38158
diff
changeset
|
987 return changes |
15482
a667c89e49b3
phases: add retractboundary function to move boundary backward
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15481
diff
changeset
|
988 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40580
diff
changeset
|
989 |
22070
c1ca47204590
phase: add a transaction argument to retractboundary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22069
diff
changeset
|
990 def retractboundary(repo, tr, targetphase, nodes): |
16725
b0fb4f57d076
phases: wrap docstrings at 70 characters
Martin Geisler <martin@geisler.net>
parents:
16724
diff
changeset
|
991 """Set nodes back to a phase changing other nodes phases if |
b0fb4f57d076
phases: wrap docstrings at 70 characters
Martin Geisler <martin@geisler.net>
parents:
16724
diff
changeset
|
992 necessary. |
15482
a667c89e49b3
phases: add retractboundary function to move boundary backward
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15481
diff
changeset
|
993 |
16725
b0fb4f57d076
phases: wrap docstrings at 70 characters
Martin Geisler <martin@geisler.net>
parents:
16724
diff
changeset
|
994 This function move boundary *backward* this means that all nodes |
b0fb4f57d076
phases: wrap docstrings at 70 characters
Martin Geisler <martin@geisler.net>
parents:
16724
diff
changeset
|
995 are set in the target phase or kept in a *higher* phase. |
15482
a667c89e49b3
phases: add retractboundary function to move boundary backward
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15481
diff
changeset
|
996 |
a667c89e49b3
phases: add retractboundary function to move boundary backward
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15481
diff
changeset
|
997 Simplify boundary to contains phase roots only.""" |
16658
6b3d31d04a69
phases: make advance/retractboundary() atomic
Patrick Mezard <patrick@mezard.eu>
parents:
16657
diff
changeset
|
998 phcache = repo._phasecache.copy() |
22070
c1ca47204590
phase: add a transaction argument to retractboundary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22069
diff
changeset
|
999 phcache.retractboundary(repo, tr, targetphase, nodes) |
16658
6b3d31d04a69
phases: make advance/retractboundary() atomic
Patrick Mezard <patrick@mezard.eu>
parents:
16657
diff
changeset
|
1000 repo._phasecache.replace(phcache) |
15648
79cc89de5be1
phases: add basic pushkey support
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
15482
diff
changeset
|
1001 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40580
diff
changeset
|
1002 |
45790
5d65e04b6a80
phases: convert registernew users to use revision sets
Joerg Sonnenberger <joerg@bec.de>
parents:
45789
diff
changeset
|
1003 def registernew(repo, tr, targetphase, revs): |
33453
f6b7617a85bb
phases: add a 'registernew' method to set new phases
Boris Feld <boris.feld@octobus.net>
parents:
33452
diff
changeset
|
1004 """register a new revision and its phase |
f6b7617a85bb
phases: add a 'registernew' method to set new phases
Boris Feld <boris.feld@octobus.net>
parents:
33452
diff
changeset
|
1005 |
f6b7617a85bb
phases: add a 'registernew' method to set new phases
Boris Feld <boris.feld@octobus.net>
parents:
33452
diff
changeset
|
1006 Code adding revisions to the repository should use this function to |
f6b7617a85bb
phases: add a 'registernew' method to set new phases
Boris Feld <boris.feld@octobus.net>
parents:
33452
diff
changeset
|
1007 set new changeset in their target phase (or higher). |
f6b7617a85bb
phases: add a 'registernew' method to set new phases
Boris Feld <boris.feld@octobus.net>
parents:
33452
diff
changeset
|
1008 """ |
f6b7617a85bb
phases: add a 'registernew' method to set new phases
Boris Feld <boris.feld@octobus.net>
parents:
33452
diff
changeset
|
1009 phcache = repo._phasecache.copy() |
45790
5d65e04b6a80
phases: convert registernew users to use revision sets
Joerg Sonnenberger <joerg@bec.de>
parents:
45789
diff
changeset
|
1010 phcache.registernew(repo, tr, targetphase, revs) |
33453
f6b7617a85bb
phases: add a 'registernew' method to set new phases
Boris Feld <boris.feld@octobus.net>
parents:
33452
diff
changeset
|
1011 repo._phasecache.replace(phcache) |
f6b7617a85bb
phases: add a 'registernew' method to set new phases
Boris Feld <boris.feld@octobus.net>
parents:
33452
diff
changeset
|
1012 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40580
diff
changeset
|
1013 |
51287
f15cb5111a1e
pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51285
diff
changeset
|
1014 def listphases(repo: "localrepo.localrepository") -> Dict[bytes, bytes]: |
16724
00535da82faf
phases: fix typos in docstrings
Martin Geisler <martin@geisler.net>
parents:
16659
diff
changeset
|
1015 """List phases root for serialization over pushkey""" |
32000
511a62669f1b
phases: emit phases to pushkey protocol in deterministic order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
31342
diff
changeset
|
1016 # Use ordered dictionary so behavior is deterministic. |
511a62669f1b
phases: emit phases to pushkey protocol in deterministic order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
31342
diff
changeset
|
1017 keys = util.sortdict() |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1018 value = b'%i' % draft |
34816
e2c42f751b06
phase: filter out non-draft item in "draft root"
Boris Feld <boris.feld@octobus.net>
parents:
34710
diff
changeset
|
1019 cl = repo.unfiltered().changelog |
51406
f8bf1a8e9181
phases: keep internal state as rev-num instead of node-id
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51405
diff
changeset
|
1020 to_node = cl.node |
51403
68289ed170c7
phases: mark `phasecache.phaseroots` private
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51401
diff
changeset
|
1021 for root in repo._phasecache._phaseroots[draft]: |
51406
f8bf1a8e9181
phases: keep internal state as rev-num instead of node-id
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51405
diff
changeset
|
1022 if repo._phasecache.phase(repo, root) <= draft: |
f8bf1a8e9181
phases: keep internal state as rev-num instead of node-id
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51405
diff
changeset
|
1023 keys[hex(to_node(root))] = value |
15892
592b3d1742a1
phases: simplify phase exchange and movement over pushkey
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15821
diff
changeset
|
1024 |
25624
f0745da75056
publishing: use new helper method
Matt Mackall <mpm@selenic.com>
parents:
25614
diff
changeset
|
1025 if repo.publishing(): |
16725
b0fb4f57d076
phases: wrap docstrings at 70 characters
Martin Geisler <martin@geisler.net>
parents:
16724
diff
changeset
|
1026 # Add an extra data to let remote know we are a publishing |
b0fb4f57d076
phases: wrap docstrings at 70 characters
Martin Geisler <martin@geisler.net>
parents:
16724
diff
changeset
|
1027 # repo. Publishing repo can't just pretend they are old repo. |
b0fb4f57d076
phases: wrap docstrings at 70 characters
Martin Geisler <martin@geisler.net>
parents:
16724
diff
changeset
|
1028 # When pushing to a publishing repo, the client still need to |
b0fb4f57d076
phases: wrap docstrings at 70 characters
Martin Geisler <martin@geisler.net>
parents:
16724
diff
changeset
|
1029 # push phase boundary |
15648
79cc89de5be1
phases: add basic pushkey support
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
15482
diff
changeset
|
1030 # |
16725
b0fb4f57d076
phases: wrap docstrings at 70 characters
Martin Geisler <martin@geisler.net>
parents:
16724
diff
changeset
|
1031 # Push do not only push changeset. It also push phase data. |
b0fb4f57d076
phases: wrap docstrings at 70 characters
Martin Geisler <martin@geisler.net>
parents:
16724
diff
changeset
|
1032 # New phase data may apply to common changeset which won't be |
b0fb4f57d076
phases: wrap docstrings at 70 characters
Martin Geisler <martin@geisler.net>
parents:
16724
diff
changeset
|
1033 # push (as they are common). Here is a very simple example: |
15648
79cc89de5be1
phases: add basic pushkey support
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
15482
diff
changeset
|
1034 # |
79cc89de5be1
phases: add basic pushkey support
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
15482
diff
changeset
|
1035 # 1) repo A push changeset X as draft to repo B |
79cc89de5be1
phases: add basic pushkey support
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
15482
diff
changeset
|
1036 # 2) repo B make changeset X public |
16725
b0fb4f57d076
phases: wrap docstrings at 70 characters
Martin Geisler <martin@geisler.net>
parents:
16724
diff
changeset
|
1037 # 3) repo B push to repo A. X is not pushed but the data that |
b0fb4f57d076
phases: wrap docstrings at 70 characters
Martin Geisler <martin@geisler.net>
parents:
16724
diff
changeset
|
1038 # X as now public should |
15648
79cc89de5be1
phases: add basic pushkey support
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
15482
diff
changeset
|
1039 # |
16725
b0fb4f57d076
phases: wrap docstrings at 70 characters
Martin Geisler <martin@geisler.net>
parents:
16724
diff
changeset
|
1040 # The server can't handle it on it's own as it has no idea of |
b0fb4f57d076
phases: wrap docstrings at 70 characters
Martin Geisler <martin@geisler.net>
parents:
16724
diff
changeset
|
1041 # client phase data. |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1042 keys[b'publishing'] = b'True' |
15648
79cc89de5be1
phases: add basic pushkey support
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
15482
diff
changeset
|
1043 return keys |
79cc89de5be1
phases: add basic pushkey support
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
15482
diff
changeset
|
1044 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40580
diff
changeset
|
1045 |
51287
f15cb5111a1e
pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51285
diff
changeset
|
1046 def pushphase( |
f15cb5111a1e
pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51285
diff
changeset
|
1047 repo: "localrepo.localrepository", |
f15cb5111a1e
pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51285
diff
changeset
|
1048 nhex: bytes, |
f15cb5111a1e
pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51285
diff
changeset
|
1049 oldphasestr: bytes, |
f15cb5111a1e
pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51285
diff
changeset
|
1050 newphasestr: bytes, |
f15cb5111a1e
pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51285
diff
changeset
|
1051 ) -> bool: |
17535 | 1052 """List phases root for serialization over pushkey""" |
18002
9bc5873e52af
clfilter: phases logic should be unfiltered
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17979
diff
changeset
|
1053 repo = repo.unfiltered() |
27861
3315a9c2019c
with: use context manager for lock in pushphase
Bryan O'Sullivan <bryano@fb.com>
parents:
26909
diff
changeset
|
1054 with repo.lock(): |
15648
79cc89de5be1
phases: add basic pushkey support
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
15482
diff
changeset
|
1055 currentphase = repo[nhex].phase() |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40580
diff
changeset
|
1056 newphase = abs(int(newphasestr)) # let's avoid negative index surprise |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40580
diff
changeset
|
1057 oldphase = abs(int(oldphasestr)) # let's avoid negative index surprise |
15648
79cc89de5be1
phases: add basic pushkey support
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
15482
diff
changeset
|
1058 if currentphase == oldphase and newphase < oldphase: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1059 with repo.transaction(b'pushkey-phase') as tr: |
27861
3315a9c2019c
with: use context manager for lock in pushphase
Bryan O'Sullivan <bryano@fb.com>
parents:
26909
diff
changeset
|
1060 advanceboundary(repo, tr, newphase, [bin(nhex)]) |
32822
e65ff29dbeb0
pushkey: use False/True for return values from push functions
Martin von Zweigbergk <martinvonz@google.com>
parents:
32000
diff
changeset
|
1061 return True |
16051
2aa5b51f310f
phases: don't complain if cset is already public on pushkey (issue3230)
Matt Mackall <mpm@selenic.com>
parents:
16030
diff
changeset
|
1062 elif currentphase == newphase: |
2aa5b51f310f
phases: don't complain if cset is already public on pushkey (issue3230)
Matt Mackall <mpm@selenic.com>
parents:
16030
diff
changeset
|
1063 # raced, but got correct result |
32822
e65ff29dbeb0
pushkey: use False/True for return values from push functions
Martin von Zweigbergk <martinvonz@google.com>
parents:
32000
diff
changeset
|
1064 return True |
15648
79cc89de5be1
phases: add basic pushkey support
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
15482
diff
changeset
|
1065 else: |
32822
e65ff29dbeb0
pushkey: use False/True for return values from push functions
Martin von Zweigbergk <martinvonz@google.com>
parents:
32000
diff
changeset
|
1066 return False |
15649
ca7c4254a21a
phases: add a function to compute heads from root
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15648
diff
changeset
|
1067 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40580
diff
changeset
|
1068 |
33031
e8c8d81eb864
bundle: add config option to include phases
Martin von Zweigbergk <martinvonz@google.com>
parents:
32822
diff
changeset
|
1069 def subsetphaseheads(repo, subset): |
e8c8d81eb864
bundle: add config option to include phases
Martin von Zweigbergk <martinvonz@google.com>
parents:
32822
diff
changeset
|
1070 """Finds the phase heads for a subset of a history |
e8c8d81eb864
bundle: add config option to include phases
Martin von Zweigbergk <martinvonz@google.com>
parents:
32822
diff
changeset
|
1071 |
e8c8d81eb864
bundle: add config option to include phases
Martin von Zweigbergk <martinvonz@google.com>
parents:
32822
diff
changeset
|
1072 Returns a list indexed by phase number where each item is a list of phase |
e8c8d81eb864
bundle: add config option to include phases
Martin von Zweigbergk <martinvonz@google.com>
parents:
32822
diff
changeset
|
1073 head nodes. |
e8c8d81eb864
bundle: add config option to include phases
Martin von Zweigbergk <martinvonz@google.com>
parents:
32822
diff
changeset
|
1074 """ |
e8c8d81eb864
bundle: add config option to include phases
Martin von Zweigbergk <martinvonz@google.com>
parents:
32822
diff
changeset
|
1075 cl = repo.changelog |
e8c8d81eb864
bundle: add config option to include phases
Martin von Zweigbergk <martinvonz@google.com>
parents:
32822
diff
changeset
|
1076 |
45117
b1e51ef4e536
phases: sparsify phase lists
Joerg Sonnenberger <joerg@bec.de>
parents:
45116
diff
changeset
|
1077 headsbyphase = {i: [] for i in allphases} |
50392
385a4f8056e5
bundle: include required phases when saving a bundle (issue6794)
Jason R. Coombs <jaraco@jaraco.com>, Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50387
diff
changeset
|
1078 for phase in allphases: |
385a4f8056e5
bundle: include required phases when saving a bundle (issue6794)
Jason R. Coombs <jaraco@jaraco.com>, Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50387
diff
changeset
|
1079 revset = b"heads(%%ln & _phase(%d))" % phase |
33031
e8c8d81eb864
bundle: add config option to include phases
Martin von Zweigbergk <martinvonz@google.com>
parents:
32822
diff
changeset
|
1080 headsbyphase[phase] = [cl.node(r) for r in repo.revs(revset, subset)] |
e8c8d81eb864
bundle: add config option to include phases
Martin von Zweigbergk <martinvonz@google.com>
parents:
32822
diff
changeset
|
1081 return headsbyphase |
e8c8d81eb864
bundle: add config option to include phases
Martin von Zweigbergk <martinvonz@google.com>
parents:
32822
diff
changeset
|
1082 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40580
diff
changeset
|
1083 |
34321
4ef472b975ff
bundle2: only grab a transaction when 'phase-heads' affect the repository
Boris Feld <boris.feld@octobus.net>
parents:
34320
diff
changeset
|
1084 def updatephases(repo, trgetter, headsbyphase): |
33031
e8c8d81eb864
bundle: add config option to include phases
Martin von Zweigbergk <martinvonz@google.com>
parents:
32822
diff
changeset
|
1085 """Updates the repo with the given phase heads""" |
45116
361a7444bc41
phases: updatephases should not skip internal phase
Joerg Sonnenberger <joerg@bec.de>
parents:
45114
diff
changeset
|
1086 # Now advance phase boundaries of all phases |
34321
4ef472b975ff
bundle2: only grab a transaction when 'phase-heads' affect the repository
Boris Feld <boris.feld@octobus.net>
parents:
34320
diff
changeset
|
1087 # |
4ef472b975ff
bundle2: only grab a transaction when 'phase-heads' affect the repository
Boris Feld <boris.feld@octobus.net>
parents:
34320
diff
changeset
|
1088 # run the update (and fetch transaction) only if there are actually things |
4ef472b975ff
bundle2: only grab a transaction when 'phase-heads' affect the repository
Boris Feld <boris.feld@octobus.net>
parents:
34320
diff
changeset
|
1089 # to update. This avoid creating empty transaction during no-op operation. |
4ef472b975ff
bundle2: only grab a transaction when 'phase-heads' affect the repository
Boris Feld <boris.feld@octobus.net>
parents:
34320
diff
changeset
|
1090 |
45116
361a7444bc41
phases: updatephases should not skip internal phase
Joerg Sonnenberger <joerg@bec.de>
parents:
45114
diff
changeset
|
1091 for phase in allphases: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1092 revset = b'%ln - _phase(%s)' |
39293
278eb4541758
phases: simplify revset in updatephases
Boris Feld <boris.feld@octobus.net>
parents:
39275
diff
changeset
|
1093 heads = [c.node() for c in repo.set(revset, headsbyphase[phase], phase)] |
34321
4ef472b975ff
bundle2: only grab a transaction when 'phase-heads' affect the repository
Boris Feld <boris.feld@octobus.net>
parents:
34320
diff
changeset
|
1094 if heads: |
4ef472b975ff
bundle2: only grab a transaction when 'phase-heads' affect the repository
Boris Feld <boris.feld@octobus.net>
parents:
34320
diff
changeset
|
1095 advanceboundary(repo, trgetter(), phase, heads) |
33031
e8c8d81eb864
bundle: add config option to include phases
Martin von Zweigbergk <martinvonz@google.com>
parents:
32822
diff
changeset
|
1096 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40580
diff
changeset
|
1097 |
51581
e0194b3ea312
phases: use revision number in analyze_remote_phases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51580
diff
changeset
|
1098 def analyze_remote_phases( |
e0194b3ea312
phases: use revision number in analyze_remote_phases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51580
diff
changeset
|
1099 repo, |
e0194b3ea312
phases: use revision number in analyze_remote_phases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51580
diff
changeset
|
1100 subset: Collection[int], |
e0194b3ea312
phases: use revision number in analyze_remote_phases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51580
diff
changeset
|
1101 roots: Dict[bytes, bytes], |
e0194b3ea312
phases: use revision number in analyze_remote_phases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51580
diff
changeset
|
1102 ) -> Tuple[Collection[int], Collection[int]]: |
15649
ca7c4254a21a
phases: add a function to compute heads from root
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15648
diff
changeset
|
1103 """Compute phases heads and root in a subset of node from root dict |
ca7c4254a21a
phases: add a function to compute heads from root
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15648
diff
changeset
|
1104 |
ca7c4254a21a
phases: add a function to compute heads from root
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15648
diff
changeset
|
1105 * subset is heads of the subset |
ca7c4254a21a
phases: add a function to compute heads from root
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15648
diff
changeset
|
1106 * roots is {<nodeid> => phase} mapping. key and value are string. |
ca7c4254a21a
phases: add a function to compute heads from root
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15648
diff
changeset
|
1107 |
ca7c4254a21a
phases: add a function to compute heads from root
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15648
diff
changeset
|
1108 Accept unknown element input |
ca7c4254a21a
phases: add a function to compute heads from root
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15648
diff
changeset
|
1109 """ |
18002
9bc5873e52af
clfilter: phases logic should be unfiltered
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17979
diff
changeset
|
1110 repo = repo.unfiltered() |
15649
ca7c4254a21a
phases: add a function to compute heads from root
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15648
diff
changeset
|
1111 # build list from dictionary |
51579
87655e6dc108
phases: convert remote phase root to node while reading them
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51578
diff
changeset
|
1112 draft_roots = [] |
87655e6dc108
phases: convert remote phase root to node while reading them
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51578
diff
changeset
|
1113 to_rev = repo.changelog.index.get_rev |
48913
f254fc73d956
global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48875
diff
changeset
|
1114 for nhex, phase in roots.items(): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1115 if nhex == b'publishing': # ignore data related to publish option |
15649
ca7c4254a21a
phases: add a function to compute heads from root
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15648
diff
changeset
|
1116 continue |
ca7c4254a21a
phases: add a function to compute heads from root
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15648
diff
changeset
|
1117 node = bin(nhex) |
ca7c4254a21a
phases: add a function to compute heads from root
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15648
diff
changeset
|
1118 phase = int(phase) |
28174
f16b84b1e40e
phases: use constants for phase values
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27874
diff
changeset
|
1119 if phase == public: |
47012
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46644
diff
changeset
|
1120 if node != repo.nullid: |
51578
231a92eb1936
phases: more compact error handling in analyzeremotephases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51517
diff
changeset
|
1121 msg = _(b'ignoring inconsistent public root from remote: %s\n') |
231a92eb1936
phases: more compact error handling in analyzeremotephases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51517
diff
changeset
|
1122 repo.ui.warn(msg % nhex) |
28174
f16b84b1e40e
phases: use constants for phase values
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27874
diff
changeset
|
1123 elif phase == draft: |
51579
87655e6dc108
phases: convert remote phase root to node while reading them
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51578
diff
changeset
|
1124 rev = to_rev(node) |
87655e6dc108
phases: convert remote phase root to node while reading them
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51578
diff
changeset
|
1125 if rev is not None: # to filter unknown nodes |
87655e6dc108
phases: convert remote phase root to node while reading them
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51578
diff
changeset
|
1126 draft_roots.append(rev) |
15892
592b3d1742a1
phases: simplify phase exchange and movement over pushkey
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15821
diff
changeset
|
1127 else: |
51578
231a92eb1936
phases: more compact error handling in analyzeremotephases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51517
diff
changeset
|
1128 msg = _(b'ignoring unexpected root from remote: %i %s\n') |
231a92eb1936
phases: more compact error handling in analyzeremotephases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51517
diff
changeset
|
1129 repo.ui.warn(msg % (phase, nhex)) |
15649
ca7c4254a21a
phases: add a function to compute heads from root
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15648
diff
changeset
|
1130 # compute heads |
51581
e0194b3ea312
phases: use revision number in analyze_remote_phases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51580
diff
changeset
|
1131 public_heads = new_heads(repo, subset, draft_roots) |
e0194b3ea312
phases: use revision number in analyze_remote_phases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51580
diff
changeset
|
1132 return public_heads, draft_roots |
15649
ca7c4254a21a
phases: add a function to compute heads from root
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15648
diff
changeset
|
1133 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40580
diff
changeset
|
1134 |
51583
22cc679a7312
phases: move RemotePhasesSummary to revision number
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51582
diff
changeset
|
1135 class RemotePhasesSummary: |
34819
eb6375651974
phase: gather remote phase information in a summary object
Boris Feld <boris.feld@octobus.net>
parents:
34816
diff
changeset
|
1136 """summarize phase information on the remote side |
eb6375651974
phase: gather remote phase information in a summary object
Boris Feld <boris.feld@octobus.net>
parents:
34816
diff
changeset
|
1137 |
eb6375651974
phase: gather remote phase information in a summary object
Boris Feld <boris.feld@octobus.net>
parents:
34816
diff
changeset
|
1138 :publishing: True is the remote is publishing |
51583
22cc679a7312
phases: move RemotePhasesSummary to revision number
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51582
diff
changeset
|
1139 :public_heads: list of remote public phase heads (revs) |
22cc679a7312
phases: move RemotePhasesSummary to revision number
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51582
diff
changeset
|
1140 :draft_heads: list of remote draft phase heads (revs) |
22cc679a7312
phases: move RemotePhasesSummary to revision number
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51582
diff
changeset
|
1141 :draft_roots: list of remote draft phase root (revs) |
34819
eb6375651974
phase: gather remote phase information in a summary object
Boris Feld <boris.feld@octobus.net>
parents:
34816
diff
changeset
|
1142 """ |
eb6375651974
phase: gather remote phase information in a summary object
Boris Feld <boris.feld@octobus.net>
parents:
34816
diff
changeset
|
1143 |
51583
22cc679a7312
phases: move RemotePhasesSummary to revision number
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51582
diff
changeset
|
1144 def __init__( |
22cc679a7312
phases: move RemotePhasesSummary to revision number
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51582
diff
changeset
|
1145 self, |
22cc679a7312
phases: move RemotePhasesSummary to revision number
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51582
diff
changeset
|
1146 repo, |
22cc679a7312
phases: move RemotePhasesSummary to revision number
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51582
diff
changeset
|
1147 remote_subset: Collection[int], |
22cc679a7312
phases: move RemotePhasesSummary to revision number
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51582
diff
changeset
|
1148 remote_roots: Dict[bytes, bytes], |
22cc679a7312
phases: move RemotePhasesSummary to revision number
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51582
diff
changeset
|
1149 ): |
34819
eb6375651974
phase: gather remote phase information in a summary object
Boris Feld <boris.feld@octobus.net>
parents:
34816
diff
changeset
|
1150 unfi = repo.unfiltered() |
51583
22cc679a7312
phases: move RemotePhasesSummary to revision number
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51582
diff
changeset
|
1151 self._allremoteroots: Dict[bytes, bytes] = remote_roots |
34819
eb6375651974
phase: gather remote phase information in a summary object
Boris Feld <boris.feld@octobus.net>
parents:
34816
diff
changeset
|
1152 |
51583
22cc679a7312
phases: move RemotePhasesSummary to revision number
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51582
diff
changeset
|
1153 self.publishing: bool = bool(remote_roots.get(b'publishing', False)) |
34819
eb6375651974
phase: gather remote phase information in a summary object
Boris Feld <boris.feld@octobus.net>
parents:
34816
diff
changeset
|
1154 |
51583
22cc679a7312
phases: move RemotePhasesSummary to revision number
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51582
diff
changeset
|
1155 heads, roots = analyze_remote_phases(repo, remote_subset, remote_roots) |
22cc679a7312
phases: move RemotePhasesSummary to revision number
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51582
diff
changeset
|
1156 self.public_heads: Collection[int] = heads |
22cc679a7312
phases: move RemotePhasesSummary to revision number
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51582
diff
changeset
|
1157 self.draft_roots: Collection[int] = roots |
34819
eb6375651974
phase: gather remote phase information in a summary object
Boris Feld <boris.feld@octobus.net>
parents:
34816
diff
changeset
|
1158 # Get the list of all "heads" revs draft on remote |
51582
d8287e43540f
phases: stop using `repo.set` in `remotephasessummary`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51581
diff
changeset
|
1159 dheads = unfi.revs(b'heads(%ld::%ld)', roots, remote_subset) |
51583
22cc679a7312
phases: move RemotePhasesSummary to revision number
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51582
diff
changeset
|
1160 self.draft_heads: Collection[int] = dheads |
34819
eb6375651974
phase: gather remote phase information in a summary object
Boris Feld <boris.feld@octobus.net>
parents:
34816
diff
changeset
|
1161 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40580
diff
changeset
|
1162 |
51580
b70628a9aa7e
phases: use revision number in new_heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51579
diff
changeset
|
1163 def new_heads( |
b70628a9aa7e
phases: use revision number in new_heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51579
diff
changeset
|
1164 repo, |
b70628a9aa7e
phases: use revision number in new_heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51579
diff
changeset
|
1165 heads: Collection[int], |
b70628a9aa7e
phases: use revision number in new_heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51579
diff
changeset
|
1166 roots: Collection[int], |
b70628a9aa7e
phases: use revision number in new_heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51579
diff
changeset
|
1167 ) -> Collection[int]: |
15954
b345f851d056
phase: extracts heads computation logics from analyzeremotephases
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
15953
diff
changeset
|
1168 """compute new head of a subset minus another |
b345f851d056
phase: extracts heads computation logics from analyzeremotephases
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
15953
diff
changeset
|
1169 |
b345f851d056
phase: extracts heads computation logics from analyzeremotephases
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
15953
diff
changeset
|
1170 * `heads`: define the first subset |
17425
e95ec38f86b0
fix wording and not-completely-trivial spelling errors and bad docstrings
Mads Kiilerich <mads@kiilerich.com>
parents:
17424
diff
changeset
|
1171 * `roots`: define the second we subtract from the first""" |
39146
f736fdbe546a
remotephase: avoid full changelog iteration (issue5964)
Boris Feld <boris.feld@octobus.net>
parents:
39141
diff
changeset
|
1172 # prevent an import cycle |
f736fdbe546a
remotephase: avoid full changelog iteration (issue5964)
Boris Feld <boris.feld@octobus.net>
parents:
39141
diff
changeset
|
1173 # phases > dagop > patch > copies > scmutil > obsolete > obsutil > phases |
f736fdbe546a
remotephase: avoid full changelog iteration (issue5964)
Boris Feld <boris.feld@octobus.net>
parents:
39141
diff
changeset
|
1174 from . import dagop |
f736fdbe546a
remotephase: avoid full changelog iteration (issue5964)
Boris Feld <boris.feld@octobus.net>
parents:
39141
diff
changeset
|
1175 |
f736fdbe546a
remotephase: avoid full changelog iteration (issue5964)
Boris Feld <boris.feld@octobus.net>
parents:
39141
diff
changeset
|
1176 if not roots: |
f736fdbe546a
remotephase: avoid full changelog iteration (issue5964)
Boris Feld <boris.feld@octobus.net>
parents:
39141
diff
changeset
|
1177 return heads |
51580
b70628a9aa7e
phases: use revision number in new_heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51579
diff
changeset
|
1178 if not heads or heads == [nullrev]: |
39146
f736fdbe546a
remotephase: avoid full changelog iteration (issue5964)
Boris Feld <boris.feld@octobus.net>
parents:
39141
diff
changeset
|
1179 return [] |
f736fdbe546a
remotephase: avoid full changelog iteration (issue5964)
Boris Feld <boris.feld@octobus.net>
parents:
39141
diff
changeset
|
1180 # The logic operated on revisions, convert arguments early for convenience |
51580
b70628a9aa7e
phases: use revision number in new_heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51579
diff
changeset
|
1181 # PERF-XXX: maybe heads could directly comes as a set without impacting |
b70628a9aa7e
phases: use revision number in new_heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51579
diff
changeset
|
1182 # other user of that value |
b70628a9aa7e
phases: use revision number in new_heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51579
diff
changeset
|
1183 new_heads = set(heads) |
b70628a9aa7e
phases: use revision number in new_heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51579
diff
changeset
|
1184 new_heads.discard(nullrev) |
39146
f736fdbe546a
remotephase: avoid full changelog iteration (issue5964)
Boris Feld <boris.feld@octobus.net>
parents:
39141
diff
changeset
|
1185 # compute the area we need to remove |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1186 affected_zone = repo.revs(b"(%ld::%ld)", roots, new_heads) |
39146
f736fdbe546a
remotephase: avoid full changelog iteration (issue5964)
Boris Feld <boris.feld@octobus.net>
parents:
39141
diff
changeset
|
1187 # heads in the area are no longer heads |
f736fdbe546a
remotephase: avoid full changelog iteration (issue5964)
Boris Feld <boris.feld@octobus.net>
parents:
39141
diff
changeset
|
1188 new_heads.difference_update(affected_zone) |
f736fdbe546a
remotephase: avoid full changelog iteration (issue5964)
Boris Feld <boris.feld@octobus.net>
parents:
39141
diff
changeset
|
1189 # revisions in the area have children outside of it, |
f736fdbe546a
remotephase: avoid full changelog iteration (issue5964)
Boris Feld <boris.feld@octobus.net>
parents:
39141
diff
changeset
|
1190 # They might be new heads |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40580
diff
changeset
|
1191 candidates = repo.revs( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1192 b"parents(%ld + (%ld and merge())) and not null", roots, affected_zone |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40580
diff
changeset
|
1193 ) |
39146
f736fdbe546a
remotephase: avoid full changelog iteration (issue5964)
Boris Feld <boris.feld@octobus.net>
parents:
39141
diff
changeset
|
1194 candidates -= affected_zone |
f736fdbe546a
remotephase: avoid full changelog iteration (issue5964)
Boris Feld <boris.feld@octobus.net>
parents:
39141
diff
changeset
|
1195 if new_heads or candidates: |
f736fdbe546a
remotephase: avoid full changelog iteration (issue5964)
Boris Feld <boris.feld@octobus.net>
parents:
39141
diff
changeset
|
1196 # remove candidate that are ancestors of other heads |
f736fdbe546a
remotephase: avoid full changelog iteration (issue5964)
Boris Feld <boris.feld@octobus.net>
parents:
39141
diff
changeset
|
1197 new_heads.update(candidates) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1198 prunestart = repo.revs(b"parents(%ld) and not null", new_heads) |
39146
f736fdbe546a
remotephase: avoid full changelog iteration (issue5964)
Boris Feld <boris.feld@octobus.net>
parents:
39141
diff
changeset
|
1199 pruned = dagop.reachableroots(repo, candidates, prunestart) |
f736fdbe546a
remotephase: avoid full changelog iteration (issue5964)
Boris Feld <boris.feld@octobus.net>
parents:
39141
diff
changeset
|
1200 new_heads.difference_update(pruned) |
f736fdbe546a
remotephase: avoid full changelog iteration (issue5964)
Boris Feld <boris.feld@octobus.net>
parents:
39141
diff
changeset
|
1201 |
51580
b70628a9aa7e
phases: use revision number in new_heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51579
diff
changeset
|
1202 # PERF-XXX: do we actually need a sorted list here? Could we simply return |
b70628a9aa7e
phases: use revision number in new_heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51579
diff
changeset
|
1203 # a set? |
b70628a9aa7e
phases: use revision number in new_heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51579
diff
changeset
|
1204 return sorted(new_heads) |
16030
308406677e9d
phases: allow phase name in phases.new-commit settings
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
16025
diff
changeset
|
1205 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40580
diff
changeset
|
1206 |
51287
f15cb5111a1e
pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51285
diff
changeset
|
1207 def newcommitphase(ui: "uimod.ui") -> int: |
16030
308406677e9d
phases: allow phase name in phases.new-commit settings
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
16025
diff
changeset
|
1208 """helper to get the target phase of new commit |
308406677e9d
phases: allow phase name in phases.new-commit settings
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
16025
diff
changeset
|
1209 |
308406677e9d
phases: allow phase name in phases.new-commit settings
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
16025
diff
changeset
|
1210 Handle all possible values for the phases.new-commit options. |
308406677e9d
phases: allow phase name in phases.new-commit settings
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
16025
diff
changeset
|
1211 |
308406677e9d
phases: allow phase name in phases.new-commit settings
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
16025
diff
changeset
|
1212 """ |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1213 v = ui.config(b'phases', b'new-commit') |
16030
308406677e9d
phases: allow phase name in phases.new-commit settings
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
16025
diff
changeset
|
1214 try: |
45117
b1e51ef4e536
phases: sparsify phase lists
Joerg Sonnenberger <joerg@bec.de>
parents:
45116
diff
changeset
|
1215 return phasenumber2[v] |
b1e51ef4e536
phases: sparsify phase lists
Joerg Sonnenberger <joerg@bec.de>
parents:
45116
diff
changeset
|
1216 except KeyError: |
b1e51ef4e536
phases: sparsify phase lists
Joerg Sonnenberger <joerg@bec.de>
parents:
45116
diff
changeset
|
1217 raise error.ConfigError( |
b1e51ef4e536
phases: sparsify phase lists
Joerg Sonnenberger <joerg@bec.de>
parents:
45116
diff
changeset
|
1218 _(b"phases.new-commit: not a valid phase name ('%s')") % v |
b1e51ef4e536
phases: sparsify phase lists
Joerg Sonnenberger <joerg@bec.de>
parents:
45116
diff
changeset
|
1219 ) |
16030
308406677e9d
phases: allow phase name in phases.new-commit settings
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
16025
diff
changeset
|
1220 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40580
diff
changeset
|
1221 |
51287
f15cb5111a1e
pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51285
diff
changeset
|
1222 def hassecret(repo: "localrepo.localrepository") -> bool: |
17671
fdd0fc046cf1
clfilter: introduce a `hassecret` function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17537
diff
changeset
|
1223 """utility function that check if a repo have any secret changeset.""" |
51403
68289ed170c7
phases: mark `phasecache.phaseroots` private
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51401
diff
changeset
|
1224 return bool(repo._phasecache._phaseroots[secret]) |
34710
cdf833d7de98
phase: add a dedicated txnclose-phase hook
Boris Feld <boris.feld@octobus.net>
parents:
34563
diff
changeset
|
1225 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40580
diff
changeset
|
1226 |
51287
f15cb5111a1e
pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51285
diff
changeset
|
1227 def preparehookargs( |
f15cb5111a1e
pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51285
diff
changeset
|
1228 node: bytes, |
f15cb5111a1e
pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51285
diff
changeset
|
1229 old: Optional[int], |
f15cb5111a1e
pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51285
diff
changeset
|
1230 new: Optional[int], |
f15cb5111a1e
pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51285
diff
changeset
|
1231 ) -> Dict[bytes, bytes]: |
34710
cdf833d7de98
phase: add a dedicated txnclose-phase hook
Boris Feld <boris.feld@octobus.net>
parents:
34563
diff
changeset
|
1232 if old is None: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1233 old = b'' |
34710
cdf833d7de98
phase: add a dedicated txnclose-phase hook
Boris Feld <boris.feld@octobus.net>
parents:
34563
diff
changeset
|
1234 else: |
34876
eb1b964b354b
phases: pass phase names to hooks instead of internal values
Kevin Bullock <kbullock+mercurial@ringworld.org>
parents:
34819
diff
changeset
|
1235 old = phasenames[old] |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1236 return {b'node': node, b'oldphase': old, b'phase': phasenames[new]} |