/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
1608.2.1 by Martin Pool
[merge] Storage filename escaping
1
# Copyright (C) 2005, 2006 Canonical Ltd
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
2
#
1196 by Martin Pool
- [WIP] retrieve historical texts from weaves
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
7
#
1196 by Martin Pool
- [WIP] retrieve historical texts from weaves
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
12
#
1196 by Martin Pool
- [WIP] retrieve historical texts from weaves
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
1393.1.19 by Martin Pool
- add WeaveStore.__iter__, __contains__ and copy_multi()
17
# XXX: Some consideration of the problems that might occur if there are
18
# files whose id differs only in case.  That should probably be forbidden.
19
20
1471 by Robert Collins
Bugfix to previous url escaping patch - include weave stores
21
import errno
22
import os
1393.1.19 by Martin Pool
- add WeaveStore.__iter__, __contains__ and copy_multi()
23
from cStringIO import StringIO
1471 by Robert Collins
Bugfix to previous url escaping patch - include weave stores
24
import urllib
1773.4.1 by Martin Pool
Add pyflakes makefile target; fix many warnings
25
from warnings import warn
1223 by Martin Pool
- store inventories in weave
26
2294.1.10 by John Arbash Meinel
Switch all apis over to utf8 file ids. All tests pass
27
from bzrlib import (
28
    errors,
29
    osutils,
30
    )
1223 by Martin Pool
- store inventories in weave
31
from bzrlib.weavefile import read_weave, write_weave_v5
1608.2.1 by Martin Pool
[merge] Storage filename escaping
32
from bzrlib.weave import WeaveFile, Weave
1185.80.6 by John Arbash Meinel
Adding tests to make sure weave stores can retrieve the files they add.
33
from bzrlib.store import TransportStore
1223 by Martin Pool
- store inventories in weave
34
from bzrlib.atomicfile import AtomicFile
1773.4.1 by Martin Pool
Add pyflakes makefile target; fix many warnings
35
from bzrlib.symbol_versioning import (deprecated_method,
36
        zero_eight)
1393.1.19 by Martin Pool
- add WeaveStore.__iter__, __contains__ and copy_multi()
37
from bzrlib.trace import mutter
1185.80.10 by John Arbash Meinel
Adding progress indicators and improved get order for 'bzr branch'
38
import bzrlib.ui
1393.2.2 by John Arbash Meinel
Updated stores to use Transport
39
40
1563.2.16 by Robert Collins
Change WeaveStore into VersionedFileStore and make its versoined file class parameterisable.
41
class VersionedFileStore(TransportStore):
42
    """Collection of many versioned files in a transport."""
1393.1.19 by Martin Pool
- add WeaveStore.__iter__, __contains__ and copy_multi()
43
1651.1.1 by Martin Pool
[merge][wip] Storage escaping
44
    # TODO: Rather than passing versionedfile_kwargs, perhaps pass in a
45
    # transport factory callable?
1185.58.4 by John Arbash Meinel
Added permission checking to Branch, and propogated that change into the stores.
46
    def __init__(self, transport, prefixed=False, precious=False,
1563.2.16 by Robert Collins
Change WeaveStore into VersionedFileStore and make its versoined file class parameterisable.
47
                 dir_mode=None, file_mode=None,
1608.2.1 by Martin Pool
[merge] Storage filename escaping
48
                 versionedfile_class=WeaveFile,
1651.1.1 by Martin Pool
[merge][wip] Storage escaping
49
                 versionedfile_kwargs={},
1608.2.1 by Martin Pool
[merge] Storage filename escaping
50
                 escaped=False):
51
        super(VersionedFileStore, self).__init__(transport,
1185.58.4 by John Arbash Meinel
Added permission checking to Branch, and propogated that change into the stores.
52
                dir_mode=dir_mode, file_mode=file_mode,
1185.80.1 by John Arbash Meinel
Text store and weave store both allow escaping fileid paths.
53
                prefixed=prefixed, compressed=False, escaped=escaped)
