39
41
Files are stored uncompressed, with no delta compression.
44
def _add_compressed(self, fn, f):
45
from cStringIO import StringIO
46
from bzrlib.osutils import pumpfile
48
if isinstance(f, basestring):
52
gf = gzip.GzipFile(mode='wb', fileobj=sio)
53
# if pumpfile handles files that don't fit in ram,
54
# so will this function
58
self._try_put(fn, sio)
42
60
def _add(self, fn, f):
43
self._transport.put(fn, f)
62
self._add_compressed(fn, f)
66
def _try_put(self, fn, f):
68
self._transport.put(fn, f)
70
if not self._prefixed:
73
self._transport.mkdir(os.path.dirname(fn))
76
self._transport.put(fn, f)
45
78
def _get(self, fn):
46
return self._transport.get(fn)
79
if fn.endswith('.gz'):
80
return self._get_compressed(fn)
82
return self._transport.get(fn)
84
def _copy_one(self, fileid, suffix, other, pb):
85
# TODO: Once the copy_to interface is improved to allow a source
86
# and destination targets, then we can always do the copy
87
# as long as other is a TextStore
88
if not (isinstance(other, TextStore)
89
and other._prefixed == self._prefixed):
90
return super(TextStore, self)._copy_one(fileid, suffix, other, pb)
92
mutter('_copy_one: %r, %r', fileid, suffix)
93
path = other._get_name(fileid, suffix)
95
raise KeyError(fileid + '-' + str(suffix))
98
result = other._transport.copy_to([path], self._transport, pb=pb)
100
if not self._prefixed:
103
self._transport.mkdir(hash_prefix(fileid)[:-1])
106
result = other._transport.copy_to([path], self._transport, pb=pb)
109
raise BzrError('Unable to copy file: %r' % (path,))
111
def _get_compressed(self, filename):
112
"""Returns a file reading from a particular entry."""
113
f = self._transport.get(filename)
114
# gzip.GzipFile.read() requires a tell() function
115
# but some transports return objects that cannot seek
116
# so buffer them in a StringIO instead
117
if hasattr(f, 'tell'):
118
return gzip.GzipFile(mode='rb', fileobj=f)
120
from cStringIO import StringIO
121
sio = StringIO(f.read())
122
return gzip.GzipFile(mode='rb', fileobj=sio)
49
125
def ScratchTextStore():