~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/store/weave.py

  • Committer: Robert Collins
  • Date: 2005-10-02 01:53:46 UTC
  • mfrom: (1393.1.23)
  • Revision ID: robertc@robertcollins.net-20051002015346-587422189352289e
merge from upstream newformat

Show diffs side-by-side

added added

removed removed

Lines of Context:
16
16
# along with this program; if not, write to the Free Software
17
17
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18
18
 
19
 
# Author: Martin Pool <mbp@canonical.com>
20
 
 
21
 
 
 
19
# XXX: Some consideration of the problems that might occur if there are
 
20
# files whose id differs only in case.  That should probably be forbidden.
 
21
 
 
22
 
 
23
from cStringIO import StringIO
22
24
import os
23
25
import errno
24
26
 
25
27
from bzrlib.weavefile import read_weave, write_weave_v5
26
28
from bzrlib.weave import Weave
 
29
from bzrlib.store import Store
27
30
from bzrlib.atomicfile import AtomicFile
28
 
 
29
 
 
30
 
 
31
 
 
32
 
class WeaveStore(object):
 
31
from bzrlib.errors import NoSuchFile
 
32
from bzrlib.trace import mutter
 
33
 
 
34
 
 
35
 
 
36
 
 
37
class WeaveStore(Store):
33
38
    """Collection of several weave files in a directory.
34
39
 
35
40
    This has some shortcuts for reading and writing them.
36
41
    """
37
 
    def __init__(self, dir, get_file=None):
38
 
        self._dir = dir
 
42
    FILE_SUFFIX = '.weave'
 
43
 
 
44
    def __init__(self, transport):
 
45
        self._transport = transport
39
46
        self._cache = {}
40
 
        self.enable_cache = False
41
 
        if get_file is not None:
42
 
            self.get_file = get_file
 
47
        self.enable_cache = False
43
48
 
44
 
    def get_file(self, filename):
45
 
        return file(filename, 'rb')
46
49
 
47
50
    def filename(self, file_id):
48
 
        return self._dir + os.sep + file_id + '.weave'
 
51
        """Return the path relative to the transport root."""
 
52
        return file_id + WeaveStore.FILE_SUFFIX
 
53
 
 
54
    def __iter__(self):
 
55
        l = len(WeaveStore.FILE_SUFFIX)
 
56
        for f in self._transport.list_dir('.'):
 
57
            if f.endswith(WeaveStore.FILE_SUFFIX):
 
58
                f = f[:-l]
 
59
                yield f
 
60
 
 
61
    def __contains__(self, fileid):
 
62
        """"""
 
63
        return self._transport.has(self.filename(fileid))
 
64
 
 
65
    def _get(self, file_id):
 
66
        return self._transport.get(self.filename(file_id))
 
67
 
 
68
    def _put(self, file_id, f):
 
69
        return self._transport.put(self.filename(file_id), f)
49
70
 
50
71
 
51
72
    def get_weave(self, file_id):
52
73
        if self.enable_cache:
53
74
            if file_id in self._cache:
54
75
                return self._cache[file_id]
55
 
        w = read_weave(self.get_file(self.filename(file_id)))
 
76
        w = read_weave(self._get(file_id))
56
77
        if self.enable_cache:
57
78
            self._cache[file_id] = w
58
79
        return w
69
90
    def get_weave_or_empty(self, file_id):
70
91
        """Return a weave, or an empty one if it doesn't exist.""" 
71
92
        try:
72
 
            inf = self.get_file(self.filename(file_id))
73
 
        except IOError, e:
74
 
            if e.errno == errno.ENOENT:
75
 
                return Weave(weave_name=file_id)
76
 
            else:
77
 
                raise
 
93
            inf = self._get(file_id)
 
94
        except NoSuchFile:
 
95
            return Weave(weave_name=file_id)
78
96
        else:
79
97
            return read_weave(inf)
80
98
    
81
99
 
82
 
    def put_empty_weave(self, file_id):
83
 
        self.put_weave(file_id, Weave())
84
 
 
85
 
 
86
100
    def put_weave(self, file_id, weave):
87
101
        """Write back a modified weave"""
88
102
        if self.enable_cache:
89
103
            self._cache[file_id] = weave
90
 
        weave_fn = self.filename(file_id)
91
 
        af = AtomicFile(weave_fn)
92
 
        try:
93
 
            write_weave_v5(weave, af)
94
 
            af.commit()
95
 
        finally:
96
 
            af.close()
 
104
 
 
105
        sio = StringIO()
 
106
        write_weave_v5(weave, sio)
 
107
        sio.seek(0)
 
108
 
 
109
        self._put(file_id, sio)
97
110
 
98
111
 
99
112
    def add_text(self, file_id, rev_id, new_lines, parents):
103
116
        self.put_weave(file_id, w)
104
117
        
105
118
     
 
119
    def copy_multi(self, from_store, file_ids):
 
120
        assert isinstance(from_store, WeaveStore)
 
121
        for f in file_ids:
 
122
            mutter("copy weave {%s} into %s", f, self)
 
123
            self._put(f, from_store._get(f))