~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/store/weave.py

  • Committer: Martin Pool
  • Date: 2005-09-30 03:38:47 UTC
  • mfrom: (1393.2.4)
  • mto: (1185.14.2)
  • mto: This revision was merged to the branch mainline in revision 1396.
  • Revision ID: mbp@sourcefrog.net-20050930033847-e78ce2a6670c1a29
- merge Transport from John into newformat

Show diffs side-by-side

added added

removed removed

Lines of Context:
24
24
 
25
25
from bzrlib.weavefile import read_weave, write_weave_v5
26
26
from bzrlib.weave import Weave
 
27
from bzrlib.store import Store
27
28
from bzrlib.atomicfile import AtomicFile
28
 
 
29
 
 
30
 
 
31
 
 
32
 
class WeaveStore(object):
 
29
from bzrlib.errors import NoSuchFile
 
30
 
 
31
from cStringIO import StringIO
 
32
 
 
33
 
 
34
 
 
35
class WeaveStore(Store):
33
36
    """Collection of several weave files in a directory.
34
37
 
35
38
    This has some shortcuts for reading and writing them.
36
39
    """
37
 
    def __init__(self, dir, get_file=None):
38
 
        self._dir = dir
 
40
    def __init__(self, transport):
 
41
        self._transport = transport
39
42
        self._cache = {}
40
 
        self.enable_cache = False
41
 
        if get_file is not None:
42
 
            self.get_file = get_file
 
43
        self.enable_cache = False
43
44
 
44
 
    def get_file(self, filename):
45
 
        return file(filename, 'rb')
46
45
 
47
46
    def filename(self, file_id):
48
 
        return self._dir + os.sep + file_id + '.weave'
 
47
        """Return the path relative to the transport root."""
 
48
        return file_id + '.weave'
 
49
 
 
50
    def _get(self, file_id):
 
51
        return self._transport.get(self.filename(file_id))
 
52
 
 
53
    def _put(self, file_id, f):
 
54
        return self._transport.put(self.filename(file_id), f)
49
55
 
50
56
 
51
57
    def get_weave(self, file_id):
52
58
        if self.enable_cache:
53
59
            if file_id in self._cache:
54
60
                return self._cache[file_id]
55
 
        w = read_weave(self.get_file(self.filename(file_id)))
 
61
        w = read_weave(self._get(file_id))
56
62
        if self.enable_cache:
57
63
            self._cache[file_id] = w
58
64
        return w
69
75
    def get_weave_or_empty(self, file_id):
70
76
        """Return a weave, or an empty one if it doesn't exist.""" 
71
77
        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
 
78
            inf = self._get(file_id)
 
79
        except NoSuchFile:
 
80
            return Weave(weave_name=file_id)
78
81
        else:
79
82
            return read_weave(inf)
80
83
    
81
84
 
82
 
    def put_empty_weave(self, file_id):
83
 
        self.put_weave(file_id, Weave())
84
 
 
85
 
 
86
85
    def put_weave(self, file_id, weave):
87
86
        """Write back a modified weave"""
88
87
        if self.enable_cache:
89
88
            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()
 
89
 
 
90
        sio = StringIO()
 
91
        write_weave_v5(weave, sio)
 
92
        sio.seek(0)
 
93
 
 
94
        self._put(file_id, sio)
97
95
 
98
96
 
99
97
    def add_text(self, file_id, rev_id, new_lines, parents):