Mercurial > public > mercurial-scm > hg
annotate mercurial/obsolete.py @ 32411:08d02c1d7e67
devel: use default-date config field when creating obsmarkers
Also use the default-date when creating obsmarkers. Currently they are created
with the current date and without any option to force their value.
To test the feature, we remove some of the many 'glob' used to match obsmarker
date in the tests.
author | Boris Feld <boris.feld@octobus.net> |
---|---|
date | Fri, 19 May 2017 12:08:47 +0200 |
parents | 655f1e2cfa5a |
children | 176d1a0ce385 |
rev | line source |
---|---|
17070
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
1 # obsolete.py - obsolete markers handling |
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
2 # |
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
3 # Copyright 2012 Pierre-Yves David <pierre-yves.david@ens-lyon.org> |
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
4 # Logilab SA <contact@logilab.fr> |
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
5 # |
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
6 # This software may be used and distributed according to the terms of the |
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
7 # GNU General Public License version 2 or any later version. |
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
8 |
21164
2efcef493aa2
obsolete: fix language and grammar in module docstring
Martin Geisler <martin@geisler.net>
parents:
21098
diff
changeset
|
9 """Obsolete marker handling |
17070
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
10 |
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
11 An obsolete marker maps an old changeset to a list of new |
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
12 changesets. If the list of new changesets is empty, the old changeset |
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
13 is said to be "killed". Otherwise, the old changeset is being |
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
14 "replaced" by the new changesets. |
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
15 |
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
16 Obsolete markers can be used to record and distribute changeset graph |
21164
2efcef493aa2
obsolete: fix language and grammar in module docstring
Martin Geisler <martin@geisler.net>
parents:
21098
diff
changeset
|
17 transformations performed by history rewrite operations, and help |
2efcef493aa2
obsolete: fix language and grammar in module docstring
Martin Geisler <martin@geisler.net>
parents:
21098
diff
changeset
|
18 building new tools to reconcile conflicting rewrite actions. To |
2efcef493aa2
obsolete: fix language and grammar in module docstring
Martin Geisler <martin@geisler.net>
parents:
21098
diff
changeset
|
19 facilitate conflict resolution, markers include various annotations |
17070
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
20 besides old and news changeset identifiers, such as creation date or |
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
21 author name. |
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
22 |
21164
2efcef493aa2
obsolete: fix language and grammar in module docstring
Martin Geisler <martin@geisler.net>
parents:
21098
diff
changeset
|
23 The old obsoleted changeset is called a "precursor" and possible |
2efcef493aa2
obsolete: fix language and grammar in module docstring
Martin Geisler <martin@geisler.net>
parents:
21098
diff
changeset
|
24 replacements are called "successors". Markers that used changeset X as |
2efcef493aa2
obsolete: fix language and grammar in module docstring
Martin Geisler <martin@geisler.net>
parents:
21098
diff
changeset
|
25 a precursor are called "successor markers of X" because they hold |
2efcef493aa2
obsolete: fix language and grammar in module docstring
Martin Geisler <martin@geisler.net>
parents:
21098
diff
changeset
|
26 information about the successors of X. Markers that use changeset Y as |
2efcef493aa2
obsolete: fix language and grammar in module docstring
Martin Geisler <martin@geisler.net>
parents:
21098
diff
changeset
|
27 a successors are call "precursor markers of Y" because they hold |
2efcef493aa2
obsolete: fix language and grammar in module docstring
Martin Geisler <martin@geisler.net>
parents:
21098
diff
changeset
|
28 information about the precursors of Y. |
17776
072812e9f570
obsolete: flip `obstore.successors` and `obsolete.precursors`
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17775
diff
changeset
|
29 |
17775
13744acc4ad7
obsolete: add example of marker usage in the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17774
diff
changeset
|
30 Examples: |
13744acc4ad7
obsolete: add example of marker usage in the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17774
diff
changeset
|
31 |
21164
2efcef493aa2
obsolete: fix language and grammar in module docstring
Martin Geisler <martin@geisler.net>
parents:
21098
diff
changeset
|
32 - When changeset A is replaced by changeset A', one marker is stored: |
17775
13744acc4ad7
obsolete: add example of marker usage in the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17774
diff
changeset
|
33 |
21166
bf2891877378
obsolete: fix one-element tuple in module docstring
Martin Geisler <martin@geisler.net>
parents:
21165
diff
changeset
|
34 (A, (A',)) |
17775
13744acc4ad7
obsolete: add example of marker usage in the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17774
diff
changeset
|
35 |
21164
2efcef493aa2
obsolete: fix language and grammar in module docstring
Martin Geisler <martin@geisler.net>
parents:
21098
diff
changeset
|
36 - When changesets A and B are folded into a new changeset C, two markers are |
17775
13744acc4ad7
obsolete: add example of marker usage in the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17774
diff
changeset
|
37 stored: |
13744acc4ad7
obsolete: add example of marker usage in the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17774
diff
changeset
|
38 |
13744acc4ad7
obsolete: add example of marker usage in the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17774
diff
changeset
|
39 (A, (C,)) and (B, (C,)) |
13744acc4ad7
obsolete: add example of marker usage in the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17774
diff
changeset
|
40 |
21164
2efcef493aa2
obsolete: fix language and grammar in module docstring
Martin Geisler <martin@geisler.net>
parents:
21098
diff
changeset
|
41 - When changeset A is simply "pruned" from the graph, a marker is created: |
17775
13744acc4ad7
obsolete: add example of marker usage in the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17774
diff
changeset
|
42 |
13744acc4ad7
obsolete: add example of marker usage in the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17774
diff
changeset
|
43 (A, ()) |
13744acc4ad7
obsolete: add example of marker usage in the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17774
diff
changeset
|
44 |
29894
02c150850e16
obsolete: fix minor module documentation issues
liscju <piotr.listkiewicz@gmail.com>
parents:
29389
diff
changeset
|
45 - When changeset A is split into B and C, a single marker is used: |
17775
13744acc4ad7
obsolete: add example of marker usage in the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17774
diff
changeset
|
46 |
29894
02c150850e16
obsolete: fix minor module documentation issues
liscju <piotr.listkiewicz@gmail.com>
parents:
29389
diff
changeset
|
47 (A, (B, C)) |
17775
13744acc4ad7
obsolete: add example of marker usage in the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17774
diff
changeset
|
48 |
21164
2efcef493aa2
obsolete: fix language and grammar in module docstring
Martin Geisler <martin@geisler.net>
parents:
21098
diff
changeset
|
49 We use a single marker to distinguish the "split" case from the "divergence" |
2efcef493aa2
obsolete: fix language and grammar in module docstring
Martin Geisler <martin@geisler.net>
parents:
21098
diff
changeset
|
50 case. If two independent operations rewrite the same changeset A in to A' and |
2efcef493aa2
obsolete: fix language and grammar in module docstring
Martin Geisler <martin@geisler.net>
parents:
21098
diff
changeset
|
51 A'', we have an error case: divergent rewriting. We can detect it because |
17775
13744acc4ad7
obsolete: add example of marker usage in the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17774
diff
changeset
|
52 two markers will be created independently: |
13744acc4ad7
obsolete: add example of marker usage in the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17774
diff
changeset
|
53 |
13744acc4ad7
obsolete: add example of marker usage in the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17774
diff
changeset
|
54 (A, (B,)) and (A, (C,)) |
17070
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
55 |
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
56 Format |
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
57 ------ |
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
58 |
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
59 Markers are stored in an append-only file stored in |
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
60 '.hg/store/obsstore'. |
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
61 |
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
62 The file starts with a version header: |
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
63 |
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
64 - 1 unsigned byte: version number, starting at zero. |
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
65 |
22612
fdfa40ee75cf
obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22507
diff
changeset
|
66 The header is followed by the markers. Marker format depend of the version. See |
fdfa40ee75cf
obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22507
diff
changeset
|
67 comment associated with each format for details. |
21164
2efcef493aa2
obsolete: fix language and grammar in module docstring
Martin Geisler <martin@geisler.net>
parents:
21098
diff
changeset
|
68 |
17070
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
69 """ |
27332
04f346b8768f
obsolete: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26684
diff
changeset
|
70 from __future__ import absolute_import |
04f346b8768f
obsolete: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26684
diff
changeset
|
71 |
04f346b8768f
obsolete: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26684
diff
changeset
|
72 import errno |
04f346b8768f
obsolete: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26684
diff
changeset
|
73 import struct |
04f346b8768f
obsolete: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26684
diff
changeset
|
74 |
04f346b8768f
obsolete: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26684
diff
changeset
|
75 from .i18n import _ |
04f346b8768f
obsolete: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26684
diff
changeset
|
76 from . import ( |
04f346b8768f
obsolete: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26684
diff
changeset
|
77 error, |
04f346b8768f
obsolete: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26684
diff
changeset
|
78 node, |
04f346b8768f
obsolete: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26684
diff
changeset
|
79 phases, |
32372
df448de7cf3b
parsers: switch to policy importer
Yuya Nishihara <yuya@tcha.org>
parents:
32354
diff
changeset
|
80 policy, |
27332
04f346b8768f
obsolete: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26684
diff
changeset
|
81 util, |
04f346b8768f
obsolete: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26684
diff
changeset
|
82 ) |
17070
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
83 |
32372
df448de7cf3b
parsers: switch to policy importer
Yuya Nishihara <yuya@tcha.org>
parents:
32354
diff
changeset
|
84 parsers = policy.importmod(r'parsers') |
df448de7cf3b
parsers: switch to policy importer
Yuya Nishihara <yuya@tcha.org>
parents:
32354
diff
changeset
|
85 |
17070
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
86 _pack = struct.pack |
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
87 _unpack = struct.unpack |
23498
ac910b1f5658
obsstore: prefetch struct.calcsize
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23497
diff
changeset
|
88 _calcsize = struct.calcsize |
24046
6e1d9f9932a9
obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents:
24045
diff
changeset
|
89 propertycache = util.propertycache |
17070
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
90 |
17424
e7cfe3587ea4
fix trivial spelling errors
Mads Kiilerich <mads@kiilerich.com>
parents:
17405
diff
changeset
|
91 # the obsolete feature is not mature enough to be enabled by default. |
17296
a1f8869f2eee
obsolete: introduce an `_enabled` switch to disable the feature by default
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17295
diff
changeset
|
92 # you have to rely on third party extension extension to enable this. |
a1f8869f2eee
obsolete: introduce an `_enabled` switch to disable the feature by default
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17295
diff
changeset
|
93 _enabled = False |
17070
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
94 |
22951
6c86c673dde6
obsolete: add createmarkers option
Durham Goode <durham@fb.com>
parents:
22950
diff
changeset
|
95 # Options for obsolescence |
6c86c673dde6
obsolete: add createmarkers option
Durham Goode <durham@fb.com>
parents:
22950
diff
changeset
|
96 createmarkersopt = 'createmarkers' |
22952
8792ac090e3b
obsolete: add allowunstable option
Durham Goode <durham@fb.com>
parents:
22951
diff
changeset
|
97 allowunstableopt = 'allowunstable' |
22953
b1d694d3975e
obsolete: add exchange option
Durham Goode <durham@fb.com>
parents:
22952
diff
changeset
|
98 exchangeopt = 'exchange' |
22951
6c86c673dde6
obsolete: add createmarkers option
Durham Goode <durham@fb.com>
parents:
22950
diff
changeset
|
99 |
32333
566cfe9cbbb9
obsolete: move the 'isenabled' function at the top of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32327
diff
changeset
|
100 def isenabled(repo, option): |
566cfe9cbbb9
obsolete: move the 'isenabled' function at the top of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32327
diff
changeset
|
101 """Returns True if the given repository has the given obsolete option |
566cfe9cbbb9
obsolete: move the 'isenabled' function at the top of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32327
diff
changeset
|
102 enabled. |
566cfe9cbbb9
obsolete: move the 'isenabled' function at the top of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32327
diff
changeset
|
103 """ |
566cfe9cbbb9
obsolete: move the 'isenabled' function at the top of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32327
diff
changeset
|
104 result = set(repo.ui.configlist('experimental', 'evolution')) |
566cfe9cbbb9
obsolete: move the 'isenabled' function at the top of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32327
diff
changeset
|
105 if 'all' in result: |
566cfe9cbbb9
obsolete: move the 'isenabled' function at the top of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32327
diff
changeset
|
106 return True |
566cfe9cbbb9
obsolete: move the 'isenabled' function at the top of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32327
diff
changeset
|
107 |
566cfe9cbbb9
obsolete: move the 'isenabled' function at the top of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32327
diff
changeset
|
108 # For migration purposes, temporarily return true if the config hasn't been |
566cfe9cbbb9
obsolete: move the 'isenabled' function at the top of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32327
diff
changeset
|
109 # set but _enabled is true. |
566cfe9cbbb9
obsolete: move the 'isenabled' function at the top of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32327
diff
changeset
|
110 if len(result) == 0 and _enabled: |
566cfe9cbbb9
obsolete: move the 'isenabled' function at the top of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32327
diff
changeset
|
111 return True |
566cfe9cbbb9
obsolete: move the 'isenabled' function at the top of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32327
diff
changeset
|
112 |
566cfe9cbbb9
obsolete: move the 'isenabled' function at the top of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32327
diff
changeset
|
113 # createmarkers must be enabled if other options are enabled |
566cfe9cbbb9
obsolete: move the 'isenabled' function at the top of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32327
diff
changeset
|
114 if ((allowunstableopt in result or exchangeopt in result) and |
566cfe9cbbb9
obsolete: move the 'isenabled' function at the top of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32327
diff
changeset
|
115 not createmarkersopt in result): |
566cfe9cbbb9
obsolete: move the 'isenabled' function at the top of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32327
diff
changeset
|
116 raise error.Abort(_("'createmarkers' obsolete option must be enabled " |
566cfe9cbbb9
obsolete: move the 'isenabled' function at the top of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32327
diff
changeset
|
117 "if other obsolete options are enabled")) |
566cfe9cbbb9
obsolete: move the 'isenabled' function at the top of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32327
diff
changeset
|
118 |
566cfe9cbbb9
obsolete: move the 'isenabled' function at the top of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32327
diff
changeset
|
119 return option in result |
566cfe9cbbb9
obsolete: move the 'isenabled' function at the top of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32327
diff
changeset
|
120 |
17831
70b08df24fef
obsolete: add a flag that allows fixing "bumped" changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17828
diff
changeset
|
121 ### obsolescence marker flag |
70b08df24fef
obsolete: add a flag that allows fixing "bumped" changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17828
diff
changeset
|
122 |
70b08df24fef
obsolete: add a flag that allows fixing "bumped" changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17828
diff
changeset
|
123 ## bumpedfix flag |
70b08df24fef
obsolete: add a flag that allows fixing "bumped" changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17828
diff
changeset
|
124 # |
70b08df24fef
obsolete: add a flag that allows fixing "bumped" changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17828
diff
changeset
|
125 # When a changeset A' succeed to a changeset A which became public, we call A' |
70b08df24fef
obsolete: add a flag that allows fixing "bumped" changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17828
diff
changeset
|
126 # "bumped" because it's a successors of a public changesets |
70b08df24fef
obsolete: add a flag that allows fixing "bumped" changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17828
diff
changeset
|
127 # |
70b08df24fef
obsolete: add a flag that allows fixing "bumped" changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17828
diff
changeset
|
128 # o A' (bumped) |
70b08df24fef
obsolete: add a flag that allows fixing "bumped" changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17828
diff
changeset
|
129 # |`: |
70b08df24fef
obsolete: add a flag that allows fixing "bumped" changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17828
diff
changeset
|
130 # | o A |
70b08df24fef
obsolete: add a flag that allows fixing "bumped" changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17828
diff
changeset
|
131 # |/ |
70b08df24fef
obsolete: add a flag that allows fixing "bumped" changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17828
diff
changeset
|
132 # o Z |
70b08df24fef
obsolete: add a flag that allows fixing "bumped" changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17828
diff
changeset
|
133 # |
70b08df24fef
obsolete: add a flag that allows fixing "bumped" changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17828
diff
changeset
|
134 # The way to solve this situation is to create a new changeset Ad as children |
70b08df24fef
obsolete: add a flag that allows fixing "bumped" changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17828
diff
changeset
|
135 # of A. This changeset have the same content than A'. So the diff from A to A' |
70b08df24fef
obsolete: add a flag that allows fixing "bumped" changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17828
diff
changeset
|
136 # is the same than the diff from A to Ad. Ad is marked as a successors of A' |
70b08df24fef
obsolete: add a flag that allows fixing "bumped" changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17828
diff
changeset
|
137 # |
70b08df24fef
obsolete: add a flag that allows fixing "bumped" changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17828
diff
changeset
|
138 # o Ad |
70b08df24fef
obsolete: add a flag that allows fixing "bumped" changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17828
diff
changeset
|
139 # |`: |
70b08df24fef
obsolete: add a flag that allows fixing "bumped" changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17828
diff
changeset
|
140 # | x A' |
70b08df24fef
obsolete: add a flag that allows fixing "bumped" changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17828
diff
changeset
|
141 # |'| |
70b08df24fef
obsolete: add a flag that allows fixing "bumped" changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17828
diff
changeset
|
142 # o | A |
70b08df24fef
obsolete: add a flag that allows fixing "bumped" changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17828
diff
changeset
|
143 # |/ |
70b08df24fef
obsolete: add a flag that allows fixing "bumped" changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17828
diff
changeset
|
144 # o Z |
70b08df24fef
obsolete: add a flag that allows fixing "bumped" changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17828
diff
changeset
|
145 # |
70b08df24fef
obsolete: add a flag that allows fixing "bumped" changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17828
diff
changeset
|
146 # But by transitivity Ad is also a successors of A. To avoid having Ad marked |
70b08df24fef
obsolete: add a flag that allows fixing "bumped" changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17828
diff
changeset
|
147 # as bumped too, we add the `bumpedfix` flag to the marker. <A', (Ad,)>. |
18644
3e92772d5383
spelling: fix some minor issues found by spell checker
Mads Kiilerich <mads@kiilerich.com>
parents:
18365
diff
changeset
|
148 # This flag mean that the successors express the changes between the public and |
3e92772d5383
spelling: fix some minor issues found by spell checker
Mads Kiilerich <mads@kiilerich.com>
parents:
18365
diff
changeset
|
149 # bumped version and fix the situation, breaking the transitivity of |
3e92772d5383
spelling: fix some minor issues found by spell checker
Mads Kiilerich <mads@kiilerich.com>
parents:
18365
diff
changeset
|
150 # "bumped" here. |
17831
70b08df24fef
obsolete: add a flag that allows fixing "bumped" changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17828
diff
changeset
|
151 bumpedfix = 1 |
22850
b078e4dc9f9a
obsstore: add a flag for sha256 hashes
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22849
diff
changeset
|
152 usingsha256 = 2 |
17831
70b08df24fef
obsolete: add a flag that allows fixing "bumped" changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17828
diff
changeset
|
153 |
22612
fdfa40ee75cf
obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22507
diff
changeset
|
154 ## Parsing and writing of version "0" |
fdfa40ee75cf
obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22507
diff
changeset
|
155 # |
fdfa40ee75cf
obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22507
diff
changeset
|
156 # The header is followed by the markers. Each marker is made of: |
fdfa40ee75cf
obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22507
diff
changeset
|
157 # |
22849
fd759142c6e5
obsolete: use uint## in the format documention
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22848
diff
changeset
|
158 # - 1 uint8 : number of new changesets "N", can be zero. |
22612
fdfa40ee75cf
obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22507
diff
changeset
|
159 # |
22849
fd759142c6e5
obsolete: use uint## in the format documention
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22848
diff
changeset
|
160 # - 1 uint32: metadata size "M" in bytes. |
22612
fdfa40ee75cf
obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22507
diff
changeset
|
161 # |
fdfa40ee75cf
obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22507
diff
changeset
|
162 # - 1 byte: a bit field. It is reserved for flags used in common |
fdfa40ee75cf
obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22507
diff
changeset
|
163 # obsolete marker operations, to avoid repeated decoding of metadata |
fdfa40ee75cf
obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22507
diff
changeset
|
164 # entries. |
fdfa40ee75cf
obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22507
diff
changeset
|
165 # |
fdfa40ee75cf
obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22507
diff
changeset
|
166 # - 20 bytes: obsoleted changeset identifier. |
fdfa40ee75cf
obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22507
diff
changeset
|
167 # |
fdfa40ee75cf
obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22507
diff
changeset
|
168 # - N*20 bytes: new changesets identifiers. |
fdfa40ee75cf
obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22507
diff
changeset
|
169 # |
fdfa40ee75cf
obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22507
diff
changeset
|
170 # - M bytes: metadata as a sequence of nul-terminated strings. Each |
fdfa40ee75cf
obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22507
diff
changeset
|
171 # string contains a key and a value, separated by a colon ':', without |
fdfa40ee75cf
obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22507
diff
changeset
|
172 # additional encoding. Keys cannot contain '\0' or ':' and values |
fdfa40ee75cf
obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22507
diff
changeset
|
173 # cannot contain '\0'. |
fdfa40ee75cf
obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22507
diff
changeset
|
174 _fm0version = 0 |
fdfa40ee75cf
obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22507
diff
changeset
|
175 _fm0fixed = '>BIB20s' |
fdfa40ee75cf
obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22507
diff
changeset
|
176 _fm0node = '20s' |
23498
ac910b1f5658
obsstore: prefetch struct.calcsize
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23497
diff
changeset
|
177 _fm0fsize = _calcsize(_fm0fixed) |
ac910b1f5658
obsstore: prefetch struct.calcsize
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23497
diff
changeset
|
178 _fm0fnodesize = _calcsize(_fm0node) |
22334
f2c3cfc30e9c
obsolete: move _encodemarkers next to _readmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22333
diff
changeset
|
179 |
24014
7d9367de2654
obsolete: make optional offset parameter to fm*readmarkers required
Augie Fackler <augie@google.com>
parents:
23973
diff
changeset
|
180 def _fm0readmarkers(data, off): |
17070
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
181 # Loop on markers |
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
182 l = len(data) |
22327
f737631a9f0a
obsolete: rename all _fm to _fm0
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22326
diff
changeset
|
183 while off + _fm0fsize <= l: |
17070
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
184 # read fixed part |
22327
f737631a9f0a
obsolete: rename all _fm to _fm0
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22326
diff
changeset
|
185 cur = data[off:off + _fm0fsize] |
f737631a9f0a
obsolete: rename all _fm to _fm0
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22326
diff
changeset
|
186 off += _fm0fsize |
22685
753515d9e274
obsolete: replace "nb" notation with "num" (for "number")
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22614
diff
changeset
|
187 numsuc, mdsize, flags, pre = _unpack(_fm0fixed, cur) |
17070
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
188 # read replacement |
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
189 sucs = () |
22685
753515d9e274
obsolete: replace "nb" notation with "num" (for "number")
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22614
diff
changeset
|
190 if numsuc: |
753515d9e274
obsolete: replace "nb" notation with "num" (for "number")
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22614
diff
changeset
|
191 s = (_fm0fnodesize * numsuc) |
17070
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
192 cur = data[off:off + s] |
22685
753515d9e274
obsolete: replace "nb" notation with "num" (for "number")
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22614
diff
changeset
|
193 sucs = _unpack(_fm0node * numsuc, cur) |
17070
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
194 off += s |
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
195 # read metadata |
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
196 # (metadata will be decoded on demand) |
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
197 metadata = data[off:off + mdsize] |
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
198 if len(metadata) != mdsize: |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26310
diff
changeset
|
199 raise error.Abort(_('parsing obsolete marker: metadata is too ' |
17070
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
200 'short, %d bytes expected, got %d') |
17253
67f56ff5afcd
obsolete: fix decoding error message arguments
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17220
diff
changeset
|
201 % (mdsize, len(metadata))) |
17070
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
202 off += mdsize |
22847
37460ee2003c
obsolete: _rename decodemeta to _fm0decodemeta
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22846
diff
changeset
|
203 metadata = _fm0decodemeta(metadata) |
22222
883e8b6bd461
obsmarker: add `date` as an explicit field
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22221
diff
changeset
|
204 try: |
22845
ef880e28e56a
obsolete: store metadata as a tuple of (key, value) pairs (API)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22685
diff
changeset
|
205 when, offset = metadata.pop('date', '0 0').split(' ') |
22309
a65697c3f20e
obsolete: avoid slow, generic date parsing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
22274
diff
changeset
|
206 date = float(when), int(offset) |
a65697c3f20e
obsolete: avoid slow, generic date parsing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
22274
diff
changeset
|
207 except ValueError: |
22222
883e8b6bd461
obsmarker: add `date` as an explicit field
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22221
diff
changeset
|
208 date = (0., 0) |
22258
cf414981978a
obsstore: also store the 'parents' field on disk
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22257
diff
changeset
|
209 parents = None |
22845
ef880e28e56a
obsolete: store metadata as a tuple of (key, value) pairs (API)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22685
diff
changeset
|
210 if 'p2' in metadata: |
ef880e28e56a
obsolete: store metadata as a tuple of (key, value) pairs (API)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22685
diff
changeset
|
211 parents = (metadata.pop('p1', None), metadata.pop('p2', None)) |
ef880e28e56a
obsolete: store metadata as a tuple of (key, value) pairs (API)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22685
diff
changeset
|
212 elif 'p1' in metadata: |
ef880e28e56a
obsolete: store metadata as a tuple of (key, value) pairs (API)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22685
diff
changeset
|
213 parents = (metadata.pop('p1', None),) |
ef880e28e56a
obsolete: store metadata as a tuple of (key, value) pairs (API)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22685
diff
changeset
|
214 elif 'p0' in metadata: |
22258
cf414981978a
obsstore: also store the 'parents' field on disk
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22257
diff
changeset
|
215 parents = () |
cf414981978a
obsstore: also store the 'parents' field on disk
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22257
diff
changeset
|
216 if parents is not None: |
cf414981978a
obsstore: also store the 'parents' field on disk
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22257
diff
changeset
|
217 try: |
cf414981978a
obsstore: also store the 'parents' field on disk
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22257
diff
changeset
|
218 parents = tuple(node.bin(p) for p in parents) |
cf414981978a
obsstore: also store the 'parents' field on disk
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22257
diff
changeset
|
219 # if parent content is not a nodeid, drop the data |
cf414981978a
obsstore: also store the 'parents' field on disk
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22257
diff
changeset
|
220 for p in parents: |
cf414981978a
obsstore: also store the 'parents' field on disk
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22257
diff
changeset
|
221 if len(p) != 20: |
cf414981978a
obsstore: also store the 'parents' field on disk
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22257
diff
changeset
|
222 parents = None |
cf414981978a
obsstore: also store the 'parents' field on disk
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22257
diff
changeset
|
223 break |
cf414981978a
obsstore: also store the 'parents' field on disk
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22257
diff
changeset
|
224 except TypeError: |
cf414981978a
obsstore: also store the 'parents' field on disk
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22257
diff
changeset
|
225 # if content cannot be translated to nodeid drop the data. |
cf414981978a
obsstore: also store the 'parents' field on disk
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22257
diff
changeset
|
226 parents = None |
cf414981978a
obsstore: also store the 'parents' field on disk
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22257
diff
changeset
|
227 |
22845
ef880e28e56a
obsolete: store metadata as a tuple of (key, value) pairs (API)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22685
diff
changeset
|
228 metadata = tuple(sorted(metadata.iteritems())) |
22222
883e8b6bd461
obsmarker: add `date` as an explicit field
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22221
diff
changeset
|
229 |
22258
cf414981978a
obsstore: also store the 'parents' field on disk
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22257
diff
changeset
|
230 yield (pre, sucs, flags, metadata, date, parents) |
17070
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
231 |
22330
e74f8a65252d
obsolete: move _fm0encodeonemarker next to _fm0readmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22329
diff
changeset
|
232 def _fm0encodeonemarker(marker): |
e74f8a65252d
obsolete: move _fm0encodeonemarker next to _fm0readmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22329
diff
changeset
|
233 pre, sucs, flags, metadata, date, parents = marker |
22850
b078e4dc9f9a
obsstore: add a flag for sha256 hashes
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22849
diff
changeset
|
234 if flags & usingsha256: |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26310
diff
changeset
|
235 raise error.Abort(_('cannot handle sha256 with old obsstore format')) |
22845
ef880e28e56a
obsolete: store metadata as a tuple of (key, value) pairs (API)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22685
diff
changeset
|
236 metadata = dict(metadata) |
23002
2920a96f5839
obsstore: record data as floating point in fm0 format
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22954
diff
changeset
|
237 time, tz = date |
2920a96f5839
obsstore: record data as floating point in fm0 format
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22954
diff
changeset
|
238 metadata['date'] = '%r %i' % (time, tz) |
22330
e74f8a65252d
obsolete: move _fm0encodeonemarker next to _fm0readmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22329
diff
changeset
|
239 if parents is not None: |
e74f8a65252d
obsolete: move _fm0encodeonemarker next to _fm0readmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22329
diff
changeset
|
240 if not parents: |
e74f8a65252d
obsolete: move _fm0encodeonemarker next to _fm0readmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22329
diff
changeset
|
241 # mark that we explicitly recorded no parents |
e74f8a65252d
obsolete: move _fm0encodeonemarker next to _fm0readmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22329
diff
changeset
|
242 metadata['p0'] = '' |
32278
7c3ef55dedbe
obsolete: use 2 argument form of enumerate()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32201
diff
changeset
|
243 for i, p in enumerate(parents, 1): |
7c3ef55dedbe
obsolete: use 2 argument form of enumerate()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32201
diff
changeset
|
244 metadata['p%i' % i] = node.hex(p) |
22846
b1efc4893da4
obsolete: _rename encodemeta to _fm0encodemeta
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22845
diff
changeset
|
245 metadata = _fm0encodemeta(metadata) |
22685
753515d9e274
obsolete: replace "nb" notation with "num" (for "number")
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22614
diff
changeset
|
246 numsuc = len(sucs) |
753515d9e274
obsolete: replace "nb" notation with "num" (for "number")
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22614
diff
changeset
|
247 format = _fm0fixed + (_fm0node * numsuc) |
753515d9e274
obsolete: replace "nb" notation with "num" (for "number")
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22614
diff
changeset
|
248 data = [numsuc, len(metadata), flags, pre] |
22330
e74f8a65252d
obsolete: move _fm0encodeonemarker next to _fm0readmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22329
diff
changeset
|
249 data.extend(sucs) |
e74f8a65252d
obsolete: move _fm0encodeonemarker next to _fm0readmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22329
diff
changeset
|
250 return _pack(format, *data) + metadata |
e74f8a65252d
obsolete: move _fm0encodeonemarker next to _fm0readmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22329
diff
changeset
|
251 |
22848
72100c1d53d4
obsolete: gather _fm0 meta encoding with other _fm0 code
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22847
diff
changeset
|
252 def _fm0encodemeta(meta): |
72100c1d53d4
obsolete: gather _fm0 meta encoding with other _fm0 code
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22847
diff
changeset
|
253 """Return encoded metadata string to string mapping. |
72100c1d53d4
obsolete: gather _fm0 meta encoding with other _fm0 code
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22847
diff
changeset
|
254 |
72100c1d53d4
obsolete: gather _fm0 meta encoding with other _fm0 code
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22847
diff
changeset
|
255 Assume no ':' in key and no '\0' in both key and value.""" |
72100c1d53d4
obsolete: gather _fm0 meta encoding with other _fm0 code
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22847
diff
changeset
|
256 for key, value in meta.iteritems(): |
72100c1d53d4
obsolete: gather _fm0 meta encoding with other _fm0 code
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22847
diff
changeset
|
257 if ':' in key or '\0' in key: |
72100c1d53d4
obsolete: gather _fm0 meta encoding with other _fm0 code
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22847
diff
changeset
|
258 raise ValueError("':' and '\0' are forbidden in metadata key'") |
72100c1d53d4
obsolete: gather _fm0 meta encoding with other _fm0 code
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22847
diff
changeset
|
259 if '\0' in value: |
72100c1d53d4
obsolete: gather _fm0 meta encoding with other _fm0 code
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22847
diff
changeset
|
260 raise ValueError("':' is forbidden in metadata value'") |
72100c1d53d4
obsolete: gather _fm0 meta encoding with other _fm0 code
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22847
diff
changeset
|
261 return '\0'.join(['%s:%s' % (k, meta[k]) for k in sorted(meta)]) |
72100c1d53d4
obsolete: gather _fm0 meta encoding with other _fm0 code
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22847
diff
changeset
|
262 |
72100c1d53d4
obsolete: gather _fm0 meta encoding with other _fm0 code
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22847
diff
changeset
|
263 def _fm0decodemeta(data): |
72100c1d53d4
obsolete: gather _fm0 meta encoding with other _fm0 code
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22847
diff
changeset
|
264 """Return string to string dictionary from encoded version.""" |
72100c1d53d4
obsolete: gather _fm0 meta encoding with other _fm0 code
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22847
diff
changeset
|
265 d = {} |
72100c1d53d4
obsolete: gather _fm0 meta encoding with other _fm0 code
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22847
diff
changeset
|
266 for l in data.split('\0'): |
72100c1d53d4
obsolete: gather _fm0 meta encoding with other _fm0 code
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22847
diff
changeset
|
267 if l: |
72100c1d53d4
obsolete: gather _fm0 meta encoding with other _fm0 code
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22847
diff
changeset
|
268 key, value = l.split(':') |
72100c1d53d4
obsolete: gather _fm0 meta encoding with other _fm0 code
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22847
diff
changeset
|
269 d[key] = value |
72100c1d53d4
obsolete: gather _fm0 meta encoding with other _fm0 code
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22847
diff
changeset
|
270 return d |
72100c1d53d4
obsolete: gather _fm0 meta encoding with other _fm0 code
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22847
diff
changeset
|
271 |
22851
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
272 ## Parsing and writing of version "1" |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
273 # |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
274 # The header is followed by the markers. Each marker is made of: |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
275 # |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
276 # - uint32: total size of the marker (including this field) |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
277 # |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
278 # - float64: date in seconds since epoch |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
279 # |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
280 # - int16: timezone offset in minutes |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
281 # |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
282 # - uint16: a bit field. It is reserved for flags used in common |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
283 # obsolete marker operations, to avoid repeated decoding of metadata |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
284 # entries. |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
285 # |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
286 # - uint8: number of successors "N", can be zero. |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
287 # |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
288 # - uint8: number of parents "P", can be zero. |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
289 # |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
290 # 0: parents data stored but no parent, |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
291 # 1: one parent stored, |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
292 # 2: two parents stored, |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
293 # 3: no parent data stored |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
294 # |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
295 # - uint8: number of metadata entries M |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
296 # |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
297 # - 20 or 32 bytes: precursor changeset identifier. |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
298 # |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
299 # - N*(20 or 32) bytes: successors changesets identifiers. |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
300 # |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
301 # - P*(20 or 32) bytes: parents of the precursors changesets. |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
302 # |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
303 # - M*(uint8, uint8): size of all metadata entries (key and value) |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
304 # |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
305 # - remaining bytes: the metadata, each (key, value) pair after the other. |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
306 _fm1version = 1 |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
307 _fm1fixed = '>IdhHBBB20s' |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
308 _fm1nodesha1 = '20s' |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
309 _fm1nodesha256 = '32s' |
23499
b46876c94a93
obsstore: cache size computation for fm1 node
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23498
diff
changeset
|
310 _fm1nodesha1size = _calcsize(_fm1nodesha1) |
b46876c94a93
obsstore: cache size computation for fm1 node
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23498
diff
changeset
|
311 _fm1nodesha256size = _calcsize(_fm1nodesha256) |
23498
ac910b1f5658
obsstore: prefetch struct.calcsize
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23497
diff
changeset
|
312 _fm1fsize = _calcsize(_fm1fixed) |
22851
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
313 _fm1parentnone = 3 |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
314 _fm1parentshift = 14 |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
315 _fm1parentmask = (_fm1parentnone << _fm1parentshift) |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
316 _fm1metapair = 'BB' |
23498
ac910b1f5658
obsstore: prefetch struct.calcsize
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23497
diff
changeset
|
317 _fm1metapairsize = _calcsize('BB') |
22851
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
318 |
24019
26fbf07482b2
_fm1readmarkers: generate list in C
Martin von Zweigbergk <martinvonz@google.com>
parents:
24018
diff
changeset
|
319 def _fm1purereadmarkers(data, off): |
23803
2763edaba857
readmarkers: promote global constants to locals for performance
Matt Mackall <mpm@selenic.com>
parents:
23802
diff
changeset
|
320 # make some global constants local for performance |
2763edaba857
readmarkers: promote global constants to locals for performance
Matt Mackall <mpm@selenic.com>
parents:
23802
diff
changeset
|
321 noneflag = _fm1parentnone |
2763edaba857
readmarkers: promote global constants to locals for performance
Matt Mackall <mpm@selenic.com>
parents:
23802
diff
changeset
|
322 sha2flag = usingsha256 |
2763edaba857
readmarkers: promote global constants to locals for performance
Matt Mackall <mpm@selenic.com>
parents:
23802
diff
changeset
|
323 sha1size = _fm1nodesha1size |
2763edaba857
readmarkers: promote global constants to locals for performance
Matt Mackall <mpm@selenic.com>
parents:
23802
diff
changeset
|
324 sha2size = _fm1nodesha256size |
2763edaba857
readmarkers: promote global constants to locals for performance
Matt Mackall <mpm@selenic.com>
parents:
23802
diff
changeset
|
325 sha1fmt = _fm1nodesha1 |
2763edaba857
readmarkers: promote global constants to locals for performance
Matt Mackall <mpm@selenic.com>
parents:
23802
diff
changeset
|
326 sha2fmt = _fm1nodesha256 |
2763edaba857
readmarkers: promote global constants to locals for performance
Matt Mackall <mpm@selenic.com>
parents:
23802
diff
changeset
|
327 metasize = _fm1metapairsize |
2763edaba857
readmarkers: promote global constants to locals for performance
Matt Mackall <mpm@selenic.com>
parents:
23802
diff
changeset
|
328 metafmt = _fm1metapair |
2763edaba857
readmarkers: promote global constants to locals for performance
Matt Mackall <mpm@selenic.com>
parents:
23802
diff
changeset
|
329 fsize = _fm1fsize |
2763edaba857
readmarkers: promote global constants to locals for performance
Matt Mackall <mpm@selenic.com>
parents:
23802
diff
changeset
|
330 unpack = _unpack |
2763edaba857
readmarkers: promote global constants to locals for performance
Matt Mackall <mpm@selenic.com>
parents:
23802
diff
changeset
|
331 |
22851
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
332 # Loop on markers |
23799
ffca0a14b566
readmarkers: hoist subtraction out of loop comparison
Matt Mackall <mpm@selenic.com>
parents:
23798
diff
changeset
|
333 stop = len(data) - _fm1fsize |
25211
22f4ce49044d
util: drop the 'unpacker' helper
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25149
diff
changeset
|
334 ufixed = struct.Struct(_fm1fixed).unpack |
24018
26d6a6a78c1d
obsolete: use parsers.fm1readmarker if it exists for a ~38% perf win
Augie Fackler <augie@google.com>
parents:
24014
diff
changeset
|
335 |
23799
ffca0a14b566
readmarkers: hoist subtraction out of loop comparison
Matt Mackall <mpm@selenic.com>
parents:
23798
diff
changeset
|
336 while off <= stop: |
22851
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
337 # read fixed part |
23803
2763edaba857
readmarkers: promote global constants to locals for performance
Matt Mackall <mpm@selenic.com>
parents:
23802
diff
changeset
|
338 o1 = off + fsize |
23800
83f361a21d31
readmarkers: drop a temporary
Matt Mackall <mpm@selenic.com>
parents:
23799
diff
changeset
|
339 t, secs, tz, flags, numsuc, numpar, nummeta, prec = ufixed(data[off:o1]) |
23792
db3bc2bcb689
readmarkers: add some whitespace
Matt Mackall <mpm@selenic.com>
parents:
23791
diff
changeset
|
340 |
23803
2763edaba857
readmarkers: promote global constants to locals for performance
Matt Mackall <mpm@selenic.com>
parents:
23802
diff
changeset
|
341 if flags & sha2flag: |
23805
345042e024dc
readmarkers: add a SHA256 fixme note
Matt Mackall <mpm@selenic.com>
parents:
23804
diff
changeset
|
342 # FIXME: prec was read as a SHA1, needs to be amended |
345042e024dc
readmarkers: add a SHA256 fixme note
Matt Mackall <mpm@selenic.com>
parents:
23804
diff
changeset
|
343 |
23801
20b5701cd90a
readmarkers: read node reading into node length conditional
Matt Mackall <mpm@selenic.com>
parents:
23800
diff
changeset
|
344 # read 0 or more successors |
23804
e880036719e3
readmarkers: fast-path single successors and parents
Matt Mackall <mpm@selenic.com>
parents:
23803
diff
changeset
|
345 if numsuc == 1: |
e880036719e3
readmarkers: fast-path single successors and parents
Matt Mackall <mpm@selenic.com>
parents:
23803
diff
changeset
|
346 o2 = o1 + sha2size |
e880036719e3
readmarkers: fast-path single successors and parents
Matt Mackall <mpm@selenic.com>
parents:
23803
diff
changeset
|
347 sucs = (data[o1:o2],) |
e880036719e3
readmarkers: fast-path single successors and parents
Matt Mackall <mpm@selenic.com>
parents:
23803
diff
changeset
|
348 else: |
e880036719e3
readmarkers: fast-path single successors and parents
Matt Mackall <mpm@selenic.com>
parents:
23803
diff
changeset
|
349 o2 = o1 + sha2size * numsuc |
e880036719e3
readmarkers: fast-path single successors and parents
Matt Mackall <mpm@selenic.com>
parents:
23803
diff
changeset
|
350 sucs = unpack(sha2fmt * numsuc, data[o1:o2]) |
23792
db3bc2bcb689
readmarkers: add some whitespace
Matt Mackall <mpm@selenic.com>
parents:
23791
diff
changeset
|
351 |
23801
20b5701cd90a
readmarkers: read node reading into node length conditional
Matt Mackall <mpm@selenic.com>
parents:
23800
diff
changeset
|
352 # read parents |
23803
2763edaba857
readmarkers: promote global constants to locals for performance
Matt Mackall <mpm@selenic.com>
parents:
23802
diff
changeset
|
353 if numpar == noneflag: |
23801
20b5701cd90a
readmarkers: read node reading into node length conditional
Matt Mackall <mpm@selenic.com>
parents:
23800
diff
changeset
|
354 o3 = o2 |
20b5701cd90a
readmarkers: read node reading into node length conditional
Matt Mackall <mpm@selenic.com>
parents:
23800
diff
changeset
|
355 parents = None |
23804
e880036719e3
readmarkers: fast-path single successors and parents
Matt Mackall <mpm@selenic.com>
parents:
23803
diff
changeset
|
356 elif numpar == 1: |
e880036719e3
readmarkers: fast-path single successors and parents
Matt Mackall <mpm@selenic.com>
parents:
23803
diff
changeset
|
357 o3 = o2 + sha2size |
e880036719e3
readmarkers: fast-path single successors and parents
Matt Mackall <mpm@selenic.com>
parents:
23803
diff
changeset
|
358 parents = (data[o2:o3],) |
23801
20b5701cd90a
readmarkers: read node reading into node length conditional
Matt Mackall <mpm@selenic.com>
parents:
23800
diff
changeset
|
359 else: |
23803
2763edaba857
readmarkers: promote global constants to locals for performance
Matt Mackall <mpm@selenic.com>
parents:
23802
diff
changeset
|
360 o3 = o2 + sha2size * numpar |
2763edaba857
readmarkers: promote global constants to locals for performance
Matt Mackall <mpm@selenic.com>
parents:
23802
diff
changeset
|
361 parents = unpack(sha2fmt * numpar, data[o2:o3]) |
23801
20b5701cd90a
readmarkers: read node reading into node length conditional
Matt Mackall <mpm@selenic.com>
parents:
23800
diff
changeset
|
362 else: |
20b5701cd90a
readmarkers: read node reading into node length conditional
Matt Mackall <mpm@selenic.com>
parents:
23800
diff
changeset
|
363 # read 0 or more successors |
23804
e880036719e3
readmarkers: fast-path single successors and parents
Matt Mackall <mpm@selenic.com>
parents:
23803
diff
changeset
|
364 if numsuc == 1: |
e880036719e3
readmarkers: fast-path single successors and parents
Matt Mackall <mpm@selenic.com>
parents:
23803
diff
changeset
|
365 o2 = o1 + sha1size |
e880036719e3
readmarkers: fast-path single successors and parents
Matt Mackall <mpm@selenic.com>
parents:
23803
diff
changeset
|
366 sucs = (data[o1:o2],) |
e880036719e3
readmarkers: fast-path single successors and parents
Matt Mackall <mpm@selenic.com>
parents:
23803
diff
changeset
|
367 else: |
e880036719e3
readmarkers: fast-path single successors and parents
Matt Mackall <mpm@selenic.com>
parents:
23803
diff
changeset
|
368 o2 = o1 + sha1size * numsuc |
e880036719e3
readmarkers: fast-path single successors and parents
Matt Mackall <mpm@selenic.com>
parents:
23803
diff
changeset
|
369 sucs = unpack(sha1fmt * numsuc, data[o1:o2]) |
23792
db3bc2bcb689
readmarkers: add some whitespace
Matt Mackall <mpm@selenic.com>
parents:
23791
diff
changeset
|
370 |
23801
20b5701cd90a
readmarkers: read node reading into node length conditional
Matt Mackall <mpm@selenic.com>
parents:
23800
diff
changeset
|
371 # read parents |
23803
2763edaba857
readmarkers: promote global constants to locals for performance
Matt Mackall <mpm@selenic.com>
parents:
23802
diff
changeset
|
372 if numpar == noneflag: |
23801
20b5701cd90a
readmarkers: read node reading into node length conditional
Matt Mackall <mpm@selenic.com>
parents:
23800
diff
changeset
|
373 o3 = o2 |
20b5701cd90a
readmarkers: read node reading into node length conditional
Matt Mackall <mpm@selenic.com>
parents:
23800
diff
changeset
|
374 parents = None |
23804
e880036719e3
readmarkers: fast-path single successors and parents
Matt Mackall <mpm@selenic.com>
parents:
23803
diff
changeset
|
375 elif numpar == 1: |
e880036719e3
readmarkers: fast-path single successors and parents
Matt Mackall <mpm@selenic.com>
parents:
23803
diff
changeset
|
376 o3 = o2 + sha1size |
e880036719e3
readmarkers: fast-path single successors and parents
Matt Mackall <mpm@selenic.com>
parents:
23803
diff
changeset
|
377 parents = (data[o2:o3],) |
23801
20b5701cd90a
readmarkers: read node reading into node length conditional
Matt Mackall <mpm@selenic.com>
parents:
23800
diff
changeset
|
378 else: |
23803
2763edaba857
readmarkers: promote global constants to locals for performance
Matt Mackall <mpm@selenic.com>
parents:
23802
diff
changeset
|
379 o3 = o2 + sha1size * numpar |
2763edaba857
readmarkers: promote global constants to locals for performance
Matt Mackall <mpm@selenic.com>
parents:
23802
diff
changeset
|
380 parents = unpack(sha1fmt * numpar, data[o2:o3]) |
23792
db3bc2bcb689
readmarkers: add some whitespace
Matt Mackall <mpm@selenic.com>
parents:
23791
diff
changeset
|
381 |
22851
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
382 # read metadata |
23803
2763edaba857
readmarkers: promote global constants to locals for performance
Matt Mackall <mpm@selenic.com>
parents:
23802
diff
changeset
|
383 off = o3 + metasize * nummeta |
2763edaba857
readmarkers: promote global constants to locals for performance
Matt Mackall <mpm@selenic.com>
parents:
23802
diff
changeset
|
384 metapairsize = unpack('>' + (metafmt * nummeta), data[o3:off]) |
22851
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
385 metadata = [] |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
386 for idx in xrange(0, len(metapairsize), 2): |
23798
86d2a0c41f44
readmarkers: streamline offset tracking
Matt Mackall <mpm@selenic.com>
parents:
23797
diff
changeset
|
387 o1 = off + metapairsize[idx] |
86d2a0c41f44
readmarkers: streamline offset tracking
Matt Mackall <mpm@selenic.com>
parents:
23797
diff
changeset
|
388 o2 = o1 + metapairsize[idx + 1] |
86d2a0c41f44
readmarkers: streamline offset tracking
Matt Mackall <mpm@selenic.com>
parents:
23797
diff
changeset
|
389 metadata.append((data[off:o1], data[o1:o2])) |
86d2a0c41f44
readmarkers: streamline offset tracking
Matt Mackall <mpm@selenic.com>
parents:
23797
diff
changeset
|
390 off = o2 |
22851
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
391 |
23800
83f361a21d31
readmarkers: drop a temporary
Matt Mackall <mpm@selenic.com>
parents:
23799
diff
changeset
|
392 yield (prec, sucs, flags, tuple(metadata), (secs, tz * 60), parents) |
22851
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
393 |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
394 def _fm1encodeonemarker(marker): |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
395 pre, sucs, flags, metadata, date, parents = marker |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
396 # determine node size |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
397 _fm1node = _fm1nodesha1 |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
398 if flags & usingsha256: |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
399 _fm1node = _fm1nodesha256 |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
400 numsuc = len(sucs) |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
401 numextranodes = numsuc |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
402 if parents is None: |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
403 numpar = _fm1parentnone |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
404 else: |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
405 numpar = len(parents) |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
406 numextranodes += numpar |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
407 formatnodes = _fm1node * numextranodes |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
408 formatmeta = _fm1metapair * len(metadata) |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
409 format = _fm1fixed + formatnodes + formatmeta |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
410 # tz is stored in minutes so we divide by 60 |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
411 tz = date[1]//60 |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
412 data = [None, date[0], tz, flags, numsuc, numpar, len(metadata), pre] |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
413 data.extend(sucs) |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
414 if parents is not None: |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
415 data.extend(parents) |
23498
ac910b1f5658
obsstore: prefetch struct.calcsize
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23497
diff
changeset
|
416 totalsize = _calcsize(format) |
22851
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
417 for key, value in metadata: |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
418 lk = len(key) |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
419 lv = len(value) |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
420 data.append(lk) |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
421 data.append(lv) |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
422 totalsize += lk + lv |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
423 data[0] = totalsize |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
424 data = [_pack(format, *data)] |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
425 for key, value in metadata: |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
426 data.append(key) |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
427 data.append(value) |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
428 return ''.join(data) |
22848
72100c1d53d4
obsolete: gather _fm0 meta encoding with other _fm0 code
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22847
diff
changeset
|
429 |
24019
26fbf07482b2
_fm1readmarkers: generate list in C
Martin von Zweigbergk <martinvonz@google.com>
parents:
24018
diff
changeset
|
430 def _fm1readmarkers(data, off): |
26fbf07482b2
_fm1readmarkers: generate list in C
Martin von Zweigbergk <martinvonz@google.com>
parents:
24018
diff
changeset
|
431 native = getattr(parsers, 'fm1readmarkers', None) |
26fbf07482b2
_fm1readmarkers: generate list in C
Martin von Zweigbergk <martinvonz@google.com>
parents:
24018
diff
changeset
|
432 if not native: |
26fbf07482b2
_fm1readmarkers: generate list in C
Martin von Zweigbergk <martinvonz@google.com>
parents:
24018
diff
changeset
|
433 return _fm1purereadmarkers(data, off) |
26fbf07482b2
_fm1readmarkers: generate list in C
Martin von Zweigbergk <martinvonz@google.com>
parents:
24018
diff
changeset
|
434 stop = len(data) - _fm1fsize |
26fbf07482b2
_fm1readmarkers: generate list in C
Martin von Zweigbergk <martinvonz@google.com>
parents:
24018
diff
changeset
|
435 return native(data, off, stop) |
26fbf07482b2
_fm1readmarkers: generate list in C
Martin von Zweigbergk <martinvonz@google.com>
parents:
24018
diff
changeset
|
436 |
22331
b130b241718e
obsolete: support for any known obsstore format when reading or writing
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22330
diff
changeset
|
437 # mapping to read/write various marker formats |
b130b241718e
obsolete: support for any known obsstore format when reading or writing
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22330
diff
changeset
|
438 # <version> -> (decoder, encoder) |
22851
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
439 formats = {_fm0version: (_fm0readmarkers, _fm0encodeonemarker), |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
440 _fm1version: (_fm1readmarkers, _fm1encodeonemarker)} |
22331
b130b241718e
obsolete: support for any known obsstore format when reading or writing
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22330
diff
changeset
|
441 |
23497
5817f71c2336
obsstore: disable garbage collection during initialization (issue4456)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23002
diff
changeset
|
442 @util.nogc |
22612
fdfa40ee75cf
obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22507
diff
changeset
|
443 def _readmarkers(data): |
fdfa40ee75cf
obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22507
diff
changeset
|
444 """Read and enumerate markers from raw data""" |
fdfa40ee75cf
obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22507
diff
changeset
|
445 off = 0 |
fdfa40ee75cf
obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22507
diff
changeset
|
446 diskversion = _unpack('>B', data[off:off + 1])[0] |
fdfa40ee75cf
obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22507
diff
changeset
|
447 off += 1 |
fdfa40ee75cf
obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22507
diff
changeset
|
448 if diskversion not in formats: |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26310
diff
changeset
|
449 raise error.Abort(_('parsing obsolete marker: unknown version %r') |
22612
fdfa40ee75cf
obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22507
diff
changeset
|
450 % diskversion) |
fdfa40ee75cf
obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22507
diff
changeset
|
451 return diskversion, formats[diskversion][0](data, off) |
fdfa40ee75cf
obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22507
diff
changeset
|
452 |
fdfa40ee75cf
obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22507
diff
changeset
|
453 def encodemarkers(markers, addheader=False, version=_fm0version): |
fdfa40ee75cf
obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22507
diff
changeset
|
454 # Kept separate from flushmarkers(), it will be reused for |
fdfa40ee75cf
obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22507
diff
changeset
|
455 # markers exchange. |
fdfa40ee75cf
obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22507
diff
changeset
|
456 encodeone = formats[version][1] |
fdfa40ee75cf
obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22507
diff
changeset
|
457 if addheader: |
22613
e623898b80f5
obsolete: use the `version` argument in encodemarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22612
diff
changeset
|
458 yield _pack('>B', version) |
22612
fdfa40ee75cf
obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22507
diff
changeset
|
459 for marker in markers: |
fdfa40ee75cf
obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22507
diff
changeset
|
460 yield encodeone(marker) |
fdfa40ee75cf
obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22507
diff
changeset
|
461 |
fdfa40ee75cf
obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22507
diff
changeset
|
462 |
17072
517af63ba382
obsolete: helper class to access obsolete marker data
Pierre-Yves.David@ens-lyon.org
parents:
17071
diff
changeset
|
463 class marker(object): |
517af63ba382
obsolete: helper class to access obsolete marker data
Pierre-Yves.David@ens-lyon.org
parents:
17071
diff
changeset
|
464 """Wrap obsolete marker raw data""" |
517af63ba382
obsolete: helper class to access obsolete marker data
Pierre-Yves.David@ens-lyon.org
parents:
17071
diff
changeset
|
465 |
517af63ba382
obsolete: helper class to access obsolete marker data
Pierre-Yves.David@ens-lyon.org
parents:
17071
diff
changeset
|
466 def __init__(self, repo, data): |
517af63ba382
obsolete: helper class to access obsolete marker data
Pierre-Yves.David@ens-lyon.org
parents:
17071
diff
changeset
|
467 # the repo argument will be used to create changectx in later version |
517af63ba382
obsolete: helper class to access obsolete marker data
Pierre-Yves.David@ens-lyon.org
parents:
17071
diff
changeset
|
468 self._repo = repo |
517af63ba382
obsolete: helper class to access obsolete marker data
Pierre-Yves.David@ens-lyon.org
parents:
17071
diff
changeset
|
469 self._data = data |
517af63ba382
obsolete: helper class to access obsolete marker data
Pierre-Yves.David@ens-lyon.org
parents:
17071
diff
changeset
|
470 self._decodedmeta = None |
517af63ba382
obsolete: helper class to access obsolete marker data
Pierre-Yves.David@ens-lyon.org
parents:
17071
diff
changeset
|
471 |
20031
6c1adf2067bb
obsolete: add __eq__ and __hash__ to marker to make set() deduplication work
Augie Fackler <raf@durin42.com>
parents:
20030
diff
changeset
|
472 def __hash__(self): |
6c1adf2067bb
obsolete: add __eq__ and __hash__ to marker to make set() deduplication work
Augie Fackler <raf@durin42.com>
parents:
20030
diff
changeset
|
473 return hash(self._data) |
6c1adf2067bb
obsolete: add __eq__ and __hash__ to marker to make set() deduplication work
Augie Fackler <raf@durin42.com>
parents:
20030
diff
changeset
|
474 |
6c1adf2067bb
obsolete: add __eq__ and __hash__ to marker to make set() deduplication work
Augie Fackler <raf@durin42.com>
parents:
20030
diff
changeset
|
475 def __eq__(self, other): |
6c1adf2067bb
obsolete: add __eq__ and __hash__ to marker to make set() deduplication work
Augie Fackler <raf@durin42.com>
parents:
20030
diff
changeset
|
476 if type(other) != type(self): |
6c1adf2067bb
obsolete: add __eq__ and __hash__ to marker to make set() deduplication work
Augie Fackler <raf@durin42.com>
parents:
20030
diff
changeset
|
477 return False |
6c1adf2067bb
obsolete: add __eq__ and __hash__ to marker to make set() deduplication work
Augie Fackler <raf@durin42.com>
parents:
20030
diff
changeset
|
478 return self._data == other._data |
6c1adf2067bb
obsolete: add __eq__ and __hash__ to marker to make set() deduplication work
Augie Fackler <raf@durin42.com>
parents:
20030
diff
changeset
|
479 |
17072
517af63ba382
obsolete: helper class to access obsolete marker data
Pierre-Yves.David@ens-lyon.org
parents:
17071
diff
changeset
|
480 def precnode(self): |
517af63ba382
obsolete: helper class to access obsolete marker data
Pierre-Yves.David@ens-lyon.org
parents:
17071
diff
changeset
|
481 """Precursor changeset node identifier""" |
517af63ba382
obsolete: helper class to access obsolete marker data
Pierre-Yves.David@ens-lyon.org
parents:
17071
diff
changeset
|
482 return self._data[0] |
517af63ba382
obsolete: helper class to access obsolete marker data
Pierre-Yves.David@ens-lyon.org
parents:
17071
diff
changeset
|
483 |
517af63ba382
obsolete: helper class to access obsolete marker data
Pierre-Yves.David@ens-lyon.org
parents:
17071
diff
changeset
|
484 def succnodes(self): |
517af63ba382
obsolete: helper class to access obsolete marker data
Pierre-Yves.David@ens-lyon.org
parents:
17071
diff
changeset
|
485 """List of successor changesets node identifiers""" |
517af63ba382
obsolete: helper class to access obsolete marker data
Pierre-Yves.David@ens-lyon.org
parents:
17071
diff
changeset
|
486 return self._data[1] |
517af63ba382
obsolete: helper class to access obsolete marker data
Pierre-Yves.David@ens-lyon.org
parents:
17071
diff
changeset
|
487 |
22259
2e6f03a193f9
obsmarkers: add a `parentnodes` method to retrieve parent information
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22258
diff
changeset
|
488 def parentnodes(self): |
2e6f03a193f9
obsmarkers: add a `parentnodes` method to retrieve parent information
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22258
diff
changeset
|
489 """Parents of the precursors (None if not recorded)""" |
2e6f03a193f9
obsmarkers: add a `parentnodes` method to retrieve parent information
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22258
diff
changeset
|
490 return self._data[5] |
2e6f03a193f9
obsmarkers: add a `parentnodes` method to retrieve parent information
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22258
diff
changeset
|
491 |
17072
517af63ba382
obsolete: helper class to access obsolete marker data
Pierre-Yves.David@ens-lyon.org
parents:
17071
diff
changeset
|
492 def metadata(self): |
517af63ba382
obsolete: helper class to access obsolete marker data
Pierre-Yves.David@ens-lyon.org
parents:
17071
diff
changeset
|
493 """Decoded metadata dictionary""" |
22845
ef880e28e56a
obsolete: store metadata as a tuple of (key, value) pairs (API)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22685
diff
changeset
|
494 return dict(self._data[3]) |
17072
517af63ba382
obsolete: helper class to access obsolete marker data
Pierre-Yves.David@ens-lyon.org
parents:
17071
diff
changeset
|
495 |
517af63ba382
obsolete: helper class to access obsolete marker data
Pierre-Yves.David@ens-lyon.org
parents:
17071
diff
changeset
|
496 def date(self): |
517af63ba382
obsolete: helper class to access obsolete marker data
Pierre-Yves.David@ens-lyon.org
parents:
17071
diff
changeset
|
497 """Creation date as (unixtime, offset)""" |
22222
883e8b6bd461
obsmarker: add `date` as an explicit field
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22221
diff
changeset
|
498 return self._data[4] |
17072
517af63ba382
obsolete: helper class to access obsolete marker data
Pierre-Yves.David@ens-lyon.org
parents:
17071
diff
changeset
|
499 |
22215
525cde5d954d
obsmarker: add a `flags` method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22207
diff
changeset
|
500 def flags(self): |
525cde5d954d
obsmarker: add a `flags` method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22207
diff
changeset
|
501 """The flags field of the marker""" |
525cde5d954d
obsmarker: add a `flags` method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22207
diff
changeset
|
502 return self._data[2] |
525cde5d954d
obsmarker: add a `flags` method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22207
diff
changeset
|
503 |
24044
e0e6dd806b23
obsolete: extract helpers from _load()
Martin von Zweigbergk <martinvonz@google.com>
parents:
24019
diff
changeset
|
504 @util.nogc |
e0e6dd806b23
obsolete: extract helpers from _load()
Martin von Zweigbergk <martinvonz@google.com>
parents:
24019
diff
changeset
|
505 def _addsuccessors(successors, markers): |
e0e6dd806b23
obsolete: extract helpers from _load()
Martin von Zweigbergk <martinvonz@google.com>
parents:
24019
diff
changeset
|
506 for mark in markers: |
e0e6dd806b23
obsolete: extract helpers from _load()
Martin von Zweigbergk <martinvonz@google.com>
parents:
24019
diff
changeset
|
507 successors.setdefault(mark[0], set()).add(mark) |
e0e6dd806b23
obsolete: extract helpers from _load()
Martin von Zweigbergk <martinvonz@google.com>
parents:
24019
diff
changeset
|
508 |
e0e6dd806b23
obsolete: extract helpers from _load()
Martin von Zweigbergk <martinvonz@google.com>
parents:
24019
diff
changeset
|
509 @util.nogc |
e0e6dd806b23
obsolete: extract helpers from _load()
Martin von Zweigbergk <martinvonz@google.com>
parents:
24019
diff
changeset
|
510 def _addprecursors(precursors, markers): |
e0e6dd806b23
obsolete: extract helpers from _load()
Martin von Zweigbergk <martinvonz@google.com>
parents:
24019
diff
changeset
|
511 for mark in markers: |
e0e6dd806b23
obsolete: extract helpers from _load()
Martin von Zweigbergk <martinvonz@google.com>
parents:
24019
diff
changeset
|
512 for suc in mark[1]: |
e0e6dd806b23
obsolete: extract helpers from _load()
Martin von Zweigbergk <martinvonz@google.com>
parents:
24019
diff
changeset
|
513 precursors.setdefault(suc, set()).add(mark) |
e0e6dd806b23
obsolete: extract helpers from _load()
Martin von Zweigbergk <martinvonz@google.com>
parents:
24019
diff
changeset
|
514 |
e0e6dd806b23
obsolete: extract helpers from _load()
Martin von Zweigbergk <martinvonz@google.com>
parents:
24019
diff
changeset
|
515 @util.nogc |
e0e6dd806b23
obsolete: extract helpers from _load()
Martin von Zweigbergk <martinvonz@google.com>
parents:
24019
diff
changeset
|
516 def _addchildren(children, markers): |
e0e6dd806b23
obsolete: extract helpers from _load()
Martin von Zweigbergk <martinvonz@google.com>
parents:
24019
diff
changeset
|
517 for mark in markers: |
e0e6dd806b23
obsolete: extract helpers from _load()
Martin von Zweigbergk <martinvonz@google.com>
parents:
24019
diff
changeset
|
518 parents = mark[5] |
e0e6dd806b23
obsolete: extract helpers from _load()
Martin von Zweigbergk <martinvonz@google.com>
parents:
24019
diff
changeset
|
519 if parents is not None: |
e0e6dd806b23
obsolete: extract helpers from _load()
Martin von Zweigbergk <martinvonz@google.com>
parents:
24019
diff
changeset
|
520 for p in parents: |
e0e6dd806b23
obsolete: extract helpers from _load()
Martin von Zweigbergk <martinvonz@google.com>
parents:
24019
diff
changeset
|
521 children.setdefault(p, set()).add(mark) |
e0e6dd806b23
obsolete: extract helpers from _load()
Martin von Zweigbergk <martinvonz@google.com>
parents:
24019
diff
changeset
|
522 |
24045
43061f96e40e
obsolete: pass only new markers to _checkinvalidmarkers()
Martin von Zweigbergk <martinvonz@google.com>
parents:
24044
diff
changeset
|
523 def _checkinvalidmarkers(markers): |
23973
18d431147cc1
obsstore: make the invalid markers check wrap-able
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23805
diff
changeset
|
524 """search for marker with invalid data and raise error if needed |
18d431147cc1
obsstore: make the invalid markers check wrap-able
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23805
diff
changeset
|
525 |
18d431147cc1
obsstore: make the invalid markers check wrap-able
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23805
diff
changeset
|
526 Exist as a separated function to allow the evolve extension for a more |
18d431147cc1
obsstore: make the invalid markers check wrap-able
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23805
diff
changeset
|
527 subtle handling. |
18d431147cc1
obsstore: make the invalid markers check wrap-able
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23805
diff
changeset
|
528 """ |
24045
43061f96e40e
obsolete: pass only new markers to _checkinvalidmarkers()
Martin von Zweigbergk <martinvonz@google.com>
parents:
24044
diff
changeset
|
529 for mark in markers: |
43061f96e40e
obsolete: pass only new markers to _checkinvalidmarkers()
Martin von Zweigbergk <martinvonz@google.com>
parents:
24044
diff
changeset
|
530 if node.nullid in mark[1]: |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26310
diff
changeset
|
531 raise error.Abort(_('bad obsolescence marker detected: ' |
24045
43061f96e40e
obsolete: pass only new markers to _checkinvalidmarkers()
Martin von Zweigbergk <martinvonz@google.com>
parents:
24044
diff
changeset
|
532 'invalid successors nullid')) |
23973
18d431147cc1
obsstore: make the invalid markers check wrap-able
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23805
diff
changeset
|
533 |
17070
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
534 class obsstore(object): |
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
535 """Store obsolete markers |
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
536 |
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
537 Markers can be accessed with two mappings: |
17776
072812e9f570
obsolete: flip `obstore.successors` and `obsolete.precursors`
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17775
diff
changeset
|
538 - precursors[x] -> set(markers on precursors edges of x) |
072812e9f570
obsolete: flip `obstore.successors` and `obsolete.precursors`
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17775
diff
changeset
|
539 - successors[x] -> set(markers on successors edges of x) |
22270
e5adb6935239
obsstore: keep track of children information
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22268
diff
changeset
|
540 - children[x] -> set(markers on precursors edges of children(x) |
17070
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
541 """ |
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
542 |
22254
b8a0e8176693
obsstore: add a `parents` field
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22253
diff
changeset
|
543 fields = ('prec', 'succs', 'flag', 'meta', 'date', 'parents') |
b8a0e8176693
obsstore: add a `parents` field
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22253
diff
changeset
|
544 # prec: nodeid, precursor changesets |
b8a0e8176693
obsstore: add a `parents` field
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22253
diff
changeset
|
545 # succs: tuple of nodeid, successor changesets (0-N length) |
b8a0e8176693
obsstore: add a `parents` field
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22253
diff
changeset
|
546 # flag: integer, flag field carrying modifier for the markers (see doc) |
b8a0e8176693
obsstore: add a `parents` field
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22253
diff
changeset
|
547 # meta: binary blob, encoded metadata dictionary |
b8a0e8176693
obsstore: add a `parents` field
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22253
diff
changeset
|
548 # date: (float, int) tuple, date of marker creation |
b8a0e8176693
obsstore: add a `parents` field
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22253
diff
changeset
|
549 # parents: (tuple of nodeid) or None, parents of precursors |
b8a0e8176693
obsstore: add a `parents` field
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22253
diff
changeset
|
550 # None is used when no data has been recorded |
22221
e75b1a3c1dbc
obsstore: add fields attribute to track each field in a marker
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22219
diff
changeset
|
551 |
25669
8d94861842e5
obsolete: replace references to 'sopener' with 'svfs'
Siddharth Agarwal <sid0@fb.com>
parents:
25412
diff
changeset
|
552 def __init__(self, svfs, defaultformat=_fm1version, readonly=False): |
17469
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
553 # caches for various obsolescence related cache |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
554 self.caches = {} |
25669
8d94861842e5
obsolete: replace references to 'sopener' with 'svfs'
Siddharth Agarwal <sid0@fb.com>
parents:
25412
diff
changeset
|
555 self.svfs = svfs |
22852
e994b034e91e
obsolete: add a "format.obsstore-version" config option
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22851
diff
changeset
|
556 self._version = defaultformat |
22950
bb8278b289ee
obsolete: add readonly flag to obstore constructor
Durham Goode <durham@fb.com>
parents:
22949
diff
changeset
|
557 self._readonly = readonly |
17070
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
558 |
17073
3a79a5682af1
obsolete: add easy way to iterate over obsolete marker object
Pierre-Yves.David@ens-lyon.org
parents:
17072
diff
changeset
|
559 def __iter__(self): |
3a79a5682af1
obsolete: add easy way to iterate over obsolete marker object
Pierre-Yves.David@ens-lyon.org
parents:
17072
diff
changeset
|
560 return iter(self._all) |
3a79a5682af1
obsolete: add easy way to iterate over obsolete marker object
Pierre-Yves.David@ens-lyon.org
parents:
17072
diff
changeset
|
561 |
20585
f3c8db3d6d66
obsstore: add a __len__ method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20584
diff
changeset
|
562 def __len__(self): |
f3c8db3d6d66
obsstore: add a __len__ method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20584
diff
changeset
|
563 return len(self._all) |
f3c8db3d6d66
obsstore: add a __len__ method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20584
diff
changeset
|
564 |
17075
28ed1c4511ce
obsolete: exchange obsolete marker over pushkey
Pierre-Yves.David@ens-lyon.org
parents:
17073
diff
changeset
|
565 def __nonzero__(self): |
26310
61efe9ef6ad4
obsstore: fast path to check if obsstore is empty
Yuya Nishihara <yuya@tcha.org>
parents:
26309
diff
changeset
|
566 if not self._cached('_all'): |
61efe9ef6ad4
obsstore: fast path to check if obsstore is empty
Yuya Nishihara <yuya@tcha.org>
parents:
26309
diff
changeset
|
567 try: |
61efe9ef6ad4
obsstore: fast path to check if obsstore is empty
Yuya Nishihara <yuya@tcha.org>
parents:
26309
diff
changeset
|
568 return self.svfs.stat('obsstore').st_size > 1 |
61efe9ef6ad4
obsstore: fast path to check if obsstore is empty
Yuya Nishihara <yuya@tcha.org>
parents:
26309
diff
changeset
|
569 except OSError as inst: |
61efe9ef6ad4
obsstore: fast path to check if obsstore is empty
Yuya Nishihara <yuya@tcha.org>
parents:
26309
diff
changeset
|
570 if inst.errno != errno.ENOENT: |
61efe9ef6ad4
obsstore: fast path to check if obsstore is empty
Yuya Nishihara <yuya@tcha.org>
parents:
26309
diff
changeset
|
571 raise |
61efe9ef6ad4
obsstore: fast path to check if obsstore is empty
Yuya Nishihara <yuya@tcha.org>
parents:
26309
diff
changeset
|
572 # just build an empty _all list if no obsstore exists, which |
61efe9ef6ad4
obsstore: fast path to check if obsstore is empty
Yuya Nishihara <yuya@tcha.org>
parents:
26309
diff
changeset
|
573 # avoids further stat() syscalls |
61efe9ef6ad4
obsstore: fast path to check if obsstore is empty
Yuya Nishihara <yuya@tcha.org>
parents:
26309
diff
changeset
|
574 pass |
17075
28ed1c4511ce
obsolete: exchange obsolete marker over pushkey
Pierre-Yves.David@ens-lyon.org
parents:
17073
diff
changeset
|
575 return bool(self._all) |
28ed1c4511ce
obsolete: exchange obsolete marker over pushkey
Pierre-Yves.David@ens-lyon.org
parents:
17073
diff
changeset
|
576 |
31476
413b44003462
py3: add __bool__ to every class defining __nonzero__
Gregory Szorc <gregory.szorc@gmail.com>
parents:
31018
diff
changeset
|
577 __bool__ = __nonzero__ |
413b44003462
py3: add __bool__ to every class defining __nonzero__
Gregory Szorc <gregory.szorc@gmail.com>
parents:
31018
diff
changeset
|
578 |
26684
74ff350c208c
obsstore: make the readonly attribute accessible
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26587
diff
changeset
|
579 @property |
74ff350c208c
obsstore: make the readonly attribute accessible
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26587
diff
changeset
|
580 def readonly(self): |
74ff350c208c
obsstore: make the readonly attribute accessible
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26587
diff
changeset
|
581 """True if marker creation is disabled |
74ff350c208c
obsstore: make the readonly attribute accessible
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26587
diff
changeset
|
582 |
74ff350c208c
obsstore: make the readonly attribute accessible
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26587
diff
changeset
|
583 Remove me in the future when obsolete marker is always on.""" |
74ff350c208c
obsstore: make the readonly attribute accessible
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26587
diff
changeset
|
584 return self._readonly |
74ff350c208c
obsstore: make the readonly attribute accessible
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26587
diff
changeset
|
585 |
22255
adb3798dce49
obsstore: add a `parents` argument to obsstore.create
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22254
diff
changeset
|
586 def create(self, transaction, prec, succs=(), flag=0, parents=None, |
32411
08d02c1d7e67
devel: use default-date config field when creating obsmarkers
Boris Feld <boris.feld@octobus.net>
parents:
32387
diff
changeset
|
587 date=None, metadata=None, ui=None): |
17071
11f26e2669aa
command: creation of obsolete marker
Pierre-Yves.David@ens-lyon.org
parents:
17070
diff
changeset
|
588 """obsolete: add a new obsolete marker |
11f26e2669aa
command: creation of obsolete marker
Pierre-Yves.David@ens-lyon.org
parents:
17070
diff
changeset
|
589 |
11f26e2669aa
command: creation of obsolete marker
Pierre-Yves.David@ens-lyon.org
parents:
17070
diff
changeset
|
590 * ensuring it is hashable |
11f26e2669aa
command: creation of obsolete marker
Pierre-Yves.David@ens-lyon.org
parents:
17070
diff
changeset
|
591 * check mandatory metadata |
11f26e2669aa
command: creation of obsolete marker
Pierre-Yves.David@ens-lyon.org
parents:
17070
diff
changeset
|
592 * encode metadata |
20516
3af218cf2007
obsstore: update create docstring to point to the coder friendly function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20476
diff
changeset
|
593 |
3af218cf2007
obsstore: update create docstring to point to the coder friendly function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20476
diff
changeset
|
594 If you are a human writing code creating marker you want to use the |
3af218cf2007
obsstore: update create docstring to point to the coder friendly function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20476
diff
changeset
|
595 `createmarkers` function in this module instead. |
20584
224a058f7cd1
obsstore: `create` method return True if a marker is actually added
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20549
diff
changeset
|
596 |
224a058f7cd1
obsstore: `create` method return True if a marker is actually added
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20549
diff
changeset
|
597 return True if a new marker have been added, False if the markers |
224a058f7cd1
obsstore: `create` method return True if a marker is actually added
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20549
diff
changeset
|
598 already existed (no op). |
17071
11f26e2669aa
command: creation of obsolete marker
Pierre-Yves.David@ens-lyon.org
parents:
17070
diff
changeset
|
599 """ |
11f26e2669aa
command: creation of obsolete marker
Pierre-Yves.David@ens-lyon.org
parents:
17070
diff
changeset
|
600 if metadata is None: |
11f26e2669aa
command: creation of obsolete marker
Pierre-Yves.David@ens-lyon.org
parents:
17070
diff
changeset
|
601 metadata = {} |
22222
883e8b6bd461
obsmarker: add `date` as an explicit field
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22221
diff
changeset
|
602 if date is None: |
883e8b6bd461
obsmarker: add `date` as an explicit field
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22221
diff
changeset
|
603 if 'date' in metadata: |
883e8b6bd461
obsmarker: add `date` as an explicit field
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22221
diff
changeset
|
604 # as a courtesy for out-of-tree extensions |
883e8b6bd461
obsmarker: add `date` as an explicit field
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22221
diff
changeset
|
605 date = util.parsedate(metadata.pop('date')) |
32411
08d02c1d7e67
devel: use default-date config field when creating obsmarkers
Boris Feld <boris.feld@octobus.net>
parents:
32387
diff
changeset
|
606 elif ui is not None: |
08d02c1d7e67
devel: use default-date config field when creating obsmarkers
Boris Feld <boris.feld@octobus.net>
parents:
32387
diff
changeset
|
607 date = ui.configdate('devel', 'default-date') |
08d02c1d7e67
devel: use default-date config field when creating obsmarkers
Boris Feld <boris.feld@octobus.net>
parents:
32387
diff
changeset
|
608 if date is None: |
08d02c1d7e67
devel: use default-date config field when creating obsmarkers
Boris Feld <boris.feld@octobus.net>
parents:
32387
diff
changeset
|
609 date = util.makedate() |
22222
883e8b6bd461
obsmarker: add `date` as an explicit field
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22221
diff
changeset
|
610 else: |
22217
570f87422f54
obsstore: add an explicit `date` argument to obsstore.create
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22216
diff
changeset
|
611 date = util.makedate() |
17071
11f26e2669aa
command: creation of obsolete marker
Pierre-Yves.David@ens-lyon.org
parents:
17070
diff
changeset
|
612 if len(prec) != 20: |
11f26e2669aa
command: creation of obsolete marker
Pierre-Yves.David@ens-lyon.org
parents:
17070
diff
changeset
|
613 raise ValueError(prec) |
11f26e2669aa
command: creation of obsolete marker
Pierre-Yves.David@ens-lyon.org
parents:
17070
diff
changeset
|
614 for succ in succs: |
11f26e2669aa
command: creation of obsolete marker
Pierre-Yves.David@ens-lyon.org
parents:
17070
diff
changeset
|
615 if len(succ) != 20: |
17117
217bfb10e6db
obsolete: fix error message at marker creation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17076
diff
changeset
|
616 raise ValueError(succ) |
22177
a56038e6a3c9
obsstore.create: add a simple safeguard against cyclic markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21166
diff
changeset
|
617 if prec in succs: |
a56038e6a3c9
obsstore.create: add a simple safeguard against cyclic markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21166
diff
changeset
|
618 raise ValueError(_('in-marker cycle with %s') % node.hex(prec)) |
22845
ef880e28e56a
obsolete: store metadata as a tuple of (key, value) pairs (API)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22685
diff
changeset
|
619 |
ef880e28e56a
obsolete: store metadata as a tuple of (key, value) pairs (API)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22685
diff
changeset
|
620 metadata = tuple(sorted(metadata.iteritems())) |
ef880e28e56a
obsolete: store metadata as a tuple of (key, value) pairs (API)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22685
diff
changeset
|
621 |
ef880e28e56a
obsolete: store metadata as a tuple of (key, value) pairs (API)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22685
diff
changeset
|
622 marker = (str(prec), tuple(succs), int(flag), metadata, date, parents) |
20584
224a058f7cd1
obsstore: `create` method return True if a marker is actually added
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20549
diff
changeset
|
623 return bool(self.add(transaction, [marker])) |
17220
bdac214a4705
obsolete: obsstore.add now takes a list of markers.
Pierre-Yves.David@ens-lyon.org
parents:
17219
diff
changeset
|
624 |
bdac214a4705
obsolete: obsstore.add now takes a list of markers.
Pierre-Yves.David@ens-lyon.org
parents:
17219
diff
changeset
|
625 def add(self, transaction, markers): |
bdac214a4705
obsolete: obsstore.add now takes a list of markers.
Pierre-Yves.David@ens-lyon.org
parents:
17219
diff
changeset
|
626 """Add new markers to the store |
17070
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
627 |
17220
bdac214a4705
obsolete: obsstore.add now takes a list of markers.
Pierre-Yves.David@ens-lyon.org
parents:
17219
diff
changeset
|
628 Take care of filtering duplicate. |
bdac214a4705
obsolete: obsstore.add now takes a list of markers.
Pierre-Yves.David@ens-lyon.org
parents:
17219
diff
changeset
|
629 Return the number of new marker.""" |
22950
bb8278b289ee
obsolete: add readonly flag to obstore constructor
Durham Goode <durham@fb.com>
parents:
22949
diff
changeset
|
630 if self._readonly: |
29389
98e8313dcd9e
i18n: translate abort messages
liscju <piotr.listkiewicz@gmail.com>
parents:
29281
diff
changeset
|
631 raise error.Abort(_('creating obsolete markers is not enabled on ' |
98e8313dcd9e
i18n: translate abort messages
liscju <piotr.listkiewicz@gmail.com>
parents:
29281
diff
changeset
|
632 'this repo')) |
20028
28445179df90
obsolete: stop doing membership test on list
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19951
diff
changeset
|
633 known = set(self._all) |
20030
5931489b65e0
obsolete: do not accept duplicated marker during exchange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20028
diff
changeset
|
634 new = [] |
5931489b65e0
obsolete: do not accept duplicated marker during exchange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20028
diff
changeset
|
635 for m in markers: |
5931489b65e0
obsolete: do not accept duplicated marker during exchange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20028
diff
changeset
|
636 if m not in known: |
5931489b65e0
obsolete: do not accept duplicated marker during exchange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20028
diff
changeset
|
637 known.add(m) |
5931489b65e0
obsolete: do not accept duplicated marker during exchange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20028
diff
changeset
|
638 new.append(m) |
17220
bdac214a4705
obsolete: obsstore.add now takes a list of markers.
Pierre-Yves.David@ens-lyon.org
parents:
17219
diff
changeset
|
639 if new: |
25669
8d94861842e5
obsolete: replace references to 'sopener' with 'svfs'
Siddharth Agarwal <sid0@fb.com>
parents:
25412
diff
changeset
|
640 f = self.svfs('obsstore', 'ab') |
17124
f1b7683f3f95
obsolete: move obsolete markers read/write logic to obsstore object
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17117
diff
changeset
|
641 try: |
17126
8fa8717b47b6
obsolete: write obsolete marker inside a transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17125
diff
changeset
|
642 offset = f.tell() |
8fa8717b47b6
obsolete: write obsolete marker inside a transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17125
diff
changeset
|
643 transaction.add('obsstore', offset) |
17219
494a970f68de
obsolete: refactor writemarkers to only encode them
Pierre-Yves.David@ens-lyon.org
parents:
17213
diff
changeset
|
644 # offset == 0: new file - add the version header |
22335
7c4c19dfd484
obsolete: make encodemarkers a public function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22334
diff
changeset
|
645 for bytes in encodemarkers(new, offset == 0, self._version): |
17219
494a970f68de
obsolete: refactor writemarkers to only encode them
Pierre-Yves.David@ens-lyon.org
parents:
17213
diff
changeset
|
646 f.write(bytes) |
17126
8fa8717b47b6
obsolete: write obsolete marker inside a transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17125
diff
changeset
|
647 finally: |
8fa8717b47b6
obsolete: write obsolete marker inside a transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17125
diff
changeset
|
648 # XXX: f.close() == filecache invalidation == obsstore rebuilt. |
8fa8717b47b6
obsolete: write obsolete marker inside a transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17125
diff
changeset
|
649 # call 'filecacheentry.refresh()' here |
17124
f1b7683f3f95
obsolete: move obsolete markers read/write logic to obsstore object
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17117
diff
changeset
|
650 f.close() |
24046
6e1d9f9932a9
obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents:
24045
diff
changeset
|
651 self._addmarkers(new) |
17469
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
652 # new marker *may* have changed several set. invalidate the cache. |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
653 self.caches.clear() |
22339
9680da73cfe0
obsmarker: record the number of new markers in the transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22335
diff
changeset
|
654 # records the number of new markers for the transaction hooks |
9680da73cfe0
obsmarker: record the number of new markers in the transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22335
diff
changeset
|
655 previous = int(transaction.hookargs.get('new_obsmarkers', '0')) |
9680da73cfe0
obsmarker: record the number of new markers in the transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22335
diff
changeset
|
656 transaction.hookargs['new_obsmarkers'] = str(previous + len(new)) |
17220
bdac214a4705
obsolete: obsstore.add now takes a list of markers.
Pierre-Yves.David@ens-lyon.org
parents:
17219
diff
changeset
|
657 return len(new) |
17126
8fa8717b47b6
obsolete: write obsolete marker inside a transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17125
diff
changeset
|
658 |
17524 | 659 def mergemarkers(self, transaction, data): |
22325
3363f2d36015
obsstore: have the `mergemarkers` method return the number of new markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22309
diff
changeset
|
660 """merge a binary stream of markers inside the obsstore |
3363f2d36015
obsstore: have the `mergemarkers` method return the number of new markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22309
diff
changeset
|
661 |
3363f2d36015
obsstore: have the `mergemarkers` method return the number of new markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22309
diff
changeset
|
662 Returns the number of new markers added.""" |
22332
13e22358e9d2
obsolete: have _readmarkers return the format version
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22331
diff
changeset
|
663 version, markers = _readmarkers(data) |
22325
3363f2d36015
obsstore: have the `mergemarkers` method return the number of new markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22309
diff
changeset
|
664 return self.add(transaction, markers) |
17070
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
665 |
24046
6e1d9f9932a9
obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents:
24045
diff
changeset
|
666 @propertycache |
26309
44918682093f
obsstore: delay loading markers from obsstore file
Yuya Nishihara <yuya@tcha.org>
parents:
26308
diff
changeset
|
667 def _all(self): |
44918682093f
obsstore: delay loading markers from obsstore file
Yuya Nishihara <yuya@tcha.org>
parents:
26308
diff
changeset
|
668 data = self.svfs.tryread('obsstore') |
44918682093f
obsstore: delay loading markers from obsstore file
Yuya Nishihara <yuya@tcha.org>
parents:
26308
diff
changeset
|
669 if not data: |
44918682093f
obsstore: delay loading markers from obsstore file
Yuya Nishihara <yuya@tcha.org>
parents:
26308
diff
changeset
|
670 return [] |
44918682093f
obsstore: delay loading markers from obsstore file
Yuya Nishihara <yuya@tcha.org>
parents:
26308
diff
changeset
|
671 self._version, markers = _readmarkers(data) |
44918682093f
obsstore: delay loading markers from obsstore file
Yuya Nishihara <yuya@tcha.org>
parents:
26308
diff
changeset
|
672 markers = list(markers) |
44918682093f
obsstore: delay loading markers from obsstore file
Yuya Nishihara <yuya@tcha.org>
parents:
26308
diff
changeset
|
673 _checkinvalidmarkers(markers) |
44918682093f
obsstore: delay loading markers from obsstore file
Yuya Nishihara <yuya@tcha.org>
parents:
26308
diff
changeset
|
674 return markers |
44918682093f
obsstore: delay loading markers from obsstore file
Yuya Nishihara <yuya@tcha.org>
parents:
26308
diff
changeset
|
675 |
44918682093f
obsstore: delay loading markers from obsstore file
Yuya Nishihara <yuya@tcha.org>
parents:
26308
diff
changeset
|
676 @propertycache |
24046
6e1d9f9932a9
obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents:
24045
diff
changeset
|
677 def successors(self): |
6e1d9f9932a9
obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents:
24045
diff
changeset
|
678 successors = {} |
6e1d9f9932a9
obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents:
24045
diff
changeset
|
679 _addsuccessors(successors, self._all) |
6e1d9f9932a9
obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents:
24045
diff
changeset
|
680 return successors |
6e1d9f9932a9
obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents:
24045
diff
changeset
|
681 |
6e1d9f9932a9
obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents:
24045
diff
changeset
|
682 @propertycache |
6e1d9f9932a9
obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents:
24045
diff
changeset
|
683 def precursors(self): |
6e1d9f9932a9
obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents:
24045
diff
changeset
|
684 precursors = {} |
6e1d9f9932a9
obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents:
24045
diff
changeset
|
685 _addprecursors(precursors, self._all) |
6e1d9f9932a9
obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents:
24045
diff
changeset
|
686 return precursors |
6e1d9f9932a9
obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents:
24045
diff
changeset
|
687 |
6e1d9f9932a9
obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents:
24045
diff
changeset
|
688 @propertycache |
6e1d9f9932a9
obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents:
24045
diff
changeset
|
689 def children(self): |
6e1d9f9932a9
obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents:
24045
diff
changeset
|
690 children = {} |
6e1d9f9932a9
obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents:
24045
diff
changeset
|
691 _addchildren(children, self._all) |
6e1d9f9932a9
obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents:
24045
diff
changeset
|
692 return children |
6e1d9f9932a9
obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents:
24045
diff
changeset
|
693 |
6e1d9f9932a9
obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents:
24045
diff
changeset
|
694 def _cached(self, attr): |
6e1d9f9932a9
obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents:
24045
diff
changeset
|
695 return attr in self.__dict__ |
6e1d9f9932a9
obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents:
24045
diff
changeset
|
696 |
6e1d9f9932a9
obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents:
24045
diff
changeset
|
697 def _addmarkers(self, markers): |
24044
e0e6dd806b23
obsolete: extract helpers from _load()
Martin von Zweigbergk <martinvonz@google.com>
parents:
24019
diff
changeset
|
698 markers = list(markers) # to allow repeated iteration |
e0e6dd806b23
obsolete: extract helpers from _load()
Martin von Zweigbergk <martinvonz@google.com>
parents:
24019
diff
changeset
|
699 self._all.extend(markers) |
24046
6e1d9f9932a9
obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents:
24045
diff
changeset
|
700 if self._cached('successors'): |
6e1d9f9932a9
obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents:
24045
diff
changeset
|
701 _addsuccessors(self.successors, markers) |
6e1d9f9932a9
obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents:
24045
diff
changeset
|
702 if self._cached('precursors'): |
6e1d9f9932a9
obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents:
24045
diff
changeset
|
703 _addprecursors(self.precursors, markers) |
6e1d9f9932a9
obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents:
24045
diff
changeset
|
704 if self._cached('children'): |
6e1d9f9932a9
obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents:
24045
diff
changeset
|
705 _addchildren(self.children, markers) |
24045
43061f96e40e
obsolete: pass only new markers to _checkinvalidmarkers()
Martin von Zweigbergk <martinvonz@google.com>
parents:
24044
diff
changeset
|
706 _checkinvalidmarkers(markers) |
23973
18d431147cc1
obsstore: make the invalid markers check wrap-able
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23805
diff
changeset
|
707 |
22271
8c69262df82d
obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22270
diff
changeset
|
708 def relevantmarkers(self, nodes): |
8c69262df82d
obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22270
diff
changeset
|
709 """return a set of all obsolescence markers relevant to a set of nodes. |
8c69262df82d
obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22270
diff
changeset
|
710 |
8c69262df82d
obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22270
diff
changeset
|
711 "relevant" to a set of nodes mean: |
8c69262df82d
obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22270
diff
changeset
|
712 |
8c69262df82d
obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22270
diff
changeset
|
713 - marker that use this changeset as successor |
8c69262df82d
obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22270
diff
changeset
|
714 - prune marker of direct children on this changeset |
8c69262df82d
obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22270
diff
changeset
|
715 - recursive application of the two rules on precursors of these markers |
8c69262df82d
obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22270
diff
changeset
|
716 |
8c69262df82d
obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22270
diff
changeset
|
717 It is a set so you cannot rely on order.""" |
8c69262df82d
obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22270
diff
changeset
|
718 |
8c69262df82d
obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22270
diff
changeset
|
719 pendingnodes = set(nodes) |
8c69262df82d
obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22270
diff
changeset
|
720 seenmarkers = set() |
8c69262df82d
obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22270
diff
changeset
|
721 seennodes = set(pendingnodes) |
8c69262df82d
obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22270
diff
changeset
|
722 precursorsmarkers = self.precursors |
8c69262df82d
obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22270
diff
changeset
|
723 children = self.children |
8c69262df82d
obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22270
diff
changeset
|
724 while pendingnodes: |
8c69262df82d
obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22270
diff
changeset
|
725 direct = set() |
8c69262df82d
obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22270
diff
changeset
|
726 for current in pendingnodes: |
8c69262df82d
obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22270
diff
changeset
|
727 direct.update(precursorsmarkers.get(current, ())) |
8c69262df82d
obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22270
diff
changeset
|
728 pruned = [m for m in children.get(current, ()) if not m[1]] |
8c69262df82d
obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22270
diff
changeset
|
729 direct.update(pruned) |
8c69262df82d
obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22270
diff
changeset
|
730 direct -= seenmarkers |
8c69262df82d
obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22270
diff
changeset
|
731 pendingnodes = set([m[0] for m in direct]) |
8c69262df82d
obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22270
diff
changeset
|
732 seenmarkers |= direct |
8c69262df82d
obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22270
diff
changeset
|
733 pendingnodes -= seennodes |
8c69262df82d
obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22270
diff
changeset
|
734 seennodes |= pendingnodes |
8c69262df82d
obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22270
diff
changeset
|
735 return seenmarkers |
17070
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
736 |
22345
cf7014c5f087
obsolete: add a `commonversion` function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22339
diff
changeset
|
737 def commonversion(versions): |
cf7014c5f087
obsolete: add a `commonversion` function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22339
diff
changeset
|
738 """Return the newest version listed in both versions and our local formats. |
cf7014c5f087
obsolete: add a `commonversion` function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22339
diff
changeset
|
739 |
cf7014c5f087
obsolete: add a `commonversion` function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22339
diff
changeset
|
740 Returns None if no common version exists. |
cf7014c5f087
obsolete: add a `commonversion` function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22339
diff
changeset
|
741 """ |
cf7014c5f087
obsolete: add a `commonversion` function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22339
diff
changeset
|
742 versions.sort(reverse=True) |
cf7014c5f087
obsolete: add a `commonversion` function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22339
diff
changeset
|
743 # search for highest version known on both side |
cf7014c5f087
obsolete: add a `commonversion` function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22339
diff
changeset
|
744 for v in versions: |
cf7014c5f087
obsolete: add a `commonversion` function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22339
diff
changeset
|
745 if v in formats: |
cf7014c5f087
obsolete: add a `commonversion` function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22339
diff
changeset
|
746 return v |
cf7014c5f087
obsolete: add a `commonversion` function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22339
diff
changeset
|
747 return None |
17295
1f08ecc7febb
pushkey: splits obsolete marker exchange into multiple keys
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17253
diff
changeset
|
748 |
1f08ecc7febb
pushkey: splits obsolete marker exchange into multiple keys
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17253
diff
changeset
|
749 # arbitrary picked to fit into 8K limit from HTTP server |
1f08ecc7febb
pushkey: splits obsolete marker exchange into multiple keys
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17253
diff
changeset
|
750 # you have to take in account: |
1f08ecc7febb
pushkey: splits obsolete marker exchange into multiple keys
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17253
diff
changeset
|
751 # - the version header |
1f08ecc7febb
pushkey: splits obsolete marker exchange into multiple keys
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17253
diff
changeset
|
752 # - the base85 encoding |
1f08ecc7febb
pushkey: splits obsolete marker exchange into multiple keys
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17253
diff
changeset
|
753 _maxpayload = 5300 |
17075
28ed1c4511ce
obsolete: exchange obsolete marker over pushkey
Pierre-Yves.David@ens-lyon.org
parents:
17073
diff
changeset
|
754 |
20599
dad29624b056
obsolete: extract encoding of marker for pushkey from the list key function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20585
diff
changeset
|
755 def _pushkeyescape(markers): |
dad29624b056
obsolete: extract encoding of marker for pushkey from the list key function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20585
diff
changeset
|
756 """encode markers into a dict suitable for pushkey exchange |
dad29624b056
obsolete: extract encoding of marker for pushkey from the list key function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20585
diff
changeset
|
757 |
21024
7731a2281cf0
spelling: fixes from spell checker
Mads Kiilerich <madski@unity3d.com>
parents:
20599
diff
changeset
|
758 - binary data is base85 encoded |
7731a2281cf0
spelling: fixes from spell checker
Mads Kiilerich <madski@unity3d.com>
parents:
20599
diff
changeset
|
759 - split in chunks smaller than 5300 bytes""" |
17295
1f08ecc7febb
pushkey: splits obsolete marker exchange into multiple keys
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17253
diff
changeset
|
760 keys = {} |
1f08ecc7febb
pushkey: splits obsolete marker exchange into multiple keys
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17253
diff
changeset
|
761 parts = [] |
1f08ecc7febb
pushkey: splits obsolete marker exchange into multiple keys
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17253
diff
changeset
|
762 currentlen = _maxpayload * 2 # ensure we create a new part |
20599
dad29624b056
obsolete: extract encoding of marker for pushkey from the list key function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20585
diff
changeset
|
763 for marker in markers: |
22329
ed37aa74d208
obsolete: rename _encodeonemarker to _fm0encodeonemarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22328
diff
changeset
|
764 nextdata = _fm0encodeonemarker(marker) |
17295
1f08ecc7febb
pushkey: splits obsolete marker exchange into multiple keys
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17253
diff
changeset
|
765 if (len(nextdata) + currentlen > _maxpayload): |
1f08ecc7febb
pushkey: splits obsolete marker exchange into multiple keys
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17253
diff
changeset
|
766 currentpart = [] |
1f08ecc7febb
pushkey: splits obsolete marker exchange into multiple keys
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17253
diff
changeset
|
767 currentlen = 0 |
1f08ecc7febb
pushkey: splits obsolete marker exchange into multiple keys
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17253
diff
changeset
|
768 parts.append(currentpart) |
1f08ecc7febb
pushkey: splits obsolete marker exchange into multiple keys
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17253
diff
changeset
|
769 currentpart.append(nextdata) |
17304
0368fc55d572
obsolete: properly increment currentlen when building pushkey payload
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17298
diff
changeset
|
770 currentlen += len(nextdata) |
17295
1f08ecc7febb
pushkey: splits obsolete marker exchange into multiple keys
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17253
diff
changeset
|
771 for idx, part in enumerate(reversed(parts)): |
22327
f737631a9f0a
obsolete: rename all _fm to _fm0
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22326
diff
changeset
|
772 data = ''.join([_pack('>B', _fm0version)] + part) |
32201
4462a981e8df
base85: proxy through util module
Yuya Nishihara <yuya@tcha.org>
parents:
31476
diff
changeset
|
773 keys['dump%i' % idx] = util.b85encode(data) |
17295
1f08ecc7febb
pushkey: splits obsolete marker exchange into multiple keys
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17253
diff
changeset
|
774 return keys |
17073
3a79a5682af1
obsolete: add easy way to iterate over obsolete marker object
Pierre-Yves.David@ens-lyon.org
parents:
17072
diff
changeset
|
775 |
20599
dad29624b056
obsolete: extract encoding of marker for pushkey from the list key function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20585
diff
changeset
|
776 def listmarkers(repo): |
dad29624b056
obsolete: extract encoding of marker for pushkey from the list key function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20585
diff
changeset
|
777 """List markers over pushkey""" |
dad29624b056
obsolete: extract encoding of marker for pushkey from the list key function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20585
diff
changeset
|
778 if not repo.obsstore: |
dad29624b056
obsolete: extract encoding of marker for pushkey from the list key function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20585
diff
changeset
|
779 return {} |
25118
e632a2429982
obsolete: sort obsmarkers during exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24928
diff
changeset
|
780 return _pushkeyescape(sorted(repo.obsstore)) |
20599
dad29624b056
obsolete: extract encoding of marker for pushkey from the list key function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20585
diff
changeset
|
781 |
17075
28ed1c4511ce
obsolete: exchange obsolete marker over pushkey
Pierre-Yves.David@ens-lyon.org
parents:
17073
diff
changeset
|
782 def pushmarker(repo, key, old, new): |
28ed1c4511ce
obsolete: exchange obsolete marker over pushkey
Pierre-Yves.David@ens-lyon.org
parents:
17073
diff
changeset
|
783 """Push markers over pushkey""" |
17295
1f08ecc7febb
pushkey: splits obsolete marker exchange into multiple keys
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17253
diff
changeset
|
784 if not key.startswith('dump'): |
17075
28ed1c4511ce
obsolete: exchange obsolete marker over pushkey
Pierre-Yves.David@ens-lyon.org
parents:
17073
diff
changeset
|
785 repo.ui.warn(_('unknown key: %r') % key) |
28ed1c4511ce
obsolete: exchange obsolete marker over pushkey
Pierre-Yves.David@ens-lyon.org
parents:
17073
diff
changeset
|
786 return 0 |
28ed1c4511ce
obsolete: exchange obsolete marker over pushkey
Pierre-Yves.David@ens-lyon.org
parents:
17073
diff
changeset
|
787 if old: |
21098
399d7770eef2
obsolete: add '%' specifier to the format string to avoid TypeError at runtime
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21024
diff
changeset
|
788 repo.ui.warn(_('unexpected old value for %r') % key) |
17075
28ed1c4511ce
obsolete: exchange obsolete marker over pushkey
Pierre-Yves.David@ens-lyon.org
parents:
17073
diff
changeset
|
789 return 0 |
32201
4462a981e8df
base85: proxy through util module
Yuya Nishihara <yuya@tcha.org>
parents:
31476
diff
changeset
|
790 data = util.b85decode(new) |
17075
28ed1c4511ce
obsolete: exchange obsolete marker over pushkey
Pierre-Yves.David@ens-lyon.org
parents:
17073
diff
changeset
|
791 lock = repo.lock() |
28ed1c4511ce
obsolete: exchange obsolete marker over pushkey
Pierre-Yves.David@ens-lyon.org
parents:
17073
diff
changeset
|
792 try: |
17126
8fa8717b47b6
obsolete: write obsolete marker inside a transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17125
diff
changeset
|
793 tr = repo.transaction('pushkey: obsolete markers') |
8fa8717b47b6
obsolete: write obsolete marker inside a transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17125
diff
changeset
|
794 try: |
8fa8717b47b6
obsolete: write obsolete marker inside a transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17125
diff
changeset
|
795 repo.obsstore.mergemarkers(tr, data) |
32326
99515353c72a
obsolete: invalidate "volatile" set cache after merging marker
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
31476
diff
changeset
|
796 repo.invalidatevolatilesets() |
17126
8fa8717b47b6
obsolete: write obsolete marker inside a transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17125
diff
changeset
|
797 tr.close() |
8fa8717b47b6
obsolete: write obsolete marker inside a transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17125
diff
changeset
|
798 return 1 |
8fa8717b47b6
obsolete: write obsolete marker inside a transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17125
diff
changeset
|
799 finally: |
8fa8717b47b6
obsolete: write obsolete marker inside a transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17125
diff
changeset
|
800 tr.release() |
17075
28ed1c4511ce
obsolete: exchange obsolete marker over pushkey
Pierre-Yves.David@ens-lyon.org
parents:
17073
diff
changeset
|
801 finally: |
28ed1c4511ce
obsolete: exchange obsolete marker over pushkey
Pierre-Yves.David@ens-lyon.org
parents:
17073
diff
changeset
|
802 lock.release() |
17073
3a79a5682af1
obsolete: add easy way to iterate over obsolete marker object
Pierre-Yves.David@ens-lyon.org
parents:
17072
diff
changeset
|
803 |
22274
10e87c67f1c7
debugobsolete: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22273
diff
changeset
|
804 def getmarkers(repo, nodes=None): |
10e87c67f1c7
debugobsolete: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22273
diff
changeset
|
805 """returns markers known in a repository |
10e87c67f1c7
debugobsolete: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22273
diff
changeset
|
806 |
10e87c67f1c7
debugobsolete: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22273
diff
changeset
|
807 If <nodes> is specified, only markers "relevant" to those nodes are are |
10e87c67f1c7
debugobsolete: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22273
diff
changeset
|
808 returned""" |
10e87c67f1c7
debugobsolete: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22273
diff
changeset
|
809 if nodes is None: |
10e87c67f1c7
debugobsolete: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22273
diff
changeset
|
810 rawmarkers = repo.obsstore |
10e87c67f1c7
debugobsolete: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22273
diff
changeset
|
811 else: |
10e87c67f1c7
debugobsolete: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22273
diff
changeset
|
812 rawmarkers = repo.obsstore.relevantmarkers(nodes) |
10e87c67f1c7
debugobsolete: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22273
diff
changeset
|
813 |
10e87c67f1c7
debugobsolete: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22273
diff
changeset
|
814 for markerdata in rawmarkers: |
17073
3a79a5682af1
obsolete: add easy way to iterate over obsolete marker object
Pierre-Yves.David@ens-lyon.org
parents:
17072
diff
changeset
|
815 yield marker(repo, markerdata) |
3a79a5682af1
obsolete: add easy way to iterate over obsolete marker object
Pierre-Yves.David@ens-lyon.org
parents:
17072
diff
changeset
|
816 |
22274
10e87c67f1c7
debugobsolete: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22273
diff
changeset
|
817 def relevantmarkers(repo, node): |
10e87c67f1c7
debugobsolete: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22273
diff
changeset
|
818 """all obsolete markers relevant to some revision""" |
10e87c67f1c7
debugobsolete: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22273
diff
changeset
|
819 for markerdata in repo.obsstore.relevantmarkers(node): |
10e87c67f1c7
debugobsolete: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22273
diff
changeset
|
820 yield marker(repo, markerdata) |
10e87c67f1c7
debugobsolete: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22273
diff
changeset
|
821 |
10e87c67f1c7
debugobsolete: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22273
diff
changeset
|
822 |
17076
75f4180509a4
obsolete: function and method to access some obsolete data
Pierre-Yves.David@ens-lyon.org
parents:
17075
diff
changeset
|
823 def precursormarkers(ctx): |
17776
072812e9f570
obsolete: flip `obstore.successors` and `obsolete.precursors`
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17775
diff
changeset
|
824 """obsolete marker marking this changeset as a successors""" |
24335
d6440a5076a5
obsolete: replace 'ctx._repo' with 'ctx.repo()'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24053
diff
changeset
|
825 for data in ctx.repo().obsstore.precursors.get(ctx.node(), ()): |
d6440a5076a5
obsolete: replace 'ctx._repo' with 'ctx.repo()'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24053
diff
changeset
|
826 yield marker(ctx.repo(), data) |
17076
75f4180509a4
obsolete: function and method to access some obsolete data
Pierre-Yves.David@ens-lyon.org
parents:
17075
diff
changeset
|
827 |
75f4180509a4
obsolete: function and method to access some obsolete data
Pierre-Yves.David@ens-lyon.org
parents:
17075
diff
changeset
|
828 def successormarkers(ctx): |
17776
072812e9f570
obsolete: flip `obstore.successors` and `obsolete.precursors`
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17775
diff
changeset
|
829 """obsolete marker making this changeset obsolete""" |
24335
d6440a5076a5
obsolete: replace 'ctx._repo' with 'ctx.repo()'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24053
diff
changeset
|
830 for data in ctx.repo().obsstore.successors.get(ctx.node(), ()): |
d6440a5076a5
obsolete: replace 'ctx._repo' with 'ctx.repo()'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24053
diff
changeset
|
831 yield marker(ctx.repo(), data) |
17076
75f4180509a4
obsolete: function and method to access some obsolete data
Pierre-Yves.David@ens-lyon.org
parents:
17075
diff
changeset
|
832 |
17831
70b08df24fef
obsolete: add a flag that allows fixing "bumped" changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17828
diff
changeset
|
833 def allsuccessors(obsstore, nodes, ignoreflags=0): |
17827
612db9d7e76a
obsolete: have `allsuccessors` takes a list of nodes
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17826
diff
changeset
|
834 """Yield node for every successor of <nodes>. |
612db9d7e76a
obsolete: have `allsuccessors` takes a list of nodes
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17826
diff
changeset
|
835 |
612db9d7e76a
obsolete: have `allsuccessors` takes a list of nodes
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17826
diff
changeset
|
836 Some successors may be unknown locally. |
17213
7eb5aa1f83fd
obsolete: add an any successors function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17200
diff
changeset
|
837 |
20204
b0c14c5d44b1
obsolete: improve allsuccessors doc string
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20203
diff
changeset
|
838 This is a linear yield unsuited to detecting split changesets. It includes |
b0c14c5d44b1
obsolete: improve allsuccessors doc string
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20203
diff
changeset
|
839 initial nodes too.""" |
17827
612db9d7e76a
obsolete: have `allsuccessors` takes a list of nodes
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17826
diff
changeset
|
840 remaining = set(nodes) |
17213
7eb5aa1f83fd
obsolete: add an any successors function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17200
diff
changeset
|
841 seen = set(remaining) |
7eb5aa1f83fd
obsolete: add an any successors function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17200
diff
changeset
|
842 while remaining: |
7eb5aa1f83fd
obsolete: add an any successors function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17200
diff
changeset
|
843 current = remaining.pop() |
7eb5aa1f83fd
obsolete: add an any successors function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17200
diff
changeset
|
844 yield current |
17776
072812e9f570
obsolete: flip `obstore.successors` and `obsolete.precursors`
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17775
diff
changeset
|
845 for mark in obsstore.successors.get(current, ()): |
20203
509768fc7542
obsolete: fix bad comment
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20031
diff
changeset
|
846 # ignore marker flagged with specified flag |
17831
70b08df24fef
obsolete: add a flag that allows fixing "bumped" changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17828
diff
changeset
|
847 if mark[2] & ignoreflags: |
70b08df24fef
obsolete: add a flag that allows fixing "bumped" changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17828
diff
changeset
|
848 continue |
17213
7eb5aa1f83fd
obsolete: add an any successors function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17200
diff
changeset
|
849 for suc in mark[1]: |
7eb5aa1f83fd
obsolete: add an any successors function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17200
diff
changeset
|
850 if suc not in seen: |
7eb5aa1f83fd
obsolete: add an any successors function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17200
diff
changeset
|
851 seen.add(suc) |
7eb5aa1f83fd
obsolete: add an any successors function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17200
diff
changeset
|
852 remaining.add(suc) |
17469
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
853 |
20206
cdcbe103b69a
obsolete: add an allprecursors method mirroring allsuccessors one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20204
diff
changeset
|
854 def allprecursors(obsstore, nodes, ignoreflags=0): |
cdcbe103b69a
obsolete: add an allprecursors method mirroring allsuccessors one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20204
diff
changeset
|
855 """Yield node for every precursors of <nodes>. |
cdcbe103b69a
obsolete: add an allprecursors method mirroring allsuccessors one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20204
diff
changeset
|
856 |
cdcbe103b69a
obsolete: add an allprecursors method mirroring allsuccessors one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20204
diff
changeset
|
857 Some precursors may be unknown locally. |
cdcbe103b69a
obsolete: add an allprecursors method mirroring allsuccessors one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20204
diff
changeset
|
858 |
cdcbe103b69a
obsolete: add an allprecursors method mirroring allsuccessors one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20204
diff
changeset
|
859 This is a linear yield unsuited to detecting folded changesets. It includes |
cdcbe103b69a
obsolete: add an allprecursors method mirroring allsuccessors one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20204
diff
changeset
|
860 initial nodes too.""" |
cdcbe103b69a
obsolete: add an allprecursors method mirroring allsuccessors one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20204
diff
changeset
|
861 |
cdcbe103b69a
obsolete: add an allprecursors method mirroring allsuccessors one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20204
diff
changeset
|
862 remaining = set(nodes) |
cdcbe103b69a
obsolete: add an allprecursors method mirroring allsuccessors one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20204
diff
changeset
|
863 seen = set(remaining) |
cdcbe103b69a
obsolete: add an allprecursors method mirroring allsuccessors one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20204
diff
changeset
|
864 while remaining: |
cdcbe103b69a
obsolete: add an allprecursors method mirroring allsuccessors one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20204
diff
changeset
|
865 current = remaining.pop() |
cdcbe103b69a
obsolete: add an allprecursors method mirroring allsuccessors one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20204
diff
changeset
|
866 yield current |
cdcbe103b69a
obsolete: add an allprecursors method mirroring allsuccessors one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20204
diff
changeset
|
867 for mark in obsstore.precursors.get(current, ()): |
cdcbe103b69a
obsolete: add an allprecursors method mirroring allsuccessors one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20204
diff
changeset
|
868 # ignore marker flagged with specified flag |
cdcbe103b69a
obsolete: add an allprecursors method mirroring allsuccessors one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20204
diff
changeset
|
869 if mark[2] & ignoreflags: |
cdcbe103b69a
obsolete: add an allprecursors method mirroring allsuccessors one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20204
diff
changeset
|
870 continue |
cdcbe103b69a
obsolete: add an allprecursors method mirroring allsuccessors one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20204
diff
changeset
|
871 suc = mark[0] |
cdcbe103b69a
obsolete: add an allprecursors method mirroring allsuccessors one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20204
diff
changeset
|
872 if suc not in seen: |
cdcbe103b69a
obsolete: add an allprecursors method mirroring allsuccessors one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20204
diff
changeset
|
873 seen.add(suc) |
cdcbe103b69a
obsolete: add an allprecursors method mirroring allsuccessors one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20204
diff
changeset
|
874 remaining.add(suc) |
cdcbe103b69a
obsolete: add an allprecursors method mirroring allsuccessors one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20204
diff
changeset
|
875 |
18984
efef056b1ae9
obsolete: extract foreground computation from bookmark.validdest
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18904
diff
changeset
|
876 def foreground(repo, nodes): |
efef056b1ae9
obsolete: extract foreground computation from bookmark.validdest
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18904
diff
changeset
|
877 """return all nodes in the "foreground" of other node |
efef056b1ae9
obsolete: extract foreground computation from bookmark.validdest
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18904
diff
changeset
|
878 |
efef056b1ae9
obsolete: extract foreground computation from bookmark.validdest
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18904
diff
changeset
|
879 The foreground of a revision is anything reachable using parent -> children |
19951
d51c4d85ec23
spelling: random spell checker fixes
Mads Kiilerich <madski@unity3d.com>
parents:
19618
diff
changeset
|
880 or precursor -> successor relation. It is very similar to "descendant" but |
18984
efef056b1ae9
obsolete: extract foreground computation from bookmark.validdest
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18904
diff
changeset
|
881 augmented with obsolescence information. |
efef056b1ae9
obsolete: extract foreground computation from bookmark.validdest
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18904
diff
changeset
|
882 |
19951
d51c4d85ec23
spelling: random spell checker fixes
Mads Kiilerich <madski@unity3d.com>
parents:
19618
diff
changeset
|
883 Beware that possible obsolescence cycle may result if complex situation. |
18984
efef056b1ae9
obsolete: extract foreground computation from bookmark.validdest
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18904
diff
changeset
|
884 """ |
efef056b1ae9
obsolete: extract foreground computation from bookmark.validdest
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18904
diff
changeset
|
885 repo = repo.unfiltered() |
efef056b1ae9
obsolete: extract foreground computation from bookmark.validdest
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18904
diff
changeset
|
886 foreground = set(repo.set('%ln::', nodes)) |
efef056b1ae9
obsolete: extract foreground computation from bookmark.validdest
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18904
diff
changeset
|
887 if repo.obsstore: |
efef056b1ae9
obsolete: extract foreground computation from bookmark.validdest
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18904
diff
changeset
|
888 # We only need this complicated logic if there is obsolescence |
efef056b1ae9
obsolete: extract foreground computation from bookmark.validdest
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18904
diff
changeset
|
889 # XXX will probably deserve an optimised revset. |
efef056b1ae9
obsolete: extract foreground computation from bookmark.validdest
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18904
diff
changeset
|
890 nm = repo.changelog.nodemap |
efef056b1ae9
obsolete: extract foreground computation from bookmark.validdest
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18904
diff
changeset
|
891 plen = -1 |
efef056b1ae9
obsolete: extract foreground computation from bookmark.validdest
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18904
diff
changeset
|
892 # compute the whole set of successors or descendants |
efef056b1ae9
obsolete: extract foreground computation from bookmark.validdest
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18904
diff
changeset
|
893 while len(foreground) != plen: |
efef056b1ae9
obsolete: extract foreground computation from bookmark.validdest
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18904
diff
changeset
|
894 plen = len(foreground) |
efef056b1ae9
obsolete: extract foreground computation from bookmark.validdest
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18904
diff
changeset
|
895 succs = set(c.node() for c in foreground) |
efef056b1ae9
obsolete: extract foreground computation from bookmark.validdest
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18904
diff
changeset
|
896 mutable = [c.node() for c in foreground if c.mutable()] |
efef056b1ae9
obsolete: extract foreground computation from bookmark.validdest
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18904
diff
changeset
|
897 succs.update(allsuccessors(repo.obsstore, mutable)) |
efef056b1ae9
obsolete: extract foreground computation from bookmark.validdest
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18904
diff
changeset
|
898 known = (n for n in succs if n in nm) |
efef056b1ae9
obsolete: extract foreground computation from bookmark.validdest
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18904
diff
changeset
|
899 foreground = set(repo.set('%ln::', known)) |
efef056b1ae9
obsolete: extract foreground computation from bookmark.validdest
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18904
diff
changeset
|
900 return set(c.node() for c in foreground) |
efef056b1ae9
obsolete: extract foreground computation from bookmark.validdest
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18904
diff
changeset
|
901 |
efef056b1ae9
obsolete: extract foreground computation from bookmark.validdest
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18904
diff
changeset
|
902 |
18068
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
903 def successorssets(repo, initialnode, cache=None): |
26265
077f20eed4b2
obsolete: clarify that 'successorssets' returns the latest successors
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26264
diff
changeset
|
904 """Return set of all latest successors of initial nodes |
18068
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
905 |
26204
54875a6c3714
obsolete: improve English of successorssets
timeless@mozdev.org
parents:
25669
diff
changeset
|
906 The successors set of a changeset A are the group of revisions that succeed |
20277
c05b968d05eb
obsolete: clarify documentation for succcessorssets
Sean Farley <sean.michael.farley@gmail.com>
parents:
20207
diff
changeset
|
907 A. It succeeds A as a consistent whole, each revision being only a partial |
c05b968d05eb
obsolete: clarify documentation for succcessorssets
Sean Farley <sean.michael.farley@gmail.com>
parents:
20207
diff
changeset
|
908 replacement. The successors set contains non-obsolete changesets only. |
18068
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
909 |
20277
c05b968d05eb
obsolete: clarify documentation for succcessorssets
Sean Farley <sean.michael.farley@gmail.com>
parents:
20207
diff
changeset
|
910 This function returns the full list of successor sets which is why it |
c05b968d05eb
obsolete: clarify documentation for succcessorssets
Sean Farley <sean.michael.farley@gmail.com>
parents:
20207
diff
changeset
|
911 returns a list of tuples and not just a single tuple. Each tuple is a valid |
26204
54875a6c3714
obsolete: improve English of successorssets
timeless@mozdev.org
parents:
25669
diff
changeset
|
912 successors set. Note that (A,) may be a valid successors set for changeset A |
20277
c05b968d05eb
obsolete: clarify documentation for succcessorssets
Sean Farley <sean.michael.farley@gmail.com>
parents:
20207
diff
changeset
|
913 (see below). |
18068
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
914 |
20277
c05b968d05eb
obsolete: clarify documentation for succcessorssets
Sean Farley <sean.michael.farley@gmail.com>
parents:
20207
diff
changeset
|
915 In most cases, a changeset A will have a single element (e.g. the changeset |
c05b968d05eb
obsolete: clarify documentation for succcessorssets
Sean Farley <sean.michael.farley@gmail.com>
parents:
20207
diff
changeset
|
916 A is replaced by A') in its successors set. Though, it is also common for a |
c05b968d05eb
obsolete: clarify documentation for succcessorssets
Sean Farley <sean.michael.farley@gmail.com>
parents:
20207
diff
changeset
|
917 changeset A to have no elements in its successor set (e.g. the changeset |
c05b968d05eb
obsolete: clarify documentation for succcessorssets
Sean Farley <sean.michael.farley@gmail.com>
parents:
20207
diff
changeset
|
918 has been pruned). Therefore, the returned list of successors sets will be |
c05b968d05eb
obsolete: clarify documentation for succcessorssets
Sean Farley <sean.michael.farley@gmail.com>
parents:
20207
diff
changeset
|
919 [(A',)] or [], respectively. |
18068
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
920 |
20277
c05b968d05eb
obsolete: clarify documentation for succcessorssets
Sean Farley <sean.michael.farley@gmail.com>
parents:
20207
diff
changeset
|
921 When a changeset A is split into A' and B', however, it will result in a |
c05b968d05eb
obsolete: clarify documentation for succcessorssets
Sean Farley <sean.michael.farley@gmail.com>
parents:
20207
diff
changeset
|
922 successors set containing more than a single element, i.e. [(A',B')]. |
c05b968d05eb
obsolete: clarify documentation for succcessorssets
Sean Farley <sean.michael.farley@gmail.com>
parents:
20207
diff
changeset
|
923 Divergent changesets will result in multiple successors sets, i.e. [(A',), |
c05b968d05eb
obsolete: clarify documentation for succcessorssets
Sean Farley <sean.michael.farley@gmail.com>
parents:
20207
diff
changeset
|
924 (A'')]. |
18068
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
925 |
20277
c05b968d05eb
obsolete: clarify documentation for succcessorssets
Sean Farley <sean.michael.farley@gmail.com>
parents:
20207
diff
changeset
|
926 If a changeset A is not obsolete, then it will conceptually have no |
c05b968d05eb
obsolete: clarify documentation for succcessorssets
Sean Farley <sean.michael.farley@gmail.com>
parents:
20207
diff
changeset
|
927 successors set. To distinguish this from a pruned changeset, the successor |
26204
54875a6c3714
obsolete: improve English of successorssets
timeless@mozdev.org
parents:
25669
diff
changeset
|
928 set will contain itself only, i.e. [(A,)]. |
18068
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
929 |
20277
c05b968d05eb
obsolete: clarify documentation for succcessorssets
Sean Farley <sean.michael.farley@gmail.com>
parents:
20207
diff
changeset
|
930 Finally, successors unknown locally are considered to be pruned (obsoleted |
c05b968d05eb
obsolete: clarify documentation for succcessorssets
Sean Farley <sean.michael.farley@gmail.com>
parents:
20207
diff
changeset
|
931 without any successors). |
c05b968d05eb
obsolete: clarify documentation for succcessorssets
Sean Farley <sean.michael.farley@gmail.com>
parents:
20207
diff
changeset
|
932 |
c05b968d05eb
obsolete: clarify documentation for succcessorssets
Sean Farley <sean.michael.farley@gmail.com>
parents:
20207
diff
changeset
|
933 The optional `cache` parameter is a dictionary that may contain precomputed |
c05b968d05eb
obsolete: clarify documentation for succcessorssets
Sean Farley <sean.michael.farley@gmail.com>
parents:
20207
diff
changeset
|
934 successors sets. It is meant to reuse the computation of a previous call to |
c05b968d05eb
obsolete: clarify documentation for succcessorssets
Sean Farley <sean.michael.farley@gmail.com>
parents:
20207
diff
changeset
|
935 `successorssets` when multiple calls are made at the same time. The cache |
26204
54875a6c3714
obsolete: improve English of successorssets
timeless@mozdev.org
parents:
25669
diff
changeset
|
936 dictionary is updated in place. The caller is responsible for its life |
54875a6c3714
obsolete: improve English of successorssets
timeless@mozdev.org
parents:
25669
diff
changeset
|
937 span. Code that makes multiple calls to `successorssets` *must* use this |
54875a6c3714
obsolete: improve English of successorssets
timeless@mozdev.org
parents:
25669
diff
changeset
|
938 cache mechanism or suffer terrible performance. |
20277
c05b968d05eb
obsolete: clarify documentation for succcessorssets
Sean Farley <sean.michael.farley@gmail.com>
parents:
20207
diff
changeset
|
939 """ |
18068
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
940 |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
941 succmarkers = repo.obsstore.successors |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
942 |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
943 # Stack of nodes we search successors sets for |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
944 toproceed = [initialnode] |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
945 # set version of above list for fast loop detection |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
946 # element added to "toproceed" must be added here |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
947 stackedset = set(toproceed) |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
948 if cache is None: |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
949 cache = {} |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
950 |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
951 # This while loop is the flattened version of a recursive search for |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
952 # successors sets |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
953 # |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
954 # def successorssets(x): |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
955 # successors = directsuccessors(x) |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
956 # ss = [[]] |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
957 # for succ in directsuccessors(x): |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
958 # # product as in itertools cartesian product |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
959 # ss = product(ss, successorssets(succ)) |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
960 # return ss |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
961 # |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
962 # But we can not use plain recursive calls here: |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
963 # - that would blow the python call stack |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
964 # - obsolescence markers may have cycles, we need to handle them. |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
965 # |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
966 # The `toproceed` list act as our call stack. Every node we search |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
967 # successors set for are stacked there. |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
968 # |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
969 # The `stackedset` is set version of this stack used to check if a node is |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
970 # already stacked. This check is used to detect cycles and prevent infinite |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
971 # loop. |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
972 # |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
973 # successors set of all nodes are stored in the `cache` dictionary. |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
974 # |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
975 # After this while loop ends we use the cache to return the successors sets |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
976 # for the node requested by the caller. |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
977 while toproceed: |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
978 # Every iteration tries to compute the successors sets of the topmost |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
979 # node of the stack: CURRENT. |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
980 # |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
981 # There are four possible outcomes: |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
982 # |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
983 # 1) We already know the successors sets of CURRENT: |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
984 # -> mission accomplished, pop it from the stack. |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
985 # 2) Node is not obsolete: |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
986 # -> the node is its own successors sets. Add it to the cache. |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
987 # 3) We do not know successors set of direct successors of CURRENT: |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
988 # -> We add those successors to the stack. |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
989 # 4) We know successors sets of all direct successors of CURRENT: |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
990 # -> We can compute CURRENT successors set and add it to the |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
991 # cache. |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
992 # |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
993 current = toproceed[-1] |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
994 if current in cache: |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
995 # case (1): We already know the successors sets |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
996 stackedset.remove(toproceed.pop()) |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
997 elif current not in succmarkers: |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
998 # case (2): The node is not obsolete. |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
999 if current in repo: |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1000 # We have a valid last successors. |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1001 cache[current] = [(current,)] |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1002 else: |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1003 # Final obsolete version is unknown locally. |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1004 # Do not count that as a valid successors |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1005 cache[current] = [] |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1006 else: |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1007 # cases (3) and (4) |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1008 # |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1009 # We proceed in two phases. Phase 1 aims to distinguish case (3) |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1010 # from case (4): |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1011 # |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1012 # For each direct successors of CURRENT, we check whether its |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1013 # successors sets are known. If they are not, we stack the |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1014 # unknown node and proceed to the next iteration of the while |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1015 # loop. (case 3) |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1016 # |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1017 # During this step, we may detect obsolescence cycles: a node |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1018 # with unknown successors sets but already in the call stack. |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1019 # In such a situation, we arbitrary set the successors sets of |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1020 # the node to nothing (node pruned) to break the cycle. |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1021 # |
18644
3e92772d5383
spelling: fix some minor issues found by spell checker
Mads Kiilerich <mads@kiilerich.com>
parents:
18365
diff
changeset
|
1022 # If no break was encountered we proceed to phase 2. |
18068
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1023 # |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1024 # Phase 2 computes successors sets of CURRENT (case 4); see details |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1025 # in phase 2 itself. |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1026 # |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1027 # Note the two levels of iteration in each phase. |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1028 # - The first one handles obsolescence markers using CURRENT as |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1029 # precursor (successors markers of CURRENT). |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1030 # |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1031 # Having multiple entry here means divergence. |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1032 # |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1033 # - The second one handles successors defined in each marker. |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1034 # |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1035 # Having none means pruned node, multiple successors means split, |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1036 # single successors are standard replacement. |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1037 # |
18365
4148414da120
obsolete: process markers in a stable order
Mads Kiilerich <mads@kiilerich.com>
parents:
18277
diff
changeset
|
1038 for mark in sorted(succmarkers[current]): |
18068
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1039 for suc in mark[1]: |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1040 if suc not in cache: |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1041 if suc in stackedset: |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1042 # cycle breaking |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1043 cache[suc] = [] |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1044 else: |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1045 # case (3) If we have not computed successors sets |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1046 # of one of those successors we add it to the |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1047 # `toproceed` stack and stop all work for this |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1048 # iteration. |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1049 toproceed.append(suc) |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1050 stackedset.add(suc) |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1051 break |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1052 else: |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1053 continue |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1054 break |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1055 else: |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1056 # case (4): we know all successors sets of all direct |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1057 # successors |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1058 # |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1059 # Successors set contributed by each marker depends on the |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1060 # successors sets of all its "successors" node. |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1061 # |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1062 # Each different marker is a divergence in the obsolescence |
18644
3e92772d5383
spelling: fix some minor issues found by spell checker
Mads Kiilerich <mads@kiilerich.com>
parents:
18365
diff
changeset
|
1063 # history. It contributes successors sets distinct from other |
18068
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1064 # markers. |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1065 # |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1066 # Within a marker, a successor may have divergent successors |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1067 # sets. In such a case, the marker will contribute multiple |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1068 # divergent successors sets. If multiple successors have |
21024
7731a2281cf0
spelling: fixes from spell checker
Mads Kiilerich <madski@unity3d.com>
parents:
20599
diff
changeset
|
1069 # divergent successors sets, a Cartesian product is used. |
18069
f84e731cbd20
obsolete: drop successors sets which are subset of another one
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18068
diff
changeset
|
1070 # |
f84e731cbd20
obsolete: drop successors sets which are subset of another one
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18068
diff
changeset
|
1071 # At the end we post-process successors sets to remove |
f84e731cbd20
obsolete: drop successors sets which are subset of another one
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18068
diff
changeset
|
1072 # duplicated entry and successors set that are strict subset of |
f84e731cbd20
obsolete: drop successors sets which are subset of another one
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18068
diff
changeset
|
1073 # another one. |
18068
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1074 succssets = [] |
18365
4148414da120
obsolete: process markers in a stable order
Mads Kiilerich <mads@kiilerich.com>
parents:
18277
diff
changeset
|
1075 for mark in sorted(succmarkers[current]): |
18068
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1076 # successors sets contributed by this marker |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1077 markss = [[]] |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1078 for suc in mark[1]: |
18069
f84e731cbd20
obsolete: drop successors sets which are subset of another one
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18068
diff
changeset
|
1079 # cardinal product with previous successors |
18068
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1080 productresult = [] |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1081 for prefix in markss: |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1082 for suffix in cache[suc]: |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1083 newss = list(prefix) |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1084 for part in suffix: |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1085 # do not duplicated entry in successors set |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1086 # first entry wins. |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1087 if part not in newss: |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1088 newss.append(part) |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1089 productresult.append(newss) |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1090 markss = productresult |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1091 succssets.extend(markss) |
18069
f84e731cbd20
obsolete: drop successors sets which are subset of another one
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18068
diff
changeset
|
1092 # remove duplicated and subset |
f84e731cbd20
obsolete: drop successors sets which are subset of another one
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18068
diff
changeset
|
1093 seen = [] |
f84e731cbd20
obsolete: drop successors sets which are subset of another one
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18068
diff
changeset
|
1094 final = [] |
f84e731cbd20
obsolete: drop successors sets which are subset of another one
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18068
diff
changeset
|
1095 candidate = sorted(((set(s), s) for s in succssets if s), |
f84e731cbd20
obsolete: drop successors sets which are subset of another one
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18068
diff
changeset
|
1096 key=lambda x: len(x[1]), reverse=True) |
f84e731cbd20
obsolete: drop successors sets which are subset of another one
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18068
diff
changeset
|
1097 for setversion, listversion in candidate: |
f84e731cbd20
obsolete: drop successors sets which are subset of another one
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18068
diff
changeset
|
1098 for seenset in seen: |
f84e731cbd20
obsolete: drop successors sets which are subset of another one
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18068
diff
changeset
|
1099 if setversion.issubset(seenset): |
f84e731cbd20
obsolete: drop successors sets which are subset of another one
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18068
diff
changeset
|
1100 break |
f84e731cbd20
obsolete: drop successors sets which are subset of another one
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18068
diff
changeset
|
1101 else: |
f84e731cbd20
obsolete: drop successors sets which are subset of another one
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18068
diff
changeset
|
1102 final.append(listversion) |
f84e731cbd20
obsolete: drop successors sets which are subset of another one
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18068
diff
changeset
|
1103 seen.append(setversion) |
f84e731cbd20
obsolete: drop successors sets which are subset of another one
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18068
diff
changeset
|
1104 final.reverse() # put small successors set first |
f84e731cbd20
obsolete: drop successors sets which are subset of another one
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18068
diff
changeset
|
1105 cache[current] = final |
18068
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1106 return cache[initialnode] |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1107 |
17828
9495be4126ef
obsolete: add the detection of bumped changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17827
diff
changeset
|
1108 # mapping of 'set-name' -> <function to compute this set> |
17469
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1109 cachefuncs = {} |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1110 def cachefor(name): |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1111 """Decorator to register a function as computing the cache for a set""" |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1112 def decorator(func): |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1113 assert name not in cachefuncs |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1114 cachefuncs[name] = func |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1115 return func |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1116 return decorator |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1117 |
17825
3cc06457f15e
obsolete: rename `getobscache` into `getrevs`
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17776
diff
changeset
|
1118 def getrevs(repo, name): |
17469
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1119 """Return the set of revision that belong to the <name> set |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1120 |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1121 Such access may compute the set and cache it for future use""" |
18001
e02feadd15ea
clfilter: unfilter computation of obsolescence related computation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17831
diff
changeset
|
1122 repo = repo.unfiltered() |
17469
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1123 if not repo.obsstore: |
22507
5c00c5298f98
obsolete: ensure that `getrevs` always return a set
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22394
diff
changeset
|
1124 return frozenset() |
17469
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1125 if name not in repo.obsstore.caches: |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1126 repo.obsstore.caches[name] = cachefuncs[name](repo) |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1127 return repo.obsstore.caches[name] |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1128 |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1129 # To be simple we need to invalidate obsolescence cache when: |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1130 # |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1131 # - new changeset is added: |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1132 # - public phase is changed |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1133 # - obsolescence marker are added |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1134 # - strip is used a repo |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1135 def clearobscaches(repo): |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1136 """Remove all obsolescence related cache from a repo |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1137 |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1138 This remove all cache in obsstore is the obsstore already exist on the |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1139 repo. |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1140 |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1141 (We could be smarter here given the exact event that trigger the cache |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1142 clearing)""" |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1143 # only clear cache is there is obsstore data in this repo |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1144 if 'obsstore' in repo._filecache: |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1145 repo.obsstore.caches.clear() |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1146 |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1147 @cachefor('obsolete') |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1148 def _computeobsoleteset(repo): |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1149 """the set of obsolete revisions""" |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1150 obs = set() |
27784
432242f41d9f
obsolete: make _computeobsoleteset much faster
Laurent Charignon <lc2817@columbia.edu>
parents:
27332
diff
changeset
|
1151 getnode = repo.changelog.node |
31018
cb5888c00410
obsolete: avoid using revset language to compute the obsolete revset
Jun Wu <quark@fb.com>
parents:
29976
diff
changeset
|
1152 notpublic = repo._phasecache.getrevset(repo, (phases.draft, phases.secret)) |
27784
432242f41d9f
obsolete: make _computeobsoleteset much faster
Laurent Charignon <lc2817@columbia.edu>
parents:
27332
diff
changeset
|
1153 for r in notpublic: |
432242f41d9f
obsolete: make _computeobsoleteset much faster
Laurent Charignon <lc2817@columbia.edu>
parents:
27332
diff
changeset
|
1154 if getnode(r) in repo.obsstore.successors: |
432242f41d9f
obsolete: make _computeobsoleteset much faster
Laurent Charignon <lc2817@columbia.edu>
parents:
27332
diff
changeset
|
1155 obs.add(r) |
18271
67872e939945
performance: speedup computation of obsolete revisions
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18101
diff
changeset
|
1156 return obs |
17469
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1157 |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1158 @cachefor('unstable') |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1159 def _computeunstableset(repo): |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1160 """the set of non obsolete revisions with obsolete parents""" |
24928
876a2ebfbf4f
obsolete: speed up unstable computation
Laurent Charignon <lcharignon@fb.com>
parents:
24927
diff
changeset
|
1161 revs = [(ctx.rev(), ctx) for ctx in |
876a2ebfbf4f
obsolete: speed up unstable computation
Laurent Charignon <lcharignon@fb.com>
parents:
24927
diff
changeset
|
1162 repo.set('(not public()) and (not obsolete())')] |
876a2ebfbf4f
obsolete: speed up unstable computation
Laurent Charignon <lcharignon@fb.com>
parents:
24927
diff
changeset
|
1163 revs.sort(key=lambda x:x[0]) |
876a2ebfbf4f
obsolete: speed up unstable computation
Laurent Charignon <lcharignon@fb.com>
parents:
24927
diff
changeset
|
1164 unstable = set() |
876a2ebfbf4f
obsolete: speed up unstable computation
Laurent Charignon <lcharignon@fb.com>
parents:
24927
diff
changeset
|
1165 for rev, ctx in revs: |
876a2ebfbf4f
obsolete: speed up unstable computation
Laurent Charignon <lcharignon@fb.com>
parents:
24927
diff
changeset
|
1166 # A rev is unstable if one of its parent is obsolete or unstable |
876a2ebfbf4f
obsolete: speed up unstable computation
Laurent Charignon <lcharignon@fb.com>
parents:
24927
diff
changeset
|
1167 # this works since we traverse following growing rev order |
25149
3f0744eeaeaf
cleanup: use __builtins__.any instead of util.any
Augie Fackler <augie@google.com>
parents:
25118
diff
changeset
|
1168 if any((x.obsolete() or (x.rev() in unstable)) |
24928
876a2ebfbf4f
obsolete: speed up unstable computation
Laurent Charignon <lcharignon@fb.com>
parents:
24927
diff
changeset
|
1169 for x in ctx.parents()): |
876a2ebfbf4f
obsolete: speed up unstable computation
Laurent Charignon <lcharignon@fb.com>
parents:
24927
diff
changeset
|
1170 unstable.add(rev) |
876a2ebfbf4f
obsolete: speed up unstable computation
Laurent Charignon <lcharignon@fb.com>
parents:
24927
diff
changeset
|
1171 return unstable |
17469
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1172 |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1173 @cachefor('suspended') |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1174 def _computesuspendedset(repo): |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1175 """the set of obsolete parents with non obsolete descendants""" |
18276
834ef7e70d0f
performance: speedup computation of suspended revisions
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18275
diff
changeset
|
1176 suspended = repo.changelog.ancestors(getrevs(repo, 'unstable')) |
834ef7e70d0f
performance: speedup computation of suspended revisions
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18275
diff
changeset
|
1177 return set(r for r in getrevs(repo, 'obsolete') if r in suspended) |
17469
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1178 |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1179 @cachefor('extinct') |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1180 def _computeextinctset(repo): |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1181 """the set of obsolete parents without non obsolete descendants""" |
18277
a58260bc101f
performance: speedup computation of extinct revisions
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18276
diff
changeset
|
1182 return getrevs(repo, 'obsolete') - getrevs(repo, 'suspended') |
17474
f85816af6294
obsolete: add a high level function to create an obsolete marker
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17469
diff
changeset
|
1183 |
17828
9495be4126ef
obsolete: add the detection of bumped changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17827
diff
changeset
|
1184 |
9495be4126ef
obsolete: add the detection of bumped changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17827
diff
changeset
|
1185 @cachefor('bumped') |
9495be4126ef
obsolete: add the detection of bumped changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17827
diff
changeset
|
1186 def _computebumpedset(repo): |
9495be4126ef
obsolete: add the detection of bumped changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17827
diff
changeset
|
1187 """the set of revs trying to obsolete public revisions""" |
20207
cd62532c62a1
obsolete: order of magnitude speedup in _computebumpedset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20206
diff
changeset
|
1188 bumped = set() |
21024
7731a2281cf0
spelling: fixes from spell checker
Mads Kiilerich <madski@unity3d.com>
parents:
20599
diff
changeset
|
1189 # util function (avoid attribute lookup in the loop) |
20207
cd62532c62a1
obsolete: order of magnitude speedup in _computebumpedset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20206
diff
changeset
|
1190 phase = repo._phasecache.phase # would be faster to grab the full list |
cd62532c62a1
obsolete: order of magnitude speedup in _computebumpedset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20206
diff
changeset
|
1191 public = phases.public |
cd62532c62a1
obsolete: order of magnitude speedup in _computebumpedset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20206
diff
changeset
|
1192 cl = repo.changelog |
cd62532c62a1
obsolete: order of magnitude speedup in _computebumpedset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20206
diff
changeset
|
1193 torev = cl.nodemap.get |
24927
cd0068232ec0
obsolete: speed up computation of bumped revset
Laurent Charignon <lcharignon@fb.com>
parents:
24393
diff
changeset
|
1194 for ctx in repo.set('(not public()) and (not obsolete())'): |
cd0068232ec0
obsolete: speed up computation of bumped revset
Laurent Charignon <lcharignon@fb.com>
parents:
24393
diff
changeset
|
1195 rev = ctx.rev() |
20207
cd62532c62a1
obsolete: order of magnitude speedup in _computebumpedset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20206
diff
changeset
|
1196 # We only evaluate mutable, non-obsolete revision |
24927
cd0068232ec0
obsolete: speed up computation of bumped revset
Laurent Charignon <lcharignon@fb.com>
parents:
24393
diff
changeset
|
1197 node = ctx.node() |
cd0068232ec0
obsolete: speed up computation of bumped revset
Laurent Charignon <lcharignon@fb.com>
parents:
24393
diff
changeset
|
1198 # (future) A cache of precursors may worth if split is very common |
cd0068232ec0
obsolete: speed up computation of bumped revset
Laurent Charignon <lcharignon@fb.com>
parents:
24393
diff
changeset
|
1199 for pnode in allprecursors(repo.obsstore, [node], |
cd0068232ec0
obsolete: speed up computation of bumped revset
Laurent Charignon <lcharignon@fb.com>
parents:
24393
diff
changeset
|
1200 ignoreflags=bumpedfix): |
cd0068232ec0
obsolete: speed up computation of bumped revset
Laurent Charignon <lcharignon@fb.com>
parents:
24393
diff
changeset
|
1201 prev = torev(pnode) # unfiltered! but so is phasecache |
cd0068232ec0
obsolete: speed up computation of bumped revset
Laurent Charignon <lcharignon@fb.com>
parents:
24393
diff
changeset
|
1202 if (prev is not None) and (phase(repo, prev) <= public): |
29281 | 1203 # we have a public precursor |
24927
cd0068232ec0
obsolete: speed up computation of bumped revset
Laurent Charignon <lcharignon@fb.com>
parents:
24393
diff
changeset
|
1204 bumped.add(rev) |
cd0068232ec0
obsolete: speed up computation of bumped revset
Laurent Charignon <lcharignon@fb.com>
parents:
24393
diff
changeset
|
1205 break # Next draft! |
20207
cd62532c62a1
obsolete: order of magnitude speedup in _computebumpedset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20206
diff
changeset
|
1206 return bumped |
17828
9495be4126ef
obsolete: add the detection of bumped changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17827
diff
changeset
|
1207 |
18070
af632936d3d9
obsolete: detect divergent changesets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18069
diff
changeset
|
1208 @cachefor('divergent') |
af632936d3d9
obsolete: detect divergent changesets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18069
diff
changeset
|
1209 def _computedivergentset(repo): |
af632936d3d9
obsolete: detect divergent changesets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18069
diff
changeset
|
1210 """the set of rev that compete to be the final successors of some revision. |
af632936d3d9
obsolete: detect divergent changesets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18069
diff
changeset
|
1211 """ |
af632936d3d9
obsolete: detect divergent changesets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18069
diff
changeset
|
1212 divergent = set() |
af632936d3d9
obsolete: detect divergent changesets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18069
diff
changeset
|
1213 obsstore = repo.obsstore |
af632936d3d9
obsolete: detect divergent changesets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18069
diff
changeset
|
1214 newermap = {} |
af632936d3d9
obsolete: detect divergent changesets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18069
diff
changeset
|
1215 for ctx in repo.set('(not public()) - obsolete()'): |
af632936d3d9
obsolete: detect divergent changesets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18069
diff
changeset
|
1216 mark = obsstore.precursors.get(ctx.node(), ()) |
af632936d3d9
obsolete: detect divergent changesets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18069
diff
changeset
|
1217 toprocess = set(mark) |
24393
77eace2a63cb
obsolete: avoid infinite loop from obs-cycle in divergence (issue4126)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24335
diff
changeset
|
1218 seen = set() |
18070
af632936d3d9
obsolete: detect divergent changesets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18069
diff
changeset
|
1219 while toprocess: |
af632936d3d9
obsolete: detect divergent changesets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18069
diff
changeset
|
1220 prec = toprocess.pop()[0] |
24393
77eace2a63cb
obsolete: avoid infinite loop from obs-cycle in divergence (issue4126)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24335
diff
changeset
|
1221 if prec in seen: |
77eace2a63cb
obsolete: avoid infinite loop from obs-cycle in divergence (issue4126)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24335
diff
changeset
|
1222 continue # emergency cycle hanging prevention |
77eace2a63cb
obsolete: avoid infinite loop from obs-cycle in divergence (issue4126)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24335
diff
changeset
|
1223 seen.add(prec) |
18070
af632936d3d9
obsolete: detect divergent changesets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18069
diff
changeset
|
1224 if prec not in newermap: |
af632936d3d9
obsolete: detect divergent changesets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18069
diff
changeset
|
1225 successorssets(repo, prec, newermap) |
af632936d3d9
obsolete: detect divergent changesets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18069
diff
changeset
|
1226 newer = [n for n in newermap[prec] if n] |
af632936d3d9
obsolete: detect divergent changesets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18069
diff
changeset
|
1227 if len(newer) > 1: |
af632936d3d9
obsolete: detect divergent changesets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18069
diff
changeset
|
1228 divergent.add(ctx.rev()) |
af632936d3d9
obsolete: detect divergent changesets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18069
diff
changeset
|
1229 break |
af632936d3d9
obsolete: detect divergent changesets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18069
diff
changeset
|
1230 toprocess.update(obsstore.precursors.get(prec, ())) |
af632936d3d9
obsolete: detect divergent changesets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18069
diff
changeset
|
1231 return divergent |
af632936d3d9
obsolete: detect divergent changesets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18069
diff
changeset
|
1232 |
af632936d3d9
obsolete: detect divergent changesets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18069
diff
changeset
|
1233 |
32327
3546a771e376
obsolete: add operation metadata to rebase/amend/histedit obsmarkers
Durham Goode <durham@fb.com>
parents:
32278
diff
changeset
|
1234 def createmarkers(repo, relations, flag=0, date=None, metadata=None, |
3546a771e376
obsolete: add operation metadata to rebase/amend/histedit obsmarkers
Durham Goode <durham@fb.com>
parents:
32278
diff
changeset
|
1235 operation=None): |
17474
f85816af6294
obsolete: add a high level function to create an obsolete marker
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17469
diff
changeset
|
1236 """Add obsolete markers between changesets in a repo |
f85816af6294
obsolete: add a high level function to create an obsolete marker
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17469
diff
changeset
|
1237 |
20517
2158e8f3cbd2
createmarkers: allow to pass metadata for a marker only
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20516
diff
changeset
|
1238 <relations> must be an iterable of (<old>, (<new>, ...)[,{metadata}]) |
21024
7731a2281cf0
spelling: fixes from spell checker
Mads Kiilerich <madski@unity3d.com>
parents:
20599
diff
changeset
|
1239 tuple. `old` and `news` are changectx. metadata is an optional dictionary |
20517
2158e8f3cbd2
createmarkers: allow to pass metadata for a marker only
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20516
diff
changeset
|
1240 containing metadata for this marker only. It is merged with the global |
2158e8f3cbd2
createmarkers: allow to pass metadata for a marker only
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20516
diff
changeset
|
1241 metadata specified through the `metadata` argument of this function, |
17474
f85816af6294
obsolete: add a high level function to create an obsolete marker
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17469
diff
changeset
|
1242 |
f85816af6294
obsolete: add a high level function to create an obsolete marker
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17469
diff
changeset
|
1243 Trying to obsolete a public changeset will raise an exception. |
f85816af6294
obsolete: add a high level function to create an obsolete marker
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17469
diff
changeset
|
1244 |
f85816af6294
obsolete: add a high level function to create an obsolete marker
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17469
diff
changeset
|
1245 Current user and date are used except if specified otherwise in the |
f85816af6294
obsolete: add a high level function to create an obsolete marker
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17469
diff
changeset
|
1246 metadata attribute. |
f85816af6294
obsolete: add a high level function to create an obsolete marker
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17469
diff
changeset
|
1247 |
f85816af6294
obsolete: add a high level function to create an obsolete marker
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17469
diff
changeset
|
1248 This function operates within a transaction of its own, but does |
f85816af6294
obsolete: add a high level function to create an obsolete marker
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17469
diff
changeset
|
1249 not take any lock on the repo. |
f85816af6294
obsolete: add a high level function to create an obsolete marker
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17469
diff
changeset
|
1250 """ |
f85816af6294
obsolete: add a high level function to create an obsolete marker
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17469
diff
changeset
|
1251 # prepare metadata |
f85816af6294
obsolete: add a high level function to create an obsolete marker
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17469
diff
changeset
|
1252 if metadata is None: |
f85816af6294
obsolete: add a high level function to create an obsolete marker
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17469
diff
changeset
|
1253 metadata = {} |
f85816af6294
obsolete: add a high level function to create an obsolete marker
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17469
diff
changeset
|
1254 if 'user' not in metadata: |
f85816af6294
obsolete: add a high level function to create an obsolete marker
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17469
diff
changeset
|
1255 metadata['user'] = repo.ui.username() |
32354
f432897a9f49
obsmarker: add an experimental flag controlling "operation" recording
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32333
diff
changeset
|
1256 useoperation = repo.ui.configbool('experimental', |
f432897a9f49
obsmarker: add an experimental flag controlling "operation" recording
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32333
diff
changeset
|
1257 'evolution.track-operation', |
f432897a9f49
obsmarker: add an experimental flag controlling "operation" recording
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32333
diff
changeset
|
1258 False) |
f432897a9f49
obsmarker: add an experimental flag controlling "operation" recording
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32333
diff
changeset
|
1259 if useoperation and operation: |
32327
3546a771e376
obsolete: add operation metadata to rebase/amend/histedit obsmarkers
Durham Goode <durham@fb.com>
parents:
32278
diff
changeset
|
1260 metadata['operation'] = operation |
17474
f85816af6294
obsolete: add a high level function to create an obsolete marker
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17469
diff
changeset
|
1261 tr = repo.transaction('add-obsolescence-marker') |
f85816af6294
obsolete: add a high level function to create an obsolete marker
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17469
diff
changeset
|
1262 try: |
27984
e60e13a86529
obsolete: fix n^2 marker computation behavior
Durham Goode <durham@fb.com>
parents:
27784
diff
changeset
|
1263 markerargs = [] |
20517
2158e8f3cbd2
createmarkers: allow to pass metadata for a marker only
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20516
diff
changeset
|
1264 for rel in relations: |
2158e8f3cbd2
createmarkers: allow to pass metadata for a marker only
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20516
diff
changeset
|
1265 prec = rel[0] |
2158e8f3cbd2
createmarkers: allow to pass metadata for a marker only
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20516
diff
changeset
|
1266 sucs = rel[1] |
2158e8f3cbd2
createmarkers: allow to pass metadata for a marker only
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20516
diff
changeset
|
1267 localmetadata = metadata.copy() |
2158e8f3cbd2
createmarkers: allow to pass metadata for a marker only
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20516
diff
changeset
|
1268 if 2 < len(rel): |
2158e8f3cbd2
createmarkers: allow to pass metadata for a marker only
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20516
diff
changeset
|
1269 localmetadata.update(rel[2]) |
2158e8f3cbd2
createmarkers: allow to pass metadata for a marker only
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20516
diff
changeset
|
1270 |
17474
f85816af6294
obsolete: add a high level function to create an obsolete marker
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17469
diff
changeset
|
1271 if not prec.mutable(): |
29389
98e8313dcd9e
i18n: translate abort messages
liscju <piotr.listkiewicz@gmail.com>
parents:
29281
diff
changeset
|
1272 raise error.Abort(_("cannot obsolete public changeset: %s") |
25412
443d4635e630
phases: add `hg help phases` hint to failures to edit public commits
Jordi Guti?rrez Hermoso <jordigh@octave.org>
parents:
25411
diff
changeset
|
1273 % prec, |
29976
42d031560294
obsolete: use single quotes in use warning
timeless <timeless@mozdev.org>
parents:
29894
diff
changeset
|
1274 hint="see 'hg help phases' for details") |
17474
f85816af6294
obsolete: add a high level function to create an obsolete marker
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17469
diff
changeset
|
1275 nprec = prec.node() |
f85816af6294
obsolete: add a high level function to create an obsolete marker
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17469
diff
changeset
|
1276 nsucs = tuple(s.node() for s in sucs) |
22256
3ae6cc6173e3
createmarkers: automatically record the parent of pruned changesets
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22255
diff
changeset
|
1277 npare = None |
3ae6cc6173e3
createmarkers: automatically record the parent of pruned changesets
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22255
diff
changeset
|
1278 if not nsucs: |
3ae6cc6173e3
createmarkers: automatically record the parent of pruned changesets
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22255
diff
changeset
|
1279 npare = tuple(p.node() for p in prec.parents()) |
17474
f85816af6294
obsolete: add a high level function to create an obsolete marker
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17469
diff
changeset
|
1280 if nprec in nsucs: |
29389
98e8313dcd9e
i18n: translate abort messages
liscju <piotr.listkiewicz@gmail.com>
parents:
29281
diff
changeset
|
1281 raise error.Abort(_("changeset %s cannot obsolete itself") |
98e8313dcd9e
i18n: translate abort messages
liscju <piotr.listkiewicz@gmail.com>
parents:
29281
diff
changeset
|
1282 % prec) |
27984
e60e13a86529
obsolete: fix n^2 marker computation behavior
Durham Goode <durham@fb.com>
parents:
27784
diff
changeset
|
1283 |
e60e13a86529
obsolete: fix n^2 marker computation behavior
Durham Goode <durham@fb.com>
parents:
27784
diff
changeset
|
1284 # Creating the marker causes the hidden cache to become invalid, |
e60e13a86529
obsolete: fix n^2 marker computation behavior
Durham Goode <durham@fb.com>
parents:
27784
diff
changeset
|
1285 # which causes recomputation when we ask for prec.parents() above. |
e60e13a86529
obsolete: fix n^2 marker computation behavior
Durham Goode <durham@fb.com>
parents:
27784
diff
changeset
|
1286 # Resulting in n^2 behavior. So let's prepare all of the args |
e60e13a86529
obsolete: fix n^2 marker computation behavior
Durham Goode <durham@fb.com>
parents:
27784
diff
changeset
|
1287 # first, then create the markers. |
e60e13a86529
obsolete: fix n^2 marker computation behavior
Durham Goode <durham@fb.com>
parents:
27784
diff
changeset
|
1288 markerargs.append((nprec, nsucs, npare, localmetadata)) |
e60e13a86529
obsolete: fix n^2 marker computation behavior
Durham Goode <durham@fb.com>
parents:
27784
diff
changeset
|
1289 |
e60e13a86529
obsolete: fix n^2 marker computation behavior
Durham Goode <durham@fb.com>
parents:
27784
diff
changeset
|
1290 for args in markerargs: |
e60e13a86529
obsolete: fix n^2 marker computation behavior
Durham Goode <durham@fb.com>
parents:
27784
diff
changeset
|
1291 nprec, nsucs, npare, localmetadata = args |
22256
3ae6cc6173e3
createmarkers: automatically record the parent of pruned changesets
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22255
diff
changeset
|
1292 repo.obsstore.create(tr, nprec, nsucs, flag, parents=npare, |
32411
08d02c1d7e67
devel: use default-date config field when creating obsmarkers
Boris Feld <boris.feld@octobus.net>
parents:
32387
diff
changeset
|
1293 date=date, metadata=localmetadata, |
08d02c1d7e67
devel: use default-date config field when creating obsmarkers
Boris Feld <boris.feld@octobus.net>
parents:
32387
diff
changeset
|
1294 ui=repo.ui) |
18101
a464deecc9dd
clfilter: add a cache on repo for set of revision to filter for a given set.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18070
diff
changeset
|
1295 repo.filteredrevcache.clear() |
17474
f85816af6294
obsolete: add a high level function to create an obsolete marker
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17469
diff
changeset
|
1296 tr.close() |
f85816af6294
obsolete: add a high level function to create an obsolete marker
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17469
diff
changeset
|
1297 finally: |
f85816af6294
obsolete: add a high level function to create an obsolete marker
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17469
diff
changeset
|
1298 tr.release() |