Mercurial > hg > mercurial-crew-with-dirclash
annotate mercurial/context.py @ 3409:1ae738bacf74
Fixed page overlap for file revision links in hgweb.
This is another step to fix issue189, but currently the file revision numbers
are read as changeset revision numbers, so the link will point to the wrong
revision.
author | Thomas Arendsen Hein <thomas@intevation.de> |
---|---|
date | Mon, 16 Oct 2006 09:53:31 +0200 |
parents | 1a437b0f4902 |
children | 357b5589dc62 |
rev | line source |
---|---|
2563
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
1 # context.py - changeset and file context objects for mercurial |
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
2 # |
2858 | 3 # Copyright 2006 Matt Mackall <mpm@selenic.com> |
2563
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
4 # |
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
5 # This software may be used and distributed according to the terms |
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
6 # of the GNU General Public License, incorporated herein by reference. |
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
7 |
3165
5c93dd0ae413
Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents:
3154
diff
changeset
|
8 from node import * |
3217
dedddde58c5b
Raise LookupError in changectx.filectx if filenode can't be found
Brendan Cully <brendan@kublai.com>
parents:
3215
diff
changeset
|
9 from i18n import gettext as _ |
3134
4bf2e895cf86
filectx: add rename-aware ancestor algorithm
Matt Mackall <mpm@selenic.com>
parents:
3133
diff
changeset
|
10 from demandload import demandload |
3308 | 11 demandload(globals(), "ancestor bdiff repo revlog util os") |
3130
da85145d4571
filectx: add rename traversal for parents()
Matt Mackall <mpm@selenic.com>
parents:
2858
diff
changeset
|
12 |
2563
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
13 class changectx(object): |
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
14 """A changecontext object makes access to data related to a particular |
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
15 changeset convenient.""" |
3127
81da3c45aabd
Move defaultrev into changectx
Brendan Cully <brendan@kublai.com>
parents:
2858
diff
changeset
|
16 def __init__(self, repo, changeid=None): |
2563
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
17 """changeid is a revision number, node, or tag""" |
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
18 self._repo = repo |
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
19 |
3143
db25f7b80fdb
context: handle fileid or changeid == 0
Brendan Cully <brendan@kublai.com>
parents:
3136
diff
changeset
|
20 if not changeid and changeid != 0: |
3127
81da3c45aabd
Move defaultrev into changectx
Brendan Cully <brendan@kublai.com>
parents:
2858
diff
changeset
|
21 p1, p2 = self._repo.dirstate.parents() |
81da3c45aabd
Move defaultrev into changectx
Brendan Cully <brendan@kublai.com>
parents:
2858
diff
changeset
|
22 self._rev = self._repo.changelog.rev(p1) |
81da3c45aabd
Move defaultrev into changectx
Brendan Cully <brendan@kublai.com>
parents:
2858
diff
changeset
|
23 if self._rev == -1: |
81da3c45aabd
Move defaultrev into changectx
Brendan Cully <brendan@kublai.com>
parents:
2858
diff
changeset
|
24 changeid = 'tip' |
81da3c45aabd
Move defaultrev into changectx
Brendan Cully <brendan@kublai.com>
parents:
2858
diff
changeset
|
25 else: |
81da3c45aabd
Move defaultrev into changectx
Brendan Cully <brendan@kublai.com>
parents:
2858
diff
changeset
|
26 self._node = p1 |
81da3c45aabd
Move defaultrev into changectx
Brendan Cully <brendan@kublai.com>
parents:
2858
diff
changeset
|
27 return |
81da3c45aabd
Move defaultrev into changectx
Brendan Cully <brendan@kublai.com>
parents:
2858
diff
changeset
|
28 |
2652
f23973ea3107
fix filectxt to really work
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2629
diff
changeset
|
29 self._node = self._repo.lookup(changeid) |
2563
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
30 self._rev = self._repo.changelog.rev(self._node) |
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
31 |
3199
ebdb3f616bc0
Add str methods to contexts
Matt Mackall <mpm@selenic.com>
parents:
3198
diff
changeset
|
32 def __str__(self): |
ebdb3f616bc0
Add str methods to contexts
Matt Mackall <mpm@selenic.com>
parents:
3198
diff
changeset
|
33 return short(self.node()) |
ebdb3f616bc0
Add str methods to contexts
Matt Mackall <mpm@selenic.com>
parents:
3198
diff
changeset
|
34 |
3151
6719b3dd7d50
context: add __repr__ methods
Matt Mackall <mpm@selenic.com>
parents:
3150
diff
changeset
|
35 def __repr__(self): |
3238
d865390c1781
context: simplify repr methods
Matt Mackall <mpm@selenic.com>
parents:
3237
diff
changeset
|
36 return "<changectx %s>" % str(self) |
3151
6719b3dd7d50
context: add __repr__ methods
Matt Mackall <mpm@selenic.com>
parents:
3150
diff
changeset
|
37 |
3198
e78185746554
Add equality operators to changectx and filectx
Matt Mackall <mpm@selenic.com>
parents:
3154
diff
changeset
|
38 def __eq__(self, other): |
e78185746554
Add equality operators to changectx and filectx
Matt Mackall <mpm@selenic.com>
parents:
3154
diff
changeset
|
39 return self._rev == other._rev |
e78185746554
Add equality operators to changectx and filectx
Matt Mackall <mpm@selenic.com>
parents:
3154
diff
changeset
|
40 |
3201
05c588e1803d
context: add __nonzero__ methods
Matt Mackall <mpm@selenic.com>
parents:
3199
diff
changeset
|
41 def __nonzero__(self): |
05c588e1803d
context: add __nonzero__ methods
Matt Mackall <mpm@selenic.com>
parents:
3199
diff
changeset
|
42 return self._rev != -1 |
05c588e1803d
context: add __nonzero__ methods
Matt Mackall <mpm@selenic.com>
parents:
3199
diff
changeset
|
43 |
3237
931288cf58a7
contexts: use __getattr__ rather than try/except in changectx
Matt Mackall <mpm@selenic.com>
parents:
3236
diff
changeset
|
44 def __getattr__(self, name): |
931288cf58a7
contexts: use __getattr__ rather than try/except in changectx
Matt Mackall <mpm@selenic.com>
parents:
3236
diff
changeset
|
45 if name == '_changeset': |
2563
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
46 self._changeset = self._repo.changelog.read(self.node()) |
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
47 return self._changeset |
3237
931288cf58a7
contexts: use __getattr__ rather than try/except in changectx
Matt Mackall <mpm@selenic.com>
parents:
3236
diff
changeset
|
48 elif name == '_manifest': |
931288cf58a7
contexts: use __getattr__ rather than try/except in changectx
Matt Mackall <mpm@selenic.com>
parents:
3236
diff
changeset
|
49 self._manifest = self._repo.manifest.read(self._changeset[0]) |
2563
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
50 return self._manifest |
3335
b02e60097bbe
changectx: search manifest delta for filenode
Brendan Cully <brendan@kublai.com>
parents:
3334
diff
changeset
|
51 elif name == '_manifestdelta': |
b02e60097bbe
changectx: search manifest delta for filenode
Brendan Cully <brendan@kublai.com>
parents:
3334
diff
changeset
|
52 md = self._repo.manifest.readdelta(self._changeset[0]) |
b02e60097bbe
changectx: search manifest delta for filenode
Brendan Cully <brendan@kublai.com>
parents:
3334
diff
changeset
|
53 self._manifestdelta = md |
b02e60097bbe
changectx: search manifest delta for filenode
Brendan Cully <brendan@kublai.com>
parents:
3334
diff
changeset
|
54 return self._manifestdelta |
3237
931288cf58a7
contexts: use __getattr__ rather than try/except in changectx
Matt Mackall <mpm@selenic.com>
parents:
3236
diff
changeset
|
55 else: |
931288cf58a7
contexts: use __getattr__ rather than try/except in changectx
Matt Mackall <mpm@selenic.com>
parents:
3236
diff
changeset
|
56 raise AttributeError, name |
931288cf58a7
contexts: use __getattr__ rather than try/except in changectx
Matt Mackall <mpm@selenic.com>
parents:
3236
diff
changeset
|
57 |
931288cf58a7
contexts: use __getattr__ rather than try/except in changectx
Matt Mackall <mpm@selenic.com>
parents:
3236
diff
changeset
|
58 def changeset(self): return self._changeset |
931288cf58a7
contexts: use __getattr__ rather than try/except in changectx
Matt Mackall <mpm@selenic.com>
parents:
3236
diff
changeset
|
59 def manifest(self): return self._manifest |
2563
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
60 |
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
61 def rev(self): return self._rev |
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
62 def node(self): return self._node |
3237
931288cf58a7
contexts: use __getattr__ rather than try/except in changectx
Matt Mackall <mpm@selenic.com>
parents:
3236
diff
changeset
|
63 def user(self): return self._changeset[1] |
931288cf58a7
contexts: use __getattr__ rather than try/except in changectx
Matt Mackall <mpm@selenic.com>
parents:
3236
diff
changeset
|
64 def date(self): return self._changeset[2] |
931288cf58a7
contexts: use __getattr__ rather than try/except in changectx
Matt Mackall <mpm@selenic.com>
parents:
3236
diff
changeset
|
65 def files(self): return self._changeset[3] |
931288cf58a7
contexts: use __getattr__ rather than try/except in changectx
Matt Mackall <mpm@selenic.com>
parents:
3236
diff
changeset
|
66 def description(self): return self._changeset[4] |
2563
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
67 |
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
68 def parents(self): |
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
69 """return contexts for each parent changeset""" |
2627
b779319a532b
context.py: self.repo is not defined, change to self._repo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2566
diff
changeset
|
70 p = self._repo.changelog.parents(self._node) |
2563
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
71 return [ changectx(self._repo, x) for x in p ] |
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
72 |
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
73 def children(self): |
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
74 """return contexts for each child changeset""" |
2627
b779319a532b
context.py: self.repo is not defined, change to self._repo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2566
diff
changeset
|
75 c = self._repo.changelog.children(self._node) |
2563
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
76 return [ changectx(self._repo, x) for x in c ] |
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
77 |
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
78 def filenode(self, path): |
3334
e44eadc92ec4
context: check self.__dict__ instead of using hasattr
Brendan Cully <brendan@kublai.com>
parents:
3319
diff
changeset
|
79 if '_manifest' in self.__dict__: |
3242
1539f788e913
Make changectx.filenode raise repo.LookupError on failure
Brendan Cully <brendan@kublai.com>
parents:
3241
diff
changeset
|
80 try: |
1539f788e913
Make changectx.filenode raise repo.LookupError on failure
Brendan Cully <brendan@kublai.com>
parents:
3241
diff
changeset
|
81 return self._manifest[path] |
1539f788e913
Make changectx.filenode raise repo.LookupError on failure
Brendan Cully <brendan@kublai.com>
parents:
3241
diff
changeset
|
82 except KeyError: |
1539f788e913
Make changectx.filenode raise repo.LookupError on failure
Brendan Cully <brendan@kublai.com>
parents:
3241
diff
changeset
|
83 raise repo.LookupError(_("'%s' not found in manifest") % path) |
3335
b02e60097bbe
changectx: search manifest delta for filenode
Brendan Cully <brendan@kublai.com>
parents:
3334
diff
changeset
|
84 if '_manifestdelta' in self.__dict__ or path in self.files(): |
b02e60097bbe
changectx: search manifest delta for filenode
Brendan Cully <brendan@kublai.com>
parents:
3334
diff
changeset
|
85 if path in self._manifestdelta: |
b02e60097bbe
changectx: search manifest delta for filenode
Brendan Cully <brendan@kublai.com>
parents:
3334
diff
changeset
|
86 return self._manifestdelta[path] |
3237
931288cf58a7
contexts: use __getattr__ rather than try/except in changectx
Matt Mackall <mpm@selenic.com>
parents:
3236
diff
changeset
|
87 node, flag = self._repo.manifest.find(self._changeset[0], path) |
3242
1539f788e913
Make changectx.filenode raise repo.LookupError on failure
Brendan Cully <brendan@kublai.com>
parents:
3241
diff
changeset
|
88 if not node: |
1539f788e913
Make changectx.filenode raise repo.LookupError on failure
Brendan Cully <brendan@kublai.com>
parents:
3241
diff
changeset
|
89 raise repo.LookupError(_("'%s' not found in manifest") % path) |
1539f788e913
Make changectx.filenode raise repo.LookupError on failure
Brendan Cully <brendan@kublai.com>
parents:
3241
diff
changeset
|
90 |
2563
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
91 return node |
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
92 |
2628
9999a796d389
context.py: filectxs was using a keyword arg, add it to filectx
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2627
diff
changeset
|
93 def filectx(self, path, fileid=None): |
2563
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
94 """get a file context from this changeset""" |
2628
9999a796d389
context.py: filectxs was using a keyword arg, add it to filectx
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2627
diff
changeset
|
95 if fileid is None: |
9999a796d389
context.py: filectxs was using a keyword arg, add it to filectx
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2627
diff
changeset
|
96 fileid = self.filenode(path) |
3236
696c656202a0
context: make filectx remember changectx in changectx.filectx
Matt Mackall <mpm@selenic.com>
parents:
3235
diff
changeset
|
97 return filectx(self._repo, path, fileid=fileid, changectx=self) |
2563
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
98 |
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
99 def filectxs(self): |
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
100 """generate a file context for each file in this changeset's |
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
101 manifest""" |
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
102 mf = self.manifest() |
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
103 m = mf.keys() |
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
104 m.sort() |
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
105 for f in m: |
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
106 yield self.filectx(f, fileid=mf[f]) |
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
107 |
3133
02b22fefc01f
changectx: add ancestor function
Matt Mackall <mpm@selenic.com>
parents:
3132
diff
changeset
|
108 def ancestor(self, c2): |
02b22fefc01f
changectx: add ancestor function
Matt Mackall <mpm@selenic.com>
parents:
3132
diff
changeset
|
109 """ |
02b22fefc01f
changectx: add ancestor function
Matt Mackall <mpm@selenic.com>
parents:
3132
diff
changeset
|
110 return the ancestor context of self and c2 |
02b22fefc01f
changectx: add ancestor function
Matt Mackall <mpm@selenic.com>
parents:
3132
diff
changeset
|
111 """ |
02b22fefc01f
changectx: add ancestor function
Matt Mackall <mpm@selenic.com>
parents:
3132
diff
changeset
|
112 n = self._repo.changelog.ancestor(self._node, c2._node) |
02b22fefc01f
changectx: add ancestor function
Matt Mackall <mpm@selenic.com>
parents:
3132
diff
changeset
|
113 return changectx(self._repo, n) |
02b22fefc01f
changectx: add ancestor function
Matt Mackall <mpm@selenic.com>
parents:
3132
diff
changeset
|
114 |
2563
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
115 class filectx(object): |
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
116 """A filecontext object makes access to data related to a particular |
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
117 filerevision convenient.""" |
3236
696c656202a0
context: make filectx remember changectx in changectx.filectx
Matt Mackall <mpm@selenic.com>
parents:
3235
diff
changeset
|
118 def __init__(self, repo, path, changeid=None, fileid=None, |
696c656202a0
context: make filectx remember changectx in changectx.filectx
Matt Mackall <mpm@selenic.com>
parents:
3235
diff
changeset
|
119 filelog=None, changectx=None): |
2563
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
120 """changeid can be a changeset revision, node, or tag. |
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
121 fileid can be a file revision or node.""" |
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
122 self._repo = repo |
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
123 self._path = path |
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
124 |
3143
db25f7b80fdb
context: handle fileid or changeid == 0
Brendan Cully <brendan@kublai.com>
parents:
3136
diff
changeset
|
125 assert changeid is not None or fileid is not None |
2652
f23973ea3107
fix filectxt to really work
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2629
diff
changeset
|
126 |
3132
4d021b91cb26
filectx: allow passing filelog in init to avoid opening new filelogs
Matt Mackall <mpm@selenic.com>
parents:
3131
diff
changeset
|
127 if filelog: |
4d021b91cb26
filectx: allow passing filelog in init to avoid opening new filelogs
Matt Mackall <mpm@selenic.com>
parents:
3131
diff
changeset
|
128 self._filelog = filelog |
3236
696c656202a0
context: make filectx remember changectx in changectx.filectx
Matt Mackall <mpm@selenic.com>
parents:
3235
diff
changeset
|
129 if changectx: |
696c656202a0
context: make filectx remember changectx in changectx.filectx
Matt Mackall <mpm@selenic.com>
parents:
3235
diff
changeset
|
130 self._changectx = changectx |
696c656202a0
context: make filectx remember changectx in changectx.filectx
Matt Mackall <mpm@selenic.com>
parents:
3235
diff
changeset
|
131 self._changeid = changectx.node() |
3132
4d021b91cb26
filectx: allow passing filelog in init to avoid opening new filelogs
Matt Mackall <mpm@selenic.com>
parents:
3131
diff
changeset
|
132 |
3143
db25f7b80fdb
context: handle fileid or changeid == 0
Brendan Cully <brendan@kublai.com>
parents:
3136
diff
changeset
|
133 if fileid is None: |
2652
f23973ea3107
fix filectxt to really work
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2629
diff
changeset
|
134 self._changeid = changeid |
f23973ea3107
fix filectxt to really work
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2629
diff
changeset
|
135 else: |
3235 | 136 self._fileid = fileid |
2563
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
137 |
3144
8342ad5abe0b
Make filectx lazier - some users never use filenode
Brendan Cully <brendan@kublai.com>
parents:
3143
diff
changeset
|
138 def __getattr__(self, name): |
8342ad5abe0b
Make filectx lazier - some users never use filenode
Brendan Cully <brendan@kublai.com>
parents:
3143
diff
changeset
|
139 if name == '_changectx': |
2652
f23973ea3107
fix filectxt to really work
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2629
diff
changeset
|
140 self._changectx = changectx(self._repo, self._changeid) |
f23973ea3107
fix filectxt to really work
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2629
diff
changeset
|
141 return self._changectx |
3235 | 142 elif name == '_filelog': |
143 self._filelog = self._repo.file(self._path) | |
144 return self._filelog | |
145 elif name == '_changeid': | |
146 self._changeid = self._filelog.linkrev(self._filenode) | |
147 return self._changeid | |
3144
8342ad5abe0b
Make filectx lazier - some users never use filenode
Brendan Cully <brendan@kublai.com>
parents:
3143
diff
changeset
|
148 elif name == '_filenode': |
3241 | 149 try: |
3334
e44eadc92ec4
context: check self.__dict__ instead of using hasattr
Brendan Cully <brendan@kublai.com>
parents:
3319
diff
changeset
|
150 if '_fileid' in self.__dict__: |
3241 | 151 self._filenode = self._filelog.lookup(self._fileid) |
152 else: | |
153 self._filenode = self._changectx.filenode(self._path) | |
154 except revlog.RevlogError, inst: | |
155 raise repo.LookupError(str(inst)) | |
3144
8342ad5abe0b
Make filectx lazier - some users never use filenode
Brendan Cully <brendan@kublai.com>
parents:
3143
diff
changeset
|
156 return self._filenode |
8342ad5abe0b
Make filectx lazier - some users never use filenode
Brendan Cully <brendan@kublai.com>
parents:
3143
diff
changeset
|
157 elif name == '_filerev': |
8342ad5abe0b
Make filectx lazier - some users never use filenode
Brendan Cully <brendan@kublai.com>
parents:
3143
diff
changeset
|
158 self._filerev = self._filelog.rev(self._filenode) |
8342ad5abe0b
Make filectx lazier - some users never use filenode
Brendan Cully <brendan@kublai.com>
parents:
3143
diff
changeset
|
159 return self._filerev |
8342ad5abe0b
Make filectx lazier - some users never use filenode
Brendan Cully <brendan@kublai.com>
parents:
3143
diff
changeset
|
160 else: |
8342ad5abe0b
Make filectx lazier - some users never use filenode
Brendan Cully <brendan@kublai.com>
parents:
3143
diff
changeset
|
161 raise AttributeError, name |
2563
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
162 |
3201
05c588e1803d
context: add __nonzero__ methods
Matt Mackall <mpm@selenic.com>
parents:
3199
diff
changeset
|
163 def __nonzero__(self): |
05c588e1803d
context: add __nonzero__ methods
Matt Mackall <mpm@selenic.com>
parents:
3199
diff
changeset
|
164 return self._filerev != nullid |
05c588e1803d
context: add __nonzero__ methods
Matt Mackall <mpm@selenic.com>
parents:
3199
diff
changeset
|
165 |
3199
ebdb3f616bc0
Add str methods to contexts
Matt Mackall <mpm@selenic.com>
parents:
3198
diff
changeset
|
166 def __str__(self): |
ebdb3f616bc0
Add str methods to contexts
Matt Mackall <mpm@selenic.com>
parents:
3198
diff
changeset
|
167 return "%s@%s" % (self.path(), short(self.node())) |
ebdb3f616bc0
Add str methods to contexts
Matt Mackall <mpm@selenic.com>
parents:
3198
diff
changeset
|
168 |
3151
6719b3dd7d50
context: add __repr__ methods
Matt Mackall <mpm@selenic.com>
parents:
3150
diff
changeset
|
169 def __repr__(self): |
3238
d865390c1781
context: simplify repr methods
Matt Mackall <mpm@selenic.com>
parents:
3237
diff
changeset
|
170 return "<filectx %s>" % str(self) |
3151
6719b3dd7d50
context: add __repr__ methods
Matt Mackall <mpm@selenic.com>
parents:
3150
diff
changeset
|
171 |
3198
e78185746554
Add equality operators to changectx and filectx
Matt Mackall <mpm@selenic.com>
parents:
3154
diff
changeset
|
172 def __eq__(self, other): |
e78185746554
Add equality operators to changectx and filectx
Matt Mackall <mpm@selenic.com>
parents:
3154
diff
changeset
|
173 return self._path == other._path and self._changeid == other._changeid |
e78185746554
Add equality operators to changectx and filectx
Matt Mackall <mpm@selenic.com>
parents:
3154
diff
changeset
|
174 |
3207
0790dce2f3a8
Add lookup method to filectx
Brendan Cully <brendan@kublai.com>
parents:
3165
diff
changeset
|
175 def filectx(self, fileid): |
0790dce2f3a8
Add lookup method to filectx
Brendan Cully <brendan@kublai.com>
parents:
3165
diff
changeset
|
176 '''opens an arbitrary revision of the file without |
0790dce2f3a8
Add lookup method to filectx
Brendan Cully <brendan@kublai.com>
parents:
3165
diff
changeset
|
177 opening a new filelog''' |
0790dce2f3a8
Add lookup method to filectx
Brendan Cully <brendan@kublai.com>
parents:
3165
diff
changeset
|
178 return filectx(self._repo, self._path, fileid=fileid, |
0790dce2f3a8
Add lookup method to filectx
Brendan Cully <brendan@kublai.com>
parents:
3165
diff
changeset
|
179 filelog=self._filelog) |
0790dce2f3a8
Add lookup method to filectx
Brendan Cully <brendan@kublai.com>
parents:
3165
diff
changeset
|
180 |
2563
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
181 def filerev(self): return self._filerev |
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
182 def filenode(self): return self._filenode |
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
183 def filelog(self): return self._filelog |
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
184 |
3150
a5e4c8172ace
filectx: lazy linkrev usage
Matt Mackall <mpm@selenic.com>
parents:
3149
diff
changeset
|
185 def rev(self): |
3334
e44eadc92ec4
context: check self.__dict__ instead of using hasattr
Brendan Cully <brendan@kublai.com>
parents:
3319
diff
changeset
|
186 if '_changectx' in self.__dict__: |
3150
a5e4c8172ace
filectx: lazy linkrev usage
Matt Mackall <mpm@selenic.com>
parents:
3149
diff
changeset
|
187 return self._changectx.rev() |
3402
372999405787
Back out d8eba1c3ce9b and a004164dbeef
Brendan Cully <brendan@kublai.com>
parents:
3400
diff
changeset
|
188 return self._filelog.linkrev(self._filenode) |
3150
a5e4c8172ace
filectx: lazy linkrev usage
Matt Mackall <mpm@selenic.com>
parents:
3149
diff
changeset
|
189 |
3144
8342ad5abe0b
Make filectx lazier - some users never use filenode
Brendan Cully <brendan@kublai.com>
parents:
3143
diff
changeset
|
190 def node(self): return self._changectx.node() |
8342ad5abe0b
Make filectx lazier - some users never use filenode
Brendan Cully <brendan@kublai.com>
parents:
3143
diff
changeset
|
191 def user(self): return self._changectx.user() |
8342ad5abe0b
Make filectx lazier - some users never use filenode
Brendan Cully <brendan@kublai.com>
parents:
3143
diff
changeset
|
192 def date(self): return self._changectx.date() |
8342ad5abe0b
Make filectx lazier - some users never use filenode
Brendan Cully <brendan@kublai.com>
parents:
3143
diff
changeset
|
193 def files(self): return self._changectx.files() |
8342ad5abe0b
Make filectx lazier - some users never use filenode
Brendan Cully <brendan@kublai.com>
parents:
3143
diff
changeset
|
194 def description(self): return self._changectx.description() |
8342ad5abe0b
Make filectx lazier - some users never use filenode
Brendan Cully <brendan@kublai.com>
parents:
3143
diff
changeset
|
195 def manifest(self): return self._changectx.manifest() |
3149
ff1ab08e6732
restore filectx.changectx() method
Matt Mackall <mpm@selenic.com>
parents:
3146
diff
changeset
|
196 def changectx(self): return self._changectx |
2563
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
197 |
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
198 def data(self): return self._filelog.read(self._filenode) |
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
199 def renamed(self): return self._filelog.renamed(self._filenode) |
3130
da85145d4571
filectx: add rename traversal for parents()
Matt Mackall <mpm@selenic.com>
parents:
2858
diff
changeset
|
200 def path(self): return self._path |
3308 | 201 def size(self): return self._filelog.size(self._filerev) |
2563
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
202 |
3316
0e370798eebf
context: add cmp for filectxs
Matt Mackall <mpm@selenic.com>
parents:
3308
diff
changeset
|
203 def cmp(self, text): return self._filelog.cmp(self._filenode, text) |
0e370798eebf
context: add cmp for filectxs
Matt Mackall <mpm@selenic.com>
parents:
3308
diff
changeset
|
204 |
2563
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
205 def parents(self): |
3132
4d021b91cb26
filectx: allow passing filelog in init to avoid opening new filelogs
Matt Mackall <mpm@selenic.com>
parents:
3131
diff
changeset
|
206 p = self._path |
4d021b91cb26
filectx: allow passing filelog in init to avoid opening new filelogs
Matt Mackall <mpm@selenic.com>
parents:
3131
diff
changeset
|
207 fl = self._filelog |
4d021b91cb26
filectx: allow passing filelog in init to avoid opening new filelogs
Matt Mackall <mpm@selenic.com>
parents:
3131
diff
changeset
|
208 pl = [ (p, n, fl) for n in self._filelog.parents(self._filenode) ] |
3131
4ea58eb3f0c9
filelog: make metadata method private
Matt Mackall <mpm@selenic.com>
parents:
3130
diff
changeset
|
209 |
3132
4d021b91cb26
filectx: allow passing filelog in init to avoid opening new filelogs
Matt Mackall <mpm@selenic.com>
parents:
3131
diff
changeset
|
210 r = self.renamed() |
3130
da85145d4571
filectx: add rename traversal for parents()
Matt Mackall <mpm@selenic.com>
parents:
2858
diff
changeset
|
211 if r: |
3132
4d021b91cb26
filectx: allow passing filelog in init to avoid opening new filelogs
Matt Mackall <mpm@selenic.com>
parents:
3131
diff
changeset
|
212 pl[0] = (r[0], r[1], None) |
4d021b91cb26
filectx: allow passing filelog in init to avoid opening new filelogs
Matt Mackall <mpm@selenic.com>
parents:
3131
diff
changeset
|
213 |
4d021b91cb26
filectx: allow passing filelog in init to avoid opening new filelogs
Matt Mackall <mpm@selenic.com>
parents:
3131
diff
changeset
|
214 return [ filectx(self._repo, p, fileid=n, filelog=l) |
4d021b91cb26
filectx: allow passing filelog in init to avoid opening new filelogs
Matt Mackall <mpm@selenic.com>
parents:
3131
diff
changeset
|
215 for p,n,l in pl if n != nullid ] |
2563
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
216 |
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
217 def children(self): |
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
218 # hard for renames |
482c524dd9ab
Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
219 c = self._filelog.children(self._filenode) |
3132
4d021b91cb26
filectx: allow passing filelog in init to avoid opening new filelogs
Matt Mackall <mpm@selenic.com>
parents:
3131
diff
changeset
|
220 return [ filectx(self._repo, self._path, fileid=x, |
4d021b91cb26
filectx: allow passing filelog in init to avoid opening new filelogs
Matt Mackall <mpm@selenic.com>
parents:
3131
diff
changeset
|
221 filelog=self._filelog) for x in c ] |
2566
d8560b458f76
Convert hg annotate to context api
Matt Mackall <mpm@selenic.com>
parents:
2563
diff
changeset
|
222 |
3165
5c93dd0ae413
Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents:
3154
diff
changeset
|
223 def annotate(self, follow=False): |
5c93dd0ae413
Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents:
3154
diff
changeset
|
224 '''returns a list of tuples of (ctx, line) for each line |
5c93dd0ae413
Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents:
3154
diff
changeset
|
225 in the file, where ctx is the filectx of the node where |
5c93dd0ae413
Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents:
3154
diff
changeset
|
226 that line was last changed''' |
5c93dd0ae413
Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents:
3154
diff
changeset
|
227 |
5c93dd0ae413
Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents:
3154
diff
changeset
|
228 def decorate(text, rev): |
5c93dd0ae413
Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents:
3154
diff
changeset
|
229 return ([rev] * len(text.splitlines()), text) |
5c93dd0ae413
Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents:
3154
diff
changeset
|
230 |
5c93dd0ae413
Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents:
3154
diff
changeset
|
231 def pair(parent, child): |
5c93dd0ae413
Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents:
3154
diff
changeset
|
232 for a1, a2, b1, b2 in bdiff.blocks(parent[1], child[1]): |
5c93dd0ae413
Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents:
3154
diff
changeset
|
233 child[0][b1:b2] = parent[0][a1:a2] |
5c93dd0ae413
Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents:
3154
diff
changeset
|
234 return child |
5c93dd0ae413
Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents:
3154
diff
changeset
|
235 |
5c93dd0ae413
Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents:
3154
diff
changeset
|
236 getlog = util.cachefunc(lambda x: self._repo.file(x)) |
5c93dd0ae413
Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents:
3154
diff
changeset
|
237 def getctx(path, fileid): |
5c93dd0ae413
Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents:
3154
diff
changeset
|
238 log = path == self._path and self._filelog or getlog(path) |
5c93dd0ae413
Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents:
3154
diff
changeset
|
239 return filectx(self._repo, path, fileid=fileid, filelog=log) |
5c93dd0ae413
Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents:
3154
diff
changeset
|
240 getctx = util.cachefunc(getctx) |
5c93dd0ae413
Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents:
3154
diff
changeset
|
241 |
5c93dd0ae413
Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents:
3154
diff
changeset
|
242 def parents(f): |
5c93dd0ae413
Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents:
3154
diff
changeset
|
243 # we want to reuse filectx objects as much as possible |
5c93dd0ae413
Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents:
3154
diff
changeset
|
244 p = f._path |
3239
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
245 if f._filerev is None: # working dir |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
246 pl = [ (n.path(), n.filerev()) for n in f.parents() ] |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
247 else: |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
248 pl = [ (p, n) for n in f._filelog.parentrevs(f._filerev) ] |
3165
5c93dd0ae413
Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents:
3154
diff
changeset
|
249 |
5c93dd0ae413
Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents:
3154
diff
changeset
|
250 if follow: |
5c93dd0ae413
Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents:
3154
diff
changeset
|
251 r = f.renamed() |
5c93dd0ae413
Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents:
3154
diff
changeset
|
252 if r: |
5c93dd0ae413
Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents:
3154
diff
changeset
|
253 pl[0] = (r[0], getlog(r[0]).rev(r[1])) |
3146
e69a0cbe268e
filectx.annotate: return filectx for each line instead of rev
Brendan Cully <brendan@kublai.com>
parents:
3144
diff
changeset
|
254 |
3165
5c93dd0ae413
Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents:
3154
diff
changeset
|
255 return [ getctx(p, n) for p, n in pl if n != -1 ] |
3239
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
256 |
3403
1a437b0f4902
Fix annotate where linkrev != rev without exporting linkrev
Brendan Cully <brendan@kublai.com>
parents:
3402
diff
changeset
|
257 # use linkrev to find the first changeset where self appeared |
1a437b0f4902
Fix annotate where linkrev != rev without exporting linkrev
Brendan Cully <brendan@kublai.com>
parents:
3402
diff
changeset
|
258 if self.rev() != self._filelog.linkrev(self._filenode): |
1a437b0f4902
Fix annotate where linkrev != rev without exporting linkrev
Brendan Cully <brendan@kublai.com>
parents:
3402
diff
changeset
|
259 base = self.filectx(self.filerev()) |
1a437b0f4902
Fix annotate where linkrev != rev without exporting linkrev
Brendan Cully <brendan@kublai.com>
parents:
3402
diff
changeset
|
260 else: |
1a437b0f4902
Fix annotate where linkrev != rev without exporting linkrev
Brendan Cully <brendan@kublai.com>
parents:
3402
diff
changeset
|
261 base = self |
1a437b0f4902
Fix annotate where linkrev != rev without exporting linkrev
Brendan Cully <brendan@kublai.com>
parents:
3402
diff
changeset
|
262 |
3165
5c93dd0ae413
Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents:
3154
diff
changeset
|
263 # find all ancestors |
3403
1a437b0f4902
Fix annotate where linkrev != rev without exporting linkrev
Brendan Cully <brendan@kublai.com>
parents:
3402
diff
changeset
|
264 needed = {base: 1} |
1a437b0f4902
Fix annotate where linkrev != rev without exporting linkrev
Brendan Cully <brendan@kublai.com>
parents:
3402
diff
changeset
|
265 visit = [base] |
1a437b0f4902
Fix annotate where linkrev != rev without exporting linkrev
Brendan Cully <brendan@kublai.com>
parents:
3402
diff
changeset
|
266 files = [base._path] |
3165
5c93dd0ae413
Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents:
3154
diff
changeset
|
267 while visit: |
5c93dd0ae413
Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents:
3154
diff
changeset
|
268 f = visit.pop(0) |
5c93dd0ae413
Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents:
3154
diff
changeset
|
269 for p in parents(f): |
5c93dd0ae413
Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents:
3154
diff
changeset
|
270 if p not in needed: |
5c93dd0ae413
Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents:
3154
diff
changeset
|
271 needed[p] = 1 |
5c93dd0ae413
Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents:
3154
diff
changeset
|
272 visit.append(p) |
5c93dd0ae413
Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents:
3154
diff
changeset
|
273 if p._path not in files: |
5c93dd0ae413
Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents:
3154
diff
changeset
|
274 files.append(p._path) |
5c93dd0ae413
Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents:
3154
diff
changeset
|
275 else: |
5c93dd0ae413
Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents:
3154
diff
changeset
|
276 # count how many times we'll use this |
5c93dd0ae413
Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents:
3154
diff
changeset
|
277 needed[p] += 1 |
5c93dd0ae413
Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents:
3154
diff
changeset
|
278 |
5c93dd0ae413
Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents:
3154
diff
changeset
|
279 # sort by revision (per file) which is a topological order |
5c93dd0ae413
Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents:
3154
diff
changeset
|
280 visit = [] |
5c93dd0ae413
Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents:
3154
diff
changeset
|
281 files.reverse() |
5c93dd0ae413
Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents:
3154
diff
changeset
|
282 for f in files: |
5c93dd0ae413
Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents:
3154
diff
changeset
|
283 fn = [(n._filerev, n) for n in needed.keys() if n._path == f] |
5c93dd0ae413
Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents:
3154
diff
changeset
|
284 fn.sort() |
5c93dd0ae413
Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents:
3154
diff
changeset
|
285 visit.extend(fn) |
5c93dd0ae413
Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents:
3154
diff
changeset
|
286 hist = {} |
5c93dd0ae413
Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents:
3154
diff
changeset
|
287 |
5c93dd0ae413
Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents:
3154
diff
changeset
|
288 for r, f in visit: |
5c93dd0ae413
Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents:
3154
diff
changeset
|
289 curr = decorate(f.data(), f) |
5c93dd0ae413
Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents:
3154
diff
changeset
|
290 for p in parents(f): |
5c93dd0ae413
Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents:
3154
diff
changeset
|
291 if p != nullid: |
5c93dd0ae413
Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents:
3154
diff
changeset
|
292 curr = pair(hist[p], curr) |
5c93dd0ae413
Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents:
3154
diff
changeset
|
293 # trim the history of unneeded revs |
5c93dd0ae413
Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents:
3154
diff
changeset
|
294 needed[p] -= 1 |
5c93dd0ae413
Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents:
3154
diff
changeset
|
295 if not needed[p]: |
5c93dd0ae413
Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents:
3154
diff
changeset
|
296 del hist[p] |
5c93dd0ae413
Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents:
3154
diff
changeset
|
297 hist[f] = curr |
5c93dd0ae413
Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents:
3154
diff
changeset
|
298 |
5c93dd0ae413
Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents:
3154
diff
changeset
|
299 return zip(hist[f][0], hist[f][1].splitlines(1)) |
3132
4d021b91cb26
filectx: allow passing filelog in init to avoid opening new filelogs
Matt Mackall <mpm@selenic.com>
parents:
3131
diff
changeset
|
300 |
3134
4bf2e895cf86
filectx: add rename-aware ancestor algorithm
Matt Mackall <mpm@selenic.com>
parents:
3133
diff
changeset
|
301 def ancestor(self, fc2): |
4bf2e895cf86
filectx: add rename-aware ancestor algorithm
Matt Mackall <mpm@selenic.com>
parents:
3133
diff
changeset
|
302 """ |
4bf2e895cf86
filectx: add rename-aware ancestor algorithm
Matt Mackall <mpm@selenic.com>
parents:
3133
diff
changeset
|
303 find the common ancestor file context, if any, of self, and fc2 |
4bf2e895cf86
filectx: add rename-aware ancestor algorithm
Matt Mackall <mpm@selenic.com>
parents:
3133
diff
changeset
|
304 """ |
4bf2e895cf86
filectx: add rename-aware ancestor algorithm
Matt Mackall <mpm@selenic.com>
parents:
3133
diff
changeset
|
305 |
3136
b1db258e875c
Abstract ancestor algorithm into generic function
Matt Mackall <mpm@selenic.com>
parents:
3135
diff
changeset
|
306 acache = {} |
3239
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
307 |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
308 # prime the ancestor cache for the working directory |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
309 for c in (self, fc2): |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
310 if c._filerev == None: |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
311 pl = [ (n.path(), n.filenode()) for n in c.parents() ] |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
312 acache[(c._path, None)] = pl |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
313 |
3134
4bf2e895cf86
filectx: add rename-aware ancestor algorithm
Matt Mackall <mpm@selenic.com>
parents:
3133
diff
changeset
|
314 flcache = {self._path:self._filelog, fc2._path:fc2._filelog} |
3136
b1db258e875c
Abstract ancestor algorithm into generic function
Matt Mackall <mpm@selenic.com>
parents:
3135
diff
changeset
|
315 def parents(vertex): |
b1db258e875c
Abstract ancestor algorithm into generic function
Matt Mackall <mpm@selenic.com>
parents:
3135
diff
changeset
|
316 if vertex in acache: |
b1db258e875c
Abstract ancestor algorithm into generic function
Matt Mackall <mpm@selenic.com>
parents:
3135
diff
changeset
|
317 return acache[vertex] |
b1db258e875c
Abstract ancestor algorithm into generic function
Matt Mackall <mpm@selenic.com>
parents:
3135
diff
changeset
|
318 f, n = vertex |
b1db258e875c
Abstract ancestor algorithm into generic function
Matt Mackall <mpm@selenic.com>
parents:
3135
diff
changeset
|
319 if f not in flcache: |
3134
4bf2e895cf86
filectx: add rename-aware ancestor algorithm
Matt Mackall <mpm@selenic.com>
parents:
3133
diff
changeset
|
320 flcache[f] = self._repo.file(f) |
3136
b1db258e875c
Abstract ancestor algorithm into generic function
Matt Mackall <mpm@selenic.com>
parents:
3135
diff
changeset
|
321 fl = flcache[f] |
b1db258e875c
Abstract ancestor algorithm into generic function
Matt Mackall <mpm@selenic.com>
parents:
3135
diff
changeset
|
322 pl = [ (f,p) for p in fl.parents(n) if p != nullid ] |
b1db258e875c
Abstract ancestor algorithm into generic function
Matt Mackall <mpm@selenic.com>
parents:
3135
diff
changeset
|
323 re = fl.renamed(n) |
b1db258e875c
Abstract ancestor algorithm into generic function
Matt Mackall <mpm@selenic.com>
parents:
3135
diff
changeset
|
324 if re: |
b1db258e875c
Abstract ancestor algorithm into generic function
Matt Mackall <mpm@selenic.com>
parents:
3135
diff
changeset
|
325 pl.append(re) |
b1db258e875c
Abstract ancestor algorithm into generic function
Matt Mackall <mpm@selenic.com>
parents:
3135
diff
changeset
|
326 acache[vertex]=pl |
b1db258e875c
Abstract ancestor algorithm into generic function
Matt Mackall <mpm@selenic.com>
parents:
3135
diff
changeset
|
327 return pl |
3134
4bf2e895cf86
filectx: add rename-aware ancestor algorithm
Matt Mackall <mpm@selenic.com>
parents:
3133
diff
changeset
|
328 |
3136
b1db258e875c
Abstract ancestor algorithm into generic function
Matt Mackall <mpm@selenic.com>
parents:
3135
diff
changeset
|
329 a, b = (self._path, self._filenode), (fc2._path, fc2._filenode) |
b1db258e875c
Abstract ancestor algorithm into generic function
Matt Mackall <mpm@selenic.com>
parents:
3135
diff
changeset
|
330 v = ancestor.ancestor(a, b, parents) |
b1db258e875c
Abstract ancestor algorithm into generic function
Matt Mackall <mpm@selenic.com>
parents:
3135
diff
changeset
|
331 if v: |
b1db258e875c
Abstract ancestor algorithm into generic function
Matt Mackall <mpm@selenic.com>
parents:
3135
diff
changeset
|
332 f,n = v |
b1db258e875c
Abstract ancestor algorithm into generic function
Matt Mackall <mpm@selenic.com>
parents:
3135
diff
changeset
|
333 return filectx(self._repo, f, fileid=n, filelog=flcache[f]) |
3134
4bf2e895cf86
filectx: add rename-aware ancestor algorithm
Matt Mackall <mpm@selenic.com>
parents:
3133
diff
changeset
|
334 |
3136
b1db258e875c
Abstract ancestor algorithm into generic function
Matt Mackall <mpm@selenic.com>
parents:
3135
diff
changeset
|
335 return None |
3239
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
336 |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
337 class workingctx(changectx): |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
338 """A workingctx object makes access to data related to |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
339 the current working directory convenient.""" |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
340 def __init__(self, repo): |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
341 self._repo = repo |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
342 self._rev = None |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
343 self._node = None |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
344 |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
345 def __str__(self): |
3319
6c68bc1e7873
context: change workingctx str() from . to <node>+
Matt Mackall <mpm@selenic.com>
parents:
3316
diff
changeset
|
346 return str(self._parents[0]) + "+" |
3239
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
347 |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
348 def __nonzero__(self): |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
349 return True |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
350 |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
351 def __getattr__(self, name): |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
352 if name == '_parents': |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
353 self._parents = self._repo.parents() |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
354 return self._parents |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
355 if name == '_status': |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
356 self._status = self._repo.status() |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
357 return self._status |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
358 if name == '_manifest': |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
359 self._buildmanifest() |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
360 return self._manifest |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
361 else: |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
362 raise AttributeError, name |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
363 |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
364 def _buildmanifest(self): |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
365 """generate a manifest corresponding to the working directory""" |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
366 |
3240
8d4855fd9d7b
merge: use new working context object in update
Matt Mackall <mpm@selenic.com>
parents:
3239
diff
changeset
|
367 man = self._parents[0].manifest().copy() |
3239
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
368 copied = self._repo.dirstate.copies() |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
369 modified, added, removed, deleted, unknown = self._status[:5] |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
370 for i,l in (("a", added), ("m", modified), ("u", unknown)): |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
371 for f in l: |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
372 man[f] = man.get(copied.get(f, f), nullid) + i |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
373 man.set(f, util.is_exec(self._repo.wjoin(f), man.execf(f))) |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
374 |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
375 for f in deleted + removed: |
3351
50a18815e3f0
Revert changeset c67920d78248.
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
3319
diff
changeset
|
376 if f in man: |
50a18815e3f0
Revert changeset c67920d78248.
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
3319
diff
changeset
|
377 del man[f] |
3239
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
378 |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
379 self._manifest = man |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
380 |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
381 def manifest(self): return self._manifest |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
382 |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
383 def user(self): return self._repo.ui.username() |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
384 def date(self): return util.makedate() |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
385 def description(self): return "" |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
386 def files(self): |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
387 f = self.modified() + self.added() + self.removed() |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
388 f.sort() |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
389 return f |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
390 |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
391 def modified(self): return self._status[0] |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
392 def added(self): return self._status[1] |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
393 def removed(self): return self._status[2] |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
394 def deleted(self): return self._status[3] |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
395 def unknown(self): return self._status[4] |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
396 def clean(self): return self._status[5] |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
397 |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
398 def parents(self): |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
399 """return contexts for each parent changeset""" |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
400 return self._parents |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
401 |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
402 def children(self): |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
403 return [] |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
404 |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
405 def filectx(self, path): |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
406 """get a file context from the working directory""" |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
407 return workingfilectx(self._repo, path, workingctx=self) |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
408 |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
409 def ancestor(self, c2): |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
410 """return the ancestor context of self and c2""" |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
411 return self._parents[0].ancestor(c2) # punt on two parents for now |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
412 |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
413 class workingfilectx(filectx): |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
414 """A workingfilectx object makes access to data related to a particular |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
415 file in the working directory convenient.""" |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
416 def __init__(self, repo, path, filelog=None, workingctx=None): |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
417 """changeid can be a changeset revision, node, or tag. |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
418 fileid can be a file revision or node.""" |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
419 self._repo = repo |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
420 self._path = path |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
421 self._changeid = None |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
422 self._filerev = self._filenode = None |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
423 |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
424 if filelog: |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
425 self._filelog = filelog |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
426 if workingctx: |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
427 self._changectx = workingctx |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
428 |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
429 def __getattr__(self, name): |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
430 if name == '_changectx': |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
431 self._changectx = workingctx(repo) |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
432 return self._changectx |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
433 elif name == '_repopath': |
3304
45f0c49f0449
fix workingfilectx parents and ancestor functions
Matt Mackall <mpm@selenic.com>
parents:
3242
diff
changeset
|
434 self._repopath = (self._repo.dirstate.copied(self._path) |
45f0c49f0449
fix workingfilectx parents and ancestor functions
Matt Mackall <mpm@selenic.com>
parents:
3242
diff
changeset
|
435 or self._path) |
45f0c49f0449
fix workingfilectx parents and ancestor functions
Matt Mackall <mpm@selenic.com>
parents:
3242
diff
changeset
|
436 return self._repopath |
3239
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
437 elif name == '_filelog': |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
438 self._filelog = self._repo.file(self._repopath) |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
439 return self._filelog |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
440 else: |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
441 raise AttributeError, name |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
442 |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
443 def __nonzero__(self): |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
444 return True |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
445 |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
446 def __str__(self): |
3319
6c68bc1e7873
context: change workingctx str() from . to <node>+
Matt Mackall <mpm@selenic.com>
parents:
3316
diff
changeset
|
447 return "%s@%s" % (self.path(), self._changectx) |
3239
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
448 |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
449 def filectx(self, fileid): |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
450 '''opens an arbitrary revision of the file without |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
451 opening a new filelog''' |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
452 return filectx(self._repo, self._repopath, fileid=fileid, |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
453 filelog=self._filelog) |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
454 |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
455 def rev(self): |
3334
e44eadc92ec4
context: check self.__dict__ instead of using hasattr
Brendan Cully <brendan@kublai.com>
parents:
3319
diff
changeset
|
456 if '_changectx' in self.__dict__: |
3239
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
457 return self._changectx.rev() |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
458 return self._filelog.linkrev(self._filenode) |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
459 |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
460 def data(self): return self._repo.wread(self._path) |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
461 def renamed(self): |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
462 rp = self._repopath |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
463 if rp == self._path: |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
464 return None |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
465 return rp, self._workingctx._parents._manifest.get(rp, nullid) |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
466 |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
467 def parents(self): |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
468 '''return parent filectxs, following copies if necessary''' |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
469 p = self._path |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
470 rp = self._repopath |
3304
45f0c49f0449
fix workingfilectx parents and ancestor functions
Matt Mackall <mpm@selenic.com>
parents:
3242
diff
changeset
|
471 pcl = self._changectx._parents |
3239
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
472 fl = self._filelog |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
473 pl = [ (rp, pcl[0]._manifest.get(rp, nullid), fl) ] |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
474 if len(pcl) > 1: |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
475 if rp != p: |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
476 fl = None |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
477 pl.append((p, pcl[1]._manifest.get(p, nullid), fl)) |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
478 |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
479 return [ filectx(self._repo, p, fileid=n, filelog=l) |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
480 for p,n,l in pl if n != nullid ] |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
481 |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
482 def children(self): |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
483 return [] |
6d98149d70fe
contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents:
3238
diff
changeset
|
484 |
3308 | 485 def size(self): return os.stat(self._repo.wjoin(self._path)).st_size |
3316
0e370798eebf
context: add cmp for filectxs
Matt Mackall <mpm@selenic.com>
parents:
3308
diff
changeset
|
486 |
0e370798eebf
context: add cmp for filectxs
Matt Mackall <mpm@selenic.com>
parents:
3308
diff
changeset
|
487 def cmp(self, text): return self._repo.wread(self._path) == text |