1417.1.10 by Robert Collins
add a cache bound to Transactions, and a precious facility, so that we keep inventory.weave in memory, but can discard weaves for other such files.
54
        self._precious = precious
1563.2.16 by Robert Collins
Change WeaveStore into VersionedFileStore and make its versoined file class parameterisable.
55
        self._versionedfile_class = versionedfile_class
1628.1.4 by Robert Collins
Change knit format to use non-delta, non-annotated revisions and signatures.
56
        self._versionedfile_kwargs = versionedfile_kwargs
1196 by Martin Pool
- [WIP] retrieve historical texts from weaves
57
1563.2.25 by Robert Collins
Merge in upstream.
58
    def _clear_cache_id(self, file_id, transaction):
59
        """WARNING may lead to inconsistent object references for file_id.
60
61
        Remove file_id from the transaction map. 
62
63
        NOT in the transaction api because theres no reliable way to clear
64
        callers. So its here for very specialised use rather than having an
65
        'api' that isn't.
66
        """
67
        weave = transaction.map.find_weave(file_id)
1563.2.34 by Robert Collins
Remove the commit and rollback transaction methods as misleading, and implement a WriteTransaction
68
        if weave is not None:
1563.2.25 by Robert Collins
Merge in upstream.
69
            mutter("old data in transaction in %s for %s", self, file_id)
1563.2.34 by Robert Collins
Remove the commit and rollback transaction methods as misleading, and implement a WriteTransaction
70
            # FIXME abstraction violation - transaction now has stale data.
71
            transaction.map.remove_object(weave)
1196 by Martin Pool
- [WIP] retrieve historical texts from weaves
72
1223 by Martin Pool
- store inventories in weave
73
    def filename(self, file_id):
1393.2.2 by John Arbash Meinel
Updated stores to use Transport
74
        """Return the path relative to the transport root."""
2294.1.10 by John Arbash Meinel
Switch all apis over to utf8 file ids. All tests pass
75
        file_id = osutils.safe_file_id(file_id)
1608.2.1 by Martin Pool
[merge] Storage filename escaping
76
        return self._relpath(file_id)
1429 by Robert Collins
merge in niemeyers prefixed-store patch
77
1393.1.19 by Martin Pool
- add WeaveStore.__iter__, __contains__ and copy_multi()
78
    def __iter__(self):
1563.2.16 by Robert Collins
Change WeaveStore into VersionedFileStore and make its versoined file class parameterisable.
79
        suffixes = self._versionedfile_class.get_suffixes()
1563.2.15 by Robert Collins
remove the weavestore assumptions about the number and nature of files it manages.
80
        ids = set()
1479 by Robert Collins
More quoting at the transport layer bugfixes.
81
        for relpath in self._iter_files_recursive():
1563.2.15 by Robert Collins
remove the weavestore assumptions about the number and nature of files it manages.
82
            for suffix in suffixes:
83
                if relpath.endswith(suffix):
1608.2.1 by Martin Pool
[merge] Storage filename escaping
84
                    # TODO: use standard remove_suffix function
85
                    escaped_id = os.path.basename(relpath[:-len(suffix)])
86
                    file_id = self._unescape(escaped_id)
87
                    if file_id not in ids:
88
                        ids.add(file_id)
89
                        yield file_id
90
                    break # only one suffix can match
1393.1.19 by Martin Pool
- add WeaveStore.__iter__, __contains__ and copy_multi()
91
2294.1.10 by John Arbash Meinel
Switch all apis over to utf8 file ids. All tests pass
92
    def has_id(self, file_id):
93
        file_id = osutils.safe_file_id(file_id)
1563.2.16 by Robert Collins
Change WeaveStore into VersionedFileStore and make its versoined file class parameterisable.
94
        suffixes = self._versionedfile_class.get_suffixes()
2294.1.10 by John Arbash Meinel
Switch all apis over to utf8 file ids. All tests pass
95
        filename = self.filename(file_id)
1563.2.15 by Robert Collins
remove the weavestore assumptions about the number and nature of files it manages.
96
        for suffix in suffixes:
