annotate mercurial/phases.py @ 51516:e0f92bd98c24 stable

phases: avoid a potentially costly dictionary interation in some case If we retract for the draft phase, there is not non-public item to be retracted and we can skip this part. This part is was apparently super costly thanks to Python. On mozilla-try-2019-02-18, a perf::unbundle call with a 10 000 changesets bundle gives give use the following timing. e57d4b868a3e: 4.6 seconds ac1c75188440: 102.5 seconds this-changeset: 30.0 seconds So we recovered about ⅔ of the regression, the next changeset will give us the rest back.
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Mon, 25 Mar 2024 01:50:31 +0100
parents c9ceb4f60256
children 4ee50d98d35c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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,
9d3721552b6c pytype: import typing directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51124
diff changeset
112 Dict,
9d3721552b6c pytype: import typing directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51124
diff changeset
113 Iterable,
9d3721552b6c pytype: import typing directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51124
diff changeset
114 List,
9d3721552b6c pytype: import typing directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51124
diff changeset
115 Optional,
9d3721552b6c pytype: import typing directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51124
diff changeset
116 Set,
9d3721552b6c pytype: import typing directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51124
diff changeset
117 Tuple,
9d3721552b6c pytype: import typing directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51124
diff changeset
118 )
25966
f14cea32e1d4 phases: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
119
f14cea32e1d4 phases: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
120 from .i18n import _
f14cea32e1d4 phases: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
121 from .node import (
f14cea32e1d4 phases: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
122 bin,
f14cea32e1d4 phases: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
123 hex,
f14cea32e1d4 phases: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
124 nullrev,
f14cea32e1d4 phases: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
125 short,
44004
9c1fd975e9ac phases: make the working directory consistently a draft
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43730
diff changeset
126 wdirrev,
25966
f14cea32e1d4 phases: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
127 )
f14cea32e1d4 phases: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
128 from . import (
f14cea32e1d4 phases: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
129 error,
35309
d13526333835 phases: drop the list with phase of each rev, always comput phase sets
Joerg Sonnenberger <joerg@bec.de>
parents: 34876
diff changeset
130 pycompat,
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)
2f39c7aeb549 phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51408
diff changeset
872 for r in range(start, end):
44988
fa151f7af275 phases: improve performance of _retractboundary
Joerg Sonnenberger <joerg@bec.de>
parents: 44548
diff changeset
873
51409
2f39c7aeb549 phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51408
diff changeset
874 # 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
875 r_phase = phase(repo, r)
2f39c7aeb549 phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51408
diff changeset
876 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
877 p1, p2 = parents(r)
2f39c7aeb549 phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51408
diff changeset
878 if p1 >= start:
2f39c7aeb549 phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51408
diff changeset
879 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
880 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
881 p_phase = p1_phase
2f39c7aeb549 phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51408
diff changeset
882 if p2 >= start:
2f39c7aeb549 phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51408
diff changeset
883 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
884 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
885 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
886 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
887 else:
2f39c7aeb549 phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51408
diff changeset
888 p_phase = p2_phase
26909
e36118815a39 phase: improve retractboundary perf
Durham Goode <durham@fb.com>
parents: 26587
diff changeset
889
51409
2f39c7aeb549 phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51408
diff changeset
890 # assess the situation
2f39c7aeb549 phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51408
diff changeset
891 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
892 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
893 new_roots.add(r)
2f39c7aeb549 phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51408
diff changeset
894 rev_phases[r - start] = targetphase
2f39c7aeb549 phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51408
diff changeset
895 changed_revs[r] = r_phase
2f39c7aeb549 phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51408
diff changeset
896 elif p_phase is None:
2f39c7aeb549 phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51408
diff changeset
897 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
898 else:
2f39c7aeb549 phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51408
diff changeset
899 if p_phase > r_phase:
2f39c7aeb549 phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51408
diff changeset
900 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
901 else:
2f39c7aeb549 phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51408
diff changeset
902 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
903 if p_phase == targetphase:
2f39c7aeb549 phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51408
diff changeset
904 if p_phase > r_phase:
2f39c7aeb549 phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51408
diff changeset
905 changed_revs[r] = r_phase
2f39c7aeb549 phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51408
diff changeset
906 elif r in currentroots:
2f39c7aeb549 phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51408
diff changeset
907 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
908 sets = self._phasesets
ac1c75188440 phases: invalidate the phases set less often on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51419
diff changeset
909 sets[targetphase].update(changed_revs)
51516
e0f92bd98c24 phases: avoid a potentially costly dictionary interation in some case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51505
diff changeset
910 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
911 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
912 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
913 sets[old].discard(r)
26909
e36118815a39 phase: improve retractboundary perf
Durham Goode <durham@fb.com>
parents: 26587
diff changeset
914
51409
2f39c7aeb549 phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51408
diff changeset
915 if new_roots:
2f39c7aeb549 phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51408
diff changeset
916 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
917
51409
2f39c7aeb549 phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51408
diff changeset
918 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
919 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
920 repo,
ac1c75188440 phases: invalidate the phases set less often on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51419
diff changeset
921 targetphase,
ac1c75188440 phases: invalidate the phases set less often on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51419
diff changeset
922 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
923 tr,
ac1c75188440 phases: invalidate the phases set less often on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51419
diff changeset
924 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
925 )
51409
2f39c7aeb549 phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51408
diff changeset
926 if targetphase > 1:
2f39c7aeb549 phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51408
diff changeset
927 retracted = set(changed_revs)
2f39c7aeb549 phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51408
diff changeset
928 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
929 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
930 if lower_roots is None:
2f39c7aeb549 phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51408
diff changeset
931 continue
2f39c7aeb549 phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51408
diff changeset
932 if lower_roots & retracted:
2f39c7aeb549 phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51408
diff changeset
933 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
934 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
935 repo,
ac1c75188440 phases: invalidate the phases set less often on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51419
diff changeset
936 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
937 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
938 tr,
ac1c75188440 phases: invalidate the phases set less often on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51419
diff changeset
939 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
940 )
51409
2f39c7aeb549 phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51408
diff changeset
941 return changed_revs
2f39c7aeb549 phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51408
diff changeset
942 else:
2f39c7aeb549 phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51408
diff changeset
943 assert not changed_revs
2f39c7aeb549 phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51408
diff changeset
944 assert not replaced_roots
2f39c7aeb549 phases: large rewrite on retract boundary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51408
diff changeset
945 return {}
16658
6b3d31d04a69 phases: make advance/retractboundary() atomic
Patrick Mezard <patrick@mezard.eu>
parents: 16657
diff changeset
946
51401
8f2ea3fa50fd phases: explicitly filter stripped revision at strip time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51290
diff changeset
947 def register_strip(
8f2ea3fa50fd phases: explicitly filter stripped revision at strip time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51290
diff changeset
948 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
949 repo,
51401
8f2ea3fa50fd phases: explicitly filter stripped revision at strip time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51290
diff changeset
950 tr,
8f2ea3fa50fd phases: explicitly filter stripped revision at strip time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51290
diff changeset
951 strip_rev: int,
8f2ea3fa50fd phases: explicitly filter stripped revision at strip time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51290
diff changeset
952 ):
8f2ea3fa50fd phases: explicitly filter stripped revision at strip time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51290
diff changeset
953 """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
954
8f2ea3fa50fd phases: explicitly filter stripped revision at strip time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51290
diff changeset
955 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
956 """
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
957 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
958 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
959 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
960 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
961 self.invalidate()
8f2ea3fa50fd phases: explicitly filter stripped revision at strip time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51290
diff changeset
962
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40580
diff changeset
963
45789
09735cde6275 phases: allow registration and boundary advancement with revision sets
Joerg Sonnenberger <joerg@bec.de>
parents: 45550
diff changeset
964 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
965 """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
966
16725
b0fb4f57d076 phases: wrap docstrings at 70 characters
Martin Geisler <martin@geisler.net>
parents: 16724
diff changeset
967 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
968 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
969
38218
36ba5dba372d advanceboundary: add dryrun parameter
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38158
diff changeset
970 Simplify boundary to contains phase roots only.
36ba5dba372d advanceboundary: add dryrun parameter
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38158
diff changeset
971
36ba5dba372d advanceboundary: add dryrun parameter
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38158
diff changeset
972 If dryrun is True, no actions will be performed
36ba5dba372d advanceboundary: add dryrun parameter
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38158
diff changeset
973
36ba5dba372d advanceboundary: add dryrun parameter
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38158
diff changeset
974 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
975 """
45789
09735cde6275 phases: allow registration and boundary advancement with revision sets
Joerg Sonnenberger <joerg@bec.de>
parents: 45550
diff changeset
976 if revs is None:
09735cde6275 phases: allow registration and boundary advancement with revision sets
Joerg Sonnenberger <joerg@bec.de>
parents: 45550
diff changeset
977 revs = []
16658
6b3d31d04a69 phases: make advance/retractboundary() atomic
Patrick Mezard <patrick@mezard.eu>
parents: 16657
diff changeset
978 phcache = repo._phasecache.copy()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40580
diff changeset
979 changes = phcache.advanceboundary(
45789
09735cde6275 phases: allow registration and boundary advancement with revision sets
Joerg Sonnenberger <joerg@bec.de>
parents: 45550
diff changeset
980 repo, tr, targetphase, nodes, revs=revs, dryrun=dryrun
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40580
diff changeset
981 )
38218
36ba5dba372d advanceboundary: add dryrun parameter
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38158
diff changeset
982 if not dryrun:
36ba5dba372d advanceboundary: add dryrun parameter
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38158
diff changeset
983 repo._phasecache.replace(phcache)
36ba5dba372d advanceboundary: add dryrun parameter
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38158
diff changeset
984 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
985
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40580
diff changeset
986
22070
c1ca47204590 phase: add a transaction argument to retractboundary
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22069
diff changeset
987 def retractboundary(repo, tr, targetphase, nodes):
16725
b0fb4f57d076 phases: wrap docstrings at 70 characters
Martin Geisler <martin@geisler.net>
parents: 16724
diff changeset
988 """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
989 necessary.
15482
a667c89e49b3 phases: add retractboundary function to move boundary backward
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15481
diff changeset
990
16725
b0fb4f57d076 phases: wrap docstrings at 70 characters
Martin Geisler <martin@geisler.net>
parents: 16724
diff changeset
991 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
992 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
993
a667c89e49b3 phases: add retractboundary function to move boundary backward
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15481
diff changeset
994 Simplify boundary to contains phase roots only."""
16658
6b3d31d04a69 phases: make advance/retractboundary() atomic
Patrick Mezard <patrick@mezard.eu>
parents: 16657
diff changeset
995 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
996 phcache.retractboundary(repo, tr, targetphase, nodes)
16658
6b3d31d04a69 phases: make advance/retractboundary() atomic
Patrick Mezard <patrick@mezard.eu>
parents: 16657
diff changeset
997 repo._phasecache.replace(phcache)
15648
79cc89de5be1 phases: add basic pushkey support
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15482
diff changeset
998
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40580
diff changeset
999
45790
5d65e04b6a80 phases: convert registernew users to use revision sets
Joerg Sonnenberger <joerg@bec.de>
parents: 45789
diff changeset
1000 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
1001 """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
1002
f6b7617a85bb phases: add a 'registernew' method to set new phases
Boris Feld <boris.feld@octobus.net>
parents: 33452
diff changeset
1003 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
1004 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
1005 """
f6b7617a85bb phases: add a 'registernew' method to set new phases
Boris Feld <boris.feld@octobus.net>
parents: 33452
diff changeset
1006 phcache = repo._phasecache.copy()
45790
5d65e04b6a80 phases: convert registernew users to use revision sets
Joerg Sonnenberger <joerg@bec.de>
parents: 45789
diff changeset
1007 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
1008 repo._phasecache.replace(phcache)
f6b7617a85bb phases: add a 'registernew' method to set new phases
Boris Feld <boris.feld@octobus.net>
parents: 33452
diff changeset
1009
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40580
diff changeset
1010
51287
f15cb5111a1e pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51285
diff changeset
1011 def listphases(repo: "localrepo.localrepository") -> Dict[bytes, bytes]:
16724
00535da82faf phases: fix typos in docstrings
Martin Geisler <martin@geisler.net>
parents: 16659
diff changeset
1012 """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
1013 # 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
1014 keys = util.sortdict()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1015 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
1016 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
1017 to_node = cl.node
51403
68289ed170c7 phases: mark `phasecache.phaseroots` private
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51401
diff changeset
1018 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
1019 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
1020 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
1021
25624
f0745da75056 publishing: use new helper method
Matt Mackall <mpm@selenic.com>
parents: 25614
diff changeset
1022 if repo.publishing():
16725
b0fb4f57d076 phases: wrap docstrings at 70 characters
Martin Geisler <martin@geisler.net>
parents: 16724
diff changeset
1023 # 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
1024 # 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
1025 # 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
1026 # push phase boundary
15648
79cc89de5be1 phases: add basic pushkey support
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15482
diff changeset
1027 #
16725
b0fb4f57d076 phases: wrap docstrings at 70 characters
Martin Geisler <martin@geisler.net>
parents: 16724
diff changeset
1028 # 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
1029 # 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
1030 # 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
1031 #
79cc89de5be1 phases: add basic pushkey support
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15482
diff changeset
1032 # 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
1033 # 2) repo B make changeset X public
16725
b0fb4f57d076 phases: wrap docstrings at 70 characters
Martin Geisler <martin@geisler.net>
parents: 16724
diff changeset
1034 # 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
1035 # X as now public should
15648
79cc89de5be1 phases: add basic pushkey support
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15482
diff changeset
1036 #
16725
b0fb4f57d076 phases: wrap docstrings at 70 characters
Martin Geisler <martin@geisler.net>
parents: 16724
diff changeset
1037 # 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
1038 # client phase data.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1039 keys[b'publishing'] = b'True'
15648
79cc89de5be1 phases: add basic pushkey support
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15482
diff changeset
1040 return keys
79cc89de5be1 phases: add basic pushkey support
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15482
diff changeset
1041
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40580
diff changeset
1042
51287
f15cb5111a1e pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51285
diff changeset
1043 def pushphase(
f15cb5111a1e pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51285
diff changeset
1044 repo: "localrepo.localrepository",
f15cb5111a1e pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51285
diff changeset
1045 nhex: bytes,
f15cb5111a1e pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51285
diff changeset
1046 oldphasestr: bytes,
f15cb5111a1e pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51285
diff changeset
1047 newphasestr: bytes,
f15cb5111a1e pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51285
diff changeset
1048 ) -> bool:
17535
63e302be813f en-us: serialization
timeless@mozdev.org
parents: 17205
diff changeset
1049 """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
1050 repo = repo.unfiltered()
27861
3315a9c2019c with: use context manager for lock in pushphase
Bryan O'Sullivan <bryano@fb.com>
parents: 26909
diff changeset
1051 with repo.lock():
15648
79cc89de5be1 phases: add basic pushkey support
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15482
diff changeset
1052 currentphase = repo[nhex].phase()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40580
diff changeset
1053 newphase = abs(int(newphasestr)) # let's avoid negative index surprise
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40580
diff changeset
1054 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
1055 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
1056 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
1057 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
1058 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
1059 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
1060 # 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
1061 return True
15648
79cc89de5be1 phases: add basic pushkey support
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15482
diff changeset
1062 else:
32822
e65ff29dbeb0 pushkey: use False/True for return values from push functions
Martin von Zweigbergk <martinvonz@google.com>
parents: 32000
diff changeset
1063 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
1064
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40580
diff changeset
1065
33031
e8c8d81eb864 bundle: add config option to include phases
Martin von Zweigbergk <martinvonz@google.com>
parents: 32822
diff changeset
1066 def subsetphaseheads(repo, subset):
e8c8d81eb864 bundle: add config option to include phases
Martin von Zweigbergk <martinvonz@google.com>
parents: 32822
diff changeset
1067 """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
1068
e8c8d81eb864 bundle: add config option to include phases
Martin von Zweigbergk <martinvonz@google.com>
parents: 32822
diff changeset
1069 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
1070 head nodes.
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 cl = repo.changelog
e8c8d81eb864 bundle: add config option to include phases
Martin von Zweigbergk <martinvonz@google.com>
parents: 32822
diff changeset
1073
45117
b1e51ef4e536 phases: sparsify phase lists
Joerg Sonnenberger <joerg@bec.de>
parents: 45116
diff changeset
1074 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
1075 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
1076 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
1077 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
1078 return headsbyphase
e8c8d81eb864 bundle: add config option to include phases
Martin von Zweigbergk <martinvonz@google.com>
parents: 32822
diff changeset
1079
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40580
diff changeset
1080
34321
4ef472b975ff bundle2: only grab a transaction when 'phase-heads' affect the repository
Boris Feld <boris.feld@octobus.net>
parents: 34320
diff changeset
1081 def updatephases(repo, trgetter, headsbyphase):
33031
e8c8d81eb864 bundle: add config option to include phases
Martin von Zweigbergk <martinvonz@google.com>
parents: 32822
diff changeset
1082 """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
1083 # 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
1084 #
4ef472b975ff bundle2: only grab a transaction when 'phase-heads' affect the repository
Boris Feld <boris.feld@octobus.net>
parents: 34320
diff changeset
1085 # 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
1086 # 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
1087
45116
361a7444bc41 phases: updatephases should not skip internal phase
Joerg Sonnenberger <joerg@bec.de>
parents: 45114
diff changeset
1088 for phase in allphases:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1089 revset = b'%ln - _phase(%s)'
39293
278eb4541758 phases: simplify revset in updatephases
Boris Feld <boris.feld@octobus.net>
parents: 39275
diff changeset
1090 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
1091 if heads:
4ef472b975ff bundle2: only grab a transaction when 'phase-heads' affect the repository
Boris Feld <boris.feld@octobus.net>
parents: 34320
diff changeset
1092 advanceboundary(repo, trgetter(), phase, heads)
33031
e8c8d81eb864 bundle: add config option to include phases
Martin von Zweigbergk <martinvonz@google.com>
parents: 32822
diff changeset
1093
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40580
diff changeset
1094
15649
ca7c4254a21a phases: add a function to compute heads from root
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15648
diff changeset
1095 def analyzeremotephases(repo, subset, roots):
ca7c4254a21a phases: add a function to compute heads from root
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15648
diff changeset
1096 """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
1097
ca7c4254a21a phases: add a function to compute heads from root
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15648
diff changeset
1098 * 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
1099 * 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
1100
ca7c4254a21a phases: add a function to compute heads from root
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15648
diff changeset
1101 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
1102 """
18002
9bc5873e52af clfilter: phases logic should be unfiltered
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17979
diff changeset
1103 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
1104 # build list from dictionary
15892
592b3d1742a1 phases: simplify phase exchange and movement over pushkey
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15821
diff changeset
1105 draftroots = []
43538
9970412d2ce3 index: use `index.has_node` in `analyzeremotephases`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43106
diff changeset
1106 has_node = repo.changelog.index.has_node # to filter unknown nodes
48913
f254fc73d956 global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
1107 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
1108 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
1109 continue
ca7c4254a21a phases: add a function to compute heads from root
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15648
diff changeset
1110 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
1111 phase = int(phase)
28174
f16b84b1e40e phases: use constants for phase values
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27874
diff changeset
1112 if phase == public:
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46644
diff changeset
1113 if node != repo.nullid:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40580
diff changeset
1114 repo.ui.warn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1115 _(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1116 b'ignoring inconsistent public root'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1117 b' from remote: %s\n'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1118 )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40580
diff changeset
1119 % nhex
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40580
diff changeset
1120 )
28174
f16b84b1e40e phases: use constants for phase values
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27874
diff changeset
1121 elif phase == draft:
43538
9970412d2ce3 index: use `index.has_node` in `analyzeremotephases`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43106
diff changeset
1122 if has_node(node):
15892
592b3d1742a1 phases: simplify phase exchange and movement over pushkey
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15821
diff changeset
1123 draftroots.append(node)
592b3d1742a1 phases: simplify phase exchange and movement over pushkey
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15821
diff changeset
1124 else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40580
diff changeset
1125 repo.ui.warn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1126 _(b'ignoring unexpected root from remote: %i %s\n')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40580
diff changeset
1127 % (phase, nhex)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40580
diff changeset
1128 )
15649
ca7c4254a21a phases: add a function to compute heads from root
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15648
diff changeset
1129 # compute heads
15954
b345f851d056 phase: extracts heads computation logics from analyzeremotephases
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15953
diff changeset
1130 publicheads = newheads(repo, subset, draftroots)
15892
592b3d1742a1 phases: simplify phase exchange and movement over pushkey
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15821
diff changeset
1131 return publicheads, draftroots
15649
ca7c4254a21a phases: add a function to compute heads from root
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15648
diff changeset
1132
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40580
diff changeset
1133
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48913
diff changeset
1134 class remotephasessummary:
34819
eb6375651974 phase: gather remote phase information in a summary object
Boris Feld <boris.feld@octobus.net>
parents: 34816
diff changeset
1135 """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
1136
eb6375651974 phase: gather remote phase information in a summary object
Boris Feld <boris.feld@octobus.net>
parents: 34816
diff changeset
1137 :publishing: True is the remote is publishing
eb6375651974 phase: gather remote phase information in a summary object
Boris Feld <boris.feld@octobus.net>
parents: 34816
diff changeset
1138 :publicheads: list of remote public phase heads (nodes)
eb6375651974 phase: gather remote phase information in a summary object
Boris Feld <boris.feld@octobus.net>
parents: 34816
diff changeset
1139 :draftheads: list of remote draft phase heads (nodes)
eb6375651974 phase: gather remote phase information in a summary object
Boris Feld <boris.feld@octobus.net>
parents: 34816
diff changeset
1140 :draftroots: list of remote draft phase root (nodes)
eb6375651974 phase: gather remote phase information in a summary object
Boris Feld <boris.feld@octobus.net>
parents: 34816
diff changeset
1141 """
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 def __init__(self, repo, remotesubset, remoteroots):
eb6375651974 phase: gather remote phase information in a summary object
Boris Feld <boris.feld@octobus.net>
parents: 34816
diff changeset
1144 unfi = repo.unfiltered()
eb6375651974 phase: gather remote phase information in a summary object
Boris Feld <boris.feld@octobus.net>
parents: 34816
diff changeset
1145 self._allremoteroots = remoteroots
eb6375651974 phase: gather remote phase information in a summary object
Boris Feld <boris.feld@octobus.net>
parents: 34816
diff changeset
1146
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1147 self.publishing = remoteroots.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
1148
eb6375651974 phase: gather remote phase information in a summary object
Boris Feld <boris.feld@octobus.net>
parents: 34816
diff changeset
1149 ana = analyzeremotephases(repo, remotesubset, remoteroots)
eb6375651974 phase: gather remote phase information in a summary object
Boris Feld <boris.feld@octobus.net>
parents: 34816
diff changeset
1150 self.publicheads, self.draftroots = ana
eb6375651974 phase: gather remote phase information in a summary object
Boris Feld <boris.feld@octobus.net>
parents: 34816
diff changeset
1151 # Get the list of all "heads" revs draft on remote
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1152 dheads = unfi.set(b'heads(%ln::%ln)', self.draftroots, remotesubset)
34819
eb6375651974 phase: gather remote phase information in a summary object
Boris Feld <boris.feld@octobus.net>
parents: 34816
diff changeset
1153 self.draftheads = [c.node() for c in dheads]
eb6375651974 phase: gather remote phase information in a summary object
Boris Feld <boris.feld@octobus.net>
parents: 34816
diff changeset
1154
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40580
diff changeset
1155
15954
b345f851d056 phase: extracts heads computation logics from analyzeremotephases
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15953
diff changeset
1156 def newheads(repo, heads, roots):
b345f851d056 phase: extracts heads computation logics from analyzeremotephases
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15953
diff changeset
1157 """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
1158
b345f851d056 phase: extracts heads computation logics from analyzeremotephases
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15953
diff changeset
1159 * `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
1160 * `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
1161 # prevent an import cycle
f736fdbe546a remotephase: avoid full changelog iteration (issue5964)
Boris Feld <boris.feld@octobus.net>
parents: 39141
diff changeset
1162 # 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
1163 from . import dagop
f736fdbe546a remotephase: avoid full changelog iteration (issue5964)
Boris Feld <boris.feld@octobus.net>
parents: 39141
diff changeset
1164
f736fdbe546a remotephase: avoid full changelog iteration (issue5964)
Boris Feld <boris.feld@octobus.net>
parents: 39141
diff changeset
1165 repo = repo.unfiltered()
f736fdbe546a remotephase: avoid full changelog iteration (issue5964)
Boris Feld <boris.feld@octobus.net>
parents: 39141
diff changeset
1166 cl = repo.changelog
43556
505a2bc53759 index: use `index.get_rev` in `phases.newheads`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43539
diff changeset
1167 rev = cl.index.get_rev
39146
f736fdbe546a remotephase: avoid full changelog iteration (issue5964)
Boris Feld <boris.feld@octobus.net>
parents: 39141
diff changeset
1168 if not roots:
f736fdbe546a remotephase: avoid full changelog iteration (issue5964)
Boris Feld <boris.feld@octobus.net>
parents: 39141
diff changeset
1169 return heads
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46644
diff changeset
1170 if not heads or heads == [repo.nullid]:
39146
f736fdbe546a remotephase: avoid full changelog iteration (issue5964)
Boris Feld <boris.feld@octobus.net>
parents: 39141
diff changeset
1171 return []
f736fdbe546a remotephase: avoid full changelog iteration (issue5964)
Boris Feld <boris.feld@octobus.net>
parents: 39141
diff changeset
1172 # The logic operated on revisions, convert arguments early for convenience
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46644
diff changeset
1173 new_heads = {rev(n) for n in heads if n != repo.nullid}
39146
f736fdbe546a remotephase: avoid full changelog iteration (issue5964)
Boris Feld <boris.feld@octobus.net>
parents: 39141
diff changeset
1174 roots = [rev(n) for n in roots]
f736fdbe546a remotephase: avoid full changelog iteration (issue5964)
Boris Feld <boris.feld@octobus.net>
parents: 39141
diff changeset
1175 # 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
1176 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
1177 # 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
1178 new_heads.difference_update(affected_zone)
f736fdbe546a remotephase: avoid full changelog iteration (issue5964)
Boris Feld <boris.feld@octobus.net>
parents: 39141
diff changeset
1179 # 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
1180 # They might be new heads
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40580
diff changeset
1181 candidates = repo.revs(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1182 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
1183 )
39146
f736fdbe546a remotephase: avoid full changelog iteration (issue5964)
Boris Feld <boris.feld@octobus.net>
parents: 39141
diff changeset
1184 candidates -= affected_zone
f736fdbe546a remotephase: avoid full changelog iteration (issue5964)
Boris Feld <boris.feld@octobus.net>
parents: 39141
diff changeset
1185 if new_heads or candidates:
f736fdbe546a remotephase: avoid full changelog iteration (issue5964)
Boris Feld <boris.feld@octobus.net>
parents: 39141
diff changeset
1186 # 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
1187 new_heads.update(candidates)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1188 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
1189 pruned = dagop.reachableroots(repo, candidates, prunestart)
f736fdbe546a remotephase: avoid full changelog iteration (issue5964)
Boris Feld <boris.feld@octobus.net>
parents: 39141
diff changeset
1190 new_heads.difference_update(pruned)
f736fdbe546a remotephase: avoid full changelog iteration (issue5964)
Boris Feld <boris.feld@octobus.net>
parents: 39141
diff changeset
1191
f736fdbe546a remotephase: avoid full changelog iteration (issue5964)
Boris Feld <boris.feld@octobus.net>
parents: 39141
diff changeset
1192 return pycompat.maplist(cl.node, 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
1193
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40580
diff changeset
1194
51287
f15cb5111a1e pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51285
diff changeset
1195 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
1196 """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
1197
308406677e9d phases: allow phase name in phases.new-commit settings
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 16025
diff changeset
1198 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
1199
308406677e9d phases: allow phase name in phases.new-commit settings
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 16025
diff changeset
1200 """
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1201 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
1202 try:
45117
b1e51ef4e536 phases: sparsify phase lists
Joerg Sonnenberger <joerg@bec.de>
parents: 45116
diff changeset
1203 return phasenumber2[v]
b1e51ef4e536 phases: sparsify phase lists
Joerg Sonnenberger <joerg@bec.de>
parents: 45116
diff changeset
1204 except KeyError:
b1e51ef4e536 phases: sparsify phase lists
Joerg Sonnenberger <joerg@bec.de>
parents: 45116
diff changeset
1205 raise error.ConfigError(
b1e51ef4e536 phases: sparsify phase lists
Joerg Sonnenberger <joerg@bec.de>
parents: 45116
diff changeset
1206 _(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
1207 )
16030
308406677e9d phases: allow phase name in phases.new-commit settings
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 16025
diff changeset
1208
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40580
diff changeset
1209
51287
f15cb5111a1e pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51285
diff changeset
1210 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
1211 """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
1212 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
1213
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40580
diff changeset
1214
51287
f15cb5111a1e pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51285
diff changeset
1215 def preparehookargs(
f15cb5111a1e pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51285
diff changeset
1216 node: bytes,
f15cb5111a1e pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51285
diff changeset
1217 old: Optional[int],
f15cb5111a1e pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51285
diff changeset
1218 new: Optional[int],
f15cb5111a1e pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51285
diff changeset
1219 ) -> Dict[bytes, bytes]:
34710
cdf833d7de98 phase: add a dedicated txnclose-phase hook
Boris Feld <boris.feld@octobus.net>
parents: 34563
diff changeset
1220 if old is None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1221 old = b''
34710
cdf833d7de98 phase: add a dedicated txnclose-phase hook
Boris Feld <boris.feld@octobus.net>
parents: 34563
diff changeset
1222 else:
34876
eb1b964b354b phases: pass phase names to hooks instead of internal values
Kevin Bullock <kbullock+mercurial@ringworld.org>
parents: 34819
diff changeset
1223 old = phasenames[old]
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1224 return {b'node': node, b'oldphase': old, b'phase': phasenames[new]}