Mercurial > hg
annotate mercurial/obsolete.py @ 27015:341cb90ffd18
util: disable floating point stat times (issue4836)
Alternate fix for this issue which avoids putting extra function calls
and exception handling in the fast path.
For almost all purposes, integer timestamps are preferable to
Mercurial. It stores integer timestamps in the dirstate and would thus
like to avoid doing any float/int comparisons or conversions. We will
continue to have to deal with 1-second granularity on filesystems for
quite some time, so this won't significantly hinder our capabilities.
This has some impact on our file cache validation code in that it
lowers timestamp resolution. But as we still have to deal with
low-resolution filesystems, we're not relying on this anyway.
An alternate approach is to use stat[ST_MTIME], which is guaranteed to
be an integer. But since this support isn't already in our extension,
we can't depend on it being available without adding a hard Python->C
API dependency that's painful for people like yours truly who have
bisect regularly and people without compilers.
author | Matt Mackall <mpm@selenic.com> |
---|---|
date | Thu, 19 Nov 2015 13:21:24 -0600 |
parents | 74ff350c208c |
children | 04f346b8768f |
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 |
13744acc4ad7
obsolete: add example of marker usage in the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17774
diff
changeset
|
45 - When changeset A is split into B and C, a single marker are used: |
13744acc4ad7
obsolete: add example of marker usage in the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17774
diff
changeset
|
46 |
13744acc4ad7
obsolete: add example of marker usage in the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17774
diff
changeset
|
47 (A, (C, C)) |
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 """ |
26310
61efe9ef6ad4
obsstore: fast path to check if obsstore is empty
Yuya Nishihara <yuya@tcha.org>
parents:
26309
diff
changeset
|
70 import errno, struct |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26310
diff
changeset
|
71 import util, base85, node, parsers, error |
20207
cd62532c62a1
obsolete: order of magnitude speedup in _computebumpedset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20206
diff
changeset
|
72 import phases |
17070
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
73 from i18n import _ |
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
74 |
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
75 _pack = struct.pack |
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
76 _unpack = struct.unpack |
23498
ac910b1f5658
obsstore: prefetch struct.calcsize
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23497
diff
changeset
|
77 _calcsize = struct.calcsize |
24046
6e1d9f9932a9
obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents:
24045
diff
changeset
|
78 propertycache = util.propertycache |
17070
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
79 |
17424
e7cfe3587ea4
fix trivial spelling errors
Mads Kiilerich <mads@kiilerich.com>
parents:
17405
diff
changeset
|
80 # 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
|
81 # 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
|
82 _enabled = False |
17070
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
83 |
22951
6c86c673dde6
obsolete: add createmarkers option
Durham Goode <durham@fb.com>
parents:
22950
diff
changeset
|
84 # Options for obsolescence |
6c86c673dde6
obsolete: add createmarkers option
Durham Goode <durham@fb.com>
parents:
22950
diff
changeset
|
85 createmarkersopt = 'createmarkers' |
22952
8792ac090e3b
obsolete: add allowunstable option
Durham Goode <durham@fb.com>
parents:
22951
diff
changeset
|
86 allowunstableopt = 'allowunstable' |
22953
b1d694d3975e
obsolete: add exchange option
Durham Goode <durham@fb.com>
parents:
22952
diff
changeset
|
87 exchangeopt = 'exchange' |
22951
6c86c673dde6
obsolete: add createmarkers option
Durham Goode <durham@fb.com>
parents:
22950
diff
changeset
|
88 |
17831
70b08df24fef
obsolete: add a flag that allows fixing "bumped" changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17828
diff
changeset
|
89 ### 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
|
90 |
70b08df24fef
obsolete: add a flag that allows fixing "bumped" changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17828
diff
changeset
|
91 ## bumpedfix flag |
70b08df24fef
obsolete: add a flag that allows fixing "bumped" changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17828
diff
changeset
|
92 # |
70b08df24fef
obsolete: add a flag that allows fixing "bumped" changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17828
diff
changeset
|
93 # 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
|
94 # "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
|
95 # |
70b08df24fef
obsolete: add a flag that allows fixing "bumped" changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17828
diff
changeset
|
96 # 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
|
97 # |`: |
70b08df24fef
obsolete: add a flag that allows fixing "bumped" changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17828
diff
changeset
|
98 # | o A |
70b08df24fef
obsolete: add a flag that allows fixing "bumped" changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17828
diff
changeset
|
99 # |/ |
70b08df24fef
obsolete: add a flag that allows fixing "bumped" changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17828
diff
changeset
|
100 # o Z |
70b08df24fef
obsolete: add a flag that allows fixing "bumped" changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17828
diff
changeset
|
101 # |
70b08df24fef
obsolete: add a flag that allows fixing "bumped" changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17828
diff
changeset
|
102 # 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
|
103 # 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
|
104 # 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
|
105 # |
70b08df24fef
obsolete: add a flag that allows fixing "bumped" changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17828
diff
changeset
|
106 # o Ad |
70b08df24fef
obsolete: add a flag that allows fixing "bumped" changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17828
diff
changeset
|
107 # |`: |
70b08df24fef
obsolete: add a flag that allows fixing "bumped" changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17828
diff
changeset
|
108 # | x A' |
70b08df24fef
obsolete: add a flag that allows fixing "bumped" changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17828
diff
changeset
|
109 # |'| |
70b08df24fef
obsolete: add a flag that allows fixing "bumped" changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17828
diff
changeset
|
110 # o | A |
70b08df24fef
obsolete: add a flag that allows fixing "bumped" changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17828
diff
changeset
|
111 # |/ |
70b08df24fef
obsolete: add a flag that allows fixing "bumped" changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17828
diff
changeset
|
112 # o Z |
70b08df24fef
obsolete: add a flag that allows fixing "bumped" changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17828
diff
changeset
|
113 # |
70b08df24fef
obsolete: add a flag that allows fixing "bumped" changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17828
diff
changeset
|
114 # 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
|
115 # 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
|
116 # 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
|
117 # 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
|
118 # "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
|
119 bumpedfix = 1 |
22850
b078e4dc9f9a
obsstore: add a flag for sha256 hashes
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22849
diff
changeset
|
120 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
|
121 |
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
|
122 ## 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
|
123 # |
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
|
124 # 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
|
125 # |
22849
fd759142c6e5
obsolete: use uint## in the format documention
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22848
diff
changeset
|
126 # - 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
|
127 # |
22849
fd759142c6e5
obsolete: use uint## in the format documention
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22848
diff
changeset
|
128 # - 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
|
129 # |
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
|
130 # - 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
|
131 # 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
|
132 # 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
|
133 # |
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
|
134 # - 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
|
135 # |
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
|
136 # - 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
|
137 # |
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
|
138 # - 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
|
139 # 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
|
140 # 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
|
141 # 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
|
142 _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
|
143 _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
|
144 _fm0node = '20s' |
23498
ac910b1f5658
obsstore: prefetch struct.calcsize
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23497
diff
changeset
|
145 _fm0fsize = _calcsize(_fm0fixed) |
ac910b1f5658
obsstore: prefetch struct.calcsize
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23497
diff
changeset
|
146 _fm0fnodesize = _calcsize(_fm0node) |
22334
f2c3cfc30e9c
obsolete: move _encodemarkers next to _readmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22333
diff
changeset
|
147 |
24014
7d9367de2654
obsolete: make optional offset parameter to fm*readmarkers required
Augie Fackler <augie@google.com>
parents:
23973
diff
changeset
|
148 def _fm0readmarkers(data, off): |
17070
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
149 # Loop on markers |
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
150 l = len(data) |
22327
f737631a9f0a
obsolete: rename all _fm to _fm0
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22326
diff
changeset
|
151 while off + _fm0fsize <= l: |
17070
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
152 # read fixed part |
22327
f737631a9f0a
obsolete: rename all _fm to _fm0
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22326
diff
changeset
|
153 cur = data[off:off + _fm0fsize] |
f737631a9f0a
obsolete: rename all _fm to _fm0
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22326
diff
changeset
|
154 off += _fm0fsize |
22685
753515d9e274
obsolete: replace "nb" notation with "num" (for "number")
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22614
diff
changeset
|
155 numsuc, mdsize, flags, pre = _unpack(_fm0fixed, cur) |
17070
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
156 # read replacement |
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
157 sucs = () |
22685
753515d9e274
obsolete: replace "nb" notation with "num" (for "number")
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22614
diff
changeset
|
158 if numsuc: |
753515d9e274
obsolete: replace "nb" notation with "num" (for "number")
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22614
diff
changeset
|
159 s = (_fm0fnodesize * numsuc) |
17070
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
160 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
|
161 sucs = _unpack(_fm0node * numsuc, cur) |
17070
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
162 off += s |
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
163 # read metadata |
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
164 # (metadata will be decoded on demand) |
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
165 metadata = data[off:off + mdsize] |
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
166 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
|
167 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
|
168 '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
|
169 % (mdsize, len(metadata))) |
17070
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
170 off += mdsize |
22847
37460ee2003c
obsolete: _rename decodemeta to _fm0decodemeta
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22846
diff
changeset
|
171 metadata = _fm0decodemeta(metadata) |
22222
883e8b6bd461
obsmarker: add `date` as an explicit field
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22221
diff
changeset
|
172 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
|
173 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
|
174 date = float(when), int(offset) |
a65697c3f20e
obsolete: avoid slow, generic date parsing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
22274
diff
changeset
|
175 except ValueError: |
22222
883e8b6bd461
obsmarker: add `date` as an explicit field
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22221
diff
changeset
|
176 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
|
177 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
|
178 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
|
179 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
|
180 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
|
181 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
|
182 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
|
183 parents = () |
cf414981978a
obsstore: also store the 'parents' field on disk
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22257
diff
changeset
|
184 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
|
185 try: |
cf414981978a
obsstore: also store the 'parents' field on disk
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22257
diff
changeset
|
186 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
|
187 # 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
|
188 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
|
189 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
|
190 parents = None |
cf414981978a
obsstore: also store the 'parents' field on disk
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22257
diff
changeset
|
191 break |
cf414981978a
obsstore: also store the 'parents' field on disk
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22257
diff
changeset
|
192 except TypeError: |
cf414981978a
obsstore: also store the 'parents' field on disk
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22257
diff
changeset
|
193 # 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
|
194 parents = None |
cf414981978a
obsstore: also store the 'parents' field on disk
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22257
diff
changeset
|
195 |
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
|
196 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
|
197 |
22258
cf414981978a
obsstore: also store the 'parents' field on disk
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22257
diff
changeset
|
198 yield (pre, sucs, flags, metadata, date, parents) |
17070
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
199 |
22330
e74f8a65252d
obsolete: move _fm0encodeonemarker next to _fm0readmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22329
diff
changeset
|
200 def _fm0encodeonemarker(marker): |
e74f8a65252d
obsolete: move _fm0encodeonemarker next to _fm0readmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22329
diff
changeset
|
201 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
|
202 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
|
203 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
|
204 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
|
205 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
|
206 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
|
207 if parents is not None: |
e74f8a65252d
obsolete: move _fm0encodeonemarker next to _fm0readmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22329
diff
changeset
|
208 if not parents: |
e74f8a65252d
obsolete: move _fm0encodeonemarker next to _fm0readmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22329
diff
changeset
|
209 # 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
|
210 metadata['p0'] = '' |
e74f8a65252d
obsolete: move _fm0encodeonemarker next to _fm0readmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22329
diff
changeset
|
211 for i, p in enumerate(parents): |
e74f8a65252d
obsolete: move _fm0encodeonemarker next to _fm0readmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22329
diff
changeset
|
212 metadata['p%i' % (i + 1)] = node.hex(p) |
22846
b1efc4893da4
obsolete: _rename encodemeta to _fm0encodemeta
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22845
diff
changeset
|
213 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
|
214 numsuc = len(sucs) |
753515d9e274
obsolete: replace "nb" notation with "num" (for "number")
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22614
diff
changeset
|
215 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
|
216 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
|
217 data.extend(sucs) |
e74f8a65252d
obsolete: move _fm0encodeonemarker next to _fm0readmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22329
diff
changeset
|
218 return _pack(format, *data) + metadata |
e74f8a65252d
obsolete: move _fm0encodeonemarker next to _fm0readmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22329
diff
changeset
|
219 |
22848
72100c1d53d4
obsolete: gather _fm0 meta encoding with other _fm0 code
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22847
diff
changeset
|
220 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
|
221 """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
|
222 |
72100c1d53d4
obsolete: gather _fm0 meta encoding with other _fm0 code
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22847
diff
changeset
|
223 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
|
224 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
|
225 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
|
226 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
|
227 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
|
228 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
|
229 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
|
230 |
72100c1d53d4
obsolete: gather _fm0 meta encoding with other _fm0 code
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22847
diff
changeset
|
231 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
|
232 """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
|
233 d = {} |
72100c1d53d4
obsolete: gather _fm0 meta encoding with other _fm0 code
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22847
diff
changeset
|
234 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
|
235 if l: |
72100c1d53d4
obsolete: gather _fm0 meta encoding with other _fm0 code
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22847
diff
changeset
|
236 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
|
237 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
|
238 return d |
72100c1d53d4
obsolete: gather _fm0 meta encoding with other _fm0 code
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22847
diff
changeset
|
239 |
22851
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
240 ## 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
|
241 # |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
242 # 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
|
243 # |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
244 # - 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
|
245 # |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
246 # - 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
|
247 # |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
248 # - 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
|
249 # |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
250 # - 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
|
251 # 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
|
252 # entries. |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
253 # |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
254 # - 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
|
255 # |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
256 # - 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
|
257 # |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
258 # 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
|
259 # 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
|
260 # 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
|
261 # 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
|
262 # |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
263 # - 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
|
264 # |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
265 # - 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
|
266 # |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
267 # - 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
|
268 # |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
269 # - 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
|
270 # |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
271 # - 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
|
272 # |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
273 # - 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
|
274 _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
|
275 _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
|
276 _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
|
277 _fm1nodesha256 = '32s' |
23499
b46876c94a93
obsstore: cache size computation for fm1 node
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23498
diff
changeset
|
278 _fm1nodesha1size = _calcsize(_fm1nodesha1) |
b46876c94a93
obsstore: cache size computation for fm1 node
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23498
diff
changeset
|
279 _fm1nodesha256size = _calcsize(_fm1nodesha256) |
23498
ac910b1f5658
obsstore: prefetch struct.calcsize
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23497
diff
changeset
|
280 _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
|
281 _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
|
282 _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
|
283 _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
|
284 _fm1metapair = 'BB' |
23498
ac910b1f5658
obsstore: prefetch struct.calcsize
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23497
diff
changeset
|
285 _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
|
286 |
24019
26fbf07482b2
_fm1readmarkers: generate list in C
Martin von Zweigbergk <martinvonz@google.com>
parents:
24018
diff
changeset
|
287 def _fm1purereadmarkers(data, off): |
23803
2763edaba857
readmarkers: promote global constants to locals for performance
Matt Mackall <mpm@selenic.com>
parents:
23802
diff
changeset
|
288 # 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
|
289 noneflag = _fm1parentnone |
2763edaba857
readmarkers: promote global constants to locals for performance
Matt Mackall <mpm@selenic.com>
parents:
23802
diff
changeset
|
290 sha2flag = usingsha256 |
2763edaba857
readmarkers: promote global constants to locals for performance
Matt Mackall <mpm@selenic.com>
parents:
23802
diff
changeset
|
291 sha1size = _fm1nodesha1size |
2763edaba857
readmarkers: promote global constants to locals for performance
Matt Mackall <mpm@selenic.com>
parents:
23802
diff
changeset
|
292 sha2size = _fm1nodesha256size |
2763edaba857
readmarkers: promote global constants to locals for performance
Matt Mackall <mpm@selenic.com>
parents:
23802
diff
changeset
|
293 sha1fmt = _fm1nodesha1 |
2763edaba857
readmarkers: promote global constants to locals for performance
Matt Mackall <mpm@selenic.com>
parents:
23802
diff
changeset
|
294 sha2fmt = _fm1nodesha256 |
2763edaba857
readmarkers: promote global constants to locals for performance
Matt Mackall <mpm@selenic.com>
parents:
23802
diff
changeset
|
295 metasize = _fm1metapairsize |
2763edaba857
readmarkers: promote global constants to locals for performance
Matt Mackall <mpm@selenic.com>
parents:
23802
diff
changeset
|
296 metafmt = _fm1metapair |
2763edaba857
readmarkers: promote global constants to locals for performance
Matt Mackall <mpm@selenic.com>
parents:
23802
diff
changeset
|
297 fsize = _fm1fsize |
2763edaba857
readmarkers: promote global constants to locals for performance
Matt Mackall <mpm@selenic.com>
parents:
23802
diff
changeset
|
298 unpack = _unpack |
2763edaba857
readmarkers: promote global constants to locals for performance
Matt Mackall <mpm@selenic.com>
parents:
23802
diff
changeset
|
299 |
22851
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
300 # Loop on markers |
23799
ffca0a14b566
readmarkers: hoist subtraction out of loop comparison
Matt Mackall <mpm@selenic.com>
parents:
23798
diff
changeset
|
301 stop = len(data) - _fm1fsize |
25211
22f4ce49044d
util: drop the 'unpacker' helper
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25149
diff
changeset
|
302 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
|
303 |
23799
ffca0a14b566
readmarkers: hoist subtraction out of loop comparison
Matt Mackall <mpm@selenic.com>
parents:
23798
diff
changeset
|
304 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
|
305 # read fixed part |
23803
2763edaba857
readmarkers: promote global constants to locals for performance
Matt Mackall <mpm@selenic.com>
parents:
23802
diff
changeset
|
306 o1 = off + fsize |
23800
83f361a21d31
readmarkers: drop a temporary
Matt Mackall <mpm@selenic.com>
parents:
23799
diff
changeset
|
307 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
|
308 |
23803
2763edaba857
readmarkers: promote global constants to locals for performance
Matt Mackall <mpm@selenic.com>
parents:
23802
diff
changeset
|
309 if flags & sha2flag: |
23805
345042e024dc
readmarkers: add a SHA256 fixme note
Matt Mackall <mpm@selenic.com>
parents:
23804
diff
changeset
|
310 # 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
|
311 |
23801
20b5701cd90a
readmarkers: read node reading into node length conditional
Matt Mackall <mpm@selenic.com>
parents:
23800
diff
changeset
|
312 # read 0 or more successors |
23804
e880036719e3
readmarkers: fast-path single successors and parents
Matt Mackall <mpm@selenic.com>
parents:
23803
diff
changeset
|
313 if numsuc == 1: |
e880036719e3
readmarkers: fast-path single successors and parents
Matt Mackall <mpm@selenic.com>
parents:
23803
diff
changeset
|
314 o2 = o1 + sha2size |
e880036719e3
readmarkers: fast-path single successors and parents
Matt Mackall <mpm@selenic.com>
parents:
23803
diff
changeset
|
315 sucs = (data[o1:o2],) |
e880036719e3
readmarkers: fast-path single successors and parents
Matt Mackall <mpm@selenic.com>
parents:
23803
diff
changeset
|
316 else: |
e880036719e3
readmarkers: fast-path single successors and parents
Matt Mackall <mpm@selenic.com>
parents:
23803
diff
changeset
|
317 o2 = o1 + sha2size * numsuc |
e880036719e3
readmarkers: fast-path single successors and parents
Matt Mackall <mpm@selenic.com>
parents:
23803
diff
changeset
|
318 sucs = unpack(sha2fmt * numsuc, data[o1:o2]) |
23792
db3bc2bcb689
readmarkers: add some whitespace
Matt Mackall <mpm@selenic.com>
parents:
23791
diff
changeset
|
319 |
23801
20b5701cd90a
readmarkers: read node reading into node length conditional
Matt Mackall <mpm@selenic.com>
parents:
23800
diff
changeset
|
320 # read parents |
23803
2763edaba857
readmarkers: promote global constants to locals for performance
Matt Mackall <mpm@selenic.com>
parents:
23802
diff
changeset
|
321 if numpar == noneflag: |
23801
20b5701cd90a
readmarkers: read node reading into node length conditional
Matt Mackall <mpm@selenic.com>
parents:
23800
diff
changeset
|
322 o3 = o2 |
20b5701cd90a
readmarkers: read node reading into node length conditional
Matt Mackall <mpm@selenic.com>
parents:
23800
diff
changeset
|
323 parents = None |
23804
e880036719e3
readmarkers: fast-path single successors and parents
Matt Mackall <mpm@selenic.com>
parents:
23803
diff
changeset
|
324 elif numpar == 1: |
e880036719e3
readmarkers: fast-path single successors and parents
Matt Mackall <mpm@selenic.com>
parents:
23803
diff
changeset
|
325 o3 = o2 + sha2size |
e880036719e3
readmarkers: fast-path single successors and parents
Matt Mackall <mpm@selenic.com>
parents:
23803
diff
changeset
|
326 parents = (data[o2:o3],) |
23801
20b5701cd90a
readmarkers: read node reading into node length conditional
Matt Mackall <mpm@selenic.com>
parents:
23800
diff
changeset
|
327 else: |
23803
2763edaba857
readmarkers: promote global constants to locals for performance
Matt Mackall <mpm@selenic.com>
parents:
23802
diff
changeset
|
328 o3 = o2 + sha2size * numpar |
2763edaba857
readmarkers: promote global constants to locals for performance
Matt Mackall <mpm@selenic.com>
parents:
23802
diff
changeset
|
329 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
|
330 else: |
20b5701cd90a
readmarkers: read node reading into node length conditional
Matt Mackall <mpm@selenic.com>
parents:
23800
diff
changeset
|
331 # read 0 or more successors |
23804
e880036719e3
readmarkers: fast-path single successors and parents
Matt Mackall <mpm@selenic.com>
parents:
23803
diff
changeset
|
332 if numsuc == 1: |
e880036719e3
readmarkers: fast-path single successors and parents
Matt Mackall <mpm@selenic.com>
parents:
23803
diff
changeset
|
333 o2 = o1 + sha1size |
e880036719e3
readmarkers: fast-path single successors and parents
Matt Mackall <mpm@selenic.com>
parents:
23803
diff
changeset
|
334 sucs = (data[o1:o2],) |
e880036719e3
readmarkers: fast-path single successors and parents
Matt Mackall <mpm@selenic.com>
parents:
23803
diff
changeset
|
335 else: |
e880036719e3
readmarkers: fast-path single successors and parents
Matt Mackall <mpm@selenic.com>
parents:
23803
diff
changeset
|
336 o2 = o1 + sha1size * numsuc |
e880036719e3
readmarkers: fast-path single successors and parents
Matt Mackall <mpm@selenic.com>
parents:
23803
diff
changeset
|
337 sucs = unpack(sha1fmt * numsuc, data[o1:o2]) |
23792
db3bc2bcb689
readmarkers: add some whitespace
Matt Mackall <mpm@selenic.com>
parents:
23791
diff
changeset
|
338 |
23801
20b5701cd90a
readmarkers: read node reading into node length conditional
Matt Mackall <mpm@selenic.com>
parents:
23800
diff
changeset
|
339 # read parents |
23803
2763edaba857
readmarkers: promote global constants to locals for performance
Matt Mackall <mpm@selenic.com>
parents:
23802
diff
changeset
|
340 if numpar == noneflag: |
23801
20b5701cd90a
readmarkers: read node reading into node length conditional
Matt Mackall <mpm@selenic.com>
parents:
23800
diff
changeset
|
341 o3 = o2 |
20b5701cd90a
readmarkers: read node reading into node length conditional
Matt Mackall <mpm@selenic.com>
parents:
23800
diff
changeset
|
342 parents = None |
23804
e880036719e3
readmarkers: fast-path single successors and parents
Matt Mackall <mpm@selenic.com>
parents:
23803
diff
changeset
|
343 elif numpar == 1: |
e880036719e3
readmarkers: fast-path single successors and parents
Matt Mackall <mpm@selenic.com>
parents:
23803
diff
changeset
|
344 o3 = o2 + sha1size |
e880036719e3
readmarkers: fast-path single successors and parents
Matt Mackall <mpm@selenic.com>
parents:
23803
diff
changeset
|
345 parents = (data[o2:o3],) |
23801
20b5701cd90a
readmarkers: read node reading into node length conditional
Matt Mackall <mpm@selenic.com>
parents:
23800
diff
changeset
|
346 else: |
23803
2763edaba857
readmarkers: promote global constants to locals for performance
Matt Mackall <mpm@selenic.com>
parents:
23802
diff
changeset
|
347 o3 = o2 + sha1size * numpar |
2763edaba857
readmarkers: promote global constants to locals for performance
Matt Mackall <mpm@selenic.com>
parents:
23802
diff
changeset
|
348 parents = unpack(sha1fmt * numpar, data[o2:o3]) |
23792
db3bc2bcb689
readmarkers: add some whitespace
Matt Mackall <mpm@selenic.com>
parents:
23791
diff
changeset
|
349 |
22851
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
350 # read metadata |
23803
2763edaba857
readmarkers: promote global constants to locals for performance
Matt Mackall <mpm@selenic.com>
parents:
23802
diff
changeset
|
351 off = o3 + metasize * nummeta |
2763edaba857
readmarkers: promote global constants to locals for performance
Matt Mackall <mpm@selenic.com>
parents:
23802
diff
changeset
|
352 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
|
353 metadata = [] |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
354 for idx in xrange(0, len(metapairsize), 2): |
23798
86d2a0c41f44
readmarkers: streamline offset tracking
Matt Mackall <mpm@selenic.com>
parents:
23797
diff
changeset
|
355 o1 = off + metapairsize[idx] |
86d2a0c41f44
readmarkers: streamline offset tracking
Matt Mackall <mpm@selenic.com>
parents:
23797
diff
changeset
|
356 o2 = o1 + metapairsize[idx + 1] |
86d2a0c41f44
readmarkers: streamline offset tracking
Matt Mackall <mpm@selenic.com>
parents:
23797
diff
changeset
|
357 metadata.append((data[off:o1], data[o1:o2])) |
86d2a0c41f44
readmarkers: streamline offset tracking
Matt Mackall <mpm@selenic.com>
parents:
23797
diff
changeset
|
358 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
|
359 |
23800
83f361a21d31
readmarkers: drop a temporary
Matt Mackall <mpm@selenic.com>
parents:
23799
diff
changeset
|
360 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
|
361 |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
362 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
|
363 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
|
364 # 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
|
365 _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
|
366 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
|
367 _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
|
368 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
|
369 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
|
370 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
|
371 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
|
372 else: |
974389427e5f
obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22850
diff
changeset
|
373 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
|
374 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
|
375 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
|
376 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
|
377 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
|
378 # 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
|
379 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
|
380 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
|
381 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
|
382 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
|
383 data.extend(parents) |
23498
ac910b1f5658
obsstore: prefetch struct.calcsize
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23497
diff
changeset
|
384 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
|
385 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
|
386 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
|
387 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
|
388 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
|
389 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
|
390 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
|
391 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
|
392 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
|
393 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
|
394 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
|
395 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
|
396 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
|
397 |
24019
26fbf07482b2
_fm1readmarkers: generate list in C
Martin von Zweigbergk <martinvonz@google.com>
parents:
24018
diff
changeset
|
398 def _fm1readmarkers(data, off): |
26fbf07482b2
_fm1readmarkers: generate list in C
Martin von Zweigbergk <martinvonz@google.com>
parents:
24018
diff
changeset
|
399 native = getattr(parsers, 'fm1readmarkers', None) |
26fbf07482b2
_fm1readmarkers: generate list in C
Martin von Zweigbergk <martinvonz@google.com>
parents:
24018
diff
changeset
|
400 if not native: |
26fbf07482b2
_fm1readmarkers: generate list in C
Martin von Zweigbergk <martinvonz@google.com>
parents:
24018
diff
changeset
|
401 return _fm1purereadmarkers(data, off) |
26fbf07482b2
_fm1readmarkers: generate list in C
Martin von Zweigbergk <martinvonz@google.com>
parents:
24018
diff
changeset
|
402 stop = len(data) - _fm1fsize |
26fbf07482b2
_fm1readmarkers: generate list in C
Martin von Zweigbergk <martinvonz@google.com>
parents:
24018
diff
changeset
|
403 return native(data, off, stop) |
26fbf07482b2
_fm1readmarkers: generate list in C
Martin von Zweigbergk <martinvonz@google.com>
parents:
24018
diff
changeset
|
404 |
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
|
405 # 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
|
406 # <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
|
407 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
|
408 _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
|
409 |
23497
5817f71c2336
obsstore: disable garbage collection during initialization (issue4456)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23002
diff
changeset
|
410 @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
|
411 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
|
412 """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
|
413 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
|
414 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
|
415 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
|
416 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
|
417 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
|
418 % 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
|
419 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
|
420 |
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
|
421 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
|
422 # 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
|
423 # 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
|
424 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
|
425 if addheader: |
22613
e623898b80f5
obsolete: use the `version` argument in encodemarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22612
diff
changeset
|
426 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
|
427 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
|
428 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
|
429 |
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
|
430 |
17072
517af63ba382
obsolete: helper class to access obsolete marker data
Pierre-Yves.David@ens-lyon.org
parents:
17071
diff
changeset
|
431 class marker(object): |
517af63ba382
obsolete: helper class to access obsolete marker data
Pierre-Yves.David@ens-lyon.org
parents:
17071
diff
changeset
|
432 """Wrap obsolete marker raw data""" |
517af63ba382
obsolete: helper class to access obsolete marker data
Pierre-Yves.David@ens-lyon.org
parents:
17071
diff
changeset
|
433 |
517af63ba382
obsolete: helper class to access obsolete marker data
Pierre-Yves.David@ens-lyon.org
parents:
17071
diff
changeset
|
434 def __init__(self, repo, data): |
517af63ba382
obsolete: helper class to access obsolete marker data
Pierre-Yves.David@ens-lyon.org
parents:
17071
diff
changeset
|
435 # 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
|
436 self._repo = repo |
517af63ba382
obsolete: helper class to access obsolete marker data
Pierre-Yves.David@ens-lyon.org
parents:
17071
diff
changeset
|
437 self._data = data |
517af63ba382
obsolete: helper class to access obsolete marker data
Pierre-Yves.David@ens-lyon.org
parents:
17071
diff
changeset
|
438 self._decodedmeta = None |
517af63ba382
obsolete: helper class to access obsolete marker data
Pierre-Yves.David@ens-lyon.org
parents:
17071
diff
changeset
|
439 |
20031
6c1adf2067bb
obsolete: add __eq__ and __hash__ to marker to make set() deduplication work
Augie Fackler <raf@durin42.com>
parents:
20030
diff
changeset
|
440 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
|
441 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
|
442 |
6c1adf2067bb
obsolete: add __eq__ and __hash__ to marker to make set() deduplication work
Augie Fackler <raf@durin42.com>
parents:
20030
diff
changeset
|
443 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
|
444 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
|
445 return False |
6c1adf2067bb
obsolete: add __eq__ and __hash__ to marker to make set() deduplication work
Augie Fackler <raf@durin42.com>
parents:
20030
diff
changeset
|
446 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
|
447 |
17072
517af63ba382
obsolete: helper class to access obsolete marker data
Pierre-Yves.David@ens-lyon.org
parents:
17071
diff
changeset
|
448 def precnode(self): |
517af63ba382
obsolete: helper class to access obsolete marker data
Pierre-Yves.David@ens-lyon.org
parents:
17071
diff
changeset
|
449 """Precursor changeset node identifier""" |
517af63ba382
obsolete: helper class to access obsolete marker data
Pierre-Yves.David@ens-lyon.org
parents:
17071
diff
changeset
|
450 return self._data[0] |
517af63ba382
obsolete: helper class to access obsolete marker data
Pierre-Yves.David@ens-lyon.org
parents:
17071
diff
changeset
|
451 |
517af63ba382
obsolete: helper class to access obsolete marker data
Pierre-Yves.David@ens-lyon.org
parents:
17071
diff
changeset
|
452 def succnodes(self): |
517af63ba382
obsolete: helper class to access obsolete marker data
Pierre-Yves.David@ens-lyon.org
parents:
17071
diff
changeset
|
453 """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
|
454 return self._data[1] |
517af63ba382
obsolete: helper class to access obsolete marker data
Pierre-Yves.David@ens-lyon.org
parents:
17071
diff
changeset
|
455 |
22259
2e6f03a193f9
obsmarkers: add a `parentnodes` method to retrieve parent information
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22258
diff
changeset
|
456 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
|
457 """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
|
458 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
|
459 |
17072
517af63ba382
obsolete: helper class to access obsolete marker data
Pierre-Yves.David@ens-lyon.org
parents:
17071
diff
changeset
|
460 def metadata(self): |
517af63ba382
obsolete: helper class to access obsolete marker data
Pierre-Yves.David@ens-lyon.org
parents:
17071
diff
changeset
|
461 """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
|
462 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
|
463 |
517af63ba382
obsolete: helper class to access obsolete marker data
Pierre-Yves.David@ens-lyon.org
parents:
17071
diff
changeset
|
464 def date(self): |
517af63ba382
obsolete: helper class to access obsolete marker data
Pierre-Yves.David@ens-lyon.org
parents:
17071
diff
changeset
|
465 """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
|
466 return self._data[4] |
17072
517af63ba382
obsolete: helper class to access obsolete marker data
Pierre-Yves.David@ens-lyon.org
parents:
17071
diff
changeset
|
467 |
22215
525cde5d954d
obsmarker: add a `flags` method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22207
diff
changeset
|
468 def flags(self): |
525cde5d954d
obsmarker: add a `flags` method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22207
diff
changeset
|
469 """The flags field of the marker""" |
525cde5d954d
obsmarker: add a `flags` method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22207
diff
changeset
|
470 return self._data[2] |
525cde5d954d
obsmarker: add a `flags` method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22207
diff
changeset
|
471 |
24044
e0e6dd806b23
obsolete: extract helpers from _load()
Martin von Zweigbergk <martinvonz@google.com>
parents:
24019
diff
changeset
|
472 @util.nogc |
e0e6dd806b23
obsolete: extract helpers from _load()
Martin von Zweigbergk <martinvonz@google.com>
parents:
24019
diff
changeset
|
473 def _addsuccessors(successors, markers): |
e0e6dd806b23
obsolete: extract helpers from _load()
Martin von Zweigbergk <martinvonz@google.com>
parents:
24019
diff
changeset
|
474 for mark in markers: |
e0e6dd806b23
obsolete: extract helpers from _load()
Martin von Zweigbergk <martinvonz@google.com>
parents:
24019
diff
changeset
|
475 successors.setdefault(mark[0], set()).add(mark) |
e0e6dd806b23
obsolete: extract helpers from _load()
Martin von Zweigbergk <martinvonz@google.com>
parents:
24019
diff
changeset
|
476 |
e0e6dd806b23
obsolete: extract helpers from _load()
Martin von Zweigbergk <martinvonz@google.com>
parents:
24019
diff
changeset
|
477 @util.nogc |
e0e6dd806b23
obsolete: extract helpers from _load()
Martin von Zweigbergk <martinvonz@google.com>
parents:
24019
diff
changeset
|
478 def _addprecursors(precursors, markers): |
e0e6dd806b23
obsolete: extract helpers from _load()
Martin von Zweigbergk <martinvonz@google.com>
parents:
24019
diff
changeset
|
479 for mark in markers: |
e0e6dd806b23
obsolete: extract helpers from _load()
Martin von Zweigbergk <martinvonz@google.com>
parents:
24019
diff
changeset
|
480 for suc in mark[1]: |
e0e6dd806b23
obsolete: extract helpers from _load()
Martin von Zweigbergk <martinvonz@google.com>
parents:
24019
diff
changeset
|
481 precursors.setdefault(suc, set()).add(mark) |
e0e6dd806b23
obsolete: extract helpers from _load()
Martin von Zweigbergk <martinvonz@google.com>
parents:
24019
diff
changeset
|
482 |
e0e6dd806b23
obsolete: extract helpers from _load()
Martin von Zweigbergk <martinvonz@google.com>
parents:
24019
diff
changeset
|
483 @util.nogc |
e0e6dd806b23
obsolete: extract helpers from _load()
Martin von Zweigbergk <martinvonz@google.com>
parents:
24019
diff
changeset
|
484 def _addchildren(children, markers): |
e0e6dd806b23
obsolete: extract helpers from _load()
Martin von Zweigbergk <martinvonz@google.com>
parents:
24019
diff
changeset
|
485 for mark in markers: |
e0e6dd806b23
obsolete: extract helpers from _load()
Martin von Zweigbergk <martinvonz@google.com>
parents:
24019
diff
changeset
|
486 parents = mark[5] |
e0e6dd806b23
obsolete: extract helpers from _load()
Martin von Zweigbergk <martinvonz@google.com>
parents:
24019
diff
changeset
|
487 if parents is not None: |
e0e6dd806b23
obsolete: extract helpers from _load()
Martin von Zweigbergk <martinvonz@google.com>
parents:
24019
diff
changeset
|
488 for p in parents: |
e0e6dd806b23
obsolete: extract helpers from _load()
Martin von Zweigbergk <martinvonz@google.com>
parents:
24019
diff
changeset
|
489 children.setdefault(p, set()).add(mark) |
e0e6dd806b23
obsolete: extract helpers from _load()
Martin von Zweigbergk <martinvonz@google.com>
parents:
24019
diff
changeset
|
490 |
24045
43061f96e40e
obsolete: pass only new markers to _checkinvalidmarkers()
Martin von Zweigbergk <martinvonz@google.com>
parents:
24044
diff
changeset
|
491 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
|
492 """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
|
493 |
18d431147cc1
obsstore: make the invalid markers check wrap-able
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23805
diff
changeset
|
494 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
|
495 subtle handling. |
18d431147cc1
obsstore: make the invalid markers check wrap-able
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23805
diff
changeset
|
496 """ |
24045
43061f96e40e
obsolete: pass only new markers to _checkinvalidmarkers()
Martin von Zweigbergk <martinvonz@google.com>
parents:
24044
diff
changeset
|
497 for mark in markers: |
43061f96e40e
obsolete: pass only new markers to _checkinvalidmarkers()
Martin von Zweigbergk <martinvonz@google.com>
parents:
24044
diff
changeset
|
498 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
|
499 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
|
500 '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
|
501 |
17070
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
502 class obsstore(object): |
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
503 """Store obsolete markers |
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
504 |
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
505 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
|
506 - 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
|
507 - 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
|
508 - 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
|
509 """ |
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
510 |
22254
b8a0e8176693
obsstore: add a `parents` field
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22253
diff
changeset
|
511 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
|
512 # prec: nodeid, precursor changesets |
b8a0e8176693
obsstore: add a `parents` field
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22253
diff
changeset
|
513 # 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
|
514 # 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
|
515 # meta: binary blob, encoded metadata dictionary |
b8a0e8176693
obsstore: add a `parents` field
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22253
diff
changeset
|
516 # 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
|
517 # 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
|
518 # 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
|
519 |
25669
8d94861842e5
obsolete: replace references to 'sopener' with 'svfs'
Siddharth Agarwal <sid0@fb.com>
parents:
25412
diff
changeset
|
520 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
|
521 # 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
|
522 self.caches = {} |
25669
8d94861842e5
obsolete: replace references to 'sopener' with 'svfs'
Siddharth Agarwal <sid0@fb.com>
parents:
25412
diff
changeset
|
523 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
|
524 self._version = defaultformat |
22950
bb8278b289ee
obsolete: add readonly flag to obstore constructor
Durham Goode <durham@fb.com>
parents:
22949
diff
changeset
|
525 self._readonly = readonly |
17070
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
526 |
17073
3a79a5682af1
obsolete: add easy way to iterate over obsolete marker object
Pierre-Yves.David@ens-lyon.org
parents:
17072
diff
changeset
|
527 def __iter__(self): |
3a79a5682af1
obsolete: add easy way to iterate over obsolete marker object
Pierre-Yves.David@ens-lyon.org
parents:
17072
diff
changeset
|
528 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
|
529 |
20585
f3c8db3d6d66
obsstore: add a __len__ method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20584
diff
changeset
|
530 def __len__(self): |
f3c8db3d6d66
obsstore: add a __len__ method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20584
diff
changeset
|
531 return len(self._all) |
f3c8db3d6d66
obsstore: add a __len__ method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20584
diff
changeset
|
532 |
17075
28ed1c4511ce
obsolete: exchange obsolete marker over pushkey
Pierre-Yves.David@ens-lyon.org
parents:
17073
diff
changeset
|
533 def __nonzero__(self): |
26310
61efe9ef6ad4
obsstore: fast path to check if obsstore is empty
Yuya Nishihara <yuya@tcha.org>
parents:
26309
diff
changeset
|
534 if not self._cached('_all'): |
61efe9ef6ad4
obsstore: fast path to check if obsstore is empty
Yuya Nishihara <yuya@tcha.org>
parents:
26309
diff
changeset
|
535 try: |
61efe9ef6ad4
obsstore: fast path to check if obsstore is empty
Yuya Nishihara <yuya@tcha.org>
parents:
26309
diff
changeset
|
536 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
|
537 except OSError as inst: |
61efe9ef6ad4
obsstore: fast path to check if obsstore is empty
Yuya Nishihara <yuya@tcha.org>
parents:
26309
diff
changeset
|
538 if inst.errno != errno.ENOENT: |
61efe9ef6ad4
obsstore: fast path to check if obsstore is empty
Yuya Nishihara <yuya@tcha.org>
parents:
26309
diff
changeset
|
539 raise |
61efe9ef6ad4
obsstore: fast path to check if obsstore is empty
Yuya Nishihara <yuya@tcha.org>
parents:
26309
diff
changeset
|
540 # 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
|
541 # avoids further stat() syscalls |
61efe9ef6ad4
obsstore: fast path to check if obsstore is empty
Yuya Nishihara <yuya@tcha.org>
parents:
26309
diff
changeset
|
542 pass |
17075
28ed1c4511ce
obsolete: exchange obsolete marker over pushkey
Pierre-Yves.David@ens-lyon.org
parents:
17073
diff
changeset
|
543 return bool(self._all) |
28ed1c4511ce
obsolete: exchange obsolete marker over pushkey
Pierre-Yves.David@ens-lyon.org
parents:
17073
diff
changeset
|
544 |
26684
74ff350c208c
obsstore: make the readonly attribute accessible
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26587
diff
changeset
|
545 @property |
74ff350c208c
obsstore: make the readonly attribute accessible
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26587
diff
changeset
|
546 def readonly(self): |
74ff350c208c
obsstore: make the readonly attribute accessible
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26587
diff
changeset
|
547 """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
|
548 |
74ff350c208c
obsstore: make the readonly attribute accessible
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26587
diff
changeset
|
549 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
|
550 return self._readonly |
74ff350c208c
obsstore: make the readonly attribute accessible
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26587
diff
changeset
|
551 |
22255
adb3798dce49
obsstore: add a `parents` argument to obsstore.create
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22254
diff
changeset
|
552 def create(self, transaction, prec, succs=(), flag=0, parents=None, |
adb3798dce49
obsstore: add a `parents` argument to obsstore.create
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22254
diff
changeset
|
553 date=None, metadata=None): |
17071
11f26e2669aa
command: creation of obsolete marker
Pierre-Yves.David@ens-lyon.org
parents:
17070
diff
changeset
|
554 """obsolete: add a new obsolete marker |
11f26e2669aa
command: creation of obsolete marker
Pierre-Yves.David@ens-lyon.org
parents:
17070
diff
changeset
|
555 |
11f26e2669aa
command: creation of obsolete marker
Pierre-Yves.David@ens-lyon.org
parents:
17070
diff
changeset
|
556 * ensuring it is hashable |
11f26e2669aa
command: creation of obsolete marker
Pierre-Yves.David@ens-lyon.org
parents:
17070
diff
changeset
|
557 * check mandatory metadata |
11f26e2669aa
command: creation of obsolete marker
Pierre-Yves.David@ens-lyon.org
parents:
17070
diff
changeset
|
558 * 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
|
559 |
3af218cf2007
obsstore: update create docstring to point to the coder friendly function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20476
diff
changeset
|
560 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
|
561 `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
|
562 |
224a058f7cd1
obsstore: `create` method return True if a marker is actually added
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20549
diff
changeset
|
563 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
|
564 already existed (no op). |
17071
11f26e2669aa
command: creation of obsolete marker
Pierre-Yves.David@ens-lyon.org
parents:
17070
diff
changeset
|
565 """ |
11f26e2669aa
command: creation of obsolete marker
Pierre-Yves.David@ens-lyon.org
parents:
17070
diff
changeset
|
566 if metadata is None: |
11f26e2669aa
command: creation of obsolete marker
Pierre-Yves.David@ens-lyon.org
parents:
17070
diff
changeset
|
567 metadata = {} |
22222
883e8b6bd461
obsmarker: add `date` as an explicit field
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22221
diff
changeset
|
568 if date is None: |
883e8b6bd461
obsmarker: add `date` as an explicit field
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22221
diff
changeset
|
569 if 'date' in metadata: |
883e8b6bd461
obsmarker: add `date` as an explicit field
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22221
diff
changeset
|
570 # 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
|
571 date = util.parsedate(metadata.pop('date')) |
883e8b6bd461
obsmarker: add `date` as an explicit field
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22221
diff
changeset
|
572 else: |
22217
570f87422f54
obsstore: add an explicit `date` argument to obsstore.create
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22216
diff
changeset
|
573 date = util.makedate() |
17071
11f26e2669aa
command: creation of obsolete marker
Pierre-Yves.David@ens-lyon.org
parents:
17070
diff
changeset
|
574 if len(prec) != 20: |
11f26e2669aa
command: creation of obsolete marker
Pierre-Yves.David@ens-lyon.org
parents:
17070
diff
changeset
|
575 raise ValueError(prec) |
11f26e2669aa
command: creation of obsolete marker
Pierre-Yves.David@ens-lyon.org
parents:
17070
diff
changeset
|
576 for succ in succs: |
11f26e2669aa
command: creation of obsolete marker
Pierre-Yves.David@ens-lyon.org
parents:
17070
diff
changeset
|
577 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
|
578 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
|
579 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
|
580 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
|
581 |
ef880e28e56a
obsolete: store metadata as a tuple of (key, value) pairs (API)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22685
diff
changeset
|
582 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
|
583 |
ef880e28e56a
obsolete: store metadata as a tuple of (key, value) pairs (API)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22685
diff
changeset
|
584 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
|
585 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
|
586 |
bdac214a4705
obsolete: obsstore.add now takes a list of markers.
Pierre-Yves.David@ens-lyon.org
parents:
17219
diff
changeset
|
587 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
|
588 """Add new markers to the store |
17070
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
589 |
17220
bdac214a4705
obsolete: obsstore.add now takes a list of markers.
Pierre-Yves.David@ens-lyon.org
parents:
17219
diff
changeset
|
590 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
|
591 Return the number of new marker.""" |
22950
bb8278b289ee
obsolete: add readonly flag to obstore constructor
Durham Goode <durham@fb.com>
parents:
22949
diff
changeset
|
592 if self._readonly: |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26310
diff
changeset
|
593 raise error.Abort('creating obsolete markers is not enabled on ' |
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26310
diff
changeset
|
594 'this repo') |
20028
28445179df90
obsolete: stop doing membership test on list
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19951
diff
changeset
|
595 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
|
596 new = [] |
5931489b65e0
obsolete: do not accept duplicated marker during exchange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20028
diff
changeset
|
597 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
|
598 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
|
599 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
|
600 new.append(m) |
17220
bdac214a4705
obsolete: obsstore.add now takes a list of markers.
Pierre-Yves.David@ens-lyon.org
parents:
17219
diff
changeset
|
601 if new: |
25669
8d94861842e5
obsolete: replace references to 'sopener' with 'svfs'
Siddharth Agarwal <sid0@fb.com>
parents:
25412
diff
changeset
|
602 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
|
603 try: |
17126
8fa8717b47b6
obsolete: write obsolete marker inside a transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17125
diff
changeset
|
604 offset = f.tell() |
8fa8717b47b6
obsolete: write obsolete marker inside a transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17125
diff
changeset
|
605 transaction.add('obsstore', offset) |
17219
494a970f68de
obsolete: refactor writemarkers to only encode them
Pierre-Yves.David@ens-lyon.org
parents:
17213
diff
changeset
|
606 # 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
|
607 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
|
608 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
|
609 finally: |
8fa8717b47b6
obsolete: write obsolete marker inside a transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17125
diff
changeset
|
610 # 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
|
611 # 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
|
612 f.close() |
24046
6e1d9f9932a9
obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents:
24045
diff
changeset
|
613 self._addmarkers(new) |
17469
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
614 # 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
|
615 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
|
616 # 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
|
617 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
|
618 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
|
619 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
|
620 |
17524 | 621 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
|
622 """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
|
623 |
3363f2d36015
obsstore: have the `mergemarkers` method return the number of new markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22309
diff
changeset
|
624 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
|
625 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
|
626 return self.add(transaction, markers) |
17070
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
627 |
24046
6e1d9f9932a9
obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents:
24045
diff
changeset
|
628 @propertycache |
26309
44918682093f
obsstore: delay loading markers from obsstore file
Yuya Nishihara <yuya@tcha.org>
parents:
26308
diff
changeset
|
629 def _all(self): |
44918682093f
obsstore: delay loading markers from obsstore file
Yuya Nishihara <yuya@tcha.org>
parents:
26308
diff
changeset
|
630 data = self.svfs.tryread('obsstore') |
44918682093f
obsstore: delay loading markers from obsstore file
Yuya Nishihara <yuya@tcha.org>
parents:
26308
diff
changeset
|
631 if not data: |
44918682093f
obsstore: delay loading markers from obsstore file
Yuya Nishihara <yuya@tcha.org>
parents:
26308
diff
changeset
|
632 return [] |
44918682093f
obsstore: delay loading markers from obsstore file
Yuya Nishihara <yuya@tcha.org>
parents:
26308
diff
changeset
|
633 self._version, markers = _readmarkers(data) |
44918682093f
obsstore: delay loading markers from obsstore file
Yuya Nishihara <yuya@tcha.org>
parents:
26308
diff
changeset
|
634 markers = list(markers) |
44918682093f
obsstore: delay loading markers from obsstore file
Yuya Nishihara <yuya@tcha.org>
parents:
26308
diff
changeset
|
635 _checkinvalidmarkers(markers) |
44918682093f
obsstore: delay loading markers from obsstore file
Yuya Nishihara <yuya@tcha.org>
parents:
26308
diff
changeset
|
636 return markers |
44918682093f
obsstore: delay loading markers from obsstore file
Yuya Nishihara <yuya@tcha.org>
parents:
26308
diff
changeset
|
637 |
44918682093f
obsstore: delay loading markers from obsstore file
Yuya Nishihara <yuya@tcha.org>
parents:
26308
diff
changeset
|
638 @propertycache |
24046
6e1d9f9932a9
obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents:
24045
diff
changeset
|
639 def successors(self): |
6e1d9f9932a9
obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents:
24045
diff
changeset
|
640 successors = {} |
6e1d9f9932a9
obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents:
24045
diff
changeset
|
641 _addsuccessors(successors, self._all) |
6e1d9f9932a9
obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents:
24045
diff
changeset
|
642 return successors |
6e1d9f9932a9
obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents:
24045
diff
changeset
|
643 |
6e1d9f9932a9
obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents:
24045
diff
changeset
|
644 @propertycache |
6e1d9f9932a9
obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents:
24045
diff
changeset
|
645 def precursors(self): |
6e1d9f9932a9
obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents:
24045
diff
changeset
|
646 precursors = {} |
6e1d9f9932a9
obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents:
24045
diff
changeset
|
647 _addprecursors(precursors, self._all) |
6e1d9f9932a9
obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents:
24045
diff
changeset
|
648 return precursors |
6e1d9f9932a9
obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents:
24045
diff
changeset
|
649 |
6e1d9f9932a9
obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents:
24045
diff
changeset
|
650 @propertycache |
6e1d9f9932a9
obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents:
24045
diff
changeset
|
651 def children(self): |
6e1d9f9932a9
obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents:
24045
diff
changeset
|
652 children = {} |
6e1d9f9932a9
obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents:
24045
diff
changeset
|
653 _addchildren(children, self._all) |
6e1d9f9932a9
obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents:
24045
diff
changeset
|
654 return children |
6e1d9f9932a9
obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents:
24045
diff
changeset
|
655 |
6e1d9f9932a9
obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents:
24045
diff
changeset
|
656 def _cached(self, attr): |
6e1d9f9932a9
obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents:
24045
diff
changeset
|
657 return attr in self.__dict__ |
6e1d9f9932a9
obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents:
24045
diff
changeset
|
658 |
6e1d9f9932a9
obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents:
24045
diff
changeset
|
659 def _addmarkers(self, markers): |
24044
e0e6dd806b23
obsolete: extract helpers from _load()
Martin von Zweigbergk <martinvonz@google.com>
parents:
24019
diff
changeset
|
660 markers = list(markers) # to allow repeated iteration |
e0e6dd806b23
obsolete: extract helpers from _load()
Martin von Zweigbergk <martinvonz@google.com>
parents:
24019
diff
changeset
|
661 self._all.extend(markers) |
24046
6e1d9f9932a9
obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents:
24045
diff
changeset
|
662 if self._cached('successors'): |
6e1d9f9932a9
obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents:
24045
diff
changeset
|
663 _addsuccessors(self.successors, markers) |
6e1d9f9932a9
obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents:
24045
diff
changeset
|
664 if self._cached('precursors'): |
6e1d9f9932a9
obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents:
24045
diff
changeset
|
665 _addprecursors(self.precursors, markers) |
6e1d9f9932a9
obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents:
24045
diff
changeset
|
666 if self._cached('children'): |
6e1d9f9932a9
obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents:
24045
diff
changeset
|
667 _addchildren(self.children, markers) |
24045
43061f96e40e
obsolete: pass only new markers to _checkinvalidmarkers()
Martin von Zweigbergk <martinvonz@google.com>
parents:
24044
diff
changeset
|
668 _checkinvalidmarkers(markers) |
23973
18d431147cc1
obsstore: make the invalid markers check wrap-able
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23805
diff
changeset
|
669 |
22271
8c69262df82d
obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22270
diff
changeset
|
670 def relevantmarkers(self, nodes): |
8c69262df82d
obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22270
diff
changeset
|
671 """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
|
672 |
8c69262df82d
obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22270
diff
changeset
|
673 "relevant" to a set of nodes mean: |
8c69262df82d
obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22270
diff
changeset
|
674 |
8c69262df82d
obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22270
diff
changeset
|
675 - marker that use this changeset as successor |
8c69262df82d
obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22270
diff
changeset
|
676 - 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
|
677 - 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
|
678 |
8c69262df82d
obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22270
diff
changeset
|
679 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
|
680 |
8c69262df82d
obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22270
diff
changeset
|
681 pendingnodes = set(nodes) |
8c69262df82d
obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22270
diff
changeset
|
682 seenmarkers = set() |
8c69262df82d
obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22270
diff
changeset
|
683 seennodes = set(pendingnodes) |
8c69262df82d
obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22270
diff
changeset
|
684 precursorsmarkers = self.precursors |
8c69262df82d
obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22270
diff
changeset
|
685 children = self.children |
8c69262df82d
obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22270
diff
changeset
|
686 while pendingnodes: |
8c69262df82d
obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22270
diff
changeset
|
687 direct = set() |
8c69262df82d
obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22270
diff
changeset
|
688 for current in pendingnodes: |
8c69262df82d
obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22270
diff
changeset
|
689 direct.update(precursorsmarkers.get(current, ())) |
8c69262df82d
obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22270
diff
changeset
|
690 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
|
691 direct.update(pruned) |
8c69262df82d
obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22270
diff
changeset
|
692 direct -= seenmarkers |
8c69262df82d
obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22270
diff
changeset
|
693 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
|
694 seenmarkers |= direct |
8c69262df82d
obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22270
diff
changeset
|
695 pendingnodes -= seennodes |
8c69262df82d
obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22270
diff
changeset
|
696 seennodes |= pendingnodes |
8c69262df82d
obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22270
diff
changeset
|
697 return seenmarkers |
17070
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff
changeset
|
698 |
22345
cf7014c5f087
obsolete: add a `commonversion` function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22339
diff
changeset
|
699 def commonversion(versions): |
cf7014c5f087
obsolete: add a `commonversion` function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22339
diff
changeset
|
700 """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
|
701 |
cf7014c5f087
obsolete: add a `commonversion` function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22339
diff
changeset
|
702 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
|
703 """ |
cf7014c5f087
obsolete: add a `commonversion` function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22339
diff
changeset
|
704 versions.sort(reverse=True) |
cf7014c5f087
obsolete: add a `commonversion` function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22339
diff
changeset
|
705 # 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
|
706 for v in versions: |
cf7014c5f087
obsolete: add a `commonversion` function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22339
diff
changeset
|
707 if v in formats: |
cf7014c5f087
obsolete: add a `commonversion` function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22339
diff
changeset
|
708 return v |
cf7014c5f087
obsolete: add a `commonversion` function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22339
diff
changeset
|
709 return None |
17295
1f08ecc7febb
pushkey: splits obsolete marker exchange into multiple keys
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17253
diff
changeset
|
710 |
1f08ecc7febb
pushkey: splits obsolete marker exchange into multiple keys
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17253
diff
changeset
|
711 # 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
|
712 # 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
|
713 # - the version header |
1f08ecc7febb
pushkey: splits obsolete marker exchange into multiple keys
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17253
diff
changeset
|
714 # - the base85 encoding |
1f08ecc7febb
pushkey: splits obsolete marker exchange into multiple keys
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17253
diff
changeset
|
715 _maxpayload = 5300 |
17075
28ed1c4511ce
obsolete: exchange obsolete marker over pushkey
Pierre-Yves.David@ens-lyon.org
parents:
17073
diff
changeset
|
716 |
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
|
717 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
|
718 """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
|
719 |
21024
7731a2281cf0
spelling: fixes from spell checker
Mads Kiilerich <madski@unity3d.com>
parents:
20599
diff
changeset
|
720 - binary data is base85 encoded |
7731a2281cf0
spelling: fixes from spell checker
Mads Kiilerich <madski@unity3d.com>
parents:
20599
diff
changeset
|
721 - 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
|
722 keys = {} |
1f08ecc7febb
pushkey: splits obsolete marker exchange into multiple keys
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17253
diff
changeset
|
723 parts = [] |
1f08ecc7febb
pushkey: splits obsolete marker exchange into multiple keys
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17253
diff
changeset
|
724 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
|
725 for marker in markers: |
22329
ed37aa74d208
obsolete: rename _encodeonemarker to _fm0encodeonemarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22328
diff
changeset
|
726 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
|
727 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
|
728 currentpart = [] |
1f08ecc7febb
pushkey: splits obsolete marker exchange into multiple keys
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17253
diff
changeset
|
729 currentlen = 0 |
1f08ecc7febb
pushkey: splits obsolete marker exchange into multiple keys
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17253
diff
changeset
|
730 parts.append(currentpart) |
1f08ecc7febb
pushkey: splits obsolete marker exchange into multiple keys
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17253
diff
changeset
|
731 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
|
732 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
|
733 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
|
734 data = ''.join([_pack('>B', _fm0version)] + part) |
17295
1f08ecc7febb
pushkey: splits obsolete marker exchange into multiple keys
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17253
diff
changeset
|
735 keys['dump%i' % idx] = base85.b85encode(data) |
1f08ecc7febb
pushkey: splits obsolete marker exchange into multiple keys
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17253
diff
changeset
|
736 return keys |
17073
3a79a5682af1
obsolete: add easy way to iterate over obsolete marker object
Pierre-Yves.David@ens-lyon.org
parents:
17072
diff
changeset
|
737 |
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
|
738 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
|
739 """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
|
740 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
|
741 return {} |
25118
e632a2429982
obsolete: sort obsmarkers during exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24928
diff
changeset
|
742 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
|
743 |
17075
28ed1c4511ce
obsolete: exchange obsolete marker over pushkey
Pierre-Yves.David@ens-lyon.org
parents:
17073
diff
changeset
|
744 def pushmarker(repo, key, old, new): |
28ed1c4511ce
obsolete: exchange obsolete marker over pushkey
Pierre-Yves.David@ens-lyon.org
parents:
17073
diff
changeset
|
745 """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
|
746 if not key.startswith('dump'): |
17075
28ed1c4511ce
obsolete: exchange obsolete marker over pushkey
Pierre-Yves.David@ens-lyon.org
parents:
17073
diff
changeset
|
747 repo.ui.warn(_('unknown key: %r') % key) |
28ed1c4511ce
obsolete: exchange obsolete marker over pushkey
Pierre-Yves.David@ens-lyon.org
parents:
17073
diff
changeset
|
748 return 0 |
28ed1c4511ce
obsolete: exchange obsolete marker over pushkey
Pierre-Yves.David@ens-lyon.org
parents:
17073
diff
changeset
|
749 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
|
750 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
|
751 return 0 |
28ed1c4511ce
obsolete: exchange obsolete marker over pushkey
Pierre-Yves.David@ens-lyon.org
parents:
17073
diff
changeset
|
752 data = base85.b85decode(new) |
28ed1c4511ce
obsolete: exchange obsolete marker over pushkey
Pierre-Yves.David@ens-lyon.org
parents:
17073
diff
changeset
|
753 lock = repo.lock() |
28ed1c4511ce
obsolete: exchange obsolete marker over pushkey
Pierre-Yves.David@ens-lyon.org
parents:
17073
diff
changeset
|
754 try: |
17126
8fa8717b47b6
obsolete: write obsolete marker inside a transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17125
diff
changeset
|
755 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
|
756 try: |
8fa8717b47b6
obsolete: write obsolete marker inside a transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17125
diff
changeset
|
757 repo.obsstore.mergemarkers(tr, data) |
8fa8717b47b6
obsolete: write obsolete marker inside a transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17125
diff
changeset
|
758 tr.close() |
8fa8717b47b6
obsolete: write obsolete marker inside a transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17125
diff
changeset
|
759 return 1 |
8fa8717b47b6
obsolete: write obsolete marker inside a transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17125
diff
changeset
|
760 finally: |
8fa8717b47b6
obsolete: write obsolete marker inside a transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17125
diff
changeset
|
761 tr.release() |
17075
28ed1c4511ce
obsolete: exchange obsolete marker over pushkey
Pierre-Yves.David@ens-lyon.org
parents:
17073
diff
changeset
|
762 finally: |
28ed1c4511ce
obsolete: exchange obsolete marker over pushkey
Pierre-Yves.David@ens-lyon.org
parents:
17073
diff
changeset
|
763 lock.release() |
17073
3a79a5682af1
obsolete: add easy way to iterate over obsolete marker object
Pierre-Yves.David@ens-lyon.org
parents:
17072
diff
changeset
|
764 |
22274
10e87c67f1c7
debugobsolete: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22273
diff
changeset
|
765 def getmarkers(repo, nodes=None): |
10e87c67f1c7
debugobsolete: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22273
diff
changeset
|
766 """returns markers known in a repository |
10e87c67f1c7
debugobsolete: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22273
diff
changeset
|
767 |
10e87c67f1c7
debugobsolete: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22273
diff
changeset
|
768 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
|
769 returned""" |
10e87c67f1c7
debugobsolete: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22273
diff
changeset
|
770 if nodes is None: |
10e87c67f1c7
debugobsolete: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22273
diff
changeset
|
771 rawmarkers = repo.obsstore |
10e87c67f1c7
debugobsolete: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22273
diff
changeset
|
772 else: |
10e87c67f1c7
debugobsolete: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22273
diff
changeset
|
773 rawmarkers = repo.obsstore.relevantmarkers(nodes) |
10e87c67f1c7
debugobsolete: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22273
diff
changeset
|
774 |
10e87c67f1c7
debugobsolete: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22273
diff
changeset
|
775 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
|
776 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
|
777 |
22274
10e87c67f1c7
debugobsolete: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22273
diff
changeset
|
778 def relevantmarkers(repo, node): |
10e87c67f1c7
debugobsolete: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22273
diff
changeset
|
779 """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
|
780 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
|
781 yield marker(repo, markerdata) |
10e87c67f1c7
debugobsolete: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22273
diff
changeset
|
782 |
10e87c67f1c7
debugobsolete: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22273
diff
changeset
|
783 |
17076
75f4180509a4
obsolete: function and method to access some obsolete data
Pierre-Yves.David@ens-lyon.org
parents:
17075
diff
changeset
|
784 def precursormarkers(ctx): |
17776
072812e9f570
obsolete: flip `obstore.successors` and `obsolete.precursors`
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17775
diff
changeset
|
785 """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
|
786 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
|
787 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
|
788 |
75f4180509a4
obsolete: function and method to access some obsolete data
Pierre-Yves.David@ens-lyon.org
parents:
17075
diff
changeset
|
789 def successormarkers(ctx): |
17776
072812e9f570
obsolete: flip `obstore.successors` and `obsolete.precursors`
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17775
diff
changeset
|
790 """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
|
791 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
|
792 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
|
793 |
17831
70b08df24fef
obsolete: add a flag that allows fixing "bumped" changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17828
diff
changeset
|
794 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
|
795 """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
|
796 |
612db9d7e76a
obsolete: have `allsuccessors` takes a list of nodes
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17826
diff
changeset
|
797 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
|
798 |
20204
b0c14c5d44b1
obsolete: improve allsuccessors doc string
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20203
diff
changeset
|
799 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
|
800 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
|
801 remaining = set(nodes) |
17213
7eb5aa1f83fd
obsolete: add an any successors function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17200
diff
changeset
|
802 seen = set(remaining) |
7eb5aa1f83fd
obsolete: add an any successors function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17200
diff
changeset
|
803 while remaining: |
7eb5aa1f83fd
obsolete: add an any successors function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17200
diff
changeset
|
804 current = remaining.pop() |
7eb5aa1f83fd
obsolete: add an any successors function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17200
diff
changeset
|
805 yield current |
17776
072812e9f570
obsolete: flip `obstore.successors` and `obsolete.precursors`
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17775
diff
changeset
|
806 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
|
807 # 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
|
808 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
|
809 continue |
17213
7eb5aa1f83fd
obsolete: add an any successors function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17200
diff
changeset
|
810 for suc in mark[1]: |
7eb5aa1f83fd
obsolete: add an any successors function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17200
diff
changeset
|
811 if suc not in seen: |
7eb5aa1f83fd
obsolete: add an any successors function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17200
diff
changeset
|
812 seen.add(suc) |
7eb5aa1f83fd
obsolete: add an any successors function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17200
diff
changeset
|
813 remaining.add(suc) |
17469
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
814 |
20206
cdcbe103b69a
obsolete: add an allprecursors method mirroring allsuccessors one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20204
diff
changeset
|
815 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
|
816 """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
|
817 |
cdcbe103b69a
obsolete: add an allprecursors method mirroring allsuccessors one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20204
diff
changeset
|
818 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
|
819 |
cdcbe103b69a
obsolete: add an allprecursors method mirroring allsuccessors one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20204
diff
changeset
|
820 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
|
821 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
|
822 |
cdcbe103b69a
obsolete: add an allprecursors method mirroring allsuccessors one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20204
diff
changeset
|
823 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
|
824 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
|
825 while remaining: |
cdcbe103b69a
obsolete: add an allprecursors method mirroring allsuccessors one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20204
diff
changeset
|
826 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
|
827 yield current |
cdcbe103b69a
obsolete: add an allprecursors method mirroring allsuccessors one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20204
diff
changeset
|
828 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
|
829 # 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
|
830 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
|
831 continue |
cdcbe103b69a
obsolete: add an allprecursors method mirroring allsuccessors one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20204
diff
changeset
|
832 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
|
833 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
|
834 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
|
835 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
|
836 |
18984
efef056b1ae9
obsolete: extract foreground computation from bookmark.validdest
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18904
diff
changeset
|
837 def foreground(repo, nodes): |
efef056b1ae9
obsolete: extract foreground computation from bookmark.validdest
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18904
diff
changeset
|
838 """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
|
839 |
efef056b1ae9
obsolete: extract foreground computation from bookmark.validdest
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18904
diff
changeset
|
840 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
|
841 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
|
842 augmented with obsolescence information. |
efef056b1ae9
obsolete: extract foreground computation from bookmark.validdest
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18904
diff
changeset
|
843 |
19951
d51c4d85ec23
spelling: random spell checker fixes
Mads Kiilerich <madski@unity3d.com>
parents:
19618
diff
changeset
|
844 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
|
845 """ |
efef056b1ae9
obsolete: extract foreground computation from bookmark.validdest
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18904
diff
changeset
|
846 repo = repo.unfiltered() |
efef056b1ae9
obsolete: extract foreground computation from bookmark.validdest
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18904
diff
changeset
|
847 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
|
848 if repo.obsstore: |
efef056b1ae9
obsolete: extract foreground computation from bookmark.validdest
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18904
diff
changeset
|
849 # 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
|
850 # 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
|
851 nm = repo.changelog.nodemap |
efef056b1ae9
obsolete: extract foreground computation from bookmark.validdest
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18904
diff
changeset
|
852 plen = -1 |
efef056b1ae9
obsolete: extract foreground computation from bookmark.validdest
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18904
diff
changeset
|
853 # 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
|
854 while len(foreground) != plen: |
efef056b1ae9
obsolete: extract foreground computation from bookmark.validdest
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18904
diff
changeset
|
855 plen = len(foreground) |
efef056b1ae9
obsolete: extract foreground computation from bookmark.validdest
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18904
diff
changeset
|
856 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
|
857 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
|
858 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
|
859 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
|
860 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
|
861 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
|
862 |
efef056b1ae9
obsolete: extract foreground computation from bookmark.validdest
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18904
diff
changeset
|
863 |
18068
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
864 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
|
865 """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
|
866 |
26204
54875a6c3714
obsolete: improve English of successorssets
timeless@mozdev.org
parents:
25669
diff
changeset
|
867 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
|
868 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
|
869 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
|
870 |
20277
c05b968d05eb
obsolete: clarify documentation for succcessorssets
Sean Farley <sean.michael.farley@gmail.com>
parents:
20207
diff
changeset
|
871 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
|
872 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
|
873 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
|
874 (see below). |
18068
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
875 |
20277
c05b968d05eb
obsolete: clarify documentation for succcessorssets
Sean Farley <sean.michael.farley@gmail.com>
parents:
20207
diff
changeset
|
876 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
|
877 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
|
878 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
|
879 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
|
880 [(A',)] or [], respectively. |
18068
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
881 |
20277
c05b968d05eb
obsolete: clarify documentation for succcessorssets
Sean Farley <sean.michael.farley@gmail.com>
parents:
20207
diff
changeset
|
882 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
|
883 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
|
884 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
|
885 (A'')]. |
18068
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
886 |
20277
c05b968d05eb
obsolete: clarify documentation for succcessorssets
Sean Farley <sean.michael.farley@gmail.com>
parents:
20207
diff
changeset
|
887 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
|
888 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
|
889 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
|
890 |
20277
c05b968d05eb
obsolete: clarify documentation for succcessorssets
Sean Farley <sean.michael.farley@gmail.com>
parents:
20207
diff
changeset
|
891 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
|
892 without any successors). |
c05b968d05eb
obsolete: clarify documentation for succcessorssets
Sean Farley <sean.michael.farley@gmail.com>
parents:
20207
diff
changeset
|
893 |
c05b968d05eb
obsolete: clarify documentation for succcessorssets
Sean Farley <sean.michael.farley@gmail.com>
parents:
20207
diff
changeset
|
894 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
|
895 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
|
896 `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
|
897 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
|
898 span. Code that makes multiple calls to `successorssets` *must* use this |
54875a6c3714
obsolete: improve English of successorssets
timeless@mozdev.org
parents:
25669
diff
changeset
|
899 cache mechanism or suffer terrible performance. |
20277
c05b968d05eb
obsolete: clarify documentation for succcessorssets
Sean Farley <sean.michael.farley@gmail.com>
parents:
20207
diff
changeset
|
900 """ |
18068
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
901 |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
902 succmarkers = repo.obsstore.successors |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
903 |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
904 # 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
|
905 toproceed = [initialnode] |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
906 # 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
|
907 # 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
|
908 stackedset = set(toproceed) |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
909 if cache is None: |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
910 cache = {} |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
911 |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
912 # 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
|
913 # successors sets |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
914 # |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
915 # def successorssets(x): |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
916 # successors = directsuccessors(x) |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
917 # ss = [[]] |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
918 # for succ in directsuccessors(x): |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
919 # # product as in itertools cartesian product |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
920 # ss = product(ss, successorssets(succ)) |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
921 # return ss |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
922 # |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
923 # 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
|
924 # - that would blow the python call stack |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
925 # - 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
|
926 # |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
927 # 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
|
928 # successors set for are stacked there. |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
929 # |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
930 # 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
|
931 # 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
|
932 # loop. |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
933 # |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
934 # 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
|
935 # |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
936 # 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
|
937 # for the node requested by the caller. |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
938 while toproceed: |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
939 # 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
|
940 # node of the stack: CURRENT. |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
941 # |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
942 # There are four possible outcomes: |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
943 # |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
944 # 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
|
945 # -> mission accomplished, pop it from the stack. |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
946 # 2) Node is not obsolete: |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
947 # -> 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
|
948 # 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
|
949 # -> We add those successors to the stack. |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
950 # 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
|
951 # -> 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
|
952 # cache. |
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 current = toproceed[-1] |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
955 if current in cache: |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
956 # 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
|
957 stackedset.remove(toproceed.pop()) |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
958 elif current not in succmarkers: |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
959 # case (2): The node is not obsolete. |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
960 if current in repo: |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
961 # We have a valid last successors. |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
962 cache[current] = [(current,)] |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
963 else: |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
964 # Final obsolete version is unknown locally. |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
965 # 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
|
966 cache[current] = [] |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
967 else: |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
968 # cases (3) and (4) |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
969 # |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
970 # 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
|
971 # from case (4): |
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 # 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
|
974 # 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
|
975 # 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
|
976 # loop. (case 3) |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
977 # |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
978 # 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
|
979 # 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
|
980 # 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
|
981 # 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
|
982 # |
18644
3e92772d5383
spelling: fix some minor issues found by spell checker
Mads Kiilerich <mads@kiilerich.com>
parents:
18365
diff
changeset
|
983 # 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
|
984 # |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
985 # 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
|
986 # in phase 2 itself. |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
987 # |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
988 # 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
|
989 # - 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
|
990 # precursor (successors markers of CURRENT). |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
991 # |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
992 # Having multiple entry here means divergence. |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
993 # |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
994 # - 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
|
995 # |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
996 # 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
|
997 # single successors are standard replacement. |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
998 # |
18365
4148414da120
obsolete: process markers in a stable order
Mads Kiilerich <mads@kiilerich.com>
parents:
18277
diff
changeset
|
999 for mark in sorted(succmarkers[current]): |
18068
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1000 for suc in mark[1]: |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1001 if suc not in cache: |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1002 if suc in stackedset: |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1003 # cycle breaking |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1004 cache[suc] = [] |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1005 else: |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1006 # 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
|
1007 # 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
|
1008 # `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
|
1009 # iteration. |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1010 toproceed.append(suc) |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1011 stackedset.add(suc) |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1012 break |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1013 else: |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1014 continue |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1015 break |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1016 else: |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1017 # 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
|
1018 # successors |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1019 # |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1020 # 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
|
1021 # successors sets of all its "successors" node. |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1022 # |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1023 # 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
|
1024 # 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
|
1025 # markers. |
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 # 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
|
1028 # 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
|
1029 # divergent successors sets. If multiple successors have |
21024
7731a2281cf0
spelling: fixes from spell checker
Mads Kiilerich <madski@unity3d.com>
parents:
20599
diff
changeset
|
1030 # 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
|
1031 # |
f84e731cbd20
obsolete: drop successors sets which are subset of another one
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18068
diff
changeset
|
1032 # 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
|
1033 # 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
|
1034 # another one. |
18068
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1035 succssets = [] |
18365
4148414da120
obsolete: process markers in a stable order
Mads Kiilerich <mads@kiilerich.com>
parents:
18277
diff
changeset
|
1036 for mark in sorted(succmarkers[current]): |
18068
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1037 # successors sets contributed by this marker |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1038 markss = [[]] |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1039 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
|
1040 # cardinal product with previous successors |
18068
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1041 productresult = [] |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1042 for prefix in markss: |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1043 for suffix in cache[suc]: |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1044 newss = list(prefix) |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1045 for part in suffix: |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1046 # do not duplicated entry in successors set |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1047 # first entry wins. |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1048 if part not in newss: |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1049 newss.append(part) |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1050 productresult.append(newss) |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1051 markss = productresult |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1052 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
|
1053 # 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
|
1054 seen = [] |
f84e731cbd20
obsolete: drop successors sets which are subset of another one
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18068
diff
changeset
|
1055 final = [] |
f84e731cbd20
obsolete: drop successors sets which are subset of another one
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18068
diff
changeset
|
1056 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
|
1057 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
|
1058 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
|
1059 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
|
1060 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
|
1061 break |
f84e731cbd20
obsolete: drop successors sets which are subset of another one
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18068
diff
changeset
|
1062 else: |
f84e731cbd20
obsolete: drop successors sets which are subset of another one
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18068
diff
changeset
|
1063 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
|
1064 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
|
1065 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
|
1066 cache[current] = final |
18068
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1067 return cache[initialnode] |
4bec77e62c00
obsolete: compute successors set
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18001
diff
changeset
|
1068 |
17828
9495be4126ef
obsolete: add the detection of bumped changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17827
diff
changeset
|
1069 # 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
|
1070 cachefuncs = {} |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1071 def cachefor(name): |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1072 """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
|
1073 def decorator(func): |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1074 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
|
1075 cachefuncs[name] = func |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1076 return func |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1077 return decorator |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1078 |
17825
3cc06457f15e
obsolete: rename `getobscache` into `getrevs`
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17776
diff
changeset
|
1079 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
|
1080 """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
|
1081 |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1082 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
|
1083 repo = repo.unfiltered() |
17469
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1084 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
|
1085 return frozenset() |
17469
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1086 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
|
1087 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
|
1088 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
|
1089 |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1090 # 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
|
1091 # |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1092 # - new changeset is added: |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1093 # - public phase is changed |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1094 # - obsolescence marker are added |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1095 # - 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
|
1096 def clearobscaches(repo): |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1097 """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
|
1098 |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1099 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
|
1100 repo. |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1101 |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1102 (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
|
1103 clearing)""" |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1104 # 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
|
1105 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
|
1106 repo.obsstore.caches.clear() |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1107 |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1108 @cachefor('obsolete') |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1109 def _computeobsoleteset(repo): |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1110 """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
|
1111 obs = set() |
18271
67872e939945
performance: speedup computation of obsolete revisions
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18101
diff
changeset
|
1112 getrev = repo.changelog.nodemap.get |
67872e939945
performance: speedup computation of obsolete revisions
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18101
diff
changeset
|
1113 getphase = repo._phasecache.phase |
22200
b27c3beaaf30
cleanup: avoid local vars shadowing imports
Mads Kiilerich <madski@unity3d.com>
parents:
21166
diff
changeset
|
1114 for n in repo.obsstore.successors: |
b27c3beaaf30
cleanup: avoid local vars shadowing imports
Mads Kiilerich <madski@unity3d.com>
parents:
21166
diff
changeset
|
1115 rev = getrev(n) |
18271
67872e939945
performance: speedup computation of obsolete revisions
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18101
diff
changeset
|
1116 if rev is not None and getphase(repo, rev): |
17469
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1117 obs.add(rev) |
18271
67872e939945
performance: speedup computation of obsolete revisions
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18101
diff
changeset
|
1118 return obs |
17469
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1119 |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1120 @cachefor('unstable') |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1121 def _computeunstableset(repo): |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1122 """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
|
1123 revs = [(ctx.rev(), ctx) for ctx in |
876a2ebfbf4f
obsolete: speed up unstable computation
Laurent Charignon <lcharignon@fb.com>
parents:
24927
diff
changeset
|
1124 repo.set('(not public()) and (not obsolete())')] |
876a2ebfbf4f
obsolete: speed up unstable computation
Laurent Charignon <lcharignon@fb.com>
parents:
24927
diff
changeset
|
1125 revs.sort(key=lambda x:x[0]) |
876a2ebfbf4f
obsolete: speed up unstable computation
Laurent Charignon <lcharignon@fb.com>
parents:
24927
diff
changeset
|
1126 unstable = set() |
876a2ebfbf4f
obsolete: speed up unstable computation
Laurent Charignon <lcharignon@fb.com>
parents:
24927
diff
changeset
|
1127 for rev, ctx in revs: |
876a2ebfbf4f
obsolete: speed up unstable computation
Laurent Charignon <lcharignon@fb.com>
parents:
24927
diff
changeset
|
1128 # 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
|
1129 # 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
|
1130 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
|
1131 for x in ctx.parents()): |
876a2ebfbf4f
obsolete: speed up unstable computation
Laurent Charignon <lcharignon@fb.com>
parents:
24927
diff
changeset
|
1132 unstable.add(rev) |
876a2ebfbf4f
obsolete: speed up unstable computation
Laurent Charignon <lcharignon@fb.com>
parents:
24927
diff
changeset
|
1133 return unstable |
17469
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1134 |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1135 @cachefor('suspended') |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1136 def _computesuspendedset(repo): |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1137 """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
|
1138 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
|
1139 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
|
1140 |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1141 @cachefor('extinct') |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1142 def _computeextinctset(repo): |
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17429
diff
changeset
|
1143 """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
|
1144 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
|
1145 |
17828
9495be4126ef
obsolete: add the detection of bumped changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17827
diff
changeset
|
1146 |
9495be4126ef
obsolete: add the detection of bumped changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17827
diff
changeset
|
1147 @cachefor('bumped') |
9495be4126ef
obsolete: add the detection of bumped changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17827
diff
changeset
|
1148 def _computebumpedset(repo): |
9495be4126ef
obsolete: add the detection of bumped changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17827
diff
changeset
|
1149 """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
|
1150 bumped = set() |
21024
7731a2281cf0
spelling: fixes from spell checker
Mads Kiilerich <madski@unity3d.com>
parents:
20599
diff
changeset
|
1151 # 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
|
1152 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
|
1153 public = phases.public |
cd62532c62a1
obsolete: order of magnitude speedup in _computebumpedset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20206
diff
changeset
|
1154 cl = repo.changelog |
cd62532c62a1
obsolete: order of magnitude speedup in _computebumpedset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20206
diff
changeset
|
1155 torev = cl.nodemap.get |
24927
cd0068232ec0
obsolete: speed up computation of bumped revset
Laurent Charignon <lcharignon@fb.com>
parents:
24393
diff
changeset
|
1156 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
|
1157 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
|
1158 # 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
|
1159 node = ctx.node() |
cd0068232ec0
obsolete: speed up computation of bumped revset
Laurent Charignon <lcharignon@fb.com>
parents:
24393
diff
changeset
|
1160 # (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
|
1161 for pnode in allprecursors(repo.obsstore, [node], |
cd0068232ec0
obsolete: speed up computation of bumped revset
Laurent Charignon <lcharignon@fb.com>
parents:
24393
diff
changeset
|
1162 ignoreflags=bumpedfix): |
cd0068232ec0
obsolete: speed up computation of bumped revset
Laurent Charignon <lcharignon@fb.com>
parents:
24393
diff
changeset
|
1163 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
|
1164 if (prev is not None) and (phase(repo, prev) <= public): |
cd0068232ec0
obsolete: speed up computation of bumped revset
Laurent Charignon <lcharignon@fb.com>
parents:
24393
diff
changeset
|
1165 # we have a public precursors |
cd0068232ec0
obsolete: speed up computation of bumped revset
Laurent Charignon <lcharignon@fb.com>
parents:
24393
diff
changeset
|
1166 bumped.add(rev) |
cd0068232ec0
obsolete: speed up computation of bumped revset
Laurent Charignon <lcharignon@fb.com>
parents:
24393
diff
changeset
|
1167 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
|
1168 return bumped |
17828
9495be4126ef
obsolete: add the detection of bumped changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17827
diff
changeset
|
1169 |
18070
af632936d3d9
obsolete: detect divergent changesets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18069
diff
changeset
|
1170 @cachefor('divergent') |
af632936d3d9
obsolete: detect divergent changesets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18069
diff
changeset
|
1171 def _computedivergentset(repo): |
af632936d3d9
obsolete: detect divergent changesets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18069
diff
changeset
|
1172 """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
|
1173 """ |
af632936d3d9
obsolete: detect divergent changesets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18069
diff
changeset
|
1174 divergent = set() |
af632936d3d9
obsolete: detect divergent changesets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18069
diff
changeset
|
1175 obsstore = repo.obsstore |
af632936d3d9
obsolete: detect divergent changesets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18069
diff
changeset
|
1176 newermap = {} |
af632936d3d9
obsolete: detect divergent changesets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18069
diff
changeset
|
1177 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
|
1178 mark = obsstore.precursors.get(ctx.node(), ()) |
af632936d3d9
obsolete: detect divergent changesets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18069
diff
changeset
|
1179 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
|
1180 seen = set() |
18070
af632936d3d9
obsolete: detect divergent changesets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18069
diff
changeset
|
1181 while toprocess: |
af632936d3d9
obsolete: detect divergent changesets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18069
diff
changeset
|
1182 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
|
1183 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
|
1184 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
|
1185 seen.add(prec) |
18070
af632936d3d9
obsolete: detect divergent changesets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18069
diff
changeset
|
1186 if prec not in newermap: |
af632936d3d9
obsolete: detect divergent changesets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18069
diff
changeset
|
1187 successorssets(repo, prec, newermap) |
af632936d3d9
obsolete: detect divergent changesets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18069
diff
changeset
|
1188 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
|
1189 if len(newer) > 1: |
af632936d3d9
obsolete: detect divergent changesets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18069
diff
changeset
|
1190 divergent.add(ctx.rev()) |
af632936d3d9
obsolete: detect divergent changesets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18069
diff
changeset
|
1191 break |
af632936d3d9
obsolete: detect divergent changesets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18069
diff
changeset
|
1192 toprocess.update(obsstore.precursors.get(prec, ())) |
af632936d3d9
obsolete: detect divergent changesets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18069
diff
changeset
|
1193 return divergent |
af632936d3d9
obsolete: detect divergent changesets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18069
diff
changeset
|
1194 |
af632936d3d9
obsolete: detect divergent changesets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18069
diff
changeset
|
1195 |
22219
79c686267486
obsolete: add a date argument to the `createmarkers` function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22217
diff
changeset
|
1196 def createmarkers(repo, relations, flag=0, date=None, metadata=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
|
1197 """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
|
1198 |
20517
2158e8f3cbd2
createmarkers: allow to pass metadata for a marker only
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20516
diff
changeset
|
1199 <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
|
1200 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
|
1201 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
|
1202 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
|
1203 |
f85816af6294
obsolete: add a high level function to create an obsolete marker
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17469
diff
changeset
|
1204 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
|
1205 |
f85816af6294
obsolete: add a high level function to create an obsolete marker
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17469
diff
changeset
|
1206 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
|
1207 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
|
1208 |
f85816af6294
obsolete: add a high level function to create an obsolete marker
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17469
diff
changeset
|
1209 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
|
1210 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
|
1211 """ |
f85816af6294
obsolete: add a high level function to create an obsolete marker
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17469
diff
changeset
|
1212 # 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
|
1213 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
|
1214 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
|
1215 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
|
1216 metadata['user'] = repo.ui.username() |
f85816af6294
obsolete: add a high level function to create an obsolete marker
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17469
diff
changeset
|
1217 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
|
1218 try: |
20517
2158e8f3cbd2
createmarkers: allow to pass metadata for a marker only
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20516
diff
changeset
|
1219 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
|
1220 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
|
1221 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
|
1222 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
|
1223 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
|
1224 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
|
1225 |
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
|
1226 if not prec.mutable(): |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26310
diff
changeset
|
1227 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
|
1228 % prec, |
443d4635e630
phases: add `hg help phases` hint to failures to edit public commits
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
25411
diff
changeset
|
1229 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
|
1230 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
|
1231 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
|
1232 npare = None |
3ae6cc6173e3
createmarkers: automatically record the parent of pruned changesets
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22255
diff
changeset
|
1233 if not nsucs: |
3ae6cc6173e3
createmarkers: automatically record the parent of pruned changesets
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22255
diff
changeset
|
1234 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
|
1235 if nprec in nsucs: |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26310
diff
changeset
|
1236 raise error.Abort("changeset %s cannot obsolete itself" % prec) |
22256
3ae6cc6173e3
createmarkers: automatically record the parent of pruned changesets
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22255
diff
changeset
|
1237 repo.obsstore.create(tr, nprec, nsucs, flag, parents=npare, |
3ae6cc6173e3
createmarkers: automatically record the parent of pruned changesets
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22255
diff
changeset
|
1238 date=date, metadata=localmetadata) |
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
|
1239 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
|
1240 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
|
1241 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
|
1242 tr.release() |
22949
714f6ef43f3a
obsolete: add isenabled function for option checking
Durham Goode <durham@fb.com>
parents:
22854
diff
changeset
|
1243 |
714f6ef43f3a
obsolete: add isenabled function for option checking
Durham Goode <durham@fb.com>
parents:
22854
diff
changeset
|
1244 def isenabled(repo, option): |
714f6ef43f3a
obsolete: add isenabled function for option checking
Durham Goode <durham@fb.com>
parents:
22854
diff
changeset
|
1245 """Returns True if the given repository has the given obsolete option |
714f6ef43f3a
obsolete: add isenabled function for option checking
Durham Goode <durham@fb.com>
parents:
22854
diff
changeset
|
1246 enabled. |
714f6ef43f3a
obsolete: add isenabled function for option checking
Durham Goode <durham@fb.com>
parents:
22854
diff
changeset
|
1247 """ |
714f6ef43f3a
obsolete: add isenabled function for option checking
Durham Goode <durham@fb.com>
parents:
22854
diff
changeset
|
1248 result = set(repo.ui.configlist('experimental', 'evolution')) |
714f6ef43f3a
obsolete: add isenabled function for option checking
Durham Goode <durham@fb.com>
parents:
22854
diff
changeset
|
1249 if 'all' in result: |
714f6ef43f3a
obsolete: add isenabled function for option checking
Durham Goode <durham@fb.com>
parents:
22854
diff
changeset
|
1250 return True |
714f6ef43f3a
obsolete: add isenabled function for option checking
Durham Goode <durham@fb.com>
parents:
22854
diff
changeset
|
1251 |
714f6ef43f3a
obsolete: add isenabled function for option checking
Durham Goode <durham@fb.com>
parents:
22854
diff
changeset
|
1252 # For migration purposes, temporarily return true if the config hasn't been |
714f6ef43f3a
obsolete: add isenabled function for option checking
Durham Goode <durham@fb.com>
parents:
22854
diff
changeset
|
1253 # set but _enabled is true. |
714f6ef43f3a
obsolete: add isenabled function for option checking
Durham Goode <durham@fb.com>
parents:
22854
diff
changeset
|
1254 if len(result) == 0 and _enabled: |
714f6ef43f3a
obsolete: add isenabled function for option checking
Durham Goode <durham@fb.com>
parents:
22854
diff
changeset
|
1255 return True |
714f6ef43f3a
obsolete: add isenabled function for option checking
Durham Goode <durham@fb.com>
parents:
22854
diff
changeset
|
1256 |
22954
32f15b361f36
obsolete: prevent options from being used without createmarkers
Durham Goode <durham@fb.com>
parents:
22953
diff
changeset
|
1257 # createmarkers must be enabled if other options are enabled |
32f15b361f36
obsolete: prevent options from being used without createmarkers
Durham Goode <durham@fb.com>
parents:
22953
diff
changeset
|
1258 if ((allowunstableopt in result or exchangeopt in result) and |
32f15b361f36
obsolete: prevent options from being used without createmarkers
Durham Goode <durham@fb.com>
parents:
22953
diff
changeset
|
1259 not createmarkersopt in result): |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26310
diff
changeset
|
1260 raise error.Abort(_("'createmarkers' obsolete option must be enabled " |
22954
32f15b361f36
obsolete: prevent options from being used without createmarkers
Durham Goode <durham@fb.com>
parents:
22953
diff
changeset
|
1261 "if other obsolete options are enabled")) |
32f15b361f36
obsolete: prevent options from being used without createmarkers
Durham Goode <durham@fb.com>
parents:
22953
diff
changeset
|
1262 |
22949
714f6ef43f3a
obsolete: add isenabled function for option checking
Durham Goode <durham@fb.com>
parents:
22854
diff
changeset
|
1263 return option in result |