41
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)
60
44
def _add(self, 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
self._transport.put(fn, f)
78
47
def _get(self, 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)
125
def ScratchTextStore():
126
return TextStore(ScratchTransport())
48
return self._transport.get(fn)
51
for relpath, st in self._iter_relpaths():
52
yield os.path.basename(relpath)
55
return len(list(self._iter_relpath()))
58
class ScratchTextStore(TextStore):
59
"""Self-destructing test subclass of TextStore.
61
The Store only exists for the lifetime of the Python object.
62
Obviously you should not put anything precious in it.
65
from transport import transport
66
super(ScratchTextStore, self).__init__(transport(tempfile.mkdtemp()))
69
self._transport.delete_multi(self._transport.list_dir('.'))
70
os.rmdir(self._transport.base)
71
mutter("%r destroyed" % self)