97
            if not self._transport.has(filename + suffix):
98
                return False
99
        return True
1223 by Martin Pool
- store inventories in weave
100
1563.2.25 by Robert Collins
Merge in upstream.
101
    def get_empty(self, file_id, transaction):
102
        """Get an empty weave, which implies deleting the existing one first."""
2294.1.10 by John Arbash Meinel
Switch all apis over to utf8 file ids. All tests pass
103
        file_id = osutils.safe_file_id(file_id)
1563.2.25 by Robert Collins
Merge in upstream.
104
        if self.has_id(file_id):
105
            self.delete(file_id, transaction)
106
        return self.get_weave_or_empty(file_id, transaction)
107
108
    def delete(self, file_id, transaction):
109
        """Remove file_id from the store."""
2294.1.10 by John Arbash Meinel
Switch all apis over to utf8 file ids. All tests pass
110
        file_id = osutils.safe_file_id(file_id)
1563.2.25 by Robert Collins
Merge in upstream.
111
        suffixes = self._versionedfile_class.get_suffixes()
112
        filename = self.filename(file_id)
113
        for suffix in suffixes:
114
            self._transport.delete(filename + suffix)
115
        self._clear_cache_id(file_id, transaction)
1393.2.2 by John Arbash Meinel
Updated stores to use Transport
116
117
    def _get(self, file_id):
118
        return self._transport.get(self.filename(file_id))
119
120
    def _put(self, file_id, f):
1185.80.6 by John Arbash Meinel
Adding tests to make sure weave stores can retrieve the files they add.
121
        fn = self.filename(file_id)
122
        try:
1955.3.9 by John Arbash Meinel
Find more occurrances of put() and replace with put_file or put_bytes
123
            return self._transport.put_file(fn, f, mode=self._file_mode)
1773.4.1 by Martin Pool
Add pyflakes makefile target; fix many warnings
124
        except errors.NoSuchFile:
1185.80.6 by John Arbash Meinel
Adding tests to make sure weave stores can retrieve the files they add.
125
            if not self._prefixed:
126
                raise
127
            self._transport.mkdir(os.path.dirname(fn), mode=self._dir_mode)
1955.3.9 by John Arbash Meinel
Find more occurrances of put() and replace with put_file or put_bytes
128
            return self._transport.put_file(fn, f, mode=self._file_mode)
1223 by Martin Pool
- store inventories in weave
129
1725.2.2 by Robert Collins
reduce file path escaping calls during commit.
130
    def get_weave(self, file_id, transaction, _filename=None):
131
        """Return the VersionedFile for file_id.
132
133
        :param _filename: filename that would be returned from self.filename for
134
        file_id. This is used to reduce duplicate filename calculations when
135
        using 'get_weave_or_empty'. FOR INTERNAL USE ONLY.
136
        """
2294.1.10 by John Arbash Meinel
Switch all apis over to utf8 file ids. All tests pass
137
        file_id = osutils.safe_file_id(file_id)
1417.1.8 by Robert Collins
use transactions in the weave store interface, which enables caching for log
138
        weave = transaction.map.find_weave(file_id)
1563.2.34 by Robert Collins
Remove the commit and rollback transaction methods as misleading, and implement a WriteTransaction
139
        if weave is not None:
1594.3.2 by Robert Collins
make trivial ranges work for HTTP really.
140
            #mutter("cache hit in %s for %s", self, file_id)
1417.1.8 by Robert Collins
use transactions in the weave store interface, which enables caching for log
141
            return weave
1725.2.2 by Robert Collins
reduce file path escaping calls during commit.
142
        if _filename is None:
143
            _filename = self.filename(file_id)
1594.2.23 by Robert Collins
Test versioned file storage handling of clean/dirty status for accessed versioned files.
144
        if transaction.writeable():
1725.2.2 by Robert Collins
reduce file path escaping calls during commit.
145
            w = self._versionedfile_class(_filename, self._transport, self._file_mode,
1628.1.4 by Robert Collins
Change knit format to use non-delta, non-annotated revisions and signatures.
146
                                          **self._versionedfile_kwargs)
