##// END OF EJS Templates
rawdata: forward the method call on `filelog` object...
marmoute -
r42946:bf1e8d2a default
parent child Browse files
Show More
@@ -1,239 +1,242 b''
1 1 # filelog.py - file history class for mercurial
2 2 #
3 3 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
4 4 #
5 5 # This software may be used and distributed according to the terms of the
6 6 # GNU General Public License version 2 or any later version.
7 7
8 8 from __future__ import absolute_import
9 9
10 10 from .i18n import _
11 11 from .node import (
12 12 nullid,
13 13 nullrev,
14 14 )
15 15 from . import (
16 16 error,
17 17 repository,
18 18 revlog,
19 19 )
20 20 from .utils import (
21 21 interfaceutil,
22 22 storageutil,
23 23 )
24 24
25 25 @interfaceutil.implementer(repository.ifilestorage)
26 26 class filelog(object):
27 27 def __init__(self, opener, path):
28 28 self._revlog = revlog.revlog(opener,
29 29 '/'.join(('data', path + '.i')),
30 30 censorable=True)
31 31 # Full name of the user visible file, relative to the repository root.
32 32 # Used by LFS.
33 33 self._revlog.filename = path
34 34
35 35 def __len__(self):
36 36 return len(self._revlog)
37 37
38 38 def __iter__(self):
39 39 return self._revlog.__iter__()
40 40
41 41 def hasnode(self, node):
42 42 if node in (nullid, nullrev):
43 43 return False
44 44
45 45 try:
46 46 self._revlog.rev(node)
47 47 return True
48 48 except (TypeError, ValueError, IndexError, error.LookupError):
49 49 return False
50 50
51 51 def revs(self, start=0, stop=None):
52 52 return self._revlog.revs(start=start, stop=stop)
53 53
54 54 def parents(self, node):
55 55 return self._revlog.parents(node)
56 56
57 57 def parentrevs(self, rev):
58 58 return self._revlog.parentrevs(rev)
59 59
60 60 def rev(self, node):
61 61 return self._revlog.rev(node)
62 62
63 63 def node(self, rev):
64 64 return self._revlog.node(rev)
65 65
66 66 def lookup(self, node):
67 67 return storageutil.fileidlookup(self._revlog, node,
68 68 self._revlog.indexfile)
69 69
70 70 def linkrev(self, rev):
71 71 return self._revlog.linkrev(rev)
72 72
73 73 def commonancestorsheads(self, node1, node2):
74 74 return self._revlog.commonancestorsheads(node1, node2)
75 75
76 76 # Used by dagop.blockdescendants().
77 77 def descendants(self, revs):
78 78 return self._revlog.descendants(revs)
79 79
80 80 def heads(self, start=None, stop=None):
81 81 return self._revlog.heads(start, stop)
82 82
83 83 # Used by hgweb, children extension.
84 84 def children(self, node):
85 85 return self._revlog.children(node)
86 86
87 87 def iscensored(self, rev):
88 88 return self._revlog.iscensored(rev)
89 89
90 90 def revision(self, node, _df=None, raw=False):
91 91 return self._revlog.revision(node, _df=_df, raw=raw)
92 92
93 def rawdata(self, node, _df=None):
94 return self._revlog.rawdata(node, _df=_df)
95
93 96 def emitrevisions(self, nodes, nodesorder=None,
94 97 revisiondata=False, assumehaveparentrevisions=False,
95 98 deltamode=repository.CG_DELTAMODE_STD):
96 99 return self._revlog.emitrevisions(
97 100 nodes, nodesorder=nodesorder, revisiondata=revisiondata,
98 101 assumehaveparentrevisions=assumehaveparentrevisions,
99 102 deltamode=deltamode)
100 103
101 104 def addrevision(self, revisiondata, transaction, linkrev, p1, p2,
102 105 node=None, flags=revlog.REVIDX_DEFAULT_FLAGS,
103 106 cachedelta=None):
104 107 return self._revlog.addrevision(revisiondata, transaction, linkrev,
105 108 p1, p2, node=node, flags=flags,
106 109 cachedelta=cachedelta)
107 110
108 111 def addgroup(self, deltas, linkmapper, transaction, addrevisioncb=None,
109 112 maybemissingparents=False):
110 113 if maybemissingparents:
111 114 raise error.Abort(_('revlog storage does not support missing '
112 115 'parents write mode'))
113 116
114 117 return self._revlog.addgroup(deltas, linkmapper, transaction,
115 118 addrevisioncb=addrevisioncb)
116 119
117 120 def getstrippoint(self, minlink):
118 121 return self._revlog.getstrippoint(minlink)
119 122
120 123 def strip(self, minlink, transaction):
121 124 return self._revlog.strip(minlink, transaction)
122 125
123 126 def censorrevision(self, tr, node, tombstone=b''):
124 127 return self._revlog.censorrevision(tr, node, tombstone=tombstone)
125 128
126 129 def files(self):
127 130 return self._revlog.files()
128 131
129 132 def read(self, node):
130 133 return storageutil.filtermetadata(self.revision(node))
131 134
132 135 def add(self, text, meta, transaction, link, p1=None, p2=None):
133 136 if meta or text.startswith('\1\n'):
134 137 text = storageutil.packmeta(meta, text)
135 138 return self.addrevision(text, transaction, link, p1, p2)
136 139
137 140 def renamed(self, node):
138 141 return storageutil.filerevisioncopied(self, node)
139 142
140 143 def size(self, rev):
141 144 """return the size of a given revision"""
142 145
143 146 # for revisions with renames, we have to go the slow way
144 147 node = self.node(rev)
145 148 if self.renamed(node):
146 149 return len(self.read(node))
147 150 if self.iscensored(rev):
148 151 return 0
149 152
150 153 # XXX if self.read(node).startswith("\1\n"), this returns (size+4)
151 154 return self._revlog.size(rev)
152 155
153 156 def cmp(self, node, text):
154 157 """compare text with a given file revision
155 158
156 159 returns True if text is different than what is stored.
157 160 """
158 161 return not storageutil.filedataequivalent(self, node, text)
159 162
160 163 def verifyintegrity(self, state):
161 164 return self._revlog.verifyintegrity(state)
162 165
163 166 def storageinfo(self, exclusivefiles=False, sharedfiles=False,
164 167 revisionscount=False, trackedsize=False,
165 168 storedsize=False):
166 169 return self._revlog.storageinfo(
167 170 exclusivefiles=exclusivefiles, sharedfiles=sharedfiles,
168 171 revisionscount=revisionscount, trackedsize=trackedsize,
169 172 storedsize=storedsize)
170 173
171 174 # TODO these aren't part of the interface and aren't internal methods.
172 175 # Callers should be fixed to not use them.
173 176
174 177 # Used by bundlefilelog, unionfilelog.
175 178 @property
176 179 def indexfile(self):
177 180 return self._revlog.indexfile
178 181
179 182 @indexfile.setter
180 183 def indexfile(self, value):
181 184 self._revlog.indexfile = value
182 185
183 186 # Used by repo upgrade.
184 187 def clone(self, tr, destrevlog, **kwargs):
185 188 if not isinstance(destrevlog, filelog):
186 189 raise error.ProgrammingError('expected filelog to clone()')
187 190
188 191 return self._revlog.clone(tr, destrevlog._revlog, **kwargs)
189 192
190 193 class narrowfilelog(filelog):
191 194 """Filelog variation to be used with narrow stores."""
192 195
193 196 def __init__(self, opener, path, narrowmatch):
194 197 super(narrowfilelog, self).__init__(opener, path)
195 198 self._narrowmatch = narrowmatch
196 199
197 200 def renamed(self, node):
198 201 res = super(narrowfilelog, self).renamed(node)
199 202
200 203 # Renames that come from outside the narrowspec are problematic
201 204 # because we may lack the base text for the rename. This can result
202 205 # in code attempting to walk the ancestry or compute a diff
203 206 # encountering a missing revision. We address this by silently
204 207 # removing rename metadata if the source file is outside the
205 208 # narrow spec.
206 209 #
207 210 # A better solution would be to see if the base revision is available,
208 211 # rather than assuming it isn't.
209 212 #
210 213 # An even better solution would be to teach all consumers of rename
211 214 # metadata that the base revision may not be available.
212 215 #
213 216 # TODO consider better ways of doing this.
214 217 if res and not self._narrowmatch(res[0]):
215 218 return None
216 219
217 220 return res
218 221
219 222 def size(self, rev):
220 223 # Because we have a custom renamed() that may lie, we need to call
221 224 # the base renamed() to report accurate results.
222 225 node = self.node(rev)
223 226 if super(narrowfilelog, self).renamed(node):
224 227 return len(self.read(node))
225 228 else:
226 229 return super(narrowfilelog, self).size(rev)
227 230
228 231 def cmp(self, node, text):
229 232 different = super(narrowfilelog, self).cmp(node, text)
230 233
231 234 # Because renamed() may lie, we may get false positives for
232 235 # different content. Check for this by comparing against the original
233 236 # renamed() implementation.
234 237 if different:
235 238 if super(narrowfilelog, self).renamed(node):
236 239 t2 = self.read(node)
237 240 return t2 != text
238 241
239 242 return different
General Comments 0
You need to be logged in to leave comments. Login now