~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 21:51:29 UTC
  • mfrom: (1396)
  • mto: This revision was merged to the branch mainline in revision 1397.
  • Revision ID: robertc@robertcollins.net-20051002215128-5686c7d24bf9bdb9
merge from martins newformat branch - brings in transport abstraction

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):
107
120
        parent_idxs = map(w.lookup, parents)
108
121
        w.add_identical(old_rev_id, new_rev_id, parent_idxs)
109
122
        self.put_weave(file_id, w)
 
123
     
 
124
    def copy_multi(self, from_store, file_ids):
 
125
        assert isinstance(from_store, WeaveStore)
 
126
        for f in file_ids:
 
127
            mutter("copy weave {%s} into %s", f, self)
 
128
            self._put(f, from_store._get(f))