1594.2.23 by Robert Collins
Test versioned file storage handling of clean/dirty status for accessed versioned files.
147
            transaction.map.add_weave(file_id, w)
148
            transaction.register_dirty(w)
149
        else:
1725.2.2 by Robert Collins
reduce file path escaping calls during commit.
150
            w = self._versionedfile_class(_filename,
1594.2.23 by Robert Collins
Test versioned file storage handling of clean/dirty status for accessed versioned files.
151
                                          self._transport,
152
                                          self._file_mode,
153
                                          create=False,
1628.1.4 by Robert Collins
Change knit format to use non-delta, non-annotated revisions and signatures.
154
                                          access_mode='r',
155
                                          **self._versionedfile_kwargs)
1594.2.23 by Robert Collins
Test versioned file storage handling of clean/dirty status for accessed versioned files.
156
            transaction.map.add_weave(file_id, w)
157
            transaction.register_clean(w, precious=self._precious)
1363 by Martin Pool
- add quick-and-dirty cache for weaves to speed check command
158
        return w
1262 by Martin Pool
- fetch should also copy ancestry records
159
1563.2.18 by Robert Collins
get knit repositories really using knits for text storage.
160
    @deprecated_method(zero_eight)
1417.1.8 by Robert Collins
use transactions in the weave store interface, which enables caching for log
161
    def get_lines(self, file_id, rev_id, transaction):
1262 by Martin Pool
- fetch should also copy ancestry records
162
        """Return text from a particular version of a weave.
163
1563.2.35 by Robert Collins
cleanup deprecation warnings and finish conversion so the inventory is knit based too.
164
        Returned as a list of lines.
165
        """
2294.1.10 by John Arbash Meinel
Switch all apis over to utf8 file ids. All tests pass
166
        file_id = osutils.safe_file_id(file_id)
1417.1.8 by Robert Collins
use transactions in the weave store interface, which enables caching for log
167
        w = self.get_weave(file_id, transaction)
1563.2.18 by Robert Collins
get knit repositories really using knits for text storage.
168
        return w.get_lines(rev_id)
1196 by Martin Pool
- [WIP] retrieve historical texts from weaves
169
    
1725.2.2 by Robert Collins
reduce file path escaping calls during commit.
170
    def _make_new_versionedfile(self, file_id, transaction,
171
        known_missing=False, _filename=None):
172
        """Make a new versioned file.
173
        
174
        :param _filename: filename that would be returned from self.filename for
175
        file_id. This is used to reduce duplicate filename calculations when
176
        using 'get_weave_or_empty'. FOR INTERNAL USE ONLY.
177
        """
178
        if not known_missing and self.has_id(file_id):
1563.2.34 by Robert Collins
Remove the commit and rollback transaction methods as misleading, and implement a WriteTransaction
179
            self.delete(file_id, transaction)
1725.2.2 by Robert Collins
reduce file path escaping calls during commit.
180
        if _filename is None:
181
            _filename = self.filename(file_id)
1563.2.14 by Robert Collins
Prepare weave store to delegate copy details to the versioned file.
182
        try:
1725.2.2 by Robert Collins
reduce file path escaping calls during commit.
183
            # we try without making the directory first because thats optimising
184
            # for the common case.
185
            weave = self._versionedfile_class(_filename, self._transport, self._file_mode, create=True,
1628.1.4 by Robert Collins
Change knit format to use non-delta, non-annotated revisions and signatures.
186
                                              **self._versionedfile_kwargs)
1773.4.1 by Martin Pool
Add pyflakes makefile target; fix many warnings
187
        except errors.NoSuchFile:
1563.2.14 by Robert Collins
Prepare weave store to delegate copy details to the versioned file.
188
            if not self._prefixed:
1725.2.2 by Robert Collins
reduce file path escaping calls during commit.
189
                # unexpected error - NoSuchFile is expected to be raised on a
190
                # missing dir only and that only occurs when we are prefixed.
