Mercurial > hg > mercurial-source
annotate mercurial/tags.py @ 25901:eaa456c5e699
tags: support reading tags cache without populating
An upcoming patch will teach the bundle2 protocol to transfer .hgtags
fnodes to the client. We don't want this to incur any extra work
at serve time. Create an optional cache query mode that doesn't
populate the cache as a side-effect.
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Mon, 25 May 2015 16:24:23 -0700 (2015-05-25) |
parents | 559f24e3957d |
children | 47edeff19139 |
rev | line source |
---|---|
9157
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 # |
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
3 # Copyright 2009 Matt Mackall <mpm@selenic.com> |
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. |
9157
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
8 |
9159
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9157
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:
9157
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:
9157
diff
changeset
|
11 # tags too. |
9157
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
12 |
9159
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9157
diff
changeset
|
13 from node import nullid, bin, hex, short |
9157
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
14 from i18n import _ |
21814
5125856a28cf
tags: read tag info into a sorted dict (rather than into a regular dict)
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21030
diff
changeset
|
15 import util |
9157
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
16 import encoding |
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
17 import error |
24914
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
18 from array import array |
14038
0e6f622f31ca
tags: loosen IOError filtering when reading localtags
Idan Kamara <idankk86@gmail.com>
parents:
14020
diff
changeset
|
19 import errno |
21030
9ea132aee96c
tags: log events related to tags cache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
19650
diff
changeset
|
20 import time |
9157
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
21 |
24914
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
22 # 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:
24665
diff
changeset
|
23 # the common case. |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
24 # |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
25 # 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:
24665
diff
changeset
|
26 # 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:
24665
diff
changeset
|
27 # 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:
24665
diff
changeset
|
28 # details. |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
29 # |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
30 # 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:
24665
diff
changeset
|
31 # 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:
24665
diff
changeset
|
32 # |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
33 # 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:
24665
diff
changeset
|
34 # 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:
24665
diff
changeset
|
35 # 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:
24665
diff
changeset
|
36 # 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:
24665
diff
changeset
|
37 # 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:
24665
diff
changeset
|
38 # |
24941
1062663808ce
tags: write a separate tags cache file for unfiltered repos
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24940
diff
changeset
|
39 # 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:
24940
diff
changeset
|
40 # These "tags-*" files store information about the history of tags. |
24575
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24198
diff
changeset
|
41 # |
24941
1062663808ce
tags: write a separate tags cache file for unfiltered repos
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24940
diff
changeset
|
42 # 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:
24940
diff
changeset
|
43 # a history of tags. |
24914
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
44 # |
24939
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24938
diff
changeset
|
45 # The cache validation line has the format: |
24575
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24198
diff
changeset
|
46 # |
24939
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24938
diff
changeset
|
47 # <tiprev> <tipnode> [<filteredhash>] |
24575
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24198
diff
changeset
|
48 # |
24939
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24938
diff
changeset
|
49 # <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:
24938
diff
changeset
|
50 # node for that changeset. These redundantly identify the repository |
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24938
diff
changeset
|
51 # 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:
24938
diff
changeset
|
52 # 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:
24938
diff
changeset
|
53 # 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:
24938
diff
changeset
|
54 # hash will change and invalidate the cache. |
24575
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24198
diff
changeset
|
55 # |
24939
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24938
diff
changeset
|
56 # The history part of the tags cache consists of lines of the form: |
24575
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24198
diff
changeset
|
57 # |
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24198
diff
changeset
|
58 # <node> <tag> |
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24198
diff
changeset
|
59 # |
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24198
diff
changeset
|
60 # (This format is identical to that of .hgtags files.) |
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24198
diff
changeset
|
61 # |
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24198
diff
changeset
|
62 # <tag> is the tag name and <node> is the 40 character hex changeset |
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24198
diff
changeset
|
63 # the tag is associated with. |
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24198
diff
changeset
|
64 # |
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24198
diff
changeset
|
65 # Tags are written sorted by tag name. |
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24198
diff
changeset
|
66 # |
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24198
diff
changeset
|
67 # Tags associated with multiple changesets have an entry for each changeset. |
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24198
diff
changeset
|
68 # The most recent changeset (in terms of revlog ordering for the head |
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24198
diff
changeset
|
69 # setting it) for each tag is last. |
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24198
diff
changeset
|
70 |
11351
1cdc8b5e5729
tags: remove the old non-caching implementation of findglobaltags().
Greg Ward <greg-hg@gerg.ca>
parents:
11078
diff
changeset
|
71 def findglobaltags(ui, repo, alltags, tagtypes): |
24575
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24198
diff
changeset
|
72 '''Find global tags in a repo. |
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24198
diff
changeset
|
73 |
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24198
diff
changeset
|
74 "alltags" maps tag name to (node, hist) 2-tuples. |
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24198
diff
changeset
|
75 |
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24198
diff
changeset
|
76 "tagtypes" maps tag name to tag type. Global tags always have the |
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24198
diff
changeset
|
77 "global" tag type. |
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24198
diff
changeset
|
78 |
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24198
diff
changeset
|
79 The "alltags" and "tagtypes" dicts are updated in place. Empty dicts |
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24198
diff
changeset
|
80 should be passed in. |
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24198
diff
changeset
|
81 |
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24198
diff
changeset
|
82 The tags cache is read and updated as a side-effect of calling. |
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24198
diff
changeset
|
83 ''' |
9160
4017291c4c48
tags: support 'instant' tag retrieval (issue548)
Greg Ward <greg-hg@gerg.ca>
parents:
9159
diff
changeset
|
84 # This is so we can be lazy and assume alltags contains only global |
4017291c4c48
tags: support 'instant' tag retrieval (issue548)
Greg Ward <greg-hg@gerg.ca>
parents:
9159
diff
changeset
|
85 # tags when we pass it to _writetagcache(). |
4017291c4c48
tags: support 'instant' tag retrieval (issue548)
Greg Ward <greg-hg@gerg.ca>
parents:
9159
diff
changeset
|
86 assert len(alltags) == len(tagtypes) == 0, \ |
4017291c4c48
tags: support 'instant' tag retrieval (issue548)
Greg Ward <greg-hg@gerg.ca>
parents:
9159
diff
changeset
|
87 "findglobaltags() should be called first" |
4017291c4c48
tags: support 'instant' tag retrieval (issue548)
Greg Ward <greg-hg@gerg.ca>
parents:
9159
diff
changeset
|
88 |
24939
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24938
diff
changeset
|
89 (heads, tagfnode, valid, cachetags, shouldwrite) = _readtagcache(ui, repo) |
9160
4017291c4c48
tags: support 'instant' tag retrieval (issue548)
Greg Ward <greg-hg@gerg.ca>
parents:
9159
diff
changeset
|
90 if cachetags is not None: |
4017291c4c48
tags: support 'instant' tag retrieval (issue548)
Greg Ward <greg-hg@gerg.ca>
parents:
9159
diff
changeset
|
91 assert not shouldwrite |
4017291c4c48
tags: support 'instant' tag retrieval (issue548)
Greg Ward <greg-hg@gerg.ca>
parents:
9159
diff
changeset
|
92 # XXX is this really 100% correct? are there oddball special |
4017291c4c48
tags: support 'instant' tag retrieval (issue548)
Greg Ward <greg-hg@gerg.ca>
parents:
9159
diff
changeset
|
93 # 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:
9159
diff
changeset
|
94 # because cachetags does not contain rank info? |
4017291c4c48
tags: support 'instant' tag retrieval (issue548)
Greg Ward <greg-hg@gerg.ca>
parents:
9159
diff
changeset
|
95 _updatetags(cachetags, 'global', alltags, tagtypes) |
4017291c4c48
tags: support 'instant' tag retrieval (issue548)
Greg Ward <greg-hg@gerg.ca>
parents:
9159
diff
changeset
|
96 return |
9159
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9157
diff
changeset
|
97 |
24575
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24198
diff
changeset
|
98 seen = set() # set of fnode |
9159
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9157
diff
changeset
|
99 fctx = None |
24575
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24198
diff
changeset
|
100 for head in reversed(heads): # oldest to newest |
9159
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9157
diff
changeset
|
101 assert head in repo.changelog.nodemap, \ |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9157
diff
changeset
|
102 "tag cache returned bogus head %s" % short(head) |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9157
diff
changeset
|
103 |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9157
diff
changeset
|
104 fnode = tagfnode.get(head) |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9157
diff
changeset
|
105 if fnode and fnode not in seen: |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9157
diff
changeset
|
106 seen.add(fnode) |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9157
diff
changeset
|
107 if not fctx: |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9157
diff
changeset
|
108 fctx = repo.filectx('.hgtags', fileid=fnode) |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9157
diff
changeset
|
109 else: |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9157
diff
changeset
|
110 fctx = fctx.filectx(fnode) |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9157
diff
changeset
|
111 |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9157
diff
changeset
|
112 filetags = _readtags(ui, repo, fctx.data().splitlines(), fctx) |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9157
diff
changeset
|
113 _updatetags(filetags, 'global', alltags, tagtypes) |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9157
diff
changeset
|
114 |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9157
diff
changeset
|
115 # and update the cache (if necessary) |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9157
diff
changeset
|
116 if shouldwrite: |
24939
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24938
diff
changeset
|
117 _writetagcache(ui, repo, valid, alltags) |
9159
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9157
diff
changeset
|
118 |
9157
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
119 def readlocaltags(ui, repo, alltags, tagtypes): |
24575
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24198
diff
changeset
|
120 '''Read local tags in repo. Update alltags and tagtypes.''' |
9157
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
121 try: |
23889
7cc77030c557
localrepo: remove all external users of localrepo.opener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
23139
diff
changeset
|
122 data = repo.vfs.read("localtags") |
14038
0e6f622f31ca
tags: loosen IOError filtering when reading localtags
Idan Kamara <idankk86@gmail.com>
parents:
14020
diff
changeset
|
123 except IOError, inst: |
0e6f622f31ca
tags: loosen IOError filtering when reading localtags
Idan Kamara <idankk86@gmail.com>
parents:
14020
diff
changeset
|
124 if inst.errno != errno.ENOENT: |
0e6f622f31ca
tags: loosen IOError filtering when reading localtags
Idan Kamara <idankk86@gmail.com>
parents:
14020
diff
changeset
|
125 raise |
0e6f622f31ca
tags: loosen IOError filtering when reading localtags
Idan Kamara <idankk86@gmail.com>
parents:
14020
diff
changeset
|
126 return |
0e6f622f31ca
tags: loosen IOError filtering when reading localtags
Idan Kamara <idankk86@gmail.com>
parents:
14020
diff
changeset
|
127 |
0e6f622f31ca
tags: loosen IOError filtering when reading localtags
Idan Kamara <idankk86@gmail.com>
parents:
14020
diff
changeset
|
128 # 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
|
129 # 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
|
130 filetags = _readtags( |
0e6f622f31ca
tags: loosen IOError filtering when reading localtags
Idan Kamara <idankk86@gmail.com>
parents:
14020
diff
changeset
|
131 ui, repo, data.splitlines(), "localtags", |
0e6f622f31ca
tags: loosen IOError filtering when reading localtags
Idan Kamara <idankk86@gmail.com>
parents:
14020
diff
changeset
|
132 recode=encoding.fromlocal) |
21823
925d1bb9a971
repoview: do not crash when localtags refers to non existing revisions
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21030
diff
changeset
|
133 |
925d1bb9a971
repoview: do not crash when localtags refers to non existing revisions
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21030
diff
changeset
|
134 # 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
|
135 cl = repo.changelog |
925d1bb9a971
repoview: do not crash when localtags refers to non existing revisions
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21030
diff
changeset
|
136 for t in filetags.keys(): |
925d1bb9a971
repoview: do not crash when localtags refers to non existing revisions
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21030
diff
changeset
|
137 try: |
925d1bb9a971
repoview: do not crash when localtags refers to non existing revisions
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21030
diff
changeset
|
138 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
|
139 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
|
140 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
|
141 |
14038
0e6f622f31ca
tags: loosen IOError filtering when reading localtags
Idan Kamara <idankk86@gmail.com>
parents:
14020
diff
changeset
|
142 _updatetags(filetags, "local", alltags, tagtypes) |
9157
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
143 |
21892
89cdebc31cda
tags: introduce _readtaghist function
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21832
diff
changeset
|
144 def _readtaghist(ui, repo, lines, fn, recode=None, calcnodelines=False): |
9157
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
145 '''Read tag definitions from a file (or any source of lines). |
24575
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24198
diff
changeset
|
146 |
21892
89cdebc31cda
tags: introduce _readtaghist function
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21832
diff
changeset
|
147 This function returns two sortdicts with similar information: |
24575
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24198
diff
changeset
|
148 |
23139
e53f6b72a0e4
spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents:
21892
diff
changeset
|
149 - 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
|
150 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
|
151 - 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
|
152 - hist is the list of node ids previously associated with it (in file |
24575
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24198
diff
changeset
|
153 order). All node ids are binary, not hex. |
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24198
diff
changeset
|
154 |
21892
89cdebc31cda
tags: introduce _readtaghist function
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21832
diff
changeset
|
155 - 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
|
156 [hexnode, line number] pairs, ordered from the oldest to the newest node. |
24575
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24198
diff
changeset
|
157 |
21892
89cdebc31cda
tags: introduce _readtaghist function
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21832
diff
changeset
|
158 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
|
159 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
|
160 performance in cases where the line numbers are not needed. |
89cdebc31cda
tags: introduce _readtaghist function
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21832
diff
changeset
|
161 ''' |
9157
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
162 |
21892
89cdebc31cda
tags: introduce _readtaghist function
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21832
diff
changeset
|
163 bintaghist = util.sortdict() |
89cdebc31cda
tags: introduce _readtaghist function
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21832
diff
changeset
|
164 hextaglines = util.sortdict() |
9157
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
165 count = 0 |
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
166 |
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
167 def warn(msg): |
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
168 ui.warn(_("%s, line %s: %s\n") % (fn, count, msg)) |
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
169 |
21892
89cdebc31cda
tags: introduce _readtaghist function
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21832
diff
changeset
|
170 for nline, line in enumerate(lines): |
9157
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
171 count += 1 |
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
172 if not line: |
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
173 continue |
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
174 try: |
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
175 (nodehex, name) = line.split(" ", 1) |
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
176 except ValueError: |
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
177 warn(_("cannot parse entry")) |
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
178 continue |
9160
4017291c4c48
tags: support 'instant' tag retrieval (issue548)
Greg Ward <greg-hg@gerg.ca>
parents:
9159
diff
changeset
|
179 name = name.strip() |
4017291c4c48
tags: support 'instant' tag retrieval (issue548)
Greg Ward <greg-hg@gerg.ca>
parents:
9159
diff
changeset
|
180 if recode: |
4017291c4c48
tags: support 'instant' tag retrieval (issue548)
Greg Ward <greg-hg@gerg.ca>
parents:
9159
diff
changeset
|
181 name = recode(name) |
9157
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
182 try: |
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
183 nodebin = bin(nodehex) |
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
184 except TypeError: |
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
185 warn(_("node '%s' is not well formed") % nodehex) |
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
186 continue |
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
187 |
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
188 # update filetags |
21892
89cdebc31cda
tags: introduce _readtaghist function
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21832
diff
changeset
|
189 if calcnodelines: |
89cdebc31cda
tags: introduce _readtaghist function
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21832
diff
changeset
|
190 # map tag name to a list of line numbers |
89cdebc31cda
tags: introduce _readtaghist function
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21832
diff
changeset
|
191 if name not in hextaglines: |
89cdebc31cda
tags: introduce _readtaghist function
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21832
diff
changeset
|
192 hextaglines[name] = [] |
89cdebc31cda
tags: introduce _readtaghist function
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21832
diff
changeset
|
193 hextaglines[name].append([nodehex, nline]) |
89cdebc31cda
tags: introduce _readtaghist function
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21832
diff
changeset
|
194 continue |
89cdebc31cda
tags: introduce _readtaghist function
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21832
diff
changeset
|
195 # map tag name to (node, hist) |
89cdebc31cda
tags: introduce _readtaghist function
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21832
diff
changeset
|
196 if name not in bintaghist: |
89cdebc31cda
tags: introduce _readtaghist function
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21832
diff
changeset
|
197 bintaghist[name] = [] |
89cdebc31cda
tags: introduce _readtaghist function
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21832
diff
changeset
|
198 bintaghist[name].append(nodebin) |
89cdebc31cda
tags: introduce _readtaghist function
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21832
diff
changeset
|
199 return bintaghist, hextaglines |
89cdebc31cda
tags: introduce _readtaghist function
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21832
diff
changeset
|
200 |
89cdebc31cda
tags: introduce _readtaghist function
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21832
diff
changeset
|
201 def _readtags(ui, repo, lines, fn, recode=None, calcnodelines=False): |
89cdebc31cda
tags: introduce _readtaghist function
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21832
diff
changeset
|
202 '''Read tag definitions from a file (or any source of lines). |
24575
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24198
diff
changeset
|
203 |
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24198
diff
changeset
|
204 Returns a mapping from tag name to (node, hist). |
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24198
diff
changeset
|
205 |
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24198
diff
changeset
|
206 "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:
24198
diff
changeset
|
207 is the list of node ids previously associated with it (in file order). |
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24198
diff
changeset
|
208 All node ids are binary, not hex. |
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24198
diff
changeset
|
209 ''' |
21892
89cdebc31cda
tags: introduce _readtaghist function
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21832
diff
changeset
|
210 filetags, nodelines = _readtaghist(ui, repo, lines, fn, recode=recode, |
89cdebc31cda
tags: introduce _readtaghist function
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21832
diff
changeset
|
211 calcnodelines=calcnodelines) |
89cdebc31cda
tags: introduce _readtaghist function
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21832
diff
changeset
|
212 for tag, taghist in filetags.items(): |
89cdebc31cda
tags: introduce _readtaghist function
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21832
diff
changeset
|
213 filetags[tag] = (taghist[-1], taghist[:-1]) |
9157
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
214 return filetags |
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
215 |
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
216 def _updatetags(filetags, tagtype, alltags, tagtypes): |
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
217 '''Incorporate the tag info read from one file into the two |
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
218 dictionaries, alltags and tagtypes, that contain all tag |
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
219 info (global across all heads plus local).''' |
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
220 |
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
221 for name, nodehist in filetags.iteritems(): |
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
222 if name not in alltags: |
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
223 alltags[name] = nodehist |
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
224 tagtypes[name] = tagtype |
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
225 continue |
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
226 |
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
227 # we prefer alltags[name] if: |
17407
e7cfe3587ea4
fix trivial spelling errors
Mads Kiilerich <mads@kiilerich.com>
parents:
17257
diff
changeset
|
228 # it supersedes us OR |
e7cfe3587ea4
fix trivial spelling errors
Mads Kiilerich <mads@kiilerich.com>
parents:
17257
diff
changeset
|
229 # mutual supersedes and it has a higher rank |
9157
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
230 # 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
|
231 anode, ahist = nodehist |
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
232 bnode, bhist = alltags[name] |
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
233 if (bnode != anode and anode in bhist and |
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
234 (bnode not in ahist or len(bhist) > len(ahist))): |
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
235 anode = bnode |
19108
cb95716da5fe
tags: update tag type only if tag node is updated (issue3911)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
17407
diff
changeset
|
236 else: |
cb95716da5fe
tags: update tag type only if tag node is updated (issue3911)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
17407
diff
changeset
|
237 tagtypes[name] = tagtype |
9157
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
238 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
|
239 alltags[name] = anode, ahist |
abb7d4d43a5f
Factor tags module out of localrepo (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
diff
changeset
|
240 |
24916
b061a2049662
tags: have a different cache file per filter level
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24914
diff
changeset
|
241 def _filename(repo): |
b061a2049662
tags: have a different cache file per filter level
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24914
diff
changeset
|
242 """name of a tagcache file for a given repo or repoview""" |
24941
1062663808ce
tags: write a separate tags cache file for unfiltered repos
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24940
diff
changeset
|
243 filename = 'cache/tags2' |
24916
b061a2049662
tags: have a different cache file per filter level
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24914
diff
changeset
|
244 if repo.filtername: |
b061a2049662
tags: have a different cache file per filter level
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24914
diff
changeset
|
245 filename = '%s-%s' % (filename, repo.filtername) |
b061a2049662
tags: have a different cache file per filter level
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24914
diff
changeset
|
246 return filename |
b061a2049662
tags: have a different cache file per filter level
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24914
diff
changeset
|
247 |
24575
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24198
diff
changeset
|
248 def _readtagcache(ui, repo): |
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24198
diff
changeset
|
249 '''Read the tag cache. |
9159
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9157
diff
changeset
|
250 |
24939
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24938
diff
changeset
|
251 Returns a tuple (heads, fnodes, validinfo, cachetags, shouldwrite). |
24575
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24198
diff
changeset
|
252 |
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24198
diff
changeset
|
253 If the cache is completely up-to-date, "cachetags" is a dict of the |
24939
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24938
diff
changeset
|
254 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:
24938
diff
changeset
|
255 None and "shouldwrite" is False. |
9159
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9157
diff
changeset
|
256 |
24575
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24198
diff
changeset
|
257 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:
24198
diff
changeset
|
258 of all heads currently in the repository, ordered from tip to oldest. |
24939
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24938
diff
changeset
|
259 "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:
24938
diff
changeset
|
260 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:
24938
diff
changeset
|
261 filenode. "shouldwrite" is True. |
24575
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24198
diff
changeset
|
262 |
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24198
diff
changeset
|
263 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:
24198
diff
changeset
|
264 info from each returned head. (See findglobaltags().) |
c71edbafe603
tags: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24198
diff
changeset
|
265 ''' |
24939
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24938
diff
changeset
|
266 import scmutil # avoid cycle |
9159
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9157
diff
changeset
|
267 |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9157
diff
changeset
|
268 try: |
24916
b061a2049662
tags: have a different cache file per filter level
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24914
diff
changeset
|
269 cachefile = repo.vfs(_filename(repo), 'r') |
11066
26abd91d9e84
static-http: mimic more closely localrepo (issue2164: allow clone -r )
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
10263
diff
changeset
|
270 # 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
|
271 cachelines = iter(cachefile) |
9159
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9157
diff
changeset
|
272 except IOError: |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9157
diff
changeset
|
273 cachefile = None |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9157
diff
changeset
|
274 |
24939
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24938
diff
changeset
|
275 cacherev = None |
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24938
diff
changeset
|
276 cachenode = None |
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24938
diff
changeset
|
277 cachehash = None |
9159
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9157
diff
changeset
|
278 if cachefile: |
12758
2d754eae430c
tags: do not fail if tags.cache is corrupted (issue2444)
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11352
diff
changeset
|
279 try: |
24939
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24938
diff
changeset
|
280 validline = cachelines.next() |
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24938
diff
changeset
|
281 validline = validline.split() |
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24938
diff
changeset
|
282 cacherev = int(validline[0]) |
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24938
diff
changeset
|
283 cachenode = bin(validline[1]) |
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24938
diff
changeset
|
284 if len(validline) > 2: |
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24938
diff
changeset
|
285 cachehash = bin(validline[2]) |
14020
98f79a5c3086
tags: catch more corruption during cache parsing (issue2779)
Matt Mackall <mpm@selenic.com>
parents:
13341
diff
changeset
|
286 except Exception: |
24938
d082c6ef9ec3
tags: don't read .hgtags fnodes from tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24916
diff
changeset
|
287 # 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:
24916
diff
changeset
|
288 pass |
9159
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9157
diff
changeset
|
289 |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9157
diff
changeset
|
290 tipnode = repo.changelog.tip() |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9157
diff
changeset
|
291 tiprev = len(repo.changelog) - 1 |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9157
diff
changeset
|
292 |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9157
diff
changeset
|
293 # 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:
9157
diff
changeset
|
294 # (Unchanged tip trivially means no changesets have been added. |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9157
diff
changeset
|
295 # But, thanks to localrepository.destroyed(), it also means none |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9157
diff
changeset
|
296 # have been destroyed by strip or rollback.) |
24939
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24938
diff
changeset
|
297 if (cacherev == tiprev |
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24938
diff
changeset
|
298 and cachenode == tipnode |
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24938
diff
changeset
|
299 and cachehash == scmutil.filteredhash(repo, tiprev)): |
11066
26abd91d9e84
static-http: mimic more closely localrepo (issue2164: allow clone -r )
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
10263
diff
changeset
|
300 tags = _readtags(ui, repo, cachelines, cachefile.name) |
9160
4017291c4c48
tags: support 'instant' tag retrieval (issue548)
Greg Ward <greg-hg@gerg.ca>
parents:
9159
diff
changeset
|
301 cachefile.close() |
24939
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24938
diff
changeset
|
302 return (None, None, None, tags, False) |
9160
4017291c4c48
tags: support 'instant' tag retrieval (issue548)
Greg Ward <greg-hg@gerg.ca>
parents:
9159
diff
changeset
|
303 if cachefile: |
4017291c4c48
tags: support 'instant' tag retrieval (issue548)
Greg Ward <greg-hg@gerg.ca>
parents:
9159
diff
changeset
|
304 cachefile.close() # ignore rest of file |
9312
c5f0825c1dbb
kill trailing whitespace
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
9160
diff
changeset
|
305 |
24939
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24938
diff
changeset
|
306 valid = (tiprev, tipnode, scmutil.filteredhash(repo, tiprev)) |
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24938
diff
changeset
|
307 |
9159
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9157
diff
changeset
|
308 repoheads = repo.heads() |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9157
diff
changeset
|
309 # 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:
9157
diff
changeset
|
310 # writing an empty cache. |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9157
diff
changeset
|
311 if repoheads == [nullid]: |
24939
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24938
diff
changeset
|
312 return ([], {}, valid, {}, False) |
9159
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9157
diff
changeset
|
313 |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9157
diff
changeset
|
314 # Case 3 (uncommon): cache file missing or empty. |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9157
diff
changeset
|
315 |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9157
diff
changeset
|
316 # Case 4 (uncommon): tip rev decreased. This should only happen |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9157
diff
changeset
|
317 # when we're called from localrepository.destroyed(). Refresh the |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9157
diff
changeset
|
318 # 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:
9157
diff
changeset
|
319 # cache. |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9157
diff
changeset
|
320 |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9157
diff
changeset
|
321 # 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:
9157
diff
changeset
|
322 |
11352
b19067ee4507
tags: remove inactive debugging code.
Greg Ward <greg-hg@gerg.ca>
parents:
11351
diff
changeset
|
323 # As it happens, the code to handle cases 3, 4, 5 is the same. |
9159
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9157
diff
changeset
|
324 |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9157
diff
changeset
|
325 # 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:
9157
diff
changeset
|
326 # exposed". |
16731
dd4ce44ff53c
tags: short-circuit if no tags have ever been committed
Bryan O'Sullivan <bryano@fb.com>
parents:
16589
diff
changeset
|
327 if not len(repo.file('.hgtags')): |
dd4ce44ff53c
tags: short-circuit if no tags have ever been committed
Bryan O'Sullivan <bryano@fb.com>
parents:
16589
diff
changeset
|
328 # 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
|
329 # potentially expensive search. |
24940
61a6d83280d3
tags: return empty list of heads for no .hgtags case
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24939
diff
changeset
|
330 return ([], {}, valid, None, True) |
16731
dd4ce44ff53c
tags: short-circuit if no tags have ever been committed
Bryan O'Sullivan <bryano@fb.com>
parents:
16589
diff
changeset
|
331 |
21030
9ea132aee96c
tags: log events related to tags cache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
19650
diff
changeset
|
332 starttime = time.time() |
9ea132aee96c
tags: log events related to tags cache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
19650
diff
changeset
|
333 |
9159
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9157
diff
changeset
|
334 # 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:
9157
diff
changeset
|
335 # 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:
9157
diff
changeset
|
336 # 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:
9157
diff
changeset
|
337 # file, so newheads == repoheads. |
24914
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
338 fnodescache = hgtagsfnodescache(repo.unfiltered()) |
24938
d082c6ef9ec3
tags: don't read .hgtags fnodes from tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24916
diff
changeset
|
339 cachefnode = {} |
d082c6ef9ec3
tags: don't read .hgtags fnodes from tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24916
diff
changeset
|
340 for head in reversed(repoheads): |
24914
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
341 fnode = fnodescache.getfnode(head) |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
342 if fnode != nullid: |
9159
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9157
diff
changeset
|
343 cachefnode[head] = fnode |
24914
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
344 |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
345 fnodescache.write() |
9159
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9157
diff
changeset
|
346 |
21030
9ea132aee96c
tags: log events related to tags cache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
19650
diff
changeset
|
347 duration = time.time() - starttime |
9ea132aee96c
tags: log events related to tags cache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
19650
diff
changeset
|
348 ui.log('tagscache', |
24914
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
349 '%d/%d cache hits/lookups in %0.4f ' |
21030
9ea132aee96c
tags: log events related to tags cache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
19650
diff
changeset
|
350 'seconds\n', |
24914
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
351 fnodescache.hitcount, fnodescache.lookupcount, duration) |
21030
9ea132aee96c
tags: log events related to tags cache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
19650
diff
changeset
|
352 |
9159
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9157
diff
changeset
|
353 # Caller has to iterate over all heads, but can use the filenodes in |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9157
diff
changeset
|
354 # cachefnode to get to each .hgtags revision quickly. |
24939
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24938
diff
changeset
|
355 return (repoheads, cachefnode, valid, None, True) |
9159
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9157
diff
changeset
|
356 |
24939
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24938
diff
changeset
|
357 def _writetagcache(ui, repo, valid, cachetags): |
24942
a698e088ad29
tags: explicitly log which tags cache file is being written
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24941
diff
changeset
|
358 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
|
359 try: |
24942
a698e088ad29
tags: explicitly log which tags cache file is being written
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24941
diff
changeset
|
360 cachefile = repo.vfs(filename, '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
|
361 except (OSError, IOError): |
9ff178e7b627
tags: don't crash if unable to write tag cache
Greg Ward <greg-hg@gerg.ca>
parents:
9312
diff
changeset
|
362 return |
9159
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9157
diff
changeset
|
363 |
24942
a698e088ad29
tags: explicitly log which tags cache file is being written
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24941
diff
changeset
|
364 ui.log('tagscache', 'writing .hg/%s with %d tags\n', |
a698e088ad29
tags: explicitly log which tags cache file is being written
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24941
diff
changeset
|
365 filename, len(cachetags)) |
21030
9ea132aee96c
tags: log events related to tags cache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
19650
diff
changeset
|
366 |
24939
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24938
diff
changeset
|
367 if valid[2]: |
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24938
diff
changeset
|
368 cachefile.write('%d %s %s\n' % (valid[0], hex(valid[1]), hex(valid[2]))) |
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24938
diff
changeset
|
369 else: |
410f3856196f
tags: change format of tags cache files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24938
diff
changeset
|
370 cachefile.write('%d %s\n' % (valid[0], hex(valid[1]))) |
9159
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9157
diff
changeset
|
371 |
9160
4017291c4c48
tags: support 'instant' tag retrieval (issue548)
Greg Ward <greg-hg@gerg.ca>
parents:
9159
diff
changeset
|
372 # 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:
9159
diff
changeset
|
373 # 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:
9159
diff
changeset
|
374 # 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:
9159
diff
changeset
|
375 # the cache. |
24198
7b09dbbbd502
tags: write tags cache deterministically
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23889
diff
changeset
|
376 for (name, (node, hist)) in sorted(cachetags.iteritems()): |
19650
335a558f81dc
tags: write tag overwriting history also into tag cache file (issue3911)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19108
diff
changeset
|
377 for n in hist: |
335a558f81dc
tags: write tag overwriting history also into tag cache file (issue3911)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19108
diff
changeset
|
378 cachefile.write("%s %s\n" % (hex(n), name)) |
9160
4017291c4c48
tags: support 'instant' tag retrieval (issue548)
Greg Ward <greg-hg@gerg.ca>
parents:
9159
diff
changeset
|
379 cachefile.write("%s %s\n" % (hex(node), name)) |
4017291c4c48
tags: support 'instant' tag retrieval (issue548)
Greg Ward <greg-hg@gerg.ca>
parents:
9159
diff
changeset
|
380 |
14662
2b30124c7d8a
tags: don't allow environment errors to be raised from _writetagscache
Steve Borho <steve@borho.org>
parents:
14170
diff
changeset
|
381 try: |
15057
774da7121fc9
atomictempfile: make close() consistent with other file-like objects.
Greg Ward <greg@gerg.ca>
parents:
14662
diff
changeset
|
382 cachefile.close() |
14662
2b30124c7d8a
tags: don't allow environment errors to be raised from _writetagscache
Steve Borho <steve@borho.org>
parents:
14170
diff
changeset
|
383 except (OSError, IOError): |
2b30124c7d8a
tags: don't allow environment errors to be raised from _writetagscache
Steve Borho <steve@borho.org>
parents:
14170
diff
changeset
|
384 pass |
24914
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
385 |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
386 _fnodescachefile = 'cache/hgtagsfnodes1' |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
387 _fnodesrecsize = 4 + 20 # changeset fragment + filenode |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
388 _fnodesmissingrec = '\xff' * 24 |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
389 |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
390 class hgtagsfnodescache(object): |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
391 """Persistent cache mapping revisions to .hgtags filenodes. |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
392 |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
393 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:
24665
diff
changeset
|
394 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:
24665
diff
changeset
|
395 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:
24665
diff
changeset
|
396 |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
397 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:
24665
diff
changeset
|
398 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:
24665
diff
changeset
|
399 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:
24665
diff
changeset
|
400 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:
24665
diff
changeset
|
401 branchmap.py). |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
402 |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
403 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:
24665
diff
changeset
|
404 only parsed on read. |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
405 |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
406 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:
24665
diff
changeset
|
407 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:
24665
diff
changeset
|
408 """ |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
409 def __init__(self, repo): |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
410 assert repo.filtername is None |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
411 |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
412 self._repo = repo |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
413 |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
414 # Only for reporting purposes. |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
415 self.lookupcount = 0 |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
416 self.hitcount = 0 |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
417 |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
418 self._raw = array('c') |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
419 |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
420 data = repo.vfs.tryread(_fnodescachefile) |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
421 self._raw.fromstring(data) |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
422 |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
423 # 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:
24665
diff
changeset
|
424 # 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:
24665
diff
changeset
|
425 # 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:
24665
diff
changeset
|
426 # 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:
24665
diff
changeset
|
427 # 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:
24665
diff
changeset
|
428 # for array members. |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
429 cllen = len(repo.changelog) |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
430 wantedlen = cllen * _fnodesrecsize |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
431 rawlen = len(self._raw) |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
432 |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
433 self._dirtyoffset = None |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
434 |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
435 if rawlen < wantedlen: |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
436 self._dirtyoffset = rawlen |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
437 self._raw.extend('\xff' * (wantedlen - rawlen)) |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
438 elif rawlen > wantedlen: |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
439 # 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:
24665
diff
changeset
|
440 # slightly less evil than copying a potentially large array slice. |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
441 for i in range(rawlen - wantedlen): |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
442 self._raw.pop() |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
443 self._dirtyoffset = len(self._raw) |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
444 |
25901
eaa456c5e699
tags: support reading tags cache without populating
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25498
diff
changeset
|
445 def getfnode(self, node, computemissing=True): |
24914
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
446 """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:
24665
diff
changeset
|
447 |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
448 If the value is in the cache, the entry will be validated and returned. |
25901
eaa456c5e699
tags: support reading tags cache without populating
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25498
diff
changeset
|
449 Otherwise, the filenode will be computed and returned unless |
eaa456c5e699
tags: support reading tags cache without populating
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25498
diff
changeset
|
450 "computemissing" is False, in which case None will be returned without |
eaa456c5e699
tags: support reading tags cache without populating
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25498
diff
changeset
|
451 any potentially expensive computation being performed. |
24914
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
452 |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
453 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:
24665
diff
changeset
|
454 returned. |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
455 """ |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
456 ctx = self._repo[node] |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
457 rev = ctx.rev() |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
458 |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
459 self.lookupcount += 1 |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
460 |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
461 offset = rev * _fnodesrecsize |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
462 record = self._raw[offset:offset + _fnodesrecsize].tostring() |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
463 properprefix = node[0:4] |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
464 |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
465 # Validate and return existing entry. |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
466 if record != _fnodesmissingrec: |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
467 fileprefix = record[0:4] |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
468 |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
469 if fileprefix == properprefix: |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
470 self.hitcount += 1 |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
471 return record[4:] |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
472 |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
473 # Fall through. |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
474 |
25901
eaa456c5e699
tags: support reading tags cache without populating
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25498
diff
changeset
|
475 # 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:
25498
diff
changeset
|
476 |
eaa456c5e699
tags: support reading tags cache without populating
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25498
diff
changeset
|
477 if not computemissing: |
eaa456c5e699
tags: support reading tags cache without populating
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25498
diff
changeset
|
478 return None |
eaa456c5e699
tags: support reading tags cache without populating
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25498
diff
changeset
|
479 |
eaa456c5e699
tags: support reading tags cache without populating
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25498
diff
changeset
|
480 # Populate missing entry. |
24914
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
481 try: |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
482 fnode = ctx.filenode('.hgtags') |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
483 except error.LookupError: |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
484 # No .hgtags file on this revision. |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
485 fnode = nullid |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
486 |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
487 # Slices on array instances only accept other array. |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
488 entry = array('c', properprefix + fnode) |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
489 self._raw[offset:offset + _fnodesrecsize] = entry |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
490 # self._dirtyoffset could be None. |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
491 self._dirtyoffset = min(self._dirtyoffset, offset) or 0 |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
492 |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
493 return fnode |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
494 |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
495 def write(self): |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
496 """Perform all necessary writes to cache file. |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
497 |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
498 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:
24665
diff
changeset
|
499 not be obtained. |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
500 """ |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
501 if self._dirtyoffset is None: |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
502 return |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
503 |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
504 data = self._raw[self._dirtyoffset:] |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
505 if not data: |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
506 return |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
507 |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
508 repo = self._repo |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
509 |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
510 try: |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
511 lock = repo.wlock(wait=False) |
24985
61aea11fb83d
tags: do not abort if failed to write lock file to save cache
Yuya Nishihara <yuya@tcha.org>
parents:
24942
diff
changeset
|
512 except error.LockError: |
24914
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
513 repo.ui.log('tagscache', |
24985
61aea11fb83d
tags: do not abort if failed to write lock file to save cache
Yuya Nishihara <yuya@tcha.org>
parents:
24942
diff
changeset
|
514 'not writing .hg/%s because lock cannot be acquired\n' % |
24914
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
515 (_fnodescachefile)) |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
516 return |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
517 |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
518 try: |
25498
559f24e3957d
tags: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
24985
diff
changeset
|
519 f = repo.vfs.open(_fnodescachefile, 'ab') |
24914
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
520 try: |
25498
559f24e3957d
tags: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
24985
diff
changeset
|
521 # if the file has been truncated |
559f24e3957d
tags: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
24985
diff
changeset
|
522 actualoffset = f.tell() |
559f24e3957d
tags: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
24985
diff
changeset
|
523 if actualoffset < self._dirtyoffset: |
559f24e3957d
tags: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
24985
diff
changeset
|
524 self._dirtyoffset = actualoffset |
559f24e3957d
tags: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
24985
diff
changeset
|
525 data = self._raw[self._dirtyoffset:] |
559f24e3957d
tags: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
24985
diff
changeset
|
526 f.seek(self._dirtyoffset) |
559f24e3957d
tags: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
24985
diff
changeset
|
527 f.truncate() |
24914
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
528 repo.ui.log('tagscache', |
25498
559f24e3957d
tags: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
24985
diff
changeset
|
529 'writing %d bytes to %s\n' % ( |
559f24e3957d
tags: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
24985
diff
changeset
|
530 len(data), _fnodescachefile)) |
559f24e3957d
tags: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
24985
diff
changeset
|
531 f.write(data) |
559f24e3957d
tags: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
24985
diff
changeset
|
532 self._dirtyoffset = None |
559f24e3957d
tags: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
24985
diff
changeset
|
533 finally: |
559f24e3957d
tags: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
24985
diff
changeset
|
534 f.close() |
559f24e3957d
tags: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
24985
diff
changeset
|
535 except (IOError, OSError), inst: |
559f24e3957d
tags: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
24985
diff
changeset
|
536 repo.ui.log('tagscache', |
559f24e3957d
tags: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
24985
diff
changeset
|
537 "couldn't write %s: %s\n" % ( |
559f24e3957d
tags: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
24985
diff
changeset
|
538 _fnodescachefile, inst)) |
24914
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
539 finally: |
07200e3332a1
tags: extract .hgtags filenodes cache to a standalone file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24665
diff
changeset
|
540 lock.release() |