bzr branch
http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
|
2052.3.1
by John Arbash Meinel
Add tests to cleanup the copyright of all source files |
1 |
# Copyright (C) 2005, 2006 Canonical Ltd
|
|
1887.1.1
by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines, |
2 |
#
|
|
1
by mbp at sourcefrog
import from baz patch-364 |
3 |
# This program is free software; you can redistribute it and/or modify
|
4 |
# it under the terms of the GNU General Public License as published by
|
|
5 |
# the Free Software Foundation; either version 2 of the License, or
|
|
6 |
# (at your option) any later version.
|
|
|
1887.1.1
by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines, |
7 |
#
|
|
1
by mbp at sourcefrog
import from baz patch-364 |
8 |
# This program is distributed in the hope that it will be useful,
|
9 |
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
10 |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
11 |
# GNU General Public License for more details.
|
|
|
1887.1.1
by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines, |
12 |
#
|
|
1
by mbp at sourcefrog
import from baz patch-364 |
13 |
# You should have received a copy of the GNU General Public License
|
14 |
# along with this program; if not, write to the Free Software
|
|
|
4183.7.1
by Sabin Iacob
update FSF mailing address |
15 |
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
1
by mbp at sourcefrog
import from baz patch-364 |
16 |
|
|
1374
by Martin Pool
todo |
17 |
# TODO: Could remember a bias towards whether a particular store is typically
|
18 |
# compressed or not.
|
|
19 |
||
|
711
by Martin Pool
- store docs |
20 |
"""
|
|
1861.2.6
by Alexander Belchenko
branding: change Bazaar-NG to Bazaar |
21 |
Stores are the main data-storage mechanism for Bazaar.
|
|
1
by mbp at sourcefrog
import from baz patch-364 |
22 |
|
23 |
A store is a simple write-once container indexed by a universally
|
|
|
711
by Martin Pool
- store docs |
24 |
unique ID.
|
25 |
"""
|
|
|
1
by mbp at sourcefrog
import from baz patch-364 |
26 |
|
|
1442.1.51
by Robert Collins
teach iter about suffixes |
27 |
import os |
|
1185.1.41
by Robert Collins
massive patch from Alexander Belchenko - many PEP8 fixes, removes unused function uuid |
28 |
|
|
6686.2.1
by Jelmer Vernooij
Move breezy.store to breezy.plugins.weave_fmt, its only user. |
29 |
from .... import ( |
|
1955.3.13
by John Arbash Meinel
Run the full test suite, and fix up any deprecation warnings. |
30 |
errors, |
|
6670.4.1
by Jelmer Vernooij
Update imports. |
31 |
)
|
|
6670.4.19
by Jelmer Vernooij
Fix import. |
32 |
from ....bzr import ( |
|
3350.6.1
by Robert Collins
* New ``versionedfile.KeyMapper`` interface to abstract out the access to |
33 |
versionedfile, |
|
1955.3.13
by John Arbash Meinel
Run the full test suite, and fix up any deprecation warnings. |
34 |
)
|
|
6686.2.1
by Jelmer Vernooij
Move breezy.store to breezy.plugins.weave_fmt, its only user. |
35 |
from ....errors import BzrError, UnlistableStore |
36 |
from ....trace import mutter |
|
|
1
by mbp at sourcefrog
import from baz patch-364 |
37 |
|
38 |
######################################################################
|
|
39 |
# stores
|
|
40 |
||
|
7143.15.2
by Jelmer Vernooij
Run autopep8. |
41 |
|
|
1
by mbp at sourcefrog
import from baz patch-364 |
42 |
class StoreError(Exception): |
43 |
pass
|
|
44 |
||
45 |
||
|
1185.11.1
by John Arbash Meinel
(broken) Transport work is merged in. Tests do not pass yet. |
46 |
class Store(object): |
|
907.1.1
by John Arbash Meinel
Reworking the Branch and Store code to support an abstracted filesystem layer. |
47 |
"""This class represents the abstract storage layout for saving information. |
|
3943.8.1
by Marius Kruger
remove all trailing whitespace from bzr source |
48 |
|
|
1
by mbp at sourcefrog
import from baz patch-364 |
49 |
Files can be added, but not modified once they are in. Typically
|
50 |
the hash is used as the name, or something else known to be unique,
|
|
51 |
such as a UUID.
|
|
|
907.1.1
by John Arbash Meinel
Reworking the Branch and Store code to support an abstracted filesystem layer. |
52 |
"""
|
53 |
||
54 |
def __len__(self): |
|
55 |
raise NotImplementedError('Children should define their length') |
|
56 |
||
|
1185.16.157
by John Arbash Meinel
Added ability for TextStore to handle both compressed and uncompressed, it just looks for one type first |
57 |
def get(self, fileid, suffix=None): |
|
1442.1.50
by Robert Collins
test get with suffixes |
58 |
"""Returns a file reading from a particular entry. |
|
3943.8.1
by Marius Kruger
remove all trailing whitespace from bzr source |
59 |
|
|
1185.16.157
by John Arbash Meinel
Added ability for TextStore to handle both compressed and uncompressed, it just looks for one type first |
60 |
If suffix is present, retrieve the named suffix for fileid.
|
|
1442.1.50
by Robert Collins
test get with suffixes |
61 |
"""
|
62 |
raise NotImplementedError |
|
|
1442.1.35
by Robert Collins
convert all users of __getitem__ into TransportStores to use .get instead |
63 |
|
|
907.1.1
by John Arbash Meinel
Reworking the Branch and Store code to support an abstracted filesystem layer. |
64 |
def __iter__(self): |
65 |
raise NotImplementedError |
|
66 |
||
|
907.1.43
by John Arbash Meinel
Restoring compatibility for Storage.add(file, fileid), it is a little arbitrary, and compatibility is better |
67 |
def add(self, f, fileid): |
|
907.1.1
by John Arbash Meinel
Reworking the Branch and Store code to support an abstracted filesystem layer. |
68 |
"""Add a file object f to the store accessible from the given fileid""" |
|
7143.15.2
by Jelmer Vernooij
Run autopep8. |
69 |
raise NotImplementedError( |
70 |
'Children of Store must define their method of adding entries.') |
|
|
907.1.1
by John Arbash Meinel
Reworking the Branch and Store code to support an abstracted filesystem layer. |
71 |
|
|
1185.16.157
by John Arbash Meinel
Added ability for TextStore to handle both compressed and uncompressed, it just looks for one type first |
72 |
def has_id(self, fileid, suffix=None): |
73 |
"""Return True or false for the presence of fileid in the store. |
|
|
3943.8.1
by Marius Kruger
remove all trailing whitespace from bzr source |
74 |
|
75 |
suffix, if present, is a per file suffix, i.e. for digital signature
|
|
|
1442.1.47
by Robert Collins
test for has with suffixed files |
76 |
data."""
|
|
1442.1.45
by Robert Collins
replace __contains__ calls in stores with has_id |
77 |
raise NotImplementedError |
|
907.1.36
by John Arbash Meinel
Moving the multi-get functionality higher up into the Branch class. |
78 |
|
|
1400.1.1
by Robert Collins
implement a basic test for the ui branch command from http servers |
79 |
def listable(self): |
80 |
"""Return True if this store is able to be listed.""" |
|
|
1963.2.6
by Robey Pointer
pychecker is on crack; go back to using 'is None'. |
81 |
return (getattr(self, "__iter__", None) is not None) |
|
1400.1.1
by Robert Collins
implement a basic test for the ui branch command from http servers |
82 |
|
|
1092.2.24
by Robert Collins
merge from martins newformat branch - brings in transport abstraction |
83 |
|
84 |
class TransportStore(Store): |
|
85 |
"""A TransportStore is a Store superclass for Stores that use Transports.""" |
|
86 |
||
|
1442.1.33
by Robert Collins
teach TransportStore.add to accept an optional file suffix, which does not alter the fileid. |
87 |
def add(self, f, fileid, suffix=None): |
|
1442.1.28
by Robert Collins
pull up core TransportStore.add from TextStore.add and CompressedTextStore.add |
88 |
"""Add contents of a file into the store. |
89 |
||
|
1955.3.13
by John Arbash Meinel
Run the full test suite, and fix up any deprecation warnings. |
90 |
f -- A file-like object
|
|
1442.1.28
by Robert Collins
pull up core TransportStore.add from TextStore.add and CompressedTextStore.add |
91 |
"""
|
|
1185.16.159
by John Arbash Meinel
Updated the stores, all tests pass, and a store doesn't have to be 100% compressed |
92 |
mutter("add store entry %r", fileid) |
|
1185.16.157
by John Arbash Meinel
Added ability for TextStore to handle both compressed and uncompressed, it just looks for one type first |
93 |
names = self._id_to_names(fileid, suffix) |
94 |
if self._transport.has_any(names): |
|
|
3943.8.1
by Marius Kruger
remove all trailing whitespace from bzr source |
95 |
raise BzrError("store %r already contains id %r" |
|
1185.16.157
by John Arbash Meinel
Added ability for TextStore to handle both compressed and uncompressed, it just looks for one type first |
96 |
% (self._transport.base, fileid)) |
|
1442.1.28
by Robert Collins
pull up core TransportStore.add from TextStore.add and CompressedTextStore.add |
97 |
|
|
1185.16.159
by John Arbash Meinel
Updated the stores, all tests pass, and a store doesn't have to be 100% compressed |
98 |
# Most of the time, just adding the file will work
|
99 |
# if we find a time where it fails, (because the dir
|
|
100 |
# doesn't exist), then create the dir, and try again
|
|
|
1185.16.157
by John Arbash Meinel
Added ability for TextStore to handle both compressed and uncompressed, it just looks for one type first |
101 |
self._add(names[0], f) |
102 |
||
103 |
def _add(self, relpath, f): |
|
104 |
"""Actually add the file to the given location. |
|
105 |
This should be overridden by children.
|
|
106 |
"""
|
|
107 |
raise NotImplementedError('children need to implement this function.') |
|
|
1442.1.28
by Robert Collins
pull up core TransportStore.add from TextStore.add and CompressedTextStore.add |
108 |
|
|
1442.1.24
by Robert Collins
Pull up _check_id and _relpath from Text and CompressedText stores into TransportStore |
109 |
def _check_fileid(self, fileid): |
|
6963.2.10
by Jelmer Vernooij
Fix a bunch of tests. |
110 |
if not isinstance(fileid, bytes): |
|
3350.6.1
by Robert Collins
* New ``versionedfile.KeyMapper`` interface to abstract out the access to |
111 |
raise TypeError('Fileids should be bytestrings: %s %r' % ( |
112 |
type(fileid), fileid)) |
|
|
6963.2.6
by Jelmer Vernooij
Fix some more tests. |
113 |
if b'\\' in fileid or b'/' in fileid: |
|
1442.1.24
by Robert Collins
Pull up _check_id and _relpath from Text and CompressedText stores into TransportStore |
114 |
raise ValueError("invalid store id %r" % fileid) |
115 |
||
|
1185.16.157
by John Arbash Meinel
Added ability for TextStore to handle both compressed and uncompressed, it just looks for one type first |
116 |
def _id_to_names(self, fileid, suffix): |
117 |
"""Return the names in the expected order""" |
|
|
1442.1.47
by Robert Collins
test for has with suffixed files |
118 |
if suffix is not None: |
119 |
fn = self._relpath(fileid, [suffix]) |
|
120 |
else: |
|
121 |
fn = self._relpath(fileid) |
|
|
1185.16.157
by John Arbash Meinel
Added ability for TextStore to handle both compressed and uncompressed, it just looks for one type first |
122 |
|
|
1185.65.13
by Robert Collins
Merge from integration |
123 |
# FIXME RBC 20051128 this belongs in TextStore.
|
|
1185.16.157
by John Arbash Meinel
Added ability for TextStore to handle both compressed and uncompressed, it just looks for one type first |
124 |
fn_gz = fn + '.gz' |
125 |
if self._compressed: |
|
126 |
return fn_gz, fn |
|
127 |
else: |
|
128 |
return fn, fn_gz |
|
129 |
||
130 |
def has_id(self, fileid, suffix=None): |
|
131 |
"""See Store.has_id.""" |
|
|
1651.1.5
by Martin Pool
Review cleanup of TransportStore.has_id |
132 |
return self._transport.has_any(self._id_to_names(fileid, suffix)) |
|
1185.16.157
by John Arbash Meinel
Added ability for TextStore to handle both compressed and uncompressed, it just looks for one type first |
133 |
|
134 |
def _get_name(self, fileid, suffix=None): |
|
135 |
"""A special check, which returns the name of an existing file. |
|
|
3943.8.1
by Marius Kruger
remove all trailing whitespace from bzr source |
136 |
|
|
1185.16.157
by John Arbash Meinel
Added ability for TextStore to handle both compressed and uncompressed, it just looks for one type first |
137 |
This is similar in spirit to 'has_id', but it is designed
|
138 |
to return information about which file the store has.
|
|
139 |
"""
|
|
140 |
for name in self._id_to_names(fileid, suffix=suffix): |
|
141 |
if self._transport.has(name): |
|
142 |
return name |
|
143 |
return None |
|
|
1442.1.38
by Robert Collins
unify __contains__ for TransportStore classes |
144 |
|
|
1442.1.36
by Robert Collins
convert get() in TextStore and CompressedTextStore into a template method |
145 |
def _get(self, filename): |
146 |
"""Return an vanilla file stream for clients to read from. |
|
147 |
||
|
3943.8.1
by Marius Kruger
remove all trailing whitespace from bzr source |
148 |
This is the body of a template method on 'get', and should be
|
|
1442.1.36
by Robert Collins
convert get() in TextStore and CompressedTextStore into a template method |
149 |
implemented by subclasses.
|
150 |
"""
|
|
151 |
raise NotImplementedError |
|
152 |
||
|
1442.1.50
by Robert Collins
test get with suffixes |
153 |
def get(self, fileid, suffix=None): |
154 |
"""See Store.get().""" |
|
|
1185.16.157
by John Arbash Meinel
Added ability for TextStore to handle both compressed and uncompressed, it just looks for one type first |
155 |
names = self._id_to_names(fileid, suffix) |
156 |
for name in names: |
|
157 |
try: |
|
158 |
return self._get(name) |
|
159 |
except errors.NoSuchFile: |
|
160 |
pass
|
|
161 |
raise KeyError(fileid) |
|
|
1433
by Robert Collins
merge in and make incremental Gustavo Niemeyers nested log patch, and remove all bare exceptions in store and transport packages. |
162 |
|
|
1185.58.4
by John Arbash Meinel
Added permission checking to Branch, and propogated that change into the stores. |
163 |
def __init__(self, a_transport, prefixed=False, compressed=False, |
|
1185.80.1
by John Arbash Meinel
Text store and weave store both allow escaping fileid paths. |
164 |
dir_mode=None, file_mode=None, |
165 |
escaped=False): |
|
|
1092.2.24
by Robert Collins
merge from martins newformat branch - brings in transport abstraction |
166 |
super(TransportStore, self).__init__() |
|
1442.1.44
by Robert Collins
Many transport related tweaks: |
167 |
self._transport = a_transport |
|
1442.1.25
by Robert Collins
Test TransportStore._relpath for simple cases: pull up _prefixed attribute as a result. |
168 |
self._prefixed = prefixed |
|
1185.65.13
by Robert Collins
Merge from integration |
169 |
# FIXME RBC 20051128 this belongs in TextStore.
|
|
1185.16.157
by John Arbash Meinel
Added ability for TextStore to handle both compressed and uncompressed, it just looks for one type first |
170 |
self._compressed = compressed |
|
1442.1.43
by Robert Collins
add registration of suffixes, in preparation for ensuring iteration is regular |
171 |
self._suffixes = set() |
|
1185.80.1
by John Arbash Meinel
Text store and weave store both allow escaping fileid paths. |
172 |
self._escaped = escaped |
|
1092.2.24
by Robert Collins
merge from martins newformat branch - brings in transport abstraction |
173 |
|
|
1185.58.6
by John Arbash Meinel
Stores don't have to have a dir_mode or file_mode set |
174 |
# It is okay for these to be None, it just means they
|
175 |
# will just use the filesystem defaults
|
|
176 |
self._dir_mode = dir_mode |
|
177 |
self._file_mode = file_mode |
|
|
3350.6.1
by Robert Collins
* New ``versionedfile.KeyMapper`` interface to abstract out the access to |
178 |
# Create a key mapper to use
|
179 |
if escaped and prefixed: |
|
180 |
self._mapper = versionedfile.HashEscapedPrefixMapper() |
|
181 |
elif not escaped and prefixed: |
|
182 |
self._mapper = versionedfile.HashPrefixMapper() |
|
183 |
elif self._escaped: |
|
|
3350.6.8
by Martin Pool
Change stray pdb calls to exceptions |
184 |
raise ValueError( |
185 |
"%r: escaped unprefixed stores are not permitted." |
|
186 |
% (self,)) |
|
|
1608.2.1
by Martin Pool
[merge] Storage filename escaping |
187 |
else: |
|
3350.6.1
by Robert Collins
* New ``versionedfile.KeyMapper`` interface to abstract out the access to |
188 |
self._mapper = versionedfile.PrefixMapper() |
|
1608.2.1
by Martin Pool
[merge] Storage filename escaping |
189 |
|
|
1479
by Robert Collins
More quoting at the transport layer bugfixes. |
190 |
def _iter_files_recursive(self): |
191 |
"""Iterate through the files in the transport.""" |
|
192 |
for quoted_relpath in self._transport.iter_files_recursive(): |
|
|
3350.6.4
by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores. |
193 |
yield quoted_relpath |
|
1479
by Robert Collins
More quoting at the transport layer bugfixes. |
194 |
|
|
1442.1.51
by Robert Collins
teach iter about suffixes |
195 |
def __iter__(self): |
|
1479
by Robert Collins
More quoting at the transport layer bugfixes. |
196 |
for relpath in self._iter_files_recursive(): |
|
1442.1.51
by Robert Collins
teach iter about suffixes |
197 |
# worst case is one of each suffix.
|
198 |
name = os.path.basename(relpath) |
|
199 |
if name.endswith('.gz'): |
|
200 |
name = name[:-3] |
|
201 |
skip = False |
|
202 |
for count in range(len(self._suffixes)): |
|
203 |
for suffix in self._suffixes: |
|
204 |
if name.endswith('.' + suffix): |
|
205 |
skip = True |
|
206 |
if not skip: |
|
|
3350.6.1
by Robert Collins
* New ``versionedfile.KeyMapper`` interface to abstract out the access to |
207 |
yield self._mapper.unmap(name)[0] |
|
1442.1.51
by Robert Collins
teach iter about suffixes |
208 |
|
|
1442.1.40
by Robert Collins
unify __len__() implementations for TransportStore classes |
209 |
def __len__(self): |
|
1442.1.50
by Robert Collins
test get with suffixes |
210 |
return len(list(self.__iter__())) |
|
1442.1.40
by Robert Collins
unify __len__() implementations for TransportStore classes |
211 |
|
|
1185.16.157
by John Arbash Meinel
Added ability for TextStore to handle both compressed and uncompressed, it just looks for one type first |
212 |
def _relpath(self, fileid, suffixes=None): |
|
1442.1.24
by Robert Collins
Pull up _check_id and _relpath from Text and CompressedText stores into TransportStore |
213 |
self._check_fileid(fileid) |
|
1185.16.157
by John Arbash Meinel
Added ability for TextStore to handle both compressed and uncompressed, it just looks for one type first |
214 |
if suffixes: |
215 |
for suffix in suffixes: |
|
|
7183.3.1
by Martin
Fix E71* lint errors |
216 |
if suffix not in self._suffixes: |
|
1185.16.157
by John Arbash Meinel
Added ability for TextStore to handle both compressed and uncompressed, it just looks for one type first |
217 |
raise ValueError("Unregistered suffix %r" % suffix) |
|
6963.2.10
by Jelmer Vernooij
Fix a bunch of tests. |
218 |
self._check_fileid(suffix.encode('utf-8')) |
|
1185.16.157
by John Arbash Meinel
Added ability for TextStore to handle both compressed and uncompressed, it just looks for one type first |
219 |
else: |
220 |
suffixes = [] |
|
|
3350.6.1
by Robert Collins
* New ``versionedfile.KeyMapper`` interface to abstract out the access to |
221 |
path = self._mapper.map((fileid,)) |
|
3350.6.4
by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores. |
222 |
full_path = '.'.join([path] + suffixes) |
223 |
return full_path |
|
|
1442.1.24
by Robert Collins
Pull up _check_id and _relpath from Text and CompressedText stores into TransportStore |
224 |
|
|
1092.2.24
by Robert Collins
merge from martins newformat branch - brings in transport abstraction |
225 |
def __repr__(self): |
226 |
if self._transport is None: |
|
227 |
return "%s(None)" % (self.__class__.__name__) |
|
228 |
else: |
|
229 |
return "%s(%r)" % (self.__class__.__name__, self._transport.base) |
|
230 |
||
231 |
__str__ = __repr__ |
|
|
1185.10.1
by Aaron Bentley
Added --basis option to bzr branch |
232 |
|
|
1400.1.1
by Robert Collins
implement a basic test for the ui branch command from http servers |
233 |
def listable(self): |
234 |
"""Return True if this store is able to be listed.""" |
|
235 |
return self._transport.listable() |
|
236 |
||
|
1442.1.43
by Robert Collins
add registration of suffixes, in preparation for ensuring iteration is regular |
237 |
def register_suffix(self, suffix): |
238 |
"""Register a suffix as being expected in this store.""" |
|
|
6963.2.10
by Jelmer Vernooij
Fix a bunch of tests. |
239 |
self._check_fileid(suffix.encode('utf-8')) |
|
1185.16.157
by John Arbash Meinel
Added ability for TextStore to handle both compressed and uncompressed, it just looks for one type first |
240 |
if suffix == 'gz': |
241 |
raise ValueError('You cannot register the "gz" suffix.') |
|
|
1442.1.43
by Robert Collins
add registration of suffixes, in preparation for ensuring iteration is regular |
242 |
self._suffixes.add(suffix) |
243 |
||
|
1442.1.37
by Robert Collins
pull up total_size into TransportStore |
244 |
def total_size(self): |
245 |
"""Return (count, bytes) |
|
246 |
||
247 |
This is the (compressed) size stored on disk, not the size of
|
|
248 |
the content."""
|
|
249 |
total = 0 |
|
250 |
count = 0 |
|
|
1442.1.44
by Robert Collins
Many transport related tweaks: |
251 |
for relpath in self._transport.iter_files_recursive(): |
|
1442.1.37
by Robert Collins
pull up total_size into TransportStore |
252 |
count += 1 |
|
1442.1.44
by Robert Collins
Many transport related tweaks: |
253 |
total += self._transport.stat(relpath).st_size |
|
3943.8.1
by Marius Kruger
remove all trailing whitespace from bzr source |
254 |
|
|
1442.1.37
by Robert Collins
pull up total_size into TransportStore |
255 |
return count, total |