1563.2.14 by Robert Collins
Prepare weave store to delegate copy details to the versioned file.
191
                raise
1608.2.1 by Martin Pool
[merge] Storage filename escaping
192
            self._transport.mkdir(self.hash_prefix(file_id), mode=self._dir_mode)
1725.2.2 by Robert Collins
reduce file path escaping calls during commit.
193
            weave = self._versionedfile_class(_filename, self._transport, 
1651.1.1 by Martin Pool
[merge][wip] Storage escaping
194
                                              self._file_mode, create=True,
1628.1.4 by Robert Collins
Change knit format to use non-delta, non-annotated revisions and signatures.
195
                                              **self._versionedfile_kwargs)
1563.2.14 by Robert Collins
Prepare weave store to delegate copy details to the versioned file.
196
        return weave
197
1417.1.8 by Robert Collins
use transactions in the weave store interface, which enables caching for log
198
    def get_weave_or_empty(self, file_id, transaction):
1725.2.2 by Robert Collins
reduce file path escaping calls during commit.
199
        """Return a weave, or an empty one if it doesn't exist."""
200
        # This is typically used from 'commit' and 'fetch/push/pull' where 
201
        # we scan across many versioned files once. As such the small overhead
202
        # of calculating the filename before doing a cache lookup is more than
203
        # compensated for by not calculating the filename when making new
204
        # versioned files.
2294.1.10 by John Arbash Meinel
Switch all apis over to utf8 file ids. All tests pass
205
        file_id = osutils.safe_file_id(file_id)
1725.2.2 by Robert Collins
reduce file path escaping calls during commit.
206
        _filename = self.filename(file_id)
1224 by Martin Pool
- new method WeaveStore.get_weave_or_empty
207
        try:
1725.2.2 by Robert Collins
reduce file path escaping calls during commit.
208
            return self.get_weave(file_id, transaction, _filename=_filename)
1773.4.1 by Martin Pool
Add pyflakes makefile target; fix many warnings
209
        except errors.NoSuchFile:
1725.2.2 by Robert Collins
reduce file path escaping calls during commit.
210
            weave = self._make_new_versionedfile(file_id, transaction,
211
                known_missing=True, _filename=_filename)
212
            transaction.map.add_weave(file_id, weave)
213
            # has to be dirty - its able to mutate on its own.
214
            transaction.register_dirty(weave)
215
            return weave
1224 by Martin Pool
- new method WeaveStore.get_weave_or_empty
216
1563.2.10 by Robert Collins
Change weave store to be a versioned store, using WeaveFiles which maintain integrity without needing explicit 'put' operations.
217
    @deprecated_method(zero_eight)
1417.1.8 by Robert Collins
use transactions in the weave store interface, which enables caching for log
218
    def put_weave(self, file_id, weave, transaction):
1563.2.10 by Robert Collins
Change weave store to be a versioned store, using WeaveFiles which maintain integrity without needing explicit 'put' operations.
219
        """This is a deprecated API: It writes an entire collection of ids out.
220
        
221
        This became inappropriate when we made a versioned file api which
222
        tracks the state of the collection of versions for a single id.
223
        
224
        Its maintained for backwards compatability but will only work on
225
        weave stores - pre 0.8 repositories.
226
        """
2294.1.10 by John Arbash Meinel
Switch all apis over to utf8 file ids. All tests pass
227
        file_id = osutils.safe_file_id(file_id)
1664.1.1 by Robert Collins
Bugfix: deprecated put_weave method was broken.
228
        self._put_weave(file_id, weave, transaction)
1563.2.10 by Robert Collins
Change weave store to be a versioned store, using WeaveFiles which maintain integrity without needing explicit 'put' operations.
229
230
    def _put_weave(self, file_id, weave, transaction):
231
        """Preserved here for upgrades-to-weaves to use."""
1563.2.34 by Robert Collins
Remove the commit and rollback transaction methods as misleading, and implement a WriteTransaction
232
        myweave = self._make_new_versionedfile(file_id, transaction)
