Mercurial > hg
annotate mercurial/tags.py @ 49171:2c0570a6d5ae
followlines: don't put Unicode directly into the .js file (issue6559)
Apparently some web server setups may serve this file in a different encoding
than UTF-8, and that results in visual garbage in the followlines button that
renders for every line in a file. So instead of using this Unicode character in
UTF-8 we can encode it as \u2212. Or, to be more explicit, we can use −
HTML entity, which resolves into exactly that character.
Since now we're using innerHTML property to set the minus part of the button,
let's use it to set the plus part as well (even though the plus sign was plain
ASCII). A wise man once said "A foolish consistency is the hobgob... eh,
whatever." Throw a brick at me if this makes things worse.
Differential Revision: https://phab.mercurial-scm.org/D12597
author | Anton Shestakov <av6@dwimlabs.net> |
---|---|
date | Mon, 02 May 2022 12:10:28 +0400 |
parents | bde2e4ef968a |
children | 63fd0282ad40 |
rev | line source |
---|---|
9149
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
1 # tags.py - read tag info from local repository |
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
2 # |
46819
d4ba4d51f85f
contributor: change mentions of mpm to olivia
Raphaël Gomès <rgomes@octobus.net>
parents:
46656
diff
changeset
|
3 # Copyright 2009 Olivia Mackall <olivia@selenic.com> |
9149
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
4 # Copyright 2009 Greg Ward <greg@gerg.ca> |
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
5 # |
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
6 # This software may be used and distributed according to the terms of the |
10263 | 7 # GNU General Public License version 2 or any later version. |
9149
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
8 |
9151
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9149
diff
changeset
|
9 # Currently this module only deals with reading and caching tags. |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9149
diff
changeset
|
10 # Eventually, it could take care of updating (adding/removing/moving) |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9149
diff
changeset
|
11 # tags too. |
9149
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
12 |
25982
b2f3f185e458
tags: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
13 |
14038
0e6f622f31ca
tags: loosen IOError filtering when reading localtags
Idan Kamara <idankk86@gmail.com>
parents:
14020
diff
changeset
|
14 import errno |
42567
4eaf7197a740
cleanup: use named constants for second arg to .seek()
Augie Fackler <augie@google.com>
parents:
42239
diff
changeset
|
15 import io |
9149
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
16 |
25982
b2f3f185e458
tags: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
17 from .node import ( |
b2f3f185e458
tags: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
18 bin, |
b2f3f185e458
tags: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
19 hex, |
42237
9f45d3d526f9
hgtagsfnodescache: inherit fnode from parent when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42236
diff
changeset
|
20 nullrev, |
25982
b2f3f185e458
tags: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
21 short, |
b2f3f185e458
tags: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
22 ) |
31668
7d0459706716
tags: move '_tags' from 'repo' to 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31360
diff
changeset
|
23 from .i18n import _ |
25982
b2f3f185e458
tags: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
24 from . import ( |
b2f3f185e458
tags: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
25 encoding, |
b2f3f185e458
tags: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
26 error, |
31668
7d0459706716
tags: move '_tags' from 'repo' to 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31360
diff
changeset
|
27 match as matchmod, |
31025
6cf2857526c7
scmutil: proxy revrange() through repo to break import cycles
Yuya Nishihara <yuya@tcha.org>
parents:
30975
diff
changeset
|
28 scmutil, |
25982
b2f3f185e458
tags: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
29 util, |
b2f3f185e458
tags: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
30 ) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
31 from .utils import stringutil |
25982
b2f3f185e458
tags: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
32 |
24735
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
33 # Tags computation can be expensive and caches exist to make it fast in |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
34 # the common case. |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
35 # |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
36 # The "hgtagsfnodes1" cache file caches the .hgtags filenode values for |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
37 # each revision in the repository. The file is effectively an array of |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
38 # fixed length records. Read the docs for "hgtagsfnodescache" for technical |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
39 # details. |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
40 # |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
41 # The .hgtags filenode cache grows in proportion to the length of the |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
42 # changelog. The file is truncated when the # changelog is stripped. |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
43 # |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
44 # The purpose of the filenode cache is to avoid the most expensive part |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
45 # of finding global tags, which is looking up the .hgtags filenode in the |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
46 # manifest for each head. This can take dozens or over 100ms for |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
47 # repositories with very large manifests. Multiplied by dozens or even |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
48 # hundreds of heads and there is a significant performance concern. |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
49 # |
24762
1062663808ce
tags: write a separate tags cache file for unfiltered repos
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24761
diff
changeset
|
50 # There also exist a separate cache file for each repository filter. |
1062663808ce
tags: write a separate tags cache file for unfiltered repos
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24761
diff
changeset
|
51 # These "tags-*" files store information about the history of tags. |
24445
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24143
diff
changeset
|
52 # |
24762
1062663808ce
tags: write a separate tags cache file for unfiltered repos
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24761
diff
changeset
|
53 # The tags cache files consists of a cache validation line followed by |
1062663808ce
tags: write a separate tags cache file for unfiltered repos
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24761
diff
changeset
|
54 # a history of tags. |
24735
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
55 # |
24760
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24759
diff
changeset
|
56 # The cache validation line has the format: |
24445
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24143
diff
changeset
|
57 # |
24760
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24759
diff
changeset
|
58 # <tiprev> <tipnode> [<filteredhash>] |
24445
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24143
diff
changeset
|
59 # |
24760
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24759
diff
changeset
|
60 # <tiprev> is an integer revision and <tipnode> is a 40 character hex |
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24759
diff
changeset
|
61 # node for that changeset. These redundantly identify the repository |
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24759
diff
changeset
|
62 # tip from the time the cache was written. In addition, <filteredhash>, |
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24759
diff
changeset
|
63 # if present, is a 40 character hex hash of the contents of the filtered |
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24759
diff
changeset
|
64 # revisions for this filter. If the set of filtered revs changes, the |
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24759
diff
changeset
|
65 # hash will change and invalidate the cache. |
24445
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24143
diff
changeset
|
66 # |
24760
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24759
diff
changeset
|
67 # The history part of the tags cache consists of lines of the form: |
24445
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24143
diff
changeset
|
68 # |
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24143
diff
changeset
|
69 # <node> <tag> |
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24143
diff
changeset
|
70 # |
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24143
diff
changeset
|
71 # (This format is identical to that of .hgtags files.) |
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24143
diff
changeset
|
72 # |
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24143
diff
changeset
|
73 # <tag> is the tag name and <node> is the 40 character hex changeset |
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24143
diff
changeset
|
74 # the tag is associated with. |
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24143
diff
changeset
|
75 # |
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24143
diff
changeset
|
76 # Tags are written sorted by tag name. |
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24143
diff
changeset
|
77 # |
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24143
diff
changeset
|
78 # Tags associated with multiple changesets have an entry for each changeset. |
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24143
diff
changeset
|
79 # The most recent changeset (in terms of revlog ordering for the head |
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24143
diff
changeset
|
80 # setting it) for each tag is last. |
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24143
diff
changeset
|
81 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
82 |
31993
bfb826c350d4
tags: introduce a function to return a valid fnodes list from revs
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31788
diff
changeset
|
83 def fnoderevs(ui, repo, revs): |
bfb826c350d4
tags: introduce a function to return a valid fnodes list from revs
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31788
diff
changeset
|
84 """return the list of '.hgtags' fnodes used in a set revisions |
bfb826c350d4
tags: introduce a function to return a valid fnodes list from revs
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31788
diff
changeset
|
85 |
bfb826c350d4
tags: introduce a function to return a valid fnodes list from revs
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31788
diff
changeset
|
86 This is returned as list of unique fnodes. We use a list instead of a set |
bfb826c350d4
tags: introduce a function to return a valid fnodes list from revs
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31788
diff
changeset
|
87 because order matters when it comes to tags.""" |
bfb826c350d4
tags: introduce a function to return a valid fnodes list from revs
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31788
diff
changeset
|
88 unfi = repo.unfiltered() |
bfb826c350d4
tags: introduce a function to return a valid fnodes list from revs
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31788
diff
changeset
|
89 tonode = unfi.changelog.node |
bfb826c350d4
tags: introduce a function to return a valid fnodes list from revs
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31788
diff
changeset
|
90 nodes = [tonode(r) for r in revs] |
42239
6770df6e4365
tags: avoid double-reversing a list
Martin von Zweigbergk <martinvonz@google.com>
parents:
42237
diff
changeset
|
91 fnodes = _getfnodes(ui, repo, nodes) |
31993
bfb826c350d4
tags: introduce a function to return a valid fnodes list from revs
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31788
diff
changeset
|
92 fnodes = _filterfnodes(fnodes, nodes) |
bfb826c350d4
tags: introduce a function to return a valid fnodes list from revs
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31788
diff
changeset
|
93 return fnodes |
bfb826c350d4
tags: introduce a function to return a valid fnodes list from revs
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31788
diff
changeset
|
94 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
95 |
47012
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46819
diff
changeset
|
96 def _nulltonone(repo, value): |
31995
fe9c4d614600
track-tags: compute the actual differences between tags pre/post transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31993
diff
changeset
|
97 """convert nullid to None |
fe9c4d614600
track-tags: compute the actual differences between tags pre/post transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31993
diff
changeset
|
98 |
fe9c4d614600
track-tags: compute the actual differences between tags pre/post transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31993
diff
changeset
|
99 For tag value, nullid means "deleted". This small utility function helps |
fe9c4d614600
track-tags: compute the actual differences between tags pre/post transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31993
diff
changeset
|
100 translating that to None.""" |
47012
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46819
diff
changeset
|
101 if value == repo.nullid: |
31995
fe9c4d614600
track-tags: compute the actual differences between tags pre/post transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31993
diff
changeset
|
102 return None |
fe9c4d614600
track-tags: compute the actual differences between tags pre/post transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31993
diff
changeset
|
103 return value |
fe9c4d614600
track-tags: compute the actual differences between tags pre/post transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31993
diff
changeset
|
104 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
105 |
31995
fe9c4d614600
track-tags: compute the actual differences between tags pre/post transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31993
diff
changeset
|
106 def difftags(ui, repo, oldfnodes, newfnodes): |
fe9c4d614600
track-tags: compute the actual differences between tags pre/post transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31993
diff
changeset
|
107 """list differences between tags expressed in two set of file-nodes |
fe9c4d614600
track-tags: compute the actual differences between tags pre/post transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31993
diff
changeset
|
108 |
fe9c4d614600
track-tags: compute the actual differences between tags pre/post transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31993
diff
changeset
|
109 The list contains entries in the form: (tagname, oldvalue, new value). |
fe9c4d614600
track-tags: compute the actual differences between tags pre/post transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31993
diff
changeset
|
110 None is used to expressed missing value: |
fe9c4d614600
track-tags: compute the actual differences between tags pre/post transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31993
diff
changeset
|
111 ('foo', None, 'abcd') is a new tag, |
fe9c4d614600
track-tags: compute the actual differences between tags pre/post transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31993
diff
changeset
|
112 ('bar', 'ef01', None) is a deletion, |
fe9c4d614600
track-tags: compute the actual differences between tags pre/post transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31993
diff
changeset
|
113 ('baz', 'abcd', 'ef01') is a tag movement. |
fe9c4d614600
track-tags: compute the actual differences between tags pre/post transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31993
diff
changeset
|
114 """ |
fe9c4d614600
track-tags: compute the actual differences between tags pre/post transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31993
diff
changeset
|
115 if oldfnodes == newfnodes: |
fe9c4d614600
track-tags: compute the actual differences between tags pre/post transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31993
diff
changeset
|
116 return [] |
fe9c4d614600
track-tags: compute the actual differences between tags pre/post transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31993
diff
changeset
|
117 oldtags = _tagsfromfnodes(ui, repo, oldfnodes) |
fe9c4d614600
track-tags: compute the actual differences between tags pre/post transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31993
diff
changeset
|
118 newtags = _tagsfromfnodes(ui, repo, newfnodes) |
fe9c4d614600
track-tags: compute the actual differences between tags pre/post transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31993
diff
changeset
|
119 |
fe9c4d614600
track-tags: compute the actual differences between tags pre/post transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31993
diff
changeset
|
120 # list of (tag, old, new): None means missing |
fe9c4d614600
track-tags: compute the actual differences between tags pre/post transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31993
diff
changeset
|
121 entries = [] |
fe9c4d614600
track-tags: compute the actual differences between tags pre/post transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31993
diff
changeset
|
122 for tag, (new, __) in newtags.items(): |
47012
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46819
diff
changeset
|
123 new = _nulltonone(repo, new) |
31995
fe9c4d614600
track-tags: compute the actual differences between tags pre/post transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31993
diff
changeset
|
124 old, __ = oldtags.pop(tag, (None, None)) |
47012
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46819
diff
changeset
|
125 old = _nulltonone(repo, old) |
31995
fe9c4d614600
track-tags: compute the actual differences between tags pre/post transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31993
diff
changeset
|
126 if old != new: |
fe9c4d614600
track-tags: compute the actual differences between tags pre/post transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31993
diff
changeset
|
127 entries.append((tag, old, new)) |
fe9c4d614600
track-tags: compute the actual differences between tags pre/post transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31993
diff
changeset
|
128 # handle deleted tags |
fe9c4d614600
track-tags: compute the actual differences between tags pre/post transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31993
diff
changeset
|
129 for tag, (old, __) in oldtags.items(): |
47012
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46819
diff
changeset
|
130 old = _nulltonone(repo, old) |
31995
fe9c4d614600
track-tags: compute the actual differences between tags pre/post transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31993
diff
changeset
|
131 if old is not None: |
fe9c4d614600
track-tags: compute the actual differences between tags pre/post transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31993
diff
changeset
|
132 entries.append((tag, old, None)) |
fe9c4d614600
track-tags: compute the actual differences between tags pre/post transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31993
diff
changeset
|
133 entries.sort() |
fe9c4d614600
track-tags: compute the actual differences between tags pre/post transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31993
diff
changeset
|
134 return entries |
fe9c4d614600
track-tags: compute the actual differences between tags pre/post transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31993
diff
changeset
|
135 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
136 |
31996
e6e1884df298
track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31995
diff
changeset
|
137 def writediff(fp, difflist): |
e6e1884df298
track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31995
diff
changeset
|
138 """write tags diff information to a file. |
e6e1884df298
track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31995
diff
changeset
|
139 |
e6e1884df298
track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31995
diff
changeset
|
140 Data are stored with a line based format: |
e6e1884df298
track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31995
diff
changeset
|
141 |
e6e1884df298
track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31995
diff
changeset
|
142 <action> <hex-node> <tag-name>\n |
e6e1884df298
track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31995
diff
changeset
|
143 |
e6e1884df298
track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31995
diff
changeset
|
144 Action are defined as follow: |
e6e1884df298
track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31995
diff
changeset
|
145 -R tag is removed, |
e6e1884df298
track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31995
diff
changeset
|
146 +A tag is added, |
e6e1884df298
track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31995
diff
changeset
|
147 -M tag is moved (old value), |
e6e1884df298
track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31995
diff
changeset
|
148 +M tag is moved (new value), |
e6e1884df298
track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31995
diff
changeset
|
149 |
e6e1884df298
track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31995
diff
changeset
|
150 Example: |
e6e1884df298
track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31995
diff
changeset
|
151 |
e6e1884df298
track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31995
diff
changeset
|
152 +A 875517b4806a848f942811a315a5bce30804ae85 t5 |
e6e1884df298
track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31995
diff
changeset
|
153 |
e6e1884df298
track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31995
diff
changeset
|
154 See documentation of difftags output for details about the input. |
e6e1884df298
track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31995
diff
changeset
|
155 """ |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
156 add = b'+A %s %s\n' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
157 remove = b'-R %s %s\n' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
158 updateold = b'-M %s %s\n' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
159 updatenew = b'+M %s %s\n' |
31996
e6e1884df298
track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31995
diff
changeset
|
160 for tag, old, new in difflist: |
e6e1884df298
track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31995
diff
changeset
|
161 # translate to hex |
e6e1884df298
track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31995
diff
changeset
|
162 if old is not None: |
e6e1884df298
track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31995
diff
changeset
|
163 old = hex(old) |
e6e1884df298
track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31995
diff
changeset
|
164 if new is not None: |
e6e1884df298
track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31995
diff
changeset
|
165 new = hex(new) |
e6e1884df298
track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31995
diff
changeset
|
166 # write to file |
e6e1884df298
track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31995
diff
changeset
|
167 if old is None: |
e6e1884df298
track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31995
diff
changeset
|
168 fp.write(add % (new, tag)) |
e6e1884df298
track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31995
diff
changeset
|
169 elif new is None: |
e6e1884df298
track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31995
diff
changeset
|
170 fp.write(remove % (old, tag)) |
e6e1884df298
track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31995
diff
changeset
|
171 else: |
e6e1884df298
track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31995
diff
changeset
|
172 fp.write(updateold % (old, tag)) |
e6e1884df298
track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31995
diff
changeset
|
173 fp.write(updatenew % (new, tag)) |
e6e1884df298
track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31995
diff
changeset
|
174 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
175 |
31706
63d4deda1b31
tags: do not feed dictionaries to 'findglobaltags'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31705
diff
changeset
|
176 def findglobaltags(ui, repo): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45787
diff
changeset
|
177 """Find global tags in a repo: return a tagsmap |
24445
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24143
diff
changeset
|
178 |
31709
c34c170b25f3
tags: only return 'alltags' in 'findglobaltags'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31708
diff
changeset
|
179 tagsmap: tag name to (node, hist) 2-tuples. |
24445
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24143
diff
changeset
|
180 |
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24143
diff
changeset
|
181 The tags cache is read and updated as a side-effect of calling. |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45787
diff
changeset
|
182 """ |
24760
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24759
diff
changeset
|
183 (heads, tagfnode, valid, cachetags, shouldwrite) = _readtagcache(ui, repo) |
9152
4017291c4c48
tags: support 'instant' tag retrieval (issue548)
Greg Ward <greg-hg@gerg.ca>
parents:
9151
diff
changeset
|
184 if cachetags is not None: |
4017291c4c48
tags: support 'instant' tag retrieval (issue548)
Greg Ward <greg-hg@gerg.ca>
parents:
9151
diff
changeset
|
185 assert not shouldwrite |
4017291c4c48
tags: support 'instant' tag retrieval (issue548)
Greg Ward <greg-hg@gerg.ca>
parents:
9151
diff
changeset
|
186 # XXX is this really 100% correct? are there oddball special |
4017291c4c48
tags: support 'instant' tag retrieval (issue548)
Greg Ward <greg-hg@gerg.ca>
parents:
9151
diff
changeset
|
187 # cases where a global tag should outrank a local tag but won't, |
4017291c4c48
tags: support 'instant' tag retrieval (issue548)
Greg Ward <greg-hg@gerg.ca>
parents:
9151
diff
changeset
|
188 # because cachetags does not contain rank info? |
31710
510267cf6c58
tags: extract tags computation from fnodes into its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31709
diff
changeset
|
189 alltags = {} |
31709
c34c170b25f3
tags: only return 'alltags' in 'findglobaltags'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31708
diff
changeset
|
190 _updatetags(cachetags, alltags) |
c34c170b25f3
tags: only return 'alltags' in 'findglobaltags'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31708
diff
changeset
|
191 return alltags |
9151
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9149
diff
changeset
|
192 |
24445
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24143
diff
changeset
|
193 for head in reversed(heads): # oldest to newest |
43543
2c3afd083e45
index: use `index.has_node` in `tags.findglobaltags`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43117
diff
changeset
|
194 assert repo.changelog.index.has_node( |
2c3afd083e45
index: use `index.has_node` in `tags.findglobaltags`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43117
diff
changeset
|
195 head |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
196 ), b"tag cache returned bogus head %s" % short(head) |
31711
472d726c1afd
tags: extract filenode filtering into its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31710
diff
changeset
|
197 fnodes = _filterfnodes(tagfnode, reversed(heads)) |
31710
510267cf6c58
tags: extract tags computation from fnodes into its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31709
diff
changeset
|
198 alltags = _tagsfromfnodes(ui, repo, fnodes) |
9151
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9149
diff
changeset
|
199 |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9149
diff
changeset
|
200 # and update the cache (if necessary) |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9149
diff
changeset
|
201 if shouldwrite: |
24760
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24759
diff
changeset
|
202 _writetagcache(ui, repo, valid, alltags) |
31709
c34c170b25f3
tags: only return 'alltags' in 'findglobaltags'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31708
diff
changeset
|
203 return alltags |
9151
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9149
diff
changeset
|
204 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
205 |
31711
472d726c1afd
tags: extract filenode filtering into its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31710
diff
changeset
|
206 def _filterfnodes(tagfnode, nodes): |
472d726c1afd
tags: extract filenode filtering into its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31710
diff
changeset
|
207 """return a list of unique fnodes |
472d726c1afd
tags: extract filenode filtering into its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31710
diff
changeset
|
208 |
472d726c1afd
tags: extract filenode filtering into its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31710
diff
changeset
|
209 The order of this list matches the order of "nodes". Preserving this order |
472d726c1afd
tags: extract filenode filtering into its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31710
diff
changeset
|
210 is important as reading tags in different order provides different |
472d726c1afd
tags: extract filenode filtering into its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31710
diff
changeset
|
211 results.""" |
472d726c1afd
tags: extract filenode filtering into its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31710
diff
changeset
|
212 seen = set() # set of fnode |
472d726c1afd
tags: extract filenode filtering into its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31710
diff
changeset
|
213 fnodes = [] |
472d726c1afd
tags: extract filenode filtering into its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31710
diff
changeset
|
214 for no in nodes: # oldest to newest |
472d726c1afd
tags: extract filenode filtering into its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31710
diff
changeset
|
215 fnode = tagfnode.get(no) |
472d726c1afd
tags: extract filenode filtering into its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31710
diff
changeset
|
216 if fnode and fnode not in seen: |
472d726c1afd
tags: extract filenode filtering into its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31710
diff
changeset
|
217 seen.add(fnode) |
472d726c1afd
tags: extract filenode filtering into its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31710
diff
changeset
|
218 fnodes.append(fnode) |
472d726c1afd
tags: extract filenode filtering into its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31710
diff
changeset
|
219 return fnodes |
472d726c1afd
tags: extract filenode filtering into its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31710
diff
changeset
|
220 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
221 |
31710
510267cf6c58
tags: extract tags computation from fnodes into its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31709
diff
changeset
|
222 def _tagsfromfnodes(ui, repo, fnodes): |
510267cf6c58
tags: extract tags computation from fnodes into its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31709
diff
changeset
|
223 """return a tagsmap from a list of file-node |
510267cf6c58
tags: extract tags computation from fnodes into its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31709
diff
changeset
|
224 |
510267cf6c58
tags: extract tags computation from fnodes into its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31709
diff
changeset
|
225 tagsmap: tag name to (node, hist) 2-tuples. |
510267cf6c58
tags: extract tags computation from fnodes into its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31709
diff
changeset
|
226 |
510267cf6c58
tags: extract tags computation from fnodes into its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31709
diff
changeset
|
227 The order of the list matters.""" |
510267cf6c58
tags: extract tags computation from fnodes into its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31709
diff
changeset
|
228 alltags = {} |
510267cf6c58
tags: extract tags computation from fnodes into its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31709
diff
changeset
|
229 fctx = None |
510267cf6c58
tags: extract tags computation from fnodes into its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31709
diff
changeset
|
230 for fnode in fnodes: |
510267cf6c58
tags: extract tags computation from fnodes into its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31709
diff
changeset
|
231 if fctx is None: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
232 fctx = repo.filectx(b'.hgtags', fileid=fnode) |
31710
510267cf6c58
tags: extract tags computation from fnodes into its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31709
diff
changeset
|
233 else: |
510267cf6c58
tags: extract tags computation from fnodes into its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31709
diff
changeset
|
234 fctx = fctx.filectx(fnode) |
510267cf6c58
tags: extract tags computation from fnodes into its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31709
diff
changeset
|
235 filetags = _readtags(ui, repo, fctx.data().splitlines(), fctx) |
510267cf6c58
tags: extract tags computation from fnodes into its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31709
diff
changeset
|
236 _updatetags(filetags, alltags) |
510267cf6c58
tags: extract tags computation from fnodes into its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31709
diff
changeset
|
237 return alltags |
510267cf6c58
tags: extract tags computation from fnodes into its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31709
diff
changeset
|
238 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
239 |
9149
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
240 def readlocaltags(ui, repo, alltags, tagtypes): |
24445
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24143
diff
changeset
|
241 '''Read local tags in repo. Update alltags and tagtypes.''' |
9149
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
242 try: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
243 data = repo.vfs.read(b"localtags") |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25381
diff
changeset
|
244 except IOError as inst: |
14038
0e6f622f31ca
tags: loosen IOError filtering when reading localtags
Idan Kamara <idankk86@gmail.com>
parents:
14020
diff
changeset
|
245 if inst.errno != errno.ENOENT: |
0e6f622f31ca
tags: loosen IOError filtering when reading localtags
Idan Kamara <idankk86@gmail.com>
parents:
14020
diff
changeset
|
246 raise |
0e6f622f31ca
tags: loosen IOError filtering when reading localtags
Idan Kamara <idankk86@gmail.com>
parents:
14020
diff
changeset
|
247 return |
0e6f622f31ca
tags: loosen IOError filtering when reading localtags
Idan Kamara <idankk86@gmail.com>
parents:
14020
diff
changeset
|
248 |
0e6f622f31ca
tags: loosen IOError filtering when reading localtags
Idan Kamara <idankk86@gmail.com>
parents:
14020
diff
changeset
|
249 # localtags is in the local encoding; re-encode to UTF-8 on |
0e6f622f31ca
tags: loosen IOError filtering when reading localtags
Idan Kamara <idankk86@gmail.com>
parents:
14020
diff
changeset
|
250 # input for consistency with the rest of this module. |
0e6f622f31ca
tags: loosen IOError filtering when reading localtags
Idan Kamara <idankk86@gmail.com>
parents:
14020
diff
changeset
|
251 filetags = _readtags( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
252 ui, repo, data.splitlines(), b"localtags", recode=encoding.fromlocal |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
253 ) |
21823
925d1bb9a971
repoview: do not crash when localtags refers to non existing revisions
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21030
diff
changeset
|
254 |
925d1bb9a971
repoview: do not crash when localtags refers to non existing revisions
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21030
diff
changeset
|
255 # remove tags pointing to invalid nodes |
925d1bb9a971
repoview: do not crash when localtags refers to non existing revisions
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21030
diff
changeset
|
256 cl = repo.changelog |
35828
553a98a436cf
tags: explicitly grab list of dict keys
Augie Fackler <augie@google.com>
parents:
34015
diff
changeset
|
257 for t in list(filetags): |
21823
925d1bb9a971
repoview: do not crash when localtags refers to non existing revisions
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21030
diff
changeset
|
258 try: |
925d1bb9a971
repoview: do not crash when localtags refers to non existing revisions
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21030
diff
changeset
|
259 cl.rev(filetags[t][0]) |
925d1bb9a971
repoview: do not crash when localtags refers to non existing revisions
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21030
diff
changeset
|
260 except (LookupError, ValueError): |
925d1bb9a971
repoview: do not crash when localtags refers to non existing revisions
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21030
diff
changeset
|
261 del filetags[t] |
925d1bb9a971
repoview: do not crash when localtags refers to non existing revisions
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21030
diff
changeset
|
262 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
263 _updatetags(filetags, alltags, b'local', tagtypes) |
9149
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
264 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
265 |
21892
89cdebc31cda
tags: introduce _readtaghist function
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21832
diff
changeset
|
266 def _readtaghist(ui, repo, lines, fn, recode=None, calcnodelines=False): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45787
diff
changeset
|
267 """Read tag definitions from a file (or any source of lines). |
24445
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24143
diff
changeset
|
268 |
21892
89cdebc31cda
tags: introduce _readtaghist function
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21832
diff
changeset
|
269 This function returns two sortdicts with similar information: |
24445
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24143
diff
changeset
|
270 |
23139
e53f6b72a0e4
spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents:
21892
diff
changeset
|
271 - the first dict, bintaghist, contains the tag information as expected by |
21892
89cdebc31cda
tags: introduce _readtaghist function
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21832
diff
changeset
|
272 the _readtags function, i.e. a mapping from tag name to (node, hist): |
89cdebc31cda
tags: introduce _readtaghist function
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21832
diff
changeset
|
273 - node is the node id from the last line read for that name, |
89cdebc31cda
tags: introduce _readtaghist function
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21832
diff
changeset
|
274 - hist is the list of node ids previously associated with it (in file |
24445
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24143
diff
changeset
|
275 order). All node ids are binary, not hex. |
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24143
diff
changeset
|
276 |
21892
89cdebc31cda
tags: introduce _readtaghist function
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21832
diff
changeset
|
277 - the second dict, hextaglines, is a mapping from tag name to a list of |
89cdebc31cda
tags: introduce _readtaghist function
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21832
diff
changeset
|
278 [hexnode, line number] pairs, ordered from the oldest to the newest node. |
24445
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24143
diff
changeset
|
279 |
21892
89cdebc31cda
tags: introduce _readtaghist function
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21832
diff
changeset
|
280 When calcnodelines is False the hextaglines dict is not calculated (an |
89cdebc31cda
tags: introduce _readtaghist function
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21832
diff
changeset
|
281 empty dict is returned). This is done to improve this function's |
89cdebc31cda
tags: introduce _readtaghist function
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21832
diff
changeset
|
282 performance in cases where the line numbers are not needed. |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45787
diff
changeset
|
283 """ |
9149
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
284 |
21892
89cdebc31cda
tags: introduce _readtaghist function
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21832
diff
changeset
|
285 bintaghist = util.sortdict() |
89cdebc31cda
tags: introduce _readtaghist function
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21832
diff
changeset
|
286 hextaglines = util.sortdict() |
9149
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
287 count = 0 |
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
288 |
29038
a9dd92c48a1c
tags: silence cache parsing errors
Matt Mackall <mpm@selenic.com>
parents:
26945
diff
changeset
|
289 def dbg(msg): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
290 ui.debug(b"%s, line %d: %s\n" % (fn, count, msg)) |
9149
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
291 |
21892
89cdebc31cda
tags: introduce _readtaghist function
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21832
diff
changeset
|
292 for nline, line in enumerate(lines): |
9149
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
293 count += 1 |
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
294 if not line: |
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
295 continue |
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
296 try: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
297 (nodehex, name) = line.split(b" ", 1) |
9149
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
298 except ValueError: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
299 dbg(b"cannot parse entry") |
9149
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
300 continue |
9152
4017291c4c48
tags: support 'instant' tag retrieval (issue548)
Greg Ward <greg-hg@gerg.ca>
parents:
9151
diff
changeset
|
301 name = name.strip() |
4017291c4c48
tags: support 'instant' tag retrieval (issue548)
Greg Ward <greg-hg@gerg.ca>
parents:
9151
diff
changeset
|
302 if recode: |
4017291c4c48
tags: support 'instant' tag retrieval (issue548)
Greg Ward <greg-hg@gerg.ca>
parents:
9151
diff
changeset
|
303 name = recode(name) |
9149
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
304 try: |
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
305 nodebin = bin(nodehex) |
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
306 except TypeError: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
307 dbg(b"node '%s' is not well formed" % nodehex) |
9149
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
308 continue |
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
309 |
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
310 # update filetags |
21892
89cdebc31cda
tags: introduce _readtaghist function
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21832
diff
changeset
|
311 if calcnodelines: |
89cdebc31cda
tags: introduce _readtaghist function
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21832
diff
changeset
|
312 # map tag name to a list of line numbers |
89cdebc31cda
tags: introduce _readtaghist function
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21832
diff
changeset
|
313 if name not in hextaglines: |
89cdebc31cda
tags: introduce _readtaghist function
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21832
diff
changeset
|
314 hextaglines[name] = [] |
89cdebc31cda
tags: introduce _readtaghist function
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21832
diff
changeset
|
315 hextaglines[name].append([nodehex, nline]) |
89cdebc31cda
tags: introduce _readtaghist function
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21832
diff
changeset
|
316 continue |
89cdebc31cda
tags: introduce _readtaghist function
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21832
diff
changeset
|
317 # map tag name to (node, hist) |
89cdebc31cda
tags: introduce _readtaghist function
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21832
diff
changeset
|
318 if name not in bintaghist: |
89cdebc31cda
tags: introduce _readtaghist function
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21832
diff
changeset
|
319 bintaghist[name] = [] |
89cdebc31cda
tags: introduce _readtaghist function
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21832
diff
changeset
|
320 bintaghist[name].append(nodebin) |
89cdebc31cda
tags: introduce _readtaghist function
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21832
diff
changeset
|
321 return bintaghist, hextaglines |
89cdebc31cda
tags: introduce _readtaghist function
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21832
diff
changeset
|
322 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
323 |
21892
89cdebc31cda
tags: introduce _readtaghist function
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21832
diff
changeset
|
324 def _readtags(ui, repo, lines, fn, recode=None, calcnodelines=False): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45787
diff
changeset
|
325 """Read tag definitions from a file (or any source of lines). |
24445
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24143
diff
changeset
|
326 |
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24143
diff
changeset
|
327 Returns a mapping from tag name to (node, hist). |
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24143
diff
changeset
|
328 |
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24143
diff
changeset
|
329 "node" is the node id from the last line read for that name. "hist" |
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24143
diff
changeset
|
330 is the list of node ids previously associated with it (in file order). |
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24143
diff
changeset
|
331 All node ids are binary, not hex. |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45787
diff
changeset
|
332 """ |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
333 filetags, nodelines = _readtaghist( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
334 ui, repo, lines, fn, recode=recode, calcnodelines=calcnodelines |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
335 ) |
26945
8a256cee72c8
tags: create new sortdict for performance reasons
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25982
diff
changeset
|
336 # util.sortdict().__setitem__ is much slower at replacing then inserting |
8a256cee72c8
tags: create new sortdict for performance reasons
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25982
diff
changeset
|
337 # new entries. The difference can matter if there are thousands of tags. |
8a256cee72c8
tags: create new sortdict for performance reasons
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25982
diff
changeset
|
338 # Create a new sortdict to avoid the performance penalty. |
8a256cee72c8
tags: create new sortdict for performance reasons
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25982
diff
changeset
|
339 newtags = util.sortdict() |
21892
89cdebc31cda
tags: introduce _readtaghist function
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21832
diff
changeset
|
340 for tag, taghist in filetags.items(): |
26945
8a256cee72c8
tags: create new sortdict for performance reasons
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25982
diff
changeset
|
341 newtags[tag] = (taghist[-1], taghist[:-1]) |
8a256cee72c8
tags: create new sortdict for performance reasons
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25982
diff
changeset
|
342 return newtags |
9149
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
343 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
344 |
31708
d0e7c70f14b7
tags: make argument 'tagtype' optional in '_updatetags'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31707
diff
changeset
|
345 def _updatetags(filetags, alltags, tagtype=None, tagtypes=None): |
d0e7c70f14b7
tags: make argument 'tagtype' optional in '_updatetags'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31707
diff
changeset
|
346 """Incorporate the tag info read from one file into dictionnaries |
d0e7c70f14b7
tags: make argument 'tagtype' optional in '_updatetags'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31707
diff
changeset
|
347 |
d0e7c70f14b7
tags: make argument 'tagtype' optional in '_updatetags'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31707
diff
changeset
|
348 The first one, 'alltags', is a "tagmaps" (see 'findglobaltags' for details). |
d0e7c70f14b7
tags: make argument 'tagtype' optional in '_updatetags'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31707
diff
changeset
|
349 |
d0e7c70f14b7
tags: make argument 'tagtype' optional in '_updatetags'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31707
diff
changeset
|
350 The second one, 'tagtypes', is optional and will be updated to track the |
d0e7c70f14b7
tags: make argument 'tagtype' optional in '_updatetags'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31707
diff
changeset
|
351 "tagtype" of entries in the tagmaps. When set, the 'tagtype' argument also |
d0e7c70f14b7
tags: make argument 'tagtype' optional in '_updatetags'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31707
diff
changeset
|
352 needs to be set.""" |
d0e7c70f14b7
tags: make argument 'tagtype' optional in '_updatetags'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31707
diff
changeset
|
353 if tagtype is None: |
d0e7c70f14b7
tags: make argument 'tagtype' optional in '_updatetags'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31707
diff
changeset
|
354 assert tagtypes is None |
9149
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
355 |
48913
f254fc73d956
global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48875
diff
changeset
|
356 for name, nodehist in filetags.items(): |
9149
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
357 if name not in alltags: |
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
358 alltags[name] = nodehist |
31708
d0e7c70f14b7
tags: make argument 'tagtype' optional in '_updatetags'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31707
diff
changeset
|
359 if tagtype is not None: |
d0e7c70f14b7
tags: make argument 'tagtype' optional in '_updatetags'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31707
diff
changeset
|
360 tagtypes[name] = tagtype |
9149
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
361 continue |
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
362 |
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
363 # we prefer alltags[name] if: |
17424
e7cfe3587ea4
fix trivial spelling errors
Mads Kiilerich <mads@kiilerich.com>
parents:
17256
diff
changeset
|
364 # it supersedes us OR |
e7cfe3587ea4
fix trivial spelling errors
Mads Kiilerich <mads@kiilerich.com>
parents:
17256
diff
changeset
|
365 # mutual supersedes and it has a higher rank |
9149
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
366 # otherwise we win because we're tip-most |
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
367 anode, ahist = nodehist |
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
368 bnode, bhist = alltags[name] |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
369 if ( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
370 bnode != anode |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
371 and anode in bhist |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
372 and (bnode not in ahist or len(bhist) > len(ahist)) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
373 ): |
9149
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
374 anode = bnode |
31708
d0e7c70f14b7
tags: make argument 'tagtype' optional in '_updatetags'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31707
diff
changeset
|
375 elif tagtype is not None: |
19108
cb95716da5fe
tags: update tag type only if tag node is updated (issue3911)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
17424
diff
changeset
|
376 tagtypes[name] = tagtype |
9149
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
377 ahist.extend([n for n in bhist if n not in ahist]) |
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
378 alltags[name] = anode, ahist |
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
379 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
380 |
24737
b061a2049662
tags: have a different cache file per filter level
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24735
diff
changeset
|
381 def _filename(repo): |
b061a2049662
tags: have a different cache file per filter level
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24735
diff
changeset
|
382 """name of a tagcache file for a given repo or repoview""" |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
383 filename = b'tags2' |
24737
b061a2049662
tags: have a different cache file per filter level
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24735
diff
changeset
|
384 if repo.filtername: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
385 filename = b'%s-%s' % (filename, repo.filtername) |
24737
b061a2049662
tags: have a different cache file per filter level
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24735
diff
changeset
|
386 return filename |
b061a2049662
tags: have a different cache file per filter level
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24735
diff
changeset
|
387 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
388 |
24445
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24143
diff
changeset
|
389 def _readtagcache(ui, repo): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45787
diff
changeset
|
390 """Read the tag cache. |
9151
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9149
diff
changeset
|
391 |
24760
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24759
diff
changeset
|
392 Returns a tuple (heads, fnodes, validinfo, cachetags, shouldwrite). |
24445
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24143
diff
changeset
|
393 |
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24143
diff
changeset
|
394 If the cache is completely up-to-date, "cachetags" is a dict of the |
24760
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24759
diff
changeset
|
395 form returned by _readtags() and "heads", "fnodes", and "validinfo" are |
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24759
diff
changeset
|
396 None and "shouldwrite" is False. |
9151
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9149
diff
changeset
|
397 |
24445
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24143
diff
changeset
|
398 If the cache is not up to date, "cachetags" is None. "heads" is a list |
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24143
diff
changeset
|
399 of all heads currently in the repository, ordered from tip to oldest. |
24760
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24759
diff
changeset
|
400 "validinfo" is a tuple describing cache validation info. This is used |
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24759
diff
changeset
|
401 when writing the tags cache. "fnodes" is a mapping from head to .hgtags |
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24759
diff
changeset
|
402 filenode. "shouldwrite" is True. |
24445
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24143
diff
changeset
|
403 |
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24143
diff
changeset
|
404 If the cache is not up to date, the caller is responsible for reading tag |
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24143
diff
changeset
|
405 info from each returned head. (See findglobaltags().) |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45787
diff
changeset
|
406 """ |
9151
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9149
diff
changeset
|
407 try: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
408 cachefile = repo.cachevfs(_filename(repo), b'r') |
11066
26abd91d9e84
static-http: mimic more closely localrepo (issue2164: allow clone -r )
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
10263
diff
changeset
|
409 # force reading the file for static-http |
26abd91d9e84
static-http: mimic more closely localrepo (issue2164: allow clone -r )
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
10263
diff
changeset
|
410 cachelines = iter(cachefile) |
9151
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9149
diff
changeset
|
411 except IOError: |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9149
diff
changeset
|
412 cachefile = None |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9149
diff
changeset
|
413 |
24760
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24759
diff
changeset
|
414 cacherev = None |
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24759
diff
changeset
|
415 cachenode = None |
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24759
diff
changeset
|
416 cachehash = None |
9151
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9149
diff
changeset
|
417 if cachefile: |
12758
2d754eae430c
tags: do not fail if tags.cache is corrupted (issue2444)
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11352
diff
changeset
|
418 try: |
29216
ead25aa27a43
py3: convert to next() function
timeless <timeless@mozdev.org>
parents:
29039
diff
changeset
|
419 validline = next(cachelines) |
24760
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24759
diff
changeset
|
420 validline = validline.split() |
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24759
diff
changeset
|
421 cacherev = int(validline[0]) |
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24759
diff
changeset
|
422 cachenode = bin(validline[1]) |
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24759
diff
changeset
|
423 if len(validline) > 2: |
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24759
diff
changeset
|
424 cachehash = bin(validline[2]) |
14020
98f79a5c3086
tags: catch more corruption during cache parsing (issue2779)
Matt Mackall <mpm@selenic.com>
parents:
13341
diff
changeset
|
425 except Exception: |
24759
d082c6ef9ec3
tags: don't read .hgtags fnodes from tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24737
diff
changeset
|
426 # corruption of the cache, just recompute it. |
d082c6ef9ec3
tags: don't read .hgtags fnodes from tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24737
diff
changeset
|
427 pass |
9151
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9149
diff
changeset
|
428 |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9149
diff
changeset
|
429 tipnode = repo.changelog.tip() |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9149
diff
changeset
|
430 tiprev = len(repo.changelog) - 1 |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9149
diff
changeset
|
431 |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9149
diff
changeset
|
432 # Case 1 (common): tip is the same, so nothing has changed. |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9149
diff
changeset
|
433 # (Unchanged tip trivially means no changesets have been added. |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9149
diff
changeset
|
434 # But, thanks to localrepository.destroyed(), it also means none |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9149
diff
changeset
|
435 # have been destroyed by strip or rollback.) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
436 if ( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
437 cacherev == tiprev |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
438 and cachenode == tipnode |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
439 and cachehash == scmutil.filteredhash(repo, tiprev) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
440 ): |
11066
26abd91d9e84
static-http: mimic more closely localrepo (issue2164: allow clone -r )
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
10263
diff
changeset
|
441 tags = _readtags(ui, repo, cachelines, cachefile.name) |
9152
4017291c4c48
tags: support 'instant' tag retrieval (issue548)
Greg Ward <greg-hg@gerg.ca>
parents:
9151
diff
changeset
|
442 cachefile.close() |
24760
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24759
diff
changeset
|
443 return (None, None, None, tags, False) |
9152
4017291c4c48
tags: support 'instant' tag retrieval (issue548)
Greg Ward <greg-hg@gerg.ca>
parents:
9151
diff
changeset
|
444 if cachefile: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
445 cachefile.close() # ignore rest of file |
9312
c5f0825c1dbb
kill trailing whitespace
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
9152
diff
changeset
|
446 |
24760
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24759
diff
changeset
|
447 valid = (tiprev, tipnode, scmutil.filteredhash(repo, tiprev)) |
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24759
diff
changeset
|
448 |
9151
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9149
diff
changeset
|
449 repoheads = repo.heads() |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9149
diff
changeset
|
450 # Case 2 (uncommon): empty repo; get out quickly and don't bother |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9149
diff
changeset
|
451 # writing an empty cache. |
47012
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46819
diff
changeset
|
452 if repoheads == [repo.nullid]: |
24760
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24759
diff
changeset
|
453 return ([], {}, valid, {}, False) |
9151
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9149
diff
changeset
|
454 |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9149
diff
changeset
|
455 # Case 3 (uncommon): cache file missing or empty. |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9149
diff
changeset
|
456 |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9149
diff
changeset
|
457 # Case 4 (uncommon): tip rev decreased. This should only happen |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9149
diff
changeset
|
458 # when we're called from localrepository.destroyed(). Refresh the |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9149
diff
changeset
|
459 # cache so future invocations will not see disappeared heads in the |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9149
diff
changeset
|
460 # cache. |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9149
diff
changeset
|
461 |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9149
diff
changeset
|
462 # Case 5 (common): tip has changed, so we've added/replaced heads. |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9149
diff
changeset
|
463 |
11352
b19067ee4507
tags: remove inactive debugging code.
Greg Ward <greg-hg@gerg.ca>
parents:
11351
diff
changeset
|
464 # As it happens, the code to handle cases 3, 4, 5 is the same. |
9151
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9149
diff
changeset
|
465 |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9149
diff
changeset
|
466 # N.B. in case 4 (nodes destroyed), "new head" really means "newly |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9149
diff
changeset
|
467 # exposed". |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
468 if not len(repo.file(b'.hgtags')): |
16730
dd4ce44ff53c
tags: short-circuit if no tags have ever been committed
Bryan O'Sullivan <bryano@fb.com>
parents:
16589
diff
changeset
|
469 # No tags have ever been committed, so we can avoid a |
dd4ce44ff53c
tags: short-circuit if no tags have ever been committed
Bryan O'Sullivan <bryano@fb.com>
parents:
16589
diff
changeset
|
470 # potentially expensive search. |
24761
61a6d83280d3
tags: return empty list of heads for no .hgtags case
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24760
diff
changeset
|
471 return ([], {}, valid, None, True) |
16730
dd4ce44ff53c
tags: short-circuit if no tags have ever been committed
Bryan O'Sullivan <bryano@fb.com>
parents:
16589
diff
changeset
|
472 |
9151
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9149
diff
changeset
|
473 # Now we have to lookup the .hgtags filenode for every new head. |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9149
diff
changeset
|
474 # This is the most expensive part of finding tags, so performance |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9149
diff
changeset
|
475 # depends primarily on the size of newheads. Worst case: no cache |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9149
diff
changeset
|
476 # file, so newheads == repoheads. |
42239
6770df6e4365
tags: avoid double-reversing a list
Martin von Zweigbergk <martinvonz@google.com>
parents:
42237
diff
changeset
|
477 # Reversed order helps the cache ('repoheads' is in descending order) |
6770df6e4365
tags: avoid double-reversing a list
Martin von Zweigbergk <martinvonz@google.com>
parents:
42237
diff
changeset
|
478 cachefnode = _getfnodes(ui, repo, reversed(repoheads)) |
31705
5eb4d206202b
tags: extract fnode retrieval into its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31669
diff
changeset
|
479 |
5eb4d206202b
tags: extract fnode retrieval into its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31669
diff
changeset
|
480 # Caller has to iterate over all heads, but can use the filenodes in |
5eb4d206202b
tags: extract fnode retrieval into its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31669
diff
changeset
|
481 # cachefnode to get to each .hgtags revision quickly. |
5eb4d206202b
tags: extract fnode retrieval into its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31669
diff
changeset
|
482 return (repoheads, cachefnode, valid, None, True) |
5eb4d206202b
tags: extract fnode retrieval into its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31669
diff
changeset
|
483 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
484 |
31705
5eb4d206202b
tags: extract fnode retrieval into its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31669
diff
changeset
|
485 def _getfnodes(ui, repo, nodes): |
5eb4d206202b
tags: extract fnode retrieval into its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31669
diff
changeset
|
486 """return .hgtags fnodes for a list of changeset nodes |
5eb4d206202b
tags: extract fnode retrieval into its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31669
diff
changeset
|
487 |
5eb4d206202b
tags: extract fnode retrieval into its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31669
diff
changeset
|
488 Return value is a {node: fnode} mapping. There will be no entry for nodes |
5eb4d206202b
tags: extract fnode retrieval into its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31669
diff
changeset
|
489 without a '.hgtags' file. |
5eb4d206202b
tags: extract fnode retrieval into its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31669
diff
changeset
|
490 """ |
5eb4d206202b
tags: extract fnode retrieval into its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31669
diff
changeset
|
491 starttime = util.timer() |
24735
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
492 fnodescache = hgtagsfnodescache(repo.unfiltered()) |
24759
d082c6ef9ec3
tags: don't read .hgtags fnodes from tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24737
diff
changeset
|
493 cachefnode = {} |
46656
9a31f65381ae
tags: validate nodes in _getfnodes() and update cache in case of unknown nodes
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46652
diff
changeset
|
494 validated_fnodes = set() |
9a31f65381ae
tags: validate nodes in _getfnodes() and update cache in case of unknown nodes
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46652
diff
changeset
|
495 unknown_entries = set() |
42239
6770df6e4365
tags: avoid double-reversing a list
Martin von Zweigbergk <martinvonz@google.com>
parents:
42237
diff
changeset
|
496 for node in nodes: |
31788
417363736c11
tags: rename "head" to "node" where we don't care
Martin von Zweigbergk <martinvonz@google.com>
parents:
31711
diff
changeset
|
497 fnode = fnodescache.getfnode(node) |
46656
9a31f65381ae
tags: validate nodes in _getfnodes() and update cache in case of unknown nodes
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46652
diff
changeset
|
498 flog = repo.file(b'.hgtags') |
47012
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46819
diff
changeset
|
499 if fnode != repo.nullid: |
46656
9a31f65381ae
tags: validate nodes in _getfnodes() and update cache in case of unknown nodes
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46652
diff
changeset
|
500 if fnode not in validated_fnodes: |
9a31f65381ae
tags: validate nodes in _getfnodes() and update cache in case of unknown nodes
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46652
diff
changeset
|
501 if flog.hasnode(fnode): |
9a31f65381ae
tags: validate nodes in _getfnodes() and update cache in case of unknown nodes
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46652
diff
changeset
|
502 validated_fnodes.add(fnode) |
9a31f65381ae
tags: validate nodes in _getfnodes() and update cache in case of unknown nodes
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46652
diff
changeset
|
503 else: |
9a31f65381ae
tags: validate nodes in _getfnodes() and update cache in case of unknown nodes
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46652
diff
changeset
|
504 unknown_entries.add(node) |
31788
417363736c11
tags: rename "head" to "node" where we don't care
Martin von Zweigbergk <martinvonz@google.com>
parents:
31711
diff
changeset
|
505 cachefnode[node] = fnode |
24735
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
506 |
46656
9a31f65381ae
tags: validate nodes in _getfnodes() and update cache in case of unknown nodes
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46652
diff
changeset
|
507 if unknown_entries: |
9a31f65381ae
tags: validate nodes in _getfnodes() and update cache in case of unknown nodes
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46652
diff
changeset
|
508 fixed_nodemap = fnodescache.refresh_invalid_nodes(unknown_entries) |
48913
f254fc73d956
global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48875
diff
changeset
|
509 for node, fnode in fixed_nodemap.items(): |
47012
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46819
diff
changeset
|
510 if fnode != repo.nullid: |
46656
9a31f65381ae
tags: validate nodes in _getfnodes() and update cache in case of unknown nodes
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46652
diff
changeset
|
511 cachefnode[node] = fnode |
9a31f65381ae
tags: validate nodes in _getfnodes() and update cache in case of unknown nodes
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46652
diff
changeset
|
512 |
24735
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
513 fnodescache.write() |
9151
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9149
diff
changeset
|
514 |
30975
22fbca1d11ed
mercurial: switch to util.timer for all interval timings
Simon Farnsworth <simonfar@fb.com>
parents:
29216
diff
changeset
|
515 duration = util.timer() - starttime |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
516 ui.log( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
517 b'tagscache', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
518 b'%d/%d cache hits/lookups in %0.4f seconds\n', |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
519 fnodescache.hitcount, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
520 fnodescache.lookupcount, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
521 duration, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
522 ) |
31705
5eb4d206202b
tags: extract fnode retrieval into its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31669
diff
changeset
|
523 return cachefnode |
9151
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9149
diff
changeset
|
524 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
525 |
24760
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24759
diff
changeset
|
526 def _writetagcache(ui, repo, valid, cachetags): |
24763
a698e088ad29
tags: explicitly log which tags cache file is being written
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24762
diff
changeset
|
527 filename = _filename(repo) |
9366
9ff178e7b627
tags: don't crash if unable to write tag cache
Greg Ward <greg-hg@gerg.ca>
parents:
9312
diff
changeset
|
528 try: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
529 cachefile = repo.cachevfs(filename, b'w', atomictemp=True) |
9366
9ff178e7b627
tags: don't crash if unable to write tag cache
Greg Ward <greg-hg@gerg.ca>
parents:
9312
diff
changeset
|
530 except (OSError, IOError): |
9ff178e7b627
tags: don't crash if unable to write tag cache
Greg Ward <greg-hg@gerg.ca>
parents:
9312
diff
changeset
|
531 return |
9151
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9149
diff
changeset
|
532 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
533 ui.log( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
534 b'tagscache', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
535 b'writing .hg/cache/%s with %d tags\n', |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
536 filename, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
537 len(cachetags), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
538 ) |
21030
9ea132aee96c
tags: log events related to tags cache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
19646
diff
changeset
|
539 |
24760
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24759
diff
changeset
|
540 if valid[2]: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
541 cachefile.write( |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
542 b'%d %s %s\n' % (valid[0], hex(valid[1]), hex(valid[2])) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
543 ) |
24760
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24759
diff
changeset
|
544 else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
545 cachefile.write(b'%d %s\n' % (valid[0], hex(valid[1]))) |
9151
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9149
diff
changeset
|
546 |
9152
4017291c4c48
tags: support 'instant' tag retrieval (issue548)
Greg Ward <greg-hg@gerg.ca>
parents:
9151
diff
changeset
|
547 # Tag names in the cache are in UTF-8 -- which is the whole reason |
4017291c4c48
tags: support 'instant' tag retrieval (issue548)
Greg Ward <greg-hg@gerg.ca>
parents:
9151
diff
changeset
|
548 # we keep them in UTF-8 throughout this module. If we converted |
4017291c4c48
tags: support 'instant' tag retrieval (issue548)
Greg Ward <greg-hg@gerg.ca>
parents:
9151
diff
changeset
|
549 # them local encoding on input, we would lose info writing them to |
4017291c4c48
tags: support 'instant' tag retrieval (issue548)
Greg Ward <greg-hg@gerg.ca>
parents:
9151
diff
changeset
|
550 # the cache. |
48913
f254fc73d956
global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48875
diff
changeset
|
551 for (name, (node, hist)) in sorted(cachetags.items()): |
19646
335a558f81dc
tags: write tag overwriting history also into tag cache file (issue3911)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19108
diff
changeset
|
552 for n in hist: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
553 cachefile.write(b"%s %s\n" % (hex(n), name)) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
554 cachefile.write(b"%s %s\n" % (hex(node), name)) |
9152
4017291c4c48
tags: support 'instant' tag retrieval (issue548)
Greg Ward <greg-hg@gerg.ca>
parents:
9151
diff
changeset
|
555 |
14662
2b30124c7d8a
tags: don't allow environment errors to be raised from _writetagscache
Steve Borho <steve@borho.org>
parents:
14168
diff
changeset
|
556 try: |
15057
774da7121fc9
atomictempfile: make close() consistent with other file-like objects.
Greg Ward <greg@gerg.ca>
parents:
14662
diff
changeset
|
557 cachefile.close() |
14662
2b30124c7d8a
tags: don't allow environment errors to be raised from _writetagscache
Steve Borho <steve@borho.org>
parents:
14168
diff
changeset
|
558 except (OSError, IOError): |
2b30124c7d8a
tags: don't allow environment errors to be raised from _writetagscache
Steve Borho <steve@borho.org>
parents:
14168
diff
changeset
|
559 pass |
24735
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
560 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
561 |
31669
a719f3315366
tags: move 'repo.tag' in the 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31668
diff
changeset
|
562 def tag(repo, names, node, message, local, user, date, editor=False): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45787
diff
changeset
|
563 """tag a revision with one or more symbolic names. |
31669
a719f3315366
tags: move 'repo.tag' in the 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31668
diff
changeset
|
564 |
a719f3315366
tags: move 'repo.tag' in the 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31668
diff
changeset
|
565 names is a list of strings or, when adding a single tag, names may be a |
a719f3315366
tags: move 'repo.tag' in the 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31668
diff
changeset
|
566 string. |
a719f3315366
tags: move 'repo.tag' in the 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31668
diff
changeset
|
567 |
a719f3315366
tags: move 'repo.tag' in the 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31668
diff
changeset
|
568 if local is True, the tags are stored in a per-repository file. |
a719f3315366
tags: move 'repo.tag' in the 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31668
diff
changeset
|
569 otherwise, they are stored in the .hgtags file, and a new |
a719f3315366
tags: move 'repo.tag' in the 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31668
diff
changeset
|
570 changeset is committed with the change. |
a719f3315366
tags: move 'repo.tag' in the 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31668
diff
changeset
|
571 |
a719f3315366
tags: move 'repo.tag' in the 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31668
diff
changeset
|
572 keyword arguments: |
a719f3315366
tags: move 'repo.tag' in the 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31668
diff
changeset
|
573 |
a719f3315366
tags: move 'repo.tag' in the 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31668
diff
changeset
|
574 local: whether to store tags in non-version-controlled file |
a719f3315366
tags: move 'repo.tag' in the 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31668
diff
changeset
|
575 (default False) |
a719f3315366
tags: move 'repo.tag' in the 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31668
diff
changeset
|
576 |
a719f3315366
tags: move 'repo.tag' in the 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31668
diff
changeset
|
577 message: commit message to use if committing |
a719f3315366
tags: move 'repo.tag' in the 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31668
diff
changeset
|
578 |
a719f3315366
tags: move 'repo.tag' in the 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31668
diff
changeset
|
579 user: name of user to use if committing |
a719f3315366
tags: move 'repo.tag' in the 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31668
diff
changeset
|
580 |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45787
diff
changeset
|
581 date: date tuple to use if committing""" |
31669
a719f3315366
tags: move 'repo.tag' in the 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31668
diff
changeset
|
582 |
a719f3315366
tags: move 'repo.tag' in the 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31668
diff
changeset
|
583 if not local: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
584 m = matchmod.exact([b'.hgtags']) |
43652
ba5c39b9324c
tags: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents:
43543
diff
changeset
|
585 st = repo.status(match=m, unknown=True, ignored=True) |
ba5c39b9324c
tags: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents:
43543
diff
changeset
|
586 if any( |
ba5c39b9324c
tags: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents:
43543
diff
changeset
|
587 ( |
ba5c39b9324c
tags: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents:
43543
diff
changeset
|
588 st.modified, |
ba5c39b9324c
tags: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents:
43543
diff
changeset
|
589 st.added, |
ba5c39b9324c
tags: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents:
43543
diff
changeset
|
590 st.removed, |
ba5c39b9324c
tags: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents:
43543
diff
changeset
|
591 st.deleted, |
ba5c39b9324c
tags: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents:
43543
diff
changeset
|
592 st.unknown, |
ba5c39b9324c
tags: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents:
43543
diff
changeset
|
593 st.ignored, |
ba5c39b9324c
tags: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents:
43543
diff
changeset
|
594 ) |
ba5c39b9324c
tags: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents:
43543
diff
changeset
|
595 ): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
596 raise error.Abort( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
597 _(b'working copy of .hgtags is changed'), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
598 hint=_(b'please commit .hgtags manually'), |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
599 ) |
31669
a719f3315366
tags: move 'repo.tag' in the 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31668
diff
changeset
|
600 |
33255
4f3f08262eb4
tag: make sure the repository is locked when tagging
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
31996
diff
changeset
|
601 with repo.wlock(): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
602 repo.tags() # instantiate the cache |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
603 _tag(repo, names, node, message, local, user, date, editor=editor) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
604 |
31669
a719f3315366
tags: move 'repo.tag' in the 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31668
diff
changeset
|
605 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
606 def _tag( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
607 repo, names, node, message, local, user, date, extra=None, editor=False |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
608 ): |
41841
b1d07f4614a6
py3: use bytes instead of str in isinstance()
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
41759
diff
changeset
|
609 if isinstance(names, bytes): |
31668
7d0459706716
tags: move '_tags' from 'repo' to 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31360
diff
changeset
|
610 names = (names,) |
7d0459706716
tags: move '_tags' from 'repo' to 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31360
diff
changeset
|
611 |
7d0459706716
tags: move '_tags' from 'repo' to 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31360
diff
changeset
|
612 branches = repo.branchmap() |
7d0459706716
tags: move '_tags' from 'repo' to 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31360
diff
changeset
|
613 for name in names: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
614 repo.hook(b'pretag', throw=True, node=hex(node), tag=name, local=local) |
31668
7d0459706716
tags: move '_tags' from 'repo' to 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31360
diff
changeset
|
615 if name in branches: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
616 repo.ui.warn( |
43117
8ff1ecfadcd1
cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents:
43106
diff
changeset
|
617 _(b"warning: tag %s conflicts with existing branch name\n") |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
618 % name |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
619 ) |
31668
7d0459706716
tags: move '_tags' from 'repo' to 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31360
diff
changeset
|
620 |
7d0459706716
tags: move '_tags' from 'repo' to 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31360
diff
changeset
|
621 def writetags(fp, names, munge, prevtags): |
42567
4eaf7197a740
cleanup: use named constants for second arg to .seek()
Augie Fackler <augie@google.com>
parents:
42239
diff
changeset
|
622 fp.seek(0, io.SEEK_END) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
623 if prevtags and not prevtags.endswith(b'\n'): |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
624 fp.write(b'\n') |
31668
7d0459706716
tags: move '_tags' from 'repo' to 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31360
diff
changeset
|
625 for name in names: |
7d0459706716
tags: move '_tags' from 'repo' to 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31360
diff
changeset
|
626 if munge: |
7d0459706716
tags: move '_tags' from 'repo' to 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31360
diff
changeset
|
627 m = munge(name) |
7d0459706716
tags: move '_tags' from 'repo' to 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31360
diff
changeset
|
628 else: |
7d0459706716
tags: move '_tags' from 'repo' to 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31360
diff
changeset
|
629 m = name |
7d0459706716
tags: move '_tags' from 'repo' to 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31360
diff
changeset
|
630 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
631 if repo._tagscache.tagtypes and name in repo._tagscache.tagtypes: |
47012
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46819
diff
changeset
|
632 old = repo.tags().get(name, repo.nullid) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
633 fp.write(b'%s %s\n' % (hex(old), m)) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
634 fp.write(b'%s %s\n' % (hex(node), m)) |
31668
7d0459706716
tags: move '_tags' from 'repo' to 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31360
diff
changeset
|
635 fp.close() |
7d0459706716
tags: move '_tags' from 'repo' to 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31360
diff
changeset
|
636 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
637 prevtags = b'' |
31668
7d0459706716
tags: move '_tags' from 'repo' to 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31360
diff
changeset
|
638 if local: |
7d0459706716
tags: move '_tags' from 'repo' to 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31360
diff
changeset
|
639 try: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
640 fp = repo.vfs(b'localtags', b'r+') |
31668
7d0459706716
tags: move '_tags' from 'repo' to 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31360
diff
changeset
|
641 except IOError: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
642 fp = repo.vfs(b'localtags', b'a') |
31668
7d0459706716
tags: move '_tags' from 'repo' to 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31360
diff
changeset
|
643 else: |
7d0459706716
tags: move '_tags' from 'repo' to 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31360
diff
changeset
|
644 prevtags = fp.read() |
7d0459706716
tags: move '_tags' from 'repo' to 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31360
diff
changeset
|
645 |
7d0459706716
tags: move '_tags' from 'repo' to 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31360
diff
changeset
|
646 # local tags are stored in the current charset |
7d0459706716
tags: move '_tags' from 'repo' to 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31360
diff
changeset
|
647 writetags(fp, names, None, prevtags) |
7d0459706716
tags: move '_tags' from 'repo' to 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31360
diff
changeset
|
648 for name in names: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
649 repo.hook(b'tag', node=hex(node), tag=name, local=local) |
31668
7d0459706716
tags: move '_tags' from 'repo' to 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31360
diff
changeset
|
650 return |
7d0459706716
tags: move '_tags' from 'repo' to 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31360
diff
changeset
|
651 |
7d0459706716
tags: move '_tags' from 'repo' to 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31360
diff
changeset
|
652 try: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
653 fp = repo.wvfs(b'.hgtags', b'rb+') |
31668
7d0459706716
tags: move '_tags' from 'repo' to 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31360
diff
changeset
|
654 except IOError as e: |
7d0459706716
tags: move '_tags' from 'repo' to 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31360
diff
changeset
|
655 if e.errno != errno.ENOENT: |
7d0459706716
tags: move '_tags' from 'repo' to 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31360
diff
changeset
|
656 raise |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
657 fp = repo.wvfs(b'.hgtags', b'ab') |
31668
7d0459706716
tags: move '_tags' from 'repo' to 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31360
diff
changeset
|
658 else: |
7d0459706716
tags: move '_tags' from 'repo' to 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31360
diff
changeset
|
659 prevtags = fp.read() |
7d0459706716
tags: move '_tags' from 'repo' to 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31360
diff
changeset
|
660 |
7d0459706716
tags: move '_tags' from 'repo' to 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31360
diff
changeset
|
661 # committed tags are stored in UTF-8 |
7d0459706716
tags: move '_tags' from 'repo' to 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31360
diff
changeset
|
662 writetags(fp, names, encoding.fromlocal, prevtags) |
7d0459706716
tags: move '_tags' from 'repo' to 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31360
diff
changeset
|
663 |
7d0459706716
tags: move '_tags' from 'repo' to 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31360
diff
changeset
|
664 fp.close() |
7d0459706716
tags: move '_tags' from 'repo' to 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31360
diff
changeset
|
665 |
7d0459706716
tags: move '_tags' from 'repo' to 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31360
diff
changeset
|
666 repo.invalidatecaches() |
7d0459706716
tags: move '_tags' from 'repo' to 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31360
diff
changeset
|
667 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
668 if b'.hgtags' not in repo.dirstate: |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
669 repo[None].add([b'.hgtags']) |
31668
7d0459706716
tags: move '_tags' from 'repo' to 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31360
diff
changeset
|
670 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
671 m = matchmod.exact([b'.hgtags']) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
672 tagnode = repo.commit( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
673 message, user, date, extra=extra, match=m, editor=editor |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
674 ) |
31668
7d0459706716
tags: move '_tags' from 'repo' to 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31360
diff
changeset
|
675 |
7d0459706716
tags: move '_tags' from 'repo' to 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31360
diff
changeset
|
676 for name in names: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
677 repo.hook(b'tag', node=hex(node), tag=name, local=local) |
31668
7d0459706716
tags: move '_tags' from 'repo' to 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31360
diff
changeset
|
678 |
7d0459706716
tags: move '_tags' from 'repo' to 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31360
diff
changeset
|
679 return tagnode |
7d0459706716
tags: move '_tags' from 'repo' to 'tags' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31360
diff
changeset
|
680 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
681 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
682 _fnodescachefile = b'hgtagsfnodes1' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
683 _fnodesrecsize = 4 + 20 # changeset fragment + filenode |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
684 _fnodesmissingrec = b'\xff' * 24 |
24735
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
685 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
686 |
48946
642e31cb55f0
py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48913
diff
changeset
|
687 class hgtagsfnodescache: |
24735
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
688 """Persistent cache mapping revisions to .hgtags filenodes. |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
689 |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
690 The cache is an array of records. Each item in the array corresponds to |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
691 a changelog revision. Values in the array contain the first 4 bytes of |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
692 the node hash and the 20 bytes .hgtags filenode for that revision. |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
693 |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
694 The first 4 bytes are present as a form of verification. Repository |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
695 stripping and rewriting may change the node at a numeric revision in the |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
696 changelog. The changeset fragment serves as a verifier to detect |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
697 rewriting. This logic is shared with the rev branch cache (see |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
698 branchmap.py). |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
699 |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
700 The instance holds in memory the full cache content but entries are |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
701 only parsed on read. |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
702 |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
703 Instances behave like lists. ``c[i]`` works where i is a rev or |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
704 changeset node. Missing indexes are populated automatically on access. |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
705 """ |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
706 |
24735
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
707 def __init__(self, repo): |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
708 assert repo.filtername is None |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
709 |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
710 self._repo = repo |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
711 |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
712 # Only for reporting purposes. |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
713 self.lookupcount = 0 |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
714 self.hitcount = 0 |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
715 |
29039
e3055b46ed1b
tags: silence hgtagsfnodes reading failures
Matt Mackall <mpm@selenic.com>
parents:
29038
diff
changeset
|
716 try: |
33537
709dde1c5dd5
cachevfs: migration the tags fnode cache to 'cachevfs'
Boris Feld <boris.feld@octobus.net>
parents:
33536
diff
changeset
|
717 data = repo.cachevfs.read(_fnodescachefile) |
29039
e3055b46ed1b
tags: silence hgtagsfnodes reading failures
Matt Mackall <mpm@selenic.com>
parents:
29038
diff
changeset
|
718 except (OSError, IOError): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
719 data = b"" |
31346
2a18e9e6ca43
py3: use bytearray() instead of array('c', ...) constructions
Augie Fackler <augie@google.com>
parents:
31025
diff
changeset
|
720 self._raw = bytearray(data) |
24735
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
721 |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
722 # The end state of self._raw is an array that is of the exact length |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
723 # required to hold a record for every revision in the repository. |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
724 # We truncate or extend the array as necessary. self._dirtyoffset is |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
725 # defined to be the start offset at which we need to write the output |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
726 # file. This offset is also adjusted when new entries are calculated |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
727 # for array members. |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
728 cllen = len(repo.changelog) |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
729 wantedlen = cllen * _fnodesrecsize |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
730 rawlen = len(self._raw) |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
731 |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
732 self._dirtyoffset = None |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
733 |
44306
a0ec05d93c8e
cleanup: re-run black on the codebase
Augie Fackler <augie@google.com>
parents:
44292
diff
changeset
|
734 rawlentokeep = min( |
44351
8ec186c1ccfe
tags: use modern // operator for division
Augie Fackler <augie@google.com>
parents:
44306
diff
changeset
|
735 wantedlen, (rawlen // _fnodesrecsize) * _fnodesrecsize |
44306
a0ec05d93c8e
cleanup: re-run black on the codebase
Augie Fackler <augie@google.com>
parents:
44292
diff
changeset
|
736 ) |
44292
f5a7cf0adb12
tags: behave better if a tags cache entry is partially written
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents:
43689
diff
changeset
|
737 if rawlen > rawlentokeep: |
24735
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
738 # There's no easy way to truncate array instances. This seems |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
739 # slightly less evil than copying a potentially large array slice. |
44292
f5a7cf0adb12
tags: behave better if a tags cache entry is partially written
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents:
43689
diff
changeset
|
740 for i in range(rawlen - rawlentokeep): |
24735
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
741 self._raw.pop() |
44292
f5a7cf0adb12
tags: behave better if a tags cache entry is partially written
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents:
43689
diff
changeset
|
742 rawlen = len(self._raw) |
f5a7cf0adb12
tags: behave better if a tags cache entry is partially written
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents:
43689
diff
changeset
|
743 self._dirtyoffset = rawlen |
f5a7cf0adb12
tags: behave better if a tags cache entry is partially written
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents:
43689
diff
changeset
|
744 if rawlen < wantedlen: |
f5a7cf0adb12
tags: behave better if a tags cache entry is partially written
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents:
43689
diff
changeset
|
745 if self._dirtyoffset is None: |
f5a7cf0adb12
tags: behave better if a tags cache entry is partially written
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents:
43689
diff
changeset
|
746 self._dirtyoffset = rawlen |
46495
5aac1a1a5beb
tagcache: distinguish between invalid and missing entries
Matt Harbison <matt_harbison@yahoo.com>
parents:
45942
diff
changeset
|
747 # TODO: zero fill entire record, because it's invalid not missing? |
44292
f5a7cf0adb12
tags: behave better if a tags cache entry is partially written
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents:
43689
diff
changeset
|
748 self._raw.extend(b'\xff' * (wantedlen - rawlen)) |
24735
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
749 |
25380
eaa456c5e699
tags: support reading tags cache without populating
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25087
diff
changeset
|
750 def getfnode(self, node, computemissing=True): |
24735
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
751 """Obtain the filenode of the .hgtags file at a specified revision. |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
752 |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
753 If the value is in the cache, the entry will be validated and returned. |
25380
eaa456c5e699
tags: support reading tags cache without populating
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25087
diff
changeset
|
754 Otherwise, the filenode will be computed and returned unless |
46495
5aac1a1a5beb
tagcache: distinguish between invalid and missing entries
Matt Harbison <matt_harbison@yahoo.com>
parents:
45942
diff
changeset
|
755 "computemissing" is False. In that case, None will be returned if |
5aac1a1a5beb
tagcache: distinguish between invalid and missing entries
Matt Harbison <matt_harbison@yahoo.com>
parents:
45942
diff
changeset
|
756 the entry is missing or False if the entry is invalid without |
25380
eaa456c5e699
tags: support reading tags cache without populating
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25087
diff
changeset
|
757 any potentially expensive computation being performed. |
24735
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
758 |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
759 If an .hgtags does not exist at the specified revision, nullid is |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
760 returned. |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
761 """ |
47012
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46819
diff
changeset
|
762 if node == self._repo.nullid: |
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46819
diff
changeset
|
763 return node |
42236
2930b31383af
hgtagsfnodescache: handle nullid lookup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
41841
diff
changeset
|
764 |
24735
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
765 ctx = self._repo[node] |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
766 rev = ctx.rev() |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
767 |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
768 self.lookupcount += 1 |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
769 |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
770 offset = rev * _fnodesrecsize |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
771 record = b'%s' % self._raw[offset : offset + _fnodesrecsize] |
24735
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
772 properprefix = node[0:4] |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
773 |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
774 # Validate and return existing entry. |
45787
225e513c444e
tags: add safety check for len(record) while reading hgtagsfnodescache
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45435
diff
changeset
|
775 if record != _fnodesmissingrec and len(record) == _fnodesrecsize: |
24735
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
776 fileprefix = record[0:4] |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
777 |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
778 if fileprefix == properprefix: |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
779 self.hitcount += 1 |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
780 return record[4:] |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
781 |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
782 # Fall through. |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
783 |
25380
eaa456c5e699
tags: support reading tags cache without populating
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25087
diff
changeset
|
784 # If we get here, the entry is either missing or invalid. |
eaa456c5e699
tags: support reading tags cache without populating
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25087
diff
changeset
|
785 |
eaa456c5e699
tags: support reading tags cache without populating
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25087
diff
changeset
|
786 if not computemissing: |
46495
5aac1a1a5beb
tagcache: distinguish between invalid and missing entries
Matt Harbison <matt_harbison@yahoo.com>
parents:
45942
diff
changeset
|
787 if record != _fnodesmissingrec: |
5aac1a1a5beb
tagcache: distinguish between invalid and missing entries
Matt Harbison <matt_harbison@yahoo.com>
parents:
45942
diff
changeset
|
788 return False |
25380
eaa456c5e699
tags: support reading tags cache without populating
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25087
diff
changeset
|
789 return None |
eaa456c5e699
tags: support reading tags cache without populating
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25087
diff
changeset
|
790 |
46652
75832107ec07
hgtagsfnodes: refactor code to compute fnode into separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46495
diff
changeset
|
791 fnode = self._computefnode(node) |
75832107ec07
hgtagsfnodes: refactor code to compute fnode into separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46495
diff
changeset
|
792 self._writeentry(offset, properprefix, fnode) |
75832107ec07
hgtagsfnodes: refactor code to compute fnode into separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46495
diff
changeset
|
793 return fnode |
75832107ec07
hgtagsfnodes: refactor code to compute fnode into separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46495
diff
changeset
|
794 |
75832107ec07
hgtagsfnodes: refactor code to compute fnode into separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46495
diff
changeset
|
795 def _computefnode(self, node): |
75832107ec07
hgtagsfnodes: refactor code to compute fnode into separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46495
diff
changeset
|
796 """Finds the tag filenode for a node which is missing or invalid |
75832107ec07
hgtagsfnodes: refactor code to compute fnode into separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46495
diff
changeset
|
797 in cache""" |
75832107ec07
hgtagsfnodes: refactor code to compute fnode into separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46495
diff
changeset
|
798 ctx = self._repo[node] |
75832107ec07
hgtagsfnodes: refactor code to compute fnode into separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46495
diff
changeset
|
799 rev = ctx.rev() |
42237
9f45d3d526f9
hgtagsfnodescache: inherit fnode from parent when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42236
diff
changeset
|
800 fnode = None |
9f45d3d526f9
hgtagsfnodescache: inherit fnode from parent when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42236
diff
changeset
|
801 cl = self._repo.changelog |
9f45d3d526f9
hgtagsfnodescache: inherit fnode from parent when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42236
diff
changeset
|
802 p1rev, p2rev = cl._uncheckedparentrevs(rev) |
9f45d3d526f9
hgtagsfnodescache: inherit fnode from parent when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42236
diff
changeset
|
803 p1node = cl.node(p1rev) |
9f45d3d526f9
hgtagsfnodescache: inherit fnode from parent when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42236
diff
changeset
|
804 p1fnode = self.getfnode(p1node, computemissing=False) |
9f45d3d526f9
hgtagsfnodescache: inherit fnode from parent when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42236
diff
changeset
|
805 if p2rev != nullrev: |
9f45d3d526f9
hgtagsfnodescache: inherit fnode from parent when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42236
diff
changeset
|
806 # There is some no-merge changeset where p1 is null and p2 is set |
9f45d3d526f9
hgtagsfnodescache: inherit fnode from parent when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42236
diff
changeset
|
807 # Processing them as merge is just slower, but still gives a good |
9f45d3d526f9
hgtagsfnodescache: inherit fnode from parent when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42236
diff
changeset
|
808 # result. |
48989
d4b66dc500c5
tags: fix typo in fast path detection of fnode resolution (issue6673)
Yuya Nishihara <yuya@tcha.org>
parents:
47012
diff
changeset
|
809 p2node = cl.node(p2rev) |
42237
9f45d3d526f9
hgtagsfnodescache: inherit fnode from parent when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42236
diff
changeset
|
810 p2fnode = self.getfnode(p2node, computemissing=False) |
9f45d3d526f9
hgtagsfnodescache: inherit fnode from parent when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42236
diff
changeset
|
811 if p1fnode != p2fnode: |
9f45d3d526f9
hgtagsfnodescache: inherit fnode from parent when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42236
diff
changeset
|
812 # we cannot rely on readfast because we don't know against what |
9f45d3d526f9
hgtagsfnodescache: inherit fnode from parent when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42236
diff
changeset
|
813 # parent the readfast delta is computed |
9f45d3d526f9
hgtagsfnodescache: inherit fnode from parent when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42236
diff
changeset
|
814 p1fnode = None |
46495
5aac1a1a5beb
tagcache: distinguish between invalid and missing entries
Matt Harbison <matt_harbison@yahoo.com>
parents:
45942
diff
changeset
|
815 if p1fnode: |
42237
9f45d3d526f9
hgtagsfnodescache: inherit fnode from parent when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42236
diff
changeset
|
816 mctx = ctx.manifestctx() |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
817 fnode = mctx.readfast().get(b'.hgtags') |
42237
9f45d3d526f9
hgtagsfnodescache: inherit fnode from parent when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42236
diff
changeset
|
818 if fnode is None: |
9f45d3d526f9
hgtagsfnodescache: inherit fnode from parent when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42236
diff
changeset
|
819 fnode = p1fnode |
9f45d3d526f9
hgtagsfnodescache: inherit fnode from parent when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42236
diff
changeset
|
820 if fnode is None: |
9f45d3d526f9
hgtagsfnodescache: inherit fnode from parent when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42236
diff
changeset
|
821 # Populate missing entry. |
9f45d3d526f9
hgtagsfnodescache: inherit fnode from parent when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42236
diff
changeset
|
822 try: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
823 fnode = ctx.filenode(b'.hgtags') |
42237
9f45d3d526f9
hgtagsfnodescache: inherit fnode from parent when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42236
diff
changeset
|
824 except error.LookupError: |
9f45d3d526f9
hgtagsfnodescache: inherit fnode from parent when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42236
diff
changeset
|
825 # No .hgtags file on this revision. |
47012
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46819
diff
changeset
|
826 fnode = self._repo.nullid |
25381
47edeff19139
tags: support setting hgtags fnodes cache entries
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25380
diff
changeset
|
827 return fnode |
47edeff19139
tags: support setting hgtags fnodes cache entries
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25380
diff
changeset
|
828 |
47edeff19139
tags: support setting hgtags fnodes cache entries
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25380
diff
changeset
|
829 def setfnode(self, node, fnode): |
47edeff19139
tags: support setting hgtags fnodes cache entries
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25380
diff
changeset
|
830 """Set the .hgtags filenode for a given changeset.""" |
47edeff19139
tags: support setting hgtags fnodes cache entries
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25380
diff
changeset
|
831 assert len(fnode) == 20 |
47edeff19139
tags: support setting hgtags fnodes cache entries
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25380
diff
changeset
|
832 ctx = self._repo[node] |
47edeff19139
tags: support setting hgtags fnodes cache entries
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25380
diff
changeset
|
833 |
47edeff19139
tags: support setting hgtags fnodes cache entries
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25380
diff
changeset
|
834 # Do a lookup first to avoid writing if nothing has changed. |
47edeff19139
tags: support setting hgtags fnodes cache entries
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25380
diff
changeset
|
835 if self.getfnode(ctx.node(), computemissing=False) == fnode: |
47edeff19139
tags: support setting hgtags fnodes cache entries
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25380
diff
changeset
|
836 return |
47edeff19139
tags: support setting hgtags fnodes cache entries
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25380
diff
changeset
|
837 |
47edeff19139
tags: support setting hgtags fnodes cache entries
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25380
diff
changeset
|
838 self._writeentry(ctx.rev() * _fnodesrecsize, node[0:4], fnode) |
47edeff19139
tags: support setting hgtags fnodes cache entries
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25380
diff
changeset
|
839 |
46656
9a31f65381ae
tags: validate nodes in _getfnodes() and update cache in case of unknown nodes
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46652
diff
changeset
|
840 def refresh_invalid_nodes(self, nodes): |
9a31f65381ae
tags: validate nodes in _getfnodes() and update cache in case of unknown nodes
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46652
diff
changeset
|
841 """recomputes file nodes for a given set of nodes which has unknown |
9a31f65381ae
tags: validate nodes in _getfnodes() and update cache in case of unknown nodes
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46652
diff
changeset
|
842 filenodes for them in the cache |
9a31f65381ae
tags: validate nodes in _getfnodes() and update cache in case of unknown nodes
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46652
diff
changeset
|
843 Also updates the in-memory cache with the correct filenode. |
9a31f65381ae
tags: validate nodes in _getfnodes() and update cache in case of unknown nodes
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46652
diff
changeset
|
844 Caller needs to take care about calling `.write()` so that updates are |
9a31f65381ae
tags: validate nodes in _getfnodes() and update cache in case of unknown nodes
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46652
diff
changeset
|
845 persisted. |
9a31f65381ae
tags: validate nodes in _getfnodes() and update cache in case of unknown nodes
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46652
diff
changeset
|
846 Returns a map {node: recomputed fnode} |
9a31f65381ae
tags: validate nodes in _getfnodes() and update cache in case of unknown nodes
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46652
diff
changeset
|
847 """ |
9a31f65381ae
tags: validate nodes in _getfnodes() and update cache in case of unknown nodes
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46652
diff
changeset
|
848 fixed_nodemap = {} |
9a31f65381ae
tags: validate nodes in _getfnodes() and update cache in case of unknown nodes
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46652
diff
changeset
|
849 for node in nodes: |
9a31f65381ae
tags: validate nodes in _getfnodes() and update cache in case of unknown nodes
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46652
diff
changeset
|
850 fnode = self._computefnode(node) |
9a31f65381ae
tags: validate nodes in _getfnodes() and update cache in case of unknown nodes
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46652
diff
changeset
|
851 fixed_nodemap[node] = fnode |
9a31f65381ae
tags: validate nodes in _getfnodes() and update cache in case of unknown nodes
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46652
diff
changeset
|
852 self.setfnode(node, fnode) |
9a31f65381ae
tags: validate nodes in _getfnodes() and update cache in case of unknown nodes
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46652
diff
changeset
|
853 return fixed_nodemap |
9a31f65381ae
tags: validate nodes in _getfnodes() and update cache in case of unknown nodes
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46652
diff
changeset
|
854 |
25381
47edeff19139
tags: support setting hgtags fnodes cache entries
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25380
diff
changeset
|
855 def _writeentry(self, offset, prefix, fnode): |
24735
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
856 # Slices on array instances only accept other array. |
31346
2a18e9e6ca43
py3: use bytearray() instead of array('c', ...) constructions
Augie Fackler <augie@google.com>
parents:
31025
diff
changeset
|
857 entry = bytearray(prefix + fnode) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
858 self._raw[offset : offset + _fnodesrecsize] = entry |
24735
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
859 # self._dirtyoffset could be None. |
36277
18106c3bc94a
tags: don't feed both int and None to min()
Augie Fackler <augie@google.com>
parents:
35828
diff
changeset
|
860 self._dirtyoffset = min(self._dirtyoffset or 0, offset or 0) |
24735
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
861 |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
862 def write(self): |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
863 """Perform all necessary writes to cache file. |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
864 |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
865 This may no-op if no writes are needed or if a write lock could |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
866 not be obtained. |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
867 """ |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
868 if self._dirtyoffset is None: |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
869 return |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
870 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
871 data = self._raw[self._dirtyoffset :] |
24735
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
872 if not data: |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
873 return |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
874 |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
875 repo = self._repo |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
876 |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
877 try: |
45435
64de86fd0984
tags: take lock instead of wlock before writing hgtagsfnodes1 cache
Pulkit Goyal <7895pulkit@gmail.com>
parents:
44351
diff
changeset
|
878 lock = repo.lock(wait=False) |
24806
61aea11fb83d
tags: do not abort if failed to write lock file to save cache
Yuya Nishihara <yuya@tcha.org>
parents:
24763
diff
changeset
|
879 except error.LockError: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
880 repo.ui.log( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
881 b'tagscache', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
882 b'not writing .hg/cache/%s because ' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
883 b'lock cannot be acquired\n' % _fnodescachefile, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
884 ) |
24735
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
885 return |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
886 |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
887 try: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
888 f = repo.cachevfs.open(_fnodescachefile, b'ab') |
24735
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
889 try: |
25087
559f24e3957d
tags: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
24806
diff
changeset
|
890 # if the file has been truncated |
559f24e3957d
tags: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
24806
diff
changeset
|
891 actualoffset = f.tell() |
559f24e3957d
tags: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
24806
diff
changeset
|
892 if actualoffset < self._dirtyoffset: |
559f24e3957d
tags: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
24806
diff
changeset
|
893 self._dirtyoffset = actualoffset |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
894 data = self._raw[self._dirtyoffset :] |
25087
559f24e3957d
tags: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
24806
diff
changeset
|
895 f.seek(self._dirtyoffset) |
559f24e3957d
tags: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
24806
diff
changeset
|
896 f.truncate() |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
897 repo.ui.log( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
898 b'tagscache', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
899 b'writing %d bytes to cache/%s\n' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
900 % (len(data), _fnodescachefile), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
901 ) |
25087
559f24e3957d
tags: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
24806
diff
changeset
|
902 f.write(data) |
559f24e3957d
tags: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
24806
diff
changeset
|
903 self._dirtyoffset = None |
559f24e3957d
tags: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
24806
diff
changeset
|
904 finally: |
559f24e3957d
tags: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
24806
diff
changeset
|
905 f.close() |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25381
diff
changeset
|
906 except (IOError, OSError) as inst: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
907 repo.ui.log( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
908 b'tagscache', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
909 b"couldn't write cache/%s: %s\n" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
910 % (_fnodescachefile, stringutil.forcebytestr(inst)), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42567
diff
changeset
|
911 ) |
24735
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
912 finally: |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24532
diff
changeset
|
913 lock.release() |