1
# Copyright (C) 2005, 2006, 2008, 2009, 2010 Canonical Ltd
1
# Copyright (C) 2005 Canonical Ltd
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
20
20
do any sort of delta compression.
23
from __future__ import absolute_import
28
from .... import osutils
29
from ....errors import BzrError, NoSuchFile, FileExists
30
from ....sixish import (
33
from . import TransportStore
34
from ....trace import mutter
37
class TextStore(TransportStore):
25
from cStringIO import StringIO
27
from bzrlib import osutils
28
from bzrlib.errors import BzrError, NoSuchFile, FileExists
30
from bzrlib.trace import mutter
34
class TextStore(bzrlib.store.TransportStore):
38
35
"""Store that holds files indexed by unique names.
40
37
Files can be added, but not modified once they are in. Typically
47
44
def _add_compressed(self, fn, f):
48
if isinstance(f, bytes):
45
from cStringIO import StringIO
46
from bzrlib.osutils import pumpfile
48
if isinstance(f, basestring):
52
52
gf = gzip.GzipFile(mode='wb', fileobj=sio)
53
53
# if pumpfile handles files that don't fit in ram,
54
54
# so will this function
55
osutils.pumpfile(f, gf)
58
58
self._try_put(fn, sio)
82
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,
101
if not self._prefixed:
104
self._transport.mkdir(osutils.dirname(path), mode=self._dir_mode)
107
result = other._transport.copy_to([path], self._transport,
108
mode=self._file_mode)
111
raise BzrError('Unable to copy file: %r' % (path,))
84
113
def _get_compressed(self, filename):
85
114
"""Returns a file reading from a particular entry."""
86
115
f = self._transport.get(filename)
87
116
# gzip.GzipFile.read() requires a tell() function
88
117
# but some transports return objects that cannot seek
89
# so buffer them in a BytesIO instead
118
# so buffer them in a StringIO instead
90
119
if getattr(f, 'tell', None) is not None:
91
120
return gzip.GzipFile(mode='rb', fileobj=f)
93
sio = BytesIO(f.read())
122
from cStringIO import StringIO
123
sio = StringIO(f.read())
94
124
return gzip.GzipFile(mode='rb', fileobj=sio)