1563.2.15 by Robert Collins
remove the weavestore assumptions about the number and nature of files it manages.
233
        myweave.join(weave)
1223 by Martin Pool
- store inventories in weave
234
1563.2.10 by Robert Collins
Change weave store to be a versioned store, using WeaveFiles which maintain integrity without needing explicit 'put' operations.
235
    @deprecated_method(zero_eight)
1417.1.8 by Robert Collins
use transactions in the weave store interface, which enables caching for log
236
    def add_text(self, file_id, rev_id, new_lines, parents, transaction):
1563.2.10 by Robert Collins
Change weave store to be a versioned store, using WeaveFiles which maintain integrity without needing explicit 'put' operations.
237
        """This method was a shorthand for 
238
239
        vfile = self.get_weave_or_empty(file_id, transaction)
240
        vfile.add_lines(rev_id, parents, new_lines)
241
        """
2294.1.10 by John Arbash Meinel
Switch all apis over to utf8 file ids. All tests pass
242
        file_id = osutils.safe_file_id(file_id)
1563.2.10 by Robert Collins
Change weave store to be a versioned store, using WeaveFiles which maintain integrity without needing explicit 'put' operations.
243
        vfile = self.get_weave_or_empty(file_id, transaction)
244
        vfile.add_lines(rev_id, parents, new_lines)
1223 by Martin Pool
- store inventories in weave
245
        
1563.2.10 by Robert Collins
Change weave store to be a versioned store, using WeaveFiles which maintain integrity without needing explicit 'put' operations.
246
    @deprecated_method(zero_eight)
1417.1.8 by Robert Collins
use transactions in the weave store interface, which enables caching for log
247
    def add_identical_text(self, file_id, old_rev_id, new_rev_id, parents,
248
                           transaction):
1563.2.10 by Robert Collins
Change weave store to be a versioned store, using WeaveFiles which maintain integrity without needing explicit 'put' operations.
249
        """This method was a shorthand for
250
251
        vfile = self.get_weave_or_empty(file_id, transaction)
252
        vfile.clone_text(new_rev_id, old_rev_id, parents)
253
        """
2294.1.10 by John Arbash Meinel
Switch all apis over to utf8 file ids. All tests pass
254
        file_id = osutils.safe_file_id(file_id)
255
        old_rev_id = osutils.safe_revision_id(old_rev_id)
256
        new_rev_id = osutils.safe_revision_id(new_rev_id)
1563.2.10 by Robert Collins
Change weave store to be a versioned store, using WeaveFiles which maintain integrity without needing explicit 'put' operations.
257
        vfile = self.get_weave_or_empty(file_id, transaction)
258
        vfile.clone_text(new_rev_id, old_rev_id, parents)
1563.2.25 by Robert Collins
Merge in upstream.
259
 
260
    def copy(self, source, result_id, transaction):
261
        """Copy the source versioned file to result_id in this store."""
262
        self._clear_cache_id(result_id, transaction)
263
        source.copy_to(self.filename(result_id), self._transport)
264
 
1563.2.34 by Robert Collins
Remove the commit and rollback transaction methods as misleading, and implement a WriteTransaction
265
    def copy_all_ids(self, store_from, pb=None, from_transaction=None,
266
                     to_transaction=None):
1563.2.14 by Robert Collins
Prepare weave store to delegate copy details to the versioned file.
267
        """Copy all the file ids from store_from into self."""
268
        if from_transaction is None:
1563.2.34 by Robert Collins
Remove the commit and rollback transaction methods as misleading, and implement a WriteTransaction
269
            warn("Please pass from_transaction into "
270
                 "versioned_store.copy_all_ids.", stacklevel=2)
271
        if to_transaction is None:
272
            warn("Please pass to_transaction into "
1563.2.14 by Robert Collins
Prepare weave store to delegate copy details to the versioned file.
273
                 "versioned_store.copy_all_ids.", stacklevel=2)
274
        if not store_from.listable():
1773.4.1 by Martin Pool
Add pyflakes makefile target; fix many warnings
275
            raise errors.UnlistableStore(store_from)
