~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/store/text.py

  • Committer: Robert Collins
  • Date: 2005-10-16 08:29:16 UTC
  • mto: This revision was merged to the branch mainline in revision 1459.
  • Revision ID: robertc@lifelesslap.robertcollins.net-20051016082916-dae075fdf18af47e
unify has() implementations for TransportStore classes

Show diffs side-by-side

added added

removed removed

Lines of Context:
21
21
do any sort of delta compression.
22
22
"""
23
23
 
24
 
import os
 
24
import os, tempfile
 
25
 
25
26
import bzrlib.store
26
27
from bzrlib.store import hash_prefix
27
28
from bzrlib.trace import mutter
28
 
from bzrlib.errors import BzrError, NoSuchFile, FileExists
 
29
from bzrlib.errors import BzrError
29
30
 
30
 
import gzip
31
31
from cStringIO import StringIO
32
32
 
33
33
 
41
41
    Files are stored uncompressed, with no delta compression.
42
42
    """
43
43
 
44
 
    def _add_compressed(self, fn, f):
45
 
        from cStringIO import StringIO
46
 
        from bzrlib.osutils import pumpfile
47
 
        
48
 
        if isinstance(f, basestring):
49
 
            f = StringIO(f)
50
 
            
51
 
        sio = StringIO()
52
 
        gf = gzip.GzipFile(mode='wb', fileobj=sio)
53
 
        # if pumpfile handles files that don't fit in ram,
54
 
        # so will this function
55
 
        pumpfile(f, gf)
56
 
        gf.close()
57
 
        sio.seek(0)
58
 
        self._try_put(fn, sio)
59
 
 
60
44
    def _add(self, fn, f):
61
 
        if self._compressed:
62
 
            self._add_compressed(fn, f)
63
 
        else:
64
 
            self._try_put(fn, f)
65
 
 
66
 
    def _try_put(self, fn, f):
67
 
        try:
68
 
            self._transport.put(fn, f)
69
 
        except NoSuchFile:
70
 
            if not self._prefixed:
71
 
                raise
72
 
            try:
73
 
                self._transport.mkdir(os.path.dirname(fn))
74
 
            except FileExists:
75
 
                pass
76
 
            self._transport.put(fn, f)
 
45
        self._transport.put(fn, f)
77
46
 
78
47
    def _get(self, fn):
79
 
        if fn.endswith('.gz'):
80
 
            return self._get_compressed(fn)
81
 
        else:
82
 
            return self._transport.get(fn)
83
 
 
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)
91
 
 
92
 
        mutter('_copy_one: %r, %r', fileid, suffix)
93
 
        path = other._get_name(fileid, suffix)
94
 
        if path is None:
95
 
            raise KeyError(fileid + '-' + str(suffix))
96
 
 
97
 
        try:
98
 
            result = other._transport.copy_to([path], self._transport, pb=pb)
99
 
        except NoSuchFile:
100
 
            if not self._prefixed:
101
 
                raise
102
 
            try:
103
 
                self._transport.mkdir(hash_prefix(fileid)[:-1])
104
 
            except FileExists:
105
 
                pass
106
 
            result = other._transport.copy_to([path], self._transport, pb=pb)
107
 
 
108
 
        if result != 1:
109
 
            raise BzrError('Unable to copy file: %r' % (path,))
110
 
 
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)
119
 
        else:
120
 
            from cStringIO import StringIO
121
 
            sio = StringIO(f.read())
122
 
            return gzip.GzipFile(mode='rb', fileobj=sio)
123
 
 
124
 
 
125
 
def ScratchTextStore():
126
 
    return TextStore(ScratchTransport())
 
48
        return self._transport.get(fn)
 
49
 
 
50
    def __iter__(self):
 
51
        for relpath, st in self._iter_relpaths():
 
52
            yield os.path.basename(relpath)
 
53
 
 
54
    def __len__(self):
 
55
        return len(list(self._iter_relpath()))
 
56
 
 
57
 
 
58
class ScratchTextStore(TextStore):
 
59
    """Self-destructing test subclass of TextStore.
 
60
 
 
61
    The Store only exists for the lifetime of the Python object.
 
62
    Obviously you should not put anything precious in it.
 
63
    """
 
64
    def __init__(self):
 
65
        from transport import transport
 
66
        super(ScratchTextStore, self).__init__(transport(tempfile.mkdtemp()))
 
67
 
 
68
    def __del__(self):
 
69
        self._transport.delete_multi(self._transport.list_dir('.'))
 
70
        os.rmdir(self._transport.base)
 
71
        mutter("%r destroyed" % self)
 
72