Mercurial > public > mercurial-scm > hg
annotate hgext/fastannotate/context.py @ 45625:c11099cc1de4
log: map --removed to walkopts.force_changelog_traversal
This is the flag to forcibly enable the slowpath. I'm not sure if the
slowpath parameter should be merged with this flag, so let's keep it as
an immutable flag for now.
I'll add another flag to support "grep --all-files". These two will be the
flags which aren't directly mapped from the command-line options.
author | Yuya Nishihara <yuya@tcha.org> |
---|---|
date | Sat, 12 Sep 2020 21:54:58 +0900 |
parents | 2d49482d0dd4 |
children | 59fa3890d40a |
rev | line source |
---|---|
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
1 # Copyright 2016-present Facebook. All Rights Reserved. |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
2 # |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
3 # context: context needed to annotate a file |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
4 # |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
5 # This software may be used and distributed according to the terms of the |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
6 # GNU General Public License version 2 or any later version. |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
7 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
8 from __future__ import absolute_import |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
9 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
10 import collections |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
11 import contextlib |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
12 import os |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
13 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
14 from mercurial.i18n import _ |
43087
66f2cc210a29
py3: manually import pycompat.setattr where it is needed
Gregory Szorc <gregory.szorc@gmail.com>
parents:
43085
diff
changeset
|
15 from mercurial.pycompat import ( |
43089
c59eb1560c44
py3: manually import getattr where it is needed
Gregory Szorc <gregory.szorc@gmail.com>
parents:
43087
diff
changeset
|
16 getattr, |
43087
66f2cc210a29
py3: manually import pycompat.setattr where it is needed
Gregory Szorc <gregory.szorc@gmail.com>
parents:
43085
diff
changeset
|
17 open, |
66f2cc210a29
py3: manually import pycompat.setattr where it is needed
Gregory Szorc <gregory.szorc@gmail.com>
parents:
43085
diff
changeset
|
18 setattr, |
66f2cc210a29
py3: manually import pycompat.setattr where it is needed
Gregory Szorc <gregory.szorc@gmail.com>
parents:
43085
diff
changeset
|
19 ) |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
20 from mercurial import ( |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
21 error, |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
22 linelog as linelogmod, |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
23 lock as lockmod, |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
24 mdiff, |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
25 node, |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
26 pycompat, |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
27 scmutil, |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
28 util, |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
29 ) |
44062
2d49482d0dd4
hgext: replace references to hashlib.sha1 with hashutil.sha1
Augie Fackler <augie@google.com>
parents:
43421
diff
changeset
|
30 from mercurial.utils import ( |
2d49482d0dd4
hgext: replace references to hashlib.sha1 with hashutil.sha1
Augie Fackler <augie@google.com>
parents:
43421
diff
changeset
|
31 hashutil, |
2d49482d0dd4
hgext: replace references to hashlib.sha1 with hashutil.sha1
Augie Fackler <augie@google.com>
parents:
43421
diff
changeset
|
32 stringutil, |
2d49482d0dd4
hgext: replace references to hashlib.sha1 with hashutil.sha1
Augie Fackler <augie@google.com>
parents:
43421
diff
changeset
|
33 ) |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
34 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
35 from . import ( |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
36 error as faerror, |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
37 revmap as revmapmod, |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
38 ) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
39 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
40 # given path, get filelog, cached |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
41 @util.lrucachefunc |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
42 def _getflog(repo, path): |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
43 return repo.file(path) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
44 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
45 |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
46 # extracted from mercurial.context.basefilectx.annotate |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
47 def _parents(f, follow=True): |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
48 # Cut _descendantrev here to mitigate the penalty of lazy linkrev |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
49 # adjustment. Otherwise, p._adjustlinkrev() would walk changelog |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
50 # from the topmost introrev (= srcrev) down to p.linkrev() if it |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
51 # isn't an ancestor of the srcrev. |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
52 f._changeid |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
53 pl = f.parents() |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
54 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
55 # Don't return renamed parents if we aren't following. |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
56 if not follow: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
57 pl = [p for p in pl if p.path() == f.path()] |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
58 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
59 # renamed filectx won't have a filelog yet, so set it |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
60 # from the cache to save time |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
61 for p in pl: |
43421
be384a2052aa
py3: don't use bytes with vars() or __dict__
Martin von Zweigbergk <martinvonz@google.com>
parents:
43105
diff
changeset
|
62 if not '_filelog' in p.__dict__: |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
63 p._filelog = _getflog(f._repo, p.path()) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
64 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
65 return pl |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
66 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
67 |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
68 # extracted from mercurial.context.basefilectx.annotate. slightly modified |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
69 # so it takes a fctx instead of a pair of text and fctx. |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
70 def _decorate(fctx): |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
71 text = fctx.data() |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
72 linecount = text.count(b'\n') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
73 if text and not text.endswith(b'\n'): |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
74 linecount += 1 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
75 return ([(fctx, i) for i in pycompat.xrange(linecount)], text) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
76 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
77 |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
78 # extracted from mercurial.context.basefilectx.annotate. slightly modified |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
79 # so it takes an extra "blocks" parameter calculated elsewhere, instead of |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
80 # calculating diff here. |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
81 def _pair(parent, child, blocks): |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
82 for (a1, a2, b1, b2), t in blocks: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
83 # Changed blocks ('!') or blocks made only of blank lines ('~') |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
84 # belong to the child. |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
85 if t == b'=': |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
86 child[0][b1:b2] = parent[0][a1:a2] |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
87 return child |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
88 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
89 |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
90 # like scmutil.revsingle, but with lru cache, so their states (like manifests) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
91 # could be reused |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
92 _revsingle = util.lrucachefunc(scmutil.revsingle) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
93 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
94 |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
95 def resolvefctx(repo, rev, path, resolverev=False, adjustctx=None): |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
96 """(repo, str, str) -> fctx |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
97 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
98 get the filectx object from repo, rev, path, in an efficient way. |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
99 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
100 if resolverev is True, "rev" is a revision specified by the revset |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
101 language, otherwise "rev" is a nodeid, or a revision number that can |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
102 be consumed by repo.__getitem__. |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
103 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
104 if adjustctx is not None, the returned fctx will point to a changeset |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
105 that introduces the change (last modified the file). if adjustctx |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
106 is 'linkrev', trust the linkrev and do not adjust it. this is noticeably |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
107 faster for big repos but is incorrect for some cases. |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
108 """ |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
109 if resolverev and not isinstance(rev, int) and rev is not None: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
110 ctx = _revsingle(repo, rev) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
111 else: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
112 ctx = repo[rev] |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
113 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
114 # If we don't need to adjust the linkrev, create the filectx using the |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
115 # changectx instead of using ctx[path]. This means it already has the |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
116 # changectx information, so blame -u will be able to look directly at the |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
117 # commitctx object instead of having to resolve it by going through the |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
118 # manifest. In a lazy-manifest world this can prevent us from downloading a |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
119 # lot of data. |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
120 if adjustctx is None: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
121 # ctx.rev() is None means it's the working copy, which is a special |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
122 # case. |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
123 if ctx.rev() is None: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
124 fctx = ctx[path] |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
125 else: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
126 fctx = repo.filectx(path, changeid=ctx.rev()) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
127 else: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
128 fctx = ctx[path] |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
129 if adjustctx == b'linkrev': |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
130 introrev = fctx.linkrev() |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
131 else: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
132 introrev = fctx.introrev() |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
133 if introrev != ctx.rev(): |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
134 fctx._changeid = introrev |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
135 fctx._changectx = repo[introrev] |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
136 return fctx |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
137 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
138 |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
139 # like mercurial.store.encodedir, but use linelog suffixes: .m, .l, .lock |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
140 def encodedir(path): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
141 return ( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
142 path.replace(b'.hg/', b'.hg.hg/') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
143 .replace(b'.l/', b'.l.hg/') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
144 .replace(b'.m/', b'.m.hg/') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
145 .replace(b'.lock/', b'.lock.hg/') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
146 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
147 |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
148 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
149 def hashdiffopts(diffopts): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
150 diffoptstr = stringutil.pprint( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
151 sorted((k, getattr(diffopts, k)) for k in mdiff.diffopts.defaults) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
152 ) |
44062
2d49482d0dd4
hgext: replace references to hashlib.sha1 with hashutil.sha1
Augie Fackler <augie@google.com>
parents:
43421
diff
changeset
|
153 return node.hex(hashutil.sha1(diffoptstr).digest())[:6] |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
154 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
155 |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
156 _defaultdiffopthash = hashdiffopts(mdiff.defaultopts) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
157 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
158 |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
159 class annotateopts(object): |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
160 """like mercurial.mdiff.diffopts, but is for annotate |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
161 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
162 followrename: follow renames, like "hg annotate -f" |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
163 followmerge: follow p2 of a merge changeset, otherwise p2 is ignored |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
164 """ |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
165 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
166 defaults = { |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
167 b'diffopts': None, |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
168 b'followrename': True, |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
169 b'followmerge': True, |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
170 } |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
171 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
172 def __init__(self, **opts): |
40669
d6a13f6db69c
py3: use pycompat.byteskwargs() to covert keys of kwargs to bytes
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
39728
diff
changeset
|
173 opts = pycompat.byteskwargs(opts) |
43105
649d3ac37a12
py3: define and use pycompat.iteritems() for hgext/
Gregory Szorc <gregory.szorc@gmail.com>
parents:
43089
diff
changeset
|
174 for k, v in pycompat.iteritems(self.defaults): |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
175 setattr(self, k, opts.get(k, v)) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
176 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
177 @util.propertycache |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
178 def shortstr(self): |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
179 """represent opts in a short string, suitable for a directory name""" |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
180 result = b'' |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
181 if not self.followrename: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
182 result += b'r0' |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
183 if not self.followmerge: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
184 result += b'm0' |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
185 if self.diffopts is not None: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
186 assert isinstance(self.diffopts, mdiff.diffopts) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
187 diffopthash = hashdiffopts(self.diffopts) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
188 if diffopthash != _defaultdiffopthash: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
189 result += b'i' + diffopthash |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
190 return result or b'default' |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
191 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
192 |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
193 defaultopts = annotateopts() |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
194 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
195 |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
196 class _annotatecontext(object): |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
197 """do not use this class directly as it does not use lock to protect |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
198 writes. use "with annotatecontext(...)" instead. |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
199 """ |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
200 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
201 def __init__(self, repo, path, linelogpath, revmappath, opts): |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
202 self.repo = repo |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
203 self.ui = repo.ui |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
204 self.path = path |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
205 self.opts = opts |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
206 self.linelogpath = linelogpath |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
207 self.revmappath = revmappath |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
208 self._linelog = None |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
209 self._revmap = None |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
210 self._node2path = {} # {str: str} |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
211 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
212 @property |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
213 def linelog(self): |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
214 if self._linelog is None: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
215 if os.path.exists(self.linelogpath): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
216 with open(self.linelogpath, b'rb') as f: |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
217 try: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
218 self._linelog = linelogmod.linelog.fromdata(f.read()) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
219 except linelogmod.LineLogError: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
220 self._linelog = linelogmod.linelog() |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
221 else: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
222 self._linelog = linelogmod.linelog() |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
223 return self._linelog |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
224 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
225 @property |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
226 def revmap(self): |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
227 if self._revmap is None: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
228 self._revmap = revmapmod.revmap(self.revmappath) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
229 return self._revmap |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
230 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
231 def close(self): |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
232 if self._revmap is not None: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
233 self._revmap.flush() |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
234 self._revmap = None |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
235 if self._linelog is not None: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
236 with open(self.linelogpath, b'wb') as f: |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
237 f.write(self._linelog.encode()) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
238 self._linelog = None |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
239 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
240 __del__ = close |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
241 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
242 def rebuild(self): |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
243 """delete linelog and revmap, useful for rebuilding""" |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
244 self.close() |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
245 self._node2path.clear() |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
246 _unlinkpaths([self.revmappath, self.linelogpath]) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
247 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
248 @property |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
249 def lastnode(self): |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
250 """return last node in revmap, or None if revmap is empty""" |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
251 if self._revmap is None: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
252 # fast path, read revmap without loading its full content |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
253 return revmapmod.getlastnode(self.revmappath) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
254 else: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
255 return self._revmap.rev2hsh(self._revmap.maxrev) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
256 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
257 def isuptodate(self, master, strict=True): |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
258 """return True if the revmap / linelog is up-to-date, or the file |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
259 does not exist in the master revision. False otherwise. |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
260 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
261 it tries to be fast and could return false negatives, because of the |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
262 use of linkrev instead of introrev. |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
263 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
264 useful for both server and client to decide whether to update |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
265 fastannotate cache or not. |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
266 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
267 if strict is True, even if fctx exists in the revmap, but is not the |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
268 last node, isuptodate will return False. it's good for performance - no |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
269 expensive check was done. |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
270 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
271 if strict is False, if fctx exists in the revmap, this function may |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
272 return True. this is useful for the client to skip downloading the |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
273 cache if the client's master is behind the server's. |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
274 """ |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
275 lastnode = self.lastnode |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
276 try: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
277 f = self._resolvefctx(master, resolverev=True) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
278 # choose linkrev instead of introrev as the check is meant to be |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
279 # *fast*. |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
280 linknode = self.repo.changelog.node(f.linkrev()) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
281 if not strict and lastnode and linknode != lastnode: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
282 # check if f.node() is in the revmap. note: this loads the |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
283 # revmap and can be slow. |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
284 return self.revmap.hsh2rev(linknode) is not None |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
285 # avoid resolving old manifest, or slow adjustlinkrev to be fast, |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
286 # false negatives are acceptable in this case. |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
287 return linknode == lastnode |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
288 except LookupError: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
289 # master does not have the file, or the revmap is ahead |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
290 return True |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
291 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
292 def annotate(self, rev, master=None, showpath=False, showlines=False): |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
293 """incrementally update the cache so it includes revisions in the main |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
294 branch till 'master'. and run annotate on 'rev', which may or may not be |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
295 included in the main branch. |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
296 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
297 if master is None, do not update linelog. |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
298 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
299 the first value returned is the annotate result, it is [(node, linenum)] |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
300 by default. [(node, linenum, path)] if showpath is True. |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
301 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
302 if showlines is True, a second value will be returned, it is a list of |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
303 corresponding line contents. |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
304 """ |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
305 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
306 # the fast path test requires commit hash, convert rev number to hash, |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
307 # so it may hit the fast path. note: in the "fctx" mode, the "annotate" |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
308 # command could give us a revision number even if the user passes a |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
309 # commit hash. |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
310 if isinstance(rev, int): |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
311 rev = node.hex(self.repo.changelog.node(rev)) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
312 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
313 # fast path: if rev is in the main branch already |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
314 directly, revfctx = self.canannotatedirectly(rev) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
315 if directly: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
316 if self.ui.debugflag: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
317 self.ui.debug( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
318 b'fastannotate: %s: using fast path ' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
319 b'(resolved fctx: %s)\n' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
320 % ( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
321 self.path, |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
322 stringutil.pprint(util.safehasattr(revfctx, b'node')), |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
323 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
324 ) |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
325 return self.annotatedirectly(revfctx, showpath, showlines) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
326 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
327 # resolve master |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
328 masterfctx = None |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
329 if master: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
330 try: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
331 masterfctx = self._resolvefctx( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
332 master, resolverev=True, adjustctx=True |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
333 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
334 except LookupError: # master does not have the file |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
335 pass |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
336 else: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
337 if masterfctx in self.revmap: # no need to update linelog |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
338 masterfctx = None |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
339 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
340 # ... - @ <- rev (can be an arbitrary changeset, |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
341 # / not necessarily a descendant |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
342 # master -> o of master) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
343 # | |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
344 # a merge -> o 'o': new changesets in the main branch |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
345 # |\ '#': revisions in the main branch that |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
346 # o * exist in linelog / revmap |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
347 # | . '*': changesets in side branches, or |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
348 # last master -> # . descendants of master |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
349 # | . |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
350 # # * joint: '#', and is a parent of a '*' |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
351 # |/ |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
352 # a joint -> # ^^^^ --- side branches |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
353 # | |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
354 # ^ --- main branch (in linelog) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
355 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
356 # these DFSes are similar to the traditional annotate algorithm. |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
357 # we cannot really reuse the code for perf reason. |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
358 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
359 # 1st DFS calculates merges, joint points, and needed. |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
360 # "needed" is a simple reference counting dict to free items in |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
361 # "hist", reducing its memory usage otherwise could be huge. |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
362 initvisit = [revfctx] |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
363 if masterfctx: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
364 if masterfctx.rev() is None: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
365 raise error.Abort( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
366 _(b'cannot update linelog to wdir()'), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
367 hint=_(b'set fastannotate.mainbranch'), |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
368 ) |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
369 initvisit.append(masterfctx) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
370 visit = initvisit[:] |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
371 pcache = {} |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
372 needed = {revfctx: 1} |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
373 hist = {} # {fctx: ([(llrev or fctx, linenum)], text)} |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
374 while visit: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
375 f = visit.pop() |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
376 if f in pcache or f in hist: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
377 continue |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
378 if f in self.revmap: # in the old main branch, it's a joint |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
379 llrev = self.revmap.hsh2rev(f.node()) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
380 self.linelog.annotate(llrev) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
381 result = self.linelog.annotateresult |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
382 hist[f] = (result, f.data()) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
383 continue |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
384 pl = self._parentfunc(f) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
385 pcache[f] = pl |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
386 for p in pl: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
387 needed[p] = needed.get(p, 0) + 1 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
388 if p not in pcache: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
389 visit.append(p) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
390 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
391 # 2nd (simple) DFS calculates new changesets in the main branch |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
392 # ('o' nodes in # the above graph), so we know when to update linelog. |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
393 newmainbranch = set() |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
394 f = masterfctx |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
395 while f and f not in self.revmap: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
396 newmainbranch.add(f) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
397 pl = pcache[f] |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
398 if pl: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
399 f = pl[0] |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
400 else: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
401 f = None |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
402 break |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
403 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
404 # f, if present, is the position where the last build stopped at, and |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
405 # should be the "master" last time. check to see if we can continue |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
406 # building the linelog incrementally. (we cannot if diverged) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
407 if masterfctx is not None: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
408 self._checklastmasterhead(f) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
409 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
410 if self.ui.debugflag: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
411 if newmainbranch: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
412 self.ui.debug( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
413 b'fastannotate: %s: %d new changesets in the main' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
414 b' branch\n' % (self.path, len(newmainbranch)) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
415 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
416 elif not hist: # no joints, no updates |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
417 self.ui.debug( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
418 b'fastannotate: %s: linelog cannot help in ' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
419 b'annotating this revision\n' % self.path |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
420 ) |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
421 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
422 # prepare annotateresult so we can update linelog incrementally |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
423 self.linelog.annotate(self.linelog.maxrev) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
424 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
425 # 3rd DFS does the actual annotate |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
426 visit = initvisit[:] |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
427 progress = self.ui.makeprogress( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
428 b'building cache', total=len(newmainbranch) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
429 ) |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
430 while visit: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
431 f = visit[-1] |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
432 if f in hist: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
433 visit.pop() |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
434 continue |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
435 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
436 ready = True |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
437 pl = pcache[f] |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
438 for p in pl: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
439 if p not in hist: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
440 ready = False |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
441 visit.append(p) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
442 if not ready: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
443 continue |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
444 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
445 visit.pop() |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
446 blocks = None # mdiff blocks, used for appending linelog |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
447 ismainbranch = f in newmainbranch |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
448 # curr is the same as the traditional annotate algorithm, |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
449 # if we only care about linear history (do not follow merge), |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
450 # then curr is not actually used. |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
451 assert f not in hist |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
452 curr = _decorate(f) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
453 for i, p in enumerate(pl): |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
454 bs = list(self._diffblocks(hist[p][1], curr[1])) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
455 if i == 0 and ismainbranch: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
456 blocks = bs |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
457 curr = _pair(hist[p], curr, bs) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
458 if needed[p] == 1: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
459 del hist[p] |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
460 del needed[p] |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
461 else: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
462 needed[p] -= 1 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
463 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
464 hist[f] = curr |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
465 del pcache[f] |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
466 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
467 if ismainbranch: # need to write to linelog |
40839
dd1006874a5a
fastannotate: use progress helper
Martin von Zweigbergk <martinvonz@google.com>
parents:
40675
diff
changeset
|
468 progress.increment() |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
469 bannotated = None |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
470 if len(pl) == 2 and self.opts.followmerge: # merge |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
471 bannotated = curr[0] |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
472 if blocks is None: # no parents, add an empty one |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
473 blocks = list(self._diffblocks(b'', curr[1])) |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
474 self._appendrev(f, blocks, bannotated) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
475 elif showpath: # not append linelog, but we need to record path |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
476 self._node2path[f.node()] = f.path() |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
477 |
40839
dd1006874a5a
fastannotate: use progress helper
Martin von Zweigbergk <martinvonz@google.com>
parents:
40675
diff
changeset
|
478 progress.complete() |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
479 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
480 result = [ |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
481 ((self.revmap.rev2hsh(fr) if isinstance(fr, int) else fr.node()), l) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
482 for fr, l in hist[revfctx][0] |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
483 ] # [(node, linenumber)] |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
484 return self._refineannotateresult(result, revfctx, showpath, showlines) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
485 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
486 def canannotatedirectly(self, rev): |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
487 """(str) -> bool, fctx or node. |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
488 return (True, f) if we can annotate without updating the linelog, pass |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
489 f to annotatedirectly. |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
490 return (False, f) if we need extra calculation. f is the fctx resolved |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
491 from rev. |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
492 """ |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
493 result = True |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
494 f = None |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
495 if not isinstance(rev, int) and rev is not None: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
496 hsh = {20: bytes, 40: node.bin}.get(len(rev), lambda x: None)(rev) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
497 if hsh is not None and (hsh, self.path) in self.revmap: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
498 f = hsh |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
499 if f is None: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
500 adjustctx = b'linkrev' if self._perfhack else True |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
501 f = self._resolvefctx(rev, adjustctx=adjustctx, resolverev=True) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
502 result = f in self.revmap |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
503 if not result and self._perfhack: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
504 # redo the resolution without perfhack - as we are going to |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
505 # do write operations, we need a correct fctx. |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
506 f = self._resolvefctx(rev, adjustctx=True, resolverev=True) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
507 return result, f |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
508 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
509 def annotatealllines(self, rev, showpath=False, showlines=False): |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
510 """(rev : str) -> [(node : str, linenum : int, path : str)] |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
511 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
512 the result has the same format with annotate, but include all (including |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
513 deleted) lines up to rev. call this after calling annotate(rev, ...) for |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
514 better performance and accuracy. |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
515 """ |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
516 revfctx = self._resolvefctx(rev, resolverev=True, adjustctx=True) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
517 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
518 # find a chain from rev to anything in the mainbranch |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
519 if revfctx not in self.revmap: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
520 chain = [revfctx] |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
521 a = b'' |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
522 while True: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
523 f = chain[-1] |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
524 pl = self._parentfunc(f) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
525 if not pl: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
526 break |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
527 if pl[0] in self.revmap: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
528 a = pl[0].data() |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
529 break |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
530 chain.append(pl[0]) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
531 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
532 # both self.linelog and self.revmap is backed by filesystem. now |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
533 # we want to modify them but do not want to write changes back to |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
534 # files. so we create in-memory objects and copy them. it's like |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
535 # a "fork". |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
536 linelog = linelogmod.linelog() |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
537 linelog.copyfrom(self.linelog) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
538 linelog.annotate(linelog.maxrev) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
539 revmap = revmapmod.revmap() |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
540 revmap.copyfrom(self.revmap) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
541 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
542 for f in reversed(chain): |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
543 b = f.data() |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
544 blocks = list(self._diffblocks(a, b)) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
545 self._doappendrev(linelog, revmap, f, blocks) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
546 a = b |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
547 else: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
548 # fastpath: use existing linelog, revmap as we don't write to them |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
549 linelog = self.linelog |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
550 revmap = self.revmap |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
551 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
552 lines = linelog.getalllines() |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
553 hsh = revfctx.node() |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
554 llrev = revmap.hsh2rev(hsh) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
555 result = [(revmap.rev2hsh(r), l) for r, l in lines if r <= llrev] |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
556 # cannot use _refineannotateresult since we need custom logic for |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
557 # resolving line contents |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
558 if showpath: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
559 result = self._addpathtoresult(result, revmap) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
560 if showlines: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
561 linecontents = self._resolvelines(result, revmap, linelog) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
562 result = (result, linecontents) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
563 return result |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
564 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
565 def _resolvelines(self, annotateresult, revmap, linelog): |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
566 """(annotateresult) -> [line]. designed for annotatealllines. |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
567 this is probably the most inefficient code in the whole fastannotate |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
568 directory. but we have made a decision that the linelog does not |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
569 store line contents. so getting them requires random accesses to |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
570 the revlog data, since they can be many, it can be very slow. |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
571 """ |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
572 # [llrev] |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
573 revs = [revmap.hsh2rev(l[0]) for l in annotateresult] |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
574 result = [None] * len(annotateresult) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
575 # {(rev, linenum): [lineindex]} |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
576 key2idxs = collections.defaultdict(list) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
577 for i in pycompat.xrange(len(result)): |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
578 key2idxs[(revs[i], annotateresult[i][1])].append(i) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
579 while key2idxs: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
580 # find an unresolved line and its linelog rev to annotate |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
581 hsh = None |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
582 try: |
43105
649d3ac37a12
py3: define and use pycompat.iteritems() for hgext/
Gregory Szorc <gregory.szorc@gmail.com>
parents:
43089
diff
changeset
|
583 for (rev, _linenum), idxs in pycompat.iteritems(key2idxs): |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
584 if revmap.rev2flag(rev) & revmapmod.sidebranchflag: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
585 continue |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
586 hsh = annotateresult[idxs[0]][0] |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
587 break |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
588 except StopIteration: # no more unresolved lines |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
589 return result |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
590 if hsh is None: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
591 # the remaining key2idxs are not in main branch, resolving them |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
592 # using the hard way... |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
593 revlines = {} |
43105
649d3ac37a12
py3: define and use pycompat.iteritems() for hgext/
Gregory Szorc <gregory.szorc@gmail.com>
parents:
43089
diff
changeset
|
594 for (rev, linenum), idxs in pycompat.iteritems(key2idxs): |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
595 if rev not in revlines: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
596 hsh = annotateresult[idxs[0]][0] |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
597 if self.ui.debugflag: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
598 self.ui.debug( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
599 b'fastannotate: reading %s line #%d ' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
600 b'to resolve lines %r\n' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
601 % (node.short(hsh), linenum, idxs) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
602 ) |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
603 fctx = self._resolvefctx(hsh, revmap.rev2path(rev)) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
604 lines = mdiff.splitnewlines(fctx.data()) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
605 revlines[rev] = lines |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
606 for idx in idxs: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
607 result[idx] = revlines[rev][linenum] |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
608 assert all(x is not None for x in result) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
609 return result |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
610 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
611 # run the annotate and the lines should match to the file content |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
612 self.ui.debug( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
613 b'fastannotate: annotate %s to resolve lines\n' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
614 % node.short(hsh) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
615 ) |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
616 linelog.annotate(rev) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
617 fctx = self._resolvefctx(hsh, revmap.rev2path(rev)) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
618 annotated = linelog.annotateresult |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
619 lines = mdiff.splitnewlines(fctx.data()) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
620 if len(lines) != len(annotated): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
621 raise faerror.CorruptedFileError(b'unexpected annotated lines') |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
622 # resolve lines from the annotate result |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
623 for i, line in enumerate(lines): |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
624 k = annotated[i] |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
625 if k in key2idxs: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
626 for idx in key2idxs[k]: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
627 result[idx] = line |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
628 del key2idxs[k] |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
629 return result |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
630 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
631 def annotatedirectly(self, f, showpath, showlines): |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
632 """like annotate, but when we know that f is in linelog. |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
633 f can be either a 20-char str (node) or a fctx. this is for perf - in |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
634 the best case, the user provides a node and we don't need to read the |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
635 filelog or construct any filecontext. |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
636 """ |
41261
1198c86beb73
fastannotate: fix isinstance checks to be against bytes instead of str
Augie Fackler <augie@google.com>
parents:
40839
diff
changeset
|
637 if isinstance(f, bytes): |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
638 hsh = f |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
639 else: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
640 hsh = f.node() |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
641 llrev = self.revmap.hsh2rev(hsh) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
642 if not llrev: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
643 raise faerror.CorruptedFileError( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
644 b'%s is not in revmap' % node.hex(hsh) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
645 ) |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
646 if (self.revmap.rev2flag(llrev) & revmapmod.sidebranchflag) != 0: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
647 raise faerror.CorruptedFileError( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
648 b'%s is not in revmap mainbranch' % node.hex(hsh) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
649 ) |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
650 self.linelog.annotate(llrev) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
651 result = [ |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
652 (self.revmap.rev2hsh(r), l) for r, l in self.linelog.annotateresult |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
653 ] |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
654 return self._refineannotateresult(result, f, showpath, showlines) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
655 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
656 def _refineannotateresult(self, result, f, showpath, showlines): |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
657 """add the missing path or line contents, they can be expensive. |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
658 f could be either node or fctx. |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
659 """ |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
660 if showpath: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
661 result = self._addpathtoresult(result) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
662 if showlines: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
663 if isinstance(f, bytes): # f: node or fctx |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
664 llrev = self.revmap.hsh2rev(f) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
665 fctx = self._resolvefctx(f, self.revmap.rev2path(llrev)) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
666 else: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
667 fctx = f |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
668 lines = mdiff.splitnewlines(fctx.data()) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
669 if len(lines) != len(result): # linelog is probably corrupted |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
670 raise faerror.CorruptedFileError() |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
671 result = (result, lines) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
672 return result |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
673 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
674 def _appendrev(self, fctx, blocks, bannotated=None): |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
675 self._doappendrev(self.linelog, self.revmap, fctx, blocks, bannotated) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
676 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
677 def _diffblocks(self, a, b): |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
678 return mdiff.allblocks(a, b, self.opts.diffopts) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
679 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
680 @staticmethod |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
681 def _doappendrev(linelog, revmap, fctx, blocks, bannotated=None): |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
682 """append a revision to linelog and revmap""" |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
683 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
684 def getllrev(f): |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
685 """(fctx) -> int""" |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
686 # f should not be a linelog revision |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
687 if isinstance(f, int): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
688 raise error.ProgrammingError(b'f should not be an int') |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
689 # f is a fctx, allocate linelog rev on demand |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
690 hsh = f.node() |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
691 rev = revmap.hsh2rev(hsh) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
692 if rev is None: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
693 rev = revmap.append(hsh, sidebranch=True, path=f.path()) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
694 return rev |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
695 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
696 # append sidebranch revisions to revmap |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
697 siderevs = [] |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
698 siderevmap = {} # node: int |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
699 if bannotated is not None: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
700 for (a1, a2, b1, b2), op in blocks: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
701 if op != b'=': |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
702 # f could be either linelong rev, or fctx. |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
703 siderevs += [ |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
704 f |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
705 for f, l in bannotated[b1:b2] |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
706 if not isinstance(f, int) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
707 ] |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
708 siderevs = set(siderevs) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
709 if fctx in siderevs: # mainnode must be appended seperately |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
710 siderevs.remove(fctx) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
711 for f in siderevs: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
712 siderevmap[f] = getllrev(f) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
713 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
714 # the changeset in the main branch, could be a merge |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
715 llrev = revmap.append(fctx.node(), path=fctx.path()) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
716 siderevmap[fctx] = llrev |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
717 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
718 for (a1, a2, b1, b2), op in reversed(blocks): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
719 if op == b'=': |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
720 continue |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
721 if bannotated is None: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
722 linelog.replacelines(llrev, a1, a2, b1, b2) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
723 else: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
724 blines = [ |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
725 ((r if isinstance(r, int) else siderevmap[r]), l) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
726 for r, l in bannotated[b1:b2] |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
727 ] |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
728 linelog.replacelines_vec(llrev, a1, a2, blines) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
729 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
730 def _addpathtoresult(self, annotateresult, revmap=None): |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
731 """(revmap, [(node, linenum)]) -> [(node, linenum, path)]""" |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
732 if revmap is None: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
733 revmap = self.revmap |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
734 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
735 def _getpath(nodeid): |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
736 path = self._node2path.get(nodeid) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
737 if path is None: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
738 path = revmap.rev2path(revmap.hsh2rev(nodeid)) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
739 self._node2path[nodeid] = path |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
740 return path |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
741 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
742 return [(n, l, _getpath(n)) for n, l in annotateresult] |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
743 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
744 def _checklastmasterhead(self, fctx): |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
745 """check if fctx is the master's head last time, raise if not""" |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
746 if fctx is None: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
747 llrev = 0 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
748 else: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
749 llrev = self.revmap.hsh2rev(fctx.node()) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
750 if not llrev: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
751 raise faerror.CannotReuseError() |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
752 if self.linelog.maxrev != llrev: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
753 raise faerror.CannotReuseError() |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
754 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
755 @util.propertycache |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
756 def _parentfunc(self): |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
757 """-> (fctx) -> [fctx]""" |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
758 followrename = self.opts.followrename |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
759 followmerge = self.opts.followmerge |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
760 |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
761 def parents(f): |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
762 pl = _parents(f, follow=followrename) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
763 if not followmerge: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
764 pl = pl[:1] |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
765 return pl |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
766 |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
767 return parents |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
768 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
769 @util.propertycache |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
770 def _perfhack(self): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
771 return self.ui.configbool(b'fastannotate', b'perfhack') |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
772 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
773 def _resolvefctx(self, rev, path=None, **kwds): |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
774 return resolvefctx(self.repo, rev, (path or self.path), **kwds) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
775 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
776 |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
777 def _unlinkpaths(paths): |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
778 """silent, best-effort unlink""" |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
779 for path in paths: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
780 try: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
781 util.unlink(path) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
782 except OSError: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
783 pass |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
784 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
785 |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
786 class pathhelper(object): |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
787 """helper for getting paths for lockfile, linelog and revmap""" |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
788 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
789 def __init__(self, repo, path, opts=defaultopts): |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
790 # different options use different directories |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
791 self._vfspath = os.path.join( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
792 b'fastannotate', opts.shortstr, encodedir(path) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
793 ) |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
794 self._repo = repo |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
795 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
796 @property |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
797 def dirname(self): |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
798 return os.path.dirname(self._repo.vfs.join(self._vfspath)) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
799 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
800 @property |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
801 def linelogpath(self): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
802 return self._repo.vfs.join(self._vfspath + b'.l') |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
803 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
804 def lock(self): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
805 return lockmod.lock(self._repo.vfs, self._vfspath + b'.lock') |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
806 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
807 @property |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
808 def revmappath(self): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
809 return self._repo.vfs.join(self._vfspath + b'.m') |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
810 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
811 |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
812 @contextlib.contextmanager |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
813 def annotatecontext(repo, path, opts=defaultopts, rebuild=False): |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
814 """context needed to perform (fast) annotate on a file |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
815 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
816 an annotatecontext of a single file consists of two structures: the |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
817 linelog and the revmap. this function takes care of locking. only 1 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
818 process is allowed to write that file's linelog and revmap at a time. |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
819 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
820 when something goes wrong, this function will assume the linelog and the |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
821 revmap are in a bad state, and remove them from disk. |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
822 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
823 use this function in the following way: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
824 |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
825 with annotatecontext(...) as actx: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
826 actx. .... |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
827 """ |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
828 helper = pathhelper(repo, path, opts) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
829 util.makedirs(helper.dirname) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
830 revmappath = helper.revmappath |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
831 linelogpath = helper.linelogpath |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
832 actx = None |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
833 try: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
834 with helper.lock(): |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
835 actx = _annotatecontext(repo, path, linelogpath, revmappath, opts) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
836 if rebuild: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
837 actx.rebuild() |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
838 yield actx |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
839 except Exception: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
840 if actx is not None: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
841 actx.rebuild() |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
842 repo.ui.debug(b'fastannotate: %s: cache broken and deleted\n' % path) |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
843 raise |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
844 finally: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
845 if actx is not None: |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
846 actx.close() |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
847 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42947
diff
changeset
|
848 |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
849 def fctxannotatecontext(fctx, follow=True, diffopts=None, rebuild=False): |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
850 """like annotatecontext but get the context from a fctx. convenient when |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
851 used in fctx.annotate |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
852 """ |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
853 repo = fctx._repo |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
854 path = fctx._path |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
855 if repo.ui.configbool(b'fastannotate', b'forcefollow', True): |
39210
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
856 follow = True |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
857 aopts = annotateopts(diffopts=diffopts, followrename=follow) |
1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
858 return annotatecontext(repo, path, aopts, rebuild) |