1563.2.14 by Robert Collins
Prepare weave store to delegate copy details to the versioned file.
276
        ids = []
277
        for count, file_id in enumerate(store_from):
278
            if pb:
279
                pb.update('listing files', count, count)
280
            ids.append(file_id)
281
        if pb:
282
            pb.clear()
283
        mutter('copy_all ids: %r', ids)
284
        self.copy_multi(store_from, ids, pb=pb,
1563.2.34 by Robert Collins
Remove the commit and rollback transaction methods as misleading, and implement a WriteTransaction
285
                        from_transaction=from_transaction,
286
                        to_transaction=to_transaction)
1563.2.14 by Robert Collins
Prepare weave store to delegate copy details to the versioned file.
287
1563.2.34 by Robert Collins
Remove the commit and rollback transaction methods as misleading, and implement a WriteTransaction
288
    def copy_multi(self, from_store, file_ids, pb=None, from_transaction=None,
289
                   to_transaction=None):
1563.2.14 by Robert Collins
Prepare weave store to delegate copy details to the versioned file.
290
        """Copy all the versions for multiple file_ids from from_store.
291
        
292
        :param from_transaction: required current transaction in from_store.
293
        """
1563.2.34 by Robert Collins
Remove the commit and rollback transaction methods as misleading, and implement a WriteTransaction
294
        from bzrlib.transactions import PassThroughTransaction
1393.1.19 by Martin Pool
- add WeaveStore.__iter__, __contains__ and copy_multi()
295
        assert isinstance(from_store, WeaveStore)
1563.2.14 by Robert Collins
Prepare weave store to delegate copy details to the versioned file.
296
        if from_transaction is None:
297
            warn("WeaveStore.copy_multi without a from_transaction parameter "
298
                 "is deprecated. Please provide a from_transaction.",
299
                 DeprecationWarning,
300
                 stacklevel=2)
1563.2.34 by Robert Collins
Remove the commit and rollback transaction methods as misleading, and implement a WriteTransaction
301
            # we are reading one object - caching is irrelevant.
302
            from_transaction = PassThroughTransaction()
303
        if to_transaction is None:
304
            warn("WeaveStore.copy_multi without a to_transaction parameter "
305
                 "is deprecated. Please provide a to_transaction.",
306
                 DeprecationWarning,
307
                 stacklevel=2)
308
            # we are copying single objects, and there may be open tranasactions
309
            # so again with the passthrough
310
            to_transaction = PassThroughTransaction()
1608.2.1 by Martin Pool
[merge] Storage filename escaping
311
        pb = bzrlib.ui.ui_factory.nested_progress_bar()
2127.1.1 by John Arbash Meinel
use try/finally to clean up a nested progress bar during weave fetching
312
        try:
2294.1.10 by John Arbash Meinel
Switch all apis over to utf8 file ids. All tests pass
313
            file_ids = [osutils.safe_file_id(f) for f in file_ids]
2127.1.1 by John Arbash Meinel
use try/finally to clean up a nested progress bar during weave fetching
314
            for count, f in enumerate(file_ids):
315
                mutter("copy weave {%s} into %s", f, self)
316
                pb.update('copy', count, len(file_ids))
317
                # if we have it in cache, its faster.
318
                # joining is fast with knits, and bearable for weaves -
319
                # indeed the new case can be optimised if needed.
320
                target = self._make_new_versionedfile(f, to_transaction)
321
                target.join(from_store.get_weave(f, from_transaction))
322
        finally:
323
            pb.finished()
1563.2.16 by Robert Collins
Change WeaveStore into VersionedFileStore and make its versoined file class parameterisable.
324
1563.2.31 by Robert Collins
Convert Knit repositories to use knits.
325
    def total_size(self):
326
        count, bytes =  super(VersionedFileStore, self).total_size()
327
        return (count / len(self._versionedfile_class.get_suffixes())), bytes
1563.2.16 by Robert Collins
Change WeaveStore into VersionedFileStore and make its versoined file class parameterisable.
328
329
WeaveStore = VersionedFileStore