~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 05:15:03 UTC
  • mto: (1185.14.2)
  • mto: This revision was merged to the branch mainline in revision 1396.
  • Revision ID: mbp@sourcefrog.net-20050930051503-9c049325215ddd1c
- fix up Branch.open_downlevel for Transport

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#! /usr/bin/python
 
2
 
 
3
# Copyright (C) 2005 Canonical Ltd
 
4
 
 
5
# This program is free software; you can redistribute it and/or modify
 
6
# it under the terms of the GNU General Public License as published by
 
7
# the Free Software Foundation; either version 2 of the License, or
 
8
# (at your option) any later version.
 
9
 
 
10
# This program is distributed in the hope that it will be useful,
 
11
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 
12
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
13
# GNU General Public License for more details.
 
14
 
 
15
# You should have received a copy of the GNU General Public License
 
16
# along with this program; if not, write to the Free Software
 
17
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
18
 
 
19
# Author: Martin Pool <mbp@canonical.com>
 
20
 
 
21
 
 
22
import os
 
23
import errno
 
24
 
 
25
from bzrlib.weavefile import read_weave, write_weave_v5
 
26
from bzrlib.weave import Weave
 
27
from bzrlib.store import Store
 
28
from bzrlib.atomicfile import AtomicFile
 
29
from bzrlib.errors import NoSuchFile
 
30
 
 
31
from cStringIO import StringIO
 
32
 
 
33
 
 
34
 
 
35
class WeaveStore(Store):
 
36
    """Collection of several weave files in a directory.
 
37
 
 
38
    This has some shortcuts for reading and writing them.
 
39
    """
 
40
    def __init__(self, transport):
 
41
        self._transport = transport
 
42
        self._cache = {}
 
43
        self.enable_cache = False
 
44
 
 
45
 
 
46
    def filename(self, file_id):
 
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)
 
55
 
 
56
 
 
57
    def get_weave(self, file_id):
 
58
        if self.enable_cache:
 
59
            if file_id in self._cache:
 
60
                return self._cache[file_id]
 
61
        w = read_weave(self._get(file_id))
 
62
        if self.enable_cache:
 
63
            self._cache[file_id] = w
 
64
        return w
 
65
 
 
66
 
 
67
    def get_lines(self, file_id, rev_id):
 
68
        """Return text from a particular version of a weave.
 
69
 
 
70
        Returned as a list of lines."""
 
71
        w = self.get_weave(file_id)
 
72
        return w.get(w.lookup(rev_id))
 
73
    
 
74
 
 
75
    def get_weave_or_empty(self, file_id):
 
76
        """Return a weave, or an empty one if it doesn't exist.""" 
 
77
        try:
 
78
            inf = self._get(file_id)
 
79
        except NoSuchFile:
 
80
            return Weave(weave_name=file_id)
 
81
        else:
 
82
            return read_weave(inf)
 
83
    
 
84
 
 
85
    def put_weave(self, file_id, weave):
 
86
        """Write back a modified weave"""
 
87
        if self.enable_cache:
 
88
            self._cache[file_id] = weave
 
89
 
 
90
        sio = StringIO()
 
91
        write_weave_v5(weave, sio)
 
92
        sio.seek(0)
 
93
 
 
94
        self._put(file_id, sio)
 
95
 
 
96
 
 
97
    def add_text(self, file_id, rev_id, new_lines, parents):
 
98
        w = self.get_weave_or_empty(file_id)
 
99
        parent_idxs = map(w.lookup, parents)
 
100
        w.add(rev_id, parent_idxs, new_lines)
 
101
        self.put_weave(file_id, w)
 
102
        
 
103