/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
5590.1.6 by John Arbash Meinel
Found another tuned_gzip use in weaverepo
1
# Copyright (C) 2007-2011 Canonical Ltd
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
2
#
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.
7
#
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.
12
#
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
4183.7.1 by Sabin Iacob
update FSF mailing address
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
16
2803.2.1 by Robert Collins
* CommitBuilder now advertises itself as requiring the root entry to be
17
"""Deprecated weave-based repository formats.
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
18
2803.2.1 by Robert Collins
* CommitBuilder now advertises itself as requiring the root entry to be
19
Weave based formats scaled linearly with history size and could not represent
20
ghosts.
21
"""
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
22
5590.1.6 by John Arbash Meinel
Found another tuned_gzip use in weaverepo
23
import gzip
3350.6.4 by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores.
24
import os
25
from cStringIO import StringIO
26
import urllib
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
27
3224.5.1 by Andrew Bennetts
Lots of assorted hackery to reduce the number of imports for common operations. Improves 'rocks', 'st' and 'help' times by ~50ms on my laptop.
28
from bzrlib.lazy_import import lazy_import
29
lazy_import(globals(), """
30
from bzrlib import (
5582.10.44 by Jelmer Vernooij
Clean up patch.
31
    xml5,
32
    graph as _mod_graph,
33
    ui,
34
    )
35
""")
36
from bzrlib import (
5582.10.24 by Jelmer Vernooij
Fix imports.
37
    debug,
5582.10.44 by Jelmer Vernooij
Clean up patch.
38
    errors,
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
39
    lockable_files,
40
    lockdir,
2803.2.1 by Robert Collins
* CommitBuilder now advertises itself as requiring the root entry to be
41
    osutils,
5539.2.10 by Andrew Bennetts
s/NotInOtherForRev/NotInOtherForRevs/, and allow passing multiple revision_ids to search_missing_revision_ids.
42
    symbol_versioning,
5184.1.1 by Vincent Ladeuil
Random cleanups to catch up with copyright updates in trunk.
43
    trace,
5590.1.6 by John Arbash Meinel
Found another tuned_gzip use in weaverepo
44
    tuned_gzip,
3834.2.2 by Martin Pool
Deprecated LockableFiles._escape
45
    urlutils,
3350.6.4 by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores.
46
    versionedfile,
5582.10.24 by Jelmer Vernooij
Fix imports.
47
    weave,
5582.10.44 by Jelmer Vernooij
Clean up patch.
48
    weavefile,
49
    )
50
from bzrlib.decorators import needs_read_lock, needs_write_lock
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
51
from bzrlib.repository import (
2803.2.1 by Robert Collins
* CommitBuilder now advertises itself as requiring the root entry to be
52
    CommitBuilder,
5537.2.1 by Jelmer Vernooij
Move InterWeaveRepo and InterKnitRepo to related repository files.
53
    InterRepository,
54
    InterSameDataRepository,
3316.2.3 by Robert Collins
Remove manual notification of transaction finishing on versioned files.
55
    MetaDirVersionedFileRepository,
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
56
    MetaDirRepositoryFormat,
57
    Repository,
58
    RepositoryFormat,
59
    )
60
from bzrlib.store.text import TextStore
3350.6.4 by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores.
61
from bzrlib.versionedfile import (
62
    AbsentContentFactory,
63
    FulltextContentFactory,
64
    VersionedFiles,
65
    )
5582.10.23 by Jelmer Vernooij
Move bzrlib.weavefile.
66
5582.10.44 by Jelmer Vernooij
Clean up patch.
67
from bzrlib.plugins.weave_fmt import bzrdir as weave_bzrdir
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
68
5582.10.23 by Jelmer Vernooij
Move bzrlib.weavefile.
69
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
70
class AllInOneRepository(Repository):
71
    """Legacy support - the repository behaviour for all-in-one branches."""
72
3224.5.1 by Andrew Bennetts
Lots of assorted hackery to reduce the number of imports for common operations. Improves 'rocks', 'st' and 'help' times by ~50ms on my laptop.
73
    @property
74
    def _serializer(self):
75
        return xml5.serializer_v5
2241.1.8 by Martin Pool
Set the repository's serializer in the places it's needed, not in the base class
76
3834.2.2 by Martin Pool
Deprecated LockableFiles._escape
77
    def _escape(self, file_or_path):
78
        if not isinstance(file_or_path, basestring):
79
            file_or_path = '/'.join(file_or_path)
80
        if file_or_path == '':
81
            return u''
82
        return urlutils.escape(osutils.safe_unicode(file_or_path))
83
3350.6.4 by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores.
84
    def __init__(self, _format, a_bzrdir):
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
85
        # we reuse one control files instance.
3416.2.3 by Martin Pool
typo
86
        dir_mode = a_bzrdir._get_dir_mode()
87
        file_mode = a_bzrdir._get_file_mode()
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
88
89
        def get_store(name, compressed=True, prefixed=False):
90
            # FIXME: This approach of assuming stores are all entirely compressed
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
91
            # or entirely uncompressed is tidy, but breaks upgrade from
92
            # some existing branches where there's a mixture; we probably
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
93
            # still want the option to look for both.
3834.2.2 by Martin Pool
Deprecated LockableFiles._escape
94
            relpath = self._escape(name)
3407.2.13 by Martin Pool
Remove indirection through control_files to get transports
95
            store = TextStore(a_bzrdir.transport.clone(relpath),
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
96
                              prefixed=prefixed, compressed=compressed,
97
                              dir_mode=dir_mode,
98
                              file_mode=file_mode)
99
            return store
100
101
        # not broken out yet because the controlweaves|inventory_store
3350.6.4 by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores.
102
        # and texts bits are still different.
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
103
        if isinstance(_format, RepositoryFormat4):
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
104
            # cannot remove these - there is still no consistent api
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
105
            # which allows access to this old info.
106
            self.inventory_store = get_store('inventory-store')
3350.6.4 by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores.
107
            self._text_store = get_store('text-store')
108
        super(AllInOneRepository, self).__init__(_format, a_bzrdir, a_bzrdir._control_files)
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
109
2850.3.1 by Robert Collins
Move various weave specific code out of the base Repository class to weaverepo.py.
110
    @needs_read_lock
111
    def _all_possible_ids(self):
112
        """Return all the possible revisions that we could find."""
113
        if 'evil' in debug.debug_flags:
5184.1.1 by Vincent Ladeuil
Random cleanups to catch up with copyright updates in trunk.
114
            trace.mutter_callsite(
115
                3, "_all_possible_ids scales with size of history.")
3350.6.4 by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores.
116
        return [key[-1] for key in self.inventories.keys()]
2850.3.1 by Robert Collins
Move various weave specific code out of the base Repository class to weaverepo.py.
117
118
    @needs_read_lock
119
    def _all_revision_ids(self):
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
120
        """Returns a list of all the revision ids in the repository.
2850.3.1 by Robert Collins
Move various weave specific code out of the base Repository class to weaverepo.py.
121
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
122
        These are in as much topological order as the underlying store can
2850.3.1 by Robert Collins
Move various weave specific code out of the base Repository class to weaverepo.py.
123
        present: for weaves ghosts may lead to a lack of correctness until
124
        the reweave updates the parents list.
125
        """
3350.6.4 by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores.
126
        return [key[-1] for key in self.revisions.keys()]
127
128
    def _activate_new_inventory(self):
129
        """Put a replacement inventory.new into use as inventories."""
130
        # Copy the content across
131
        t = self.bzrdir._control_files._transport
132
        t.copy('inventory.new.weave', 'inventory.weave')
133
        # delete the temp inventory
134
        t.delete('inventory.new.weave')
135
        # Check we can parse the new weave properly as a sanity check
136
        self.inventories.keys()
137
138
    def _backup_inventory(self):
139
        t = self.bzrdir._control_files._transport
140
        t.copy('inventory.weave', 'inventory.backup.weave')
141
142
    def _temp_inventories(self):
143
        t = self.bzrdir._control_files._transport
144
        return self._format._get_inventories(t, self, 'inventory.new')
2850.3.1 by Robert Collins
Move various weave specific code out of the base Repository class to weaverepo.py.
145
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
146
    def get_commit_builder(self, branch, parents, config, timestamp=None,
147
                           timezone=None, committer=None, revprops=None,
148
                           revision_id=None):
149
        self._check_ascii_revisionid(revision_id, self.get_commit_builder)
3350.6.4 by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores.
150
        result = CommitBuilder(self, parents, config, timestamp, timezone,
2803.2.1 by Robert Collins
* CommitBuilder now advertises itself as requiring the root entry to be
151
                              committer, revprops, revision_id)
152
        self.start_write_group()
153
        return result
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
154
155
    @needs_read_lock
2850.3.1 by Robert Collins
Move various weave specific code out of the base Repository class to weaverepo.py.
156
    def get_revisions(self, revision_ids):
157
        revs = self._get_revisions(revision_ids)
158
        return revs
159
3350.6.4 by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores.
160
    def _inventory_add_lines(self, revision_id, parents, lines,
161
        check_content=True):
162
        """Store lines in inv_vf and return the sha1 of the inventory."""
163
        present_parents = self.get_graph().get_parent_map(parents)
164
        final_parents = []
165
        for parent in parents:
166
            if parent in present_parents:
167
                final_parents.append((parent,))
168
        return self.inventories.add_lines((revision_id,), final_parents, lines,
169
            check_content=check_content)[0]
3172.3.1 by Robert Collins
Repository has a new method ``has_revisions`` which signals the presence
170
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
171
    def is_shared(self):
172
        """AllInOne repositories cannot be shared."""
173
        return False
174
175
    @needs_write_lock
176
    def set_make_working_trees(self, new_value):
177
        """Set the policy flag for making working trees when creating branches.
178
179
        This only applies to branches that use this repository.
180
181
        The default is 'True'.
182
        :param new_value: True to restore the default, False to disable making
183
                          working trees.
184
        """
5158.6.10 by Martin Pool
Update more code to use user_transport when it should
185
        raise errors.RepositoryUpgradeRequired(self.user_url)
3349.1.1 by Aaron Bentley
Enable setting and getting make_working_trees for all repositories
186
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
187
    def make_working_trees(self):
188
        """Returns the policy for making working trees on new branches."""
189
        return True
190
2819.2.4 by Andrew Bennetts
Add a 'revision_graph_can_have_wrong_parents' method to repository.
191
    def revision_graph_can_have_wrong_parents(self):
192
        # XXX: This is an old format that we don't support full checking on, so
193
        # just claim that checking for this inconsistency is not required.
194
        return False
195
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
196
3316.2.3 by Robert Collins
Remove manual notification of transaction finishing on versioned files.
197
class WeaveMetaDirRepository(MetaDirVersionedFileRepository):
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
198
    """A subclass of MetaDirRepository to set weave specific policy."""
199
3565.3.1 by Robert Collins
* The generic fetch code now uses two attributes on Repository objects
200
    def __init__(self, _format, a_bzrdir, control_files):
201
        super(WeaveMetaDirRepository, self).__init__(_format, a_bzrdir, control_files)
4022.1.1 by Robert Collins
Refactoring of fetch to have a sender and sink component enabling splitting the logic over a network stream. (Robert Collins, Andrew Bennetts)
202
        self._serializer = _format._serializer
3565.3.1 by Robert Collins
* The generic fetch code now uses two attributes on Repository objects
203
2850.3.1 by Robert Collins
Move various weave specific code out of the base Repository class to weaverepo.py.
204
    @needs_read_lock
205
    def _all_possible_ids(self):
206
        """Return all the possible revisions that we could find."""
207
        if 'evil' in debug.debug_flags:
5184.1.1 by Vincent Ladeuil
Random cleanups to catch up with copyright updates in trunk.
208
            trace.mutter_callsite(
209
                3, "_all_possible_ids scales with size of history.")
3350.6.4 by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores.
210
        return [key[-1] for key in self.inventories.keys()]
2850.3.1 by Robert Collins
Move various weave specific code out of the base Repository class to weaverepo.py.
211
212
    @needs_read_lock
213
    def _all_revision_ids(self):
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
214
        """Returns a list of all the revision ids in the repository.
2850.3.1 by Robert Collins
Move various weave specific code out of the base Repository class to weaverepo.py.
215
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
216
        These are in as much topological order as the underlying store can
2850.3.1 by Robert Collins
Move various weave specific code out of the base Repository class to weaverepo.py.
217
        present: for weaves ghosts may lead to a lack of correctness until
218
        the reweave updates the parents list.
219
        """
3350.6.4 by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores.
220
        return [key[-1] for key in self.revisions.keys()]
221
222
    def _activate_new_inventory(self):
223
        """Put a replacement inventory.new into use as inventories."""
224
        # Copy the content across
225
        t = self._transport
226
        t.copy('inventory.new.weave', 'inventory.weave')
227
        # delete the temp inventory
228
        t.delete('inventory.new.weave')
229
        # Check we can parse the new weave properly as a sanity check
230
        self.inventories.keys()
231
232
    def _backup_inventory(self):
233
        t = self._transport
234
        t.copy('inventory.weave', 'inventory.backup.weave')
235
236
    def _temp_inventories(self):
237
        t = self._transport
238
        return self._format._get_inventories(t, self, 'inventory.new')
2850.3.1 by Robert Collins
Move various weave specific code out of the base Repository class to weaverepo.py.
239
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
240
    def get_commit_builder(self, branch, parents, config, timestamp=None,
241
                           timezone=None, committer=None, revprops=None,
242
                           revision_id=None):
243
        self._check_ascii_revisionid(revision_id, self.get_commit_builder)
3350.6.4 by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores.
244
        result = CommitBuilder(self, parents, config, timestamp, timezone,
2803.2.1 by Robert Collins
* CommitBuilder now advertises itself as requiring the root entry to be
245
                              committer, revprops, revision_id)
246
        self.start_write_group()
247
        return result
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
248
2850.3.1 by Robert Collins
Move various weave specific code out of the base Repository class to weaverepo.py.
249
    @needs_read_lock
250
    def get_revision(self, revision_id):
251
        """Return the Revision object for a named revision"""
252
        r = self.get_revision_reconcile(revision_id)
253
        return r
254
3350.6.4 by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores.
255
    def _inventory_add_lines(self, revision_id, parents, lines,
256
        check_content=True):
257
        """Store lines in inv_vf and return the sha1 of the inventory."""
258
        present_parents = self.get_graph().get_parent_map(parents)
259
        final_parents = []
260
        for parent in parents:
261
            if parent in present_parents:
262
                final_parents.append((parent,))
263
        return self.inventories.add_lines((revision_id,), final_parents, lines,
264
            check_content=check_content)[0]
3172.3.1 by Robert Collins
Repository has a new method ``has_revisions`` which signals the presence
265
2819.2.4 by Andrew Bennetts
Add a 'revision_graph_can_have_wrong_parents' method to repository.
266
    def revision_graph_can_have_wrong_parents(self):
267
        return False
268
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
269
270
class PreSplitOutRepositoryFormat(RepositoryFormat):
271
    """Base class for the pre split out repository formats."""
272
273
    rich_root_data = False
2323.5.17 by Martin Pool
Add supports_tree_reference to all repo formats (robert)
274
    supports_tree_reference = False
2949.1.2 by Robert Collins
* Fetch with pack repositories will no longer read the entire history graph.
275
    supports_ghosts = False
3221.3.1 by Robert Collins
* Repository formats have a new supported-feature attribute
276
    supports_external_lookups = False
4246.2.1 by Ian Clatworthy
supports_chks flag on repo formats & log tuning
277
    supports_chks = False
4053.1.4 by Robert Collins
Move the fetch control attributes from Repository to RepositoryFormat.
278
    _fetch_order = 'topological'
279
    _fetch_reconcile = True
4183.5.1 by Robert Collins
Add RepositoryFormat.fast_deltas to signal fast delta creation.
280
    fast_deltas = False
5674.1.1 by Jelmer Vernooij
Add supports_leave_lock flag to BranchFormat and RepositoryFormat.
281
    supports_leaving_lock = False
5684.2.1 by Jelmer Vernooij
Add bzrlib.tests.per_repository_vf.
282
    supports_full_versioned_files = True
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
283
284
    def initialize(self, a_bzrdir, shared=False, _internal=False):
2949.1.2 by Robert Collins
* Fetch with pack repositories will no longer read the entire history graph.
285
        """Create a weave repository."""
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
286
        if shared:
287
            raise errors.IncompatibleFormat(self, a_bzrdir._format)
288
289
        if not _internal:
290
            # always initialized when the bzrdir is.
291
            return self.open(a_bzrdir, _found=True)
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
292
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
293
        # Create an empty weave
294
        sio = StringIO()
5582.10.44 by Jelmer Vernooij
Clean up patch.
295
        weavefile.write_weave_v5(weave.Weave(), sio)
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
296
        empty_weave = sio.getvalue()
297
5184.1.1 by Vincent Ladeuil
Random cleanups to catch up with copyright updates in trunk.
298
        trace.mutter('creating repository in %s.', a_bzrdir.transport.base)
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
299
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
300
        # FIXME: RBC 20060125 don't peek under the covers
301
        # NB: no need to escape relative paths that are url safe.
302
        control_files = lockable_files.LockableFiles(a_bzrdir.transport,
3407.2.4 by Martin Pool
Small cleanups to initial creation of repository files
303
            'branch-lock', lockable_files.TransportLock)
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
304
        control_files.create_lock()
305
        control_files.lock_write()
3407.2.13 by Martin Pool
Remove indirection through control_files to get transports
306
        transport = a_bzrdir.transport
3407.2.4 by Martin Pool
Small cleanups to initial creation of repository files
307
        try:
308
            transport.mkdir_multi(['revision-store', 'weaves'],
3407.2.18 by Martin Pool
BzrDir takes responsibility for default file/dir modes
309
                mode=a_bzrdir._get_dir_mode())
310
            transport.put_bytes_non_atomic('inventory.weave', empty_weave,
311
                mode=a_bzrdir._get_file_mode())
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
312
        finally:
313
            control_files.unlock()
5107.3.1 by Marco Pantaleoni
Added the new hooks 'post_branch', 'post_switch' and 'post_repo_init',
314
        repository = self.open(a_bzrdir, _found=True)
315
        self._run_post_repo_init_hooks(repository, a_bzrdir, shared)
316
        return repository
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
317
318
    def open(self, a_bzrdir, _found=False):
319
        """See RepositoryFormat.open()."""
320
        if not _found:
321
            # we are being called directly and must probe.
322
            raise NotImplementedError
323
324
        repo_transport = a_bzrdir.get_repository_transport(None)
325
        control_files = a_bzrdir._control_files
3350.6.4 by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores.
326
        result = AllInOneRepository(_format=self, a_bzrdir=a_bzrdir)
327
        result.revisions = self._get_revisions(repo_transport, result)
328
        result.signatures = self._get_signatures(repo_transport, result)
329
        result.inventories = self._get_inventories(repo_transport, result)
330
        result.texts = self._get_texts(repo_transport, result)
4246.2.1 by Ian Clatworthy
supports_chks flag on repo formats & log tuning
331
        result.chk_bytes = None
3350.6.4 by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores.
332
        return result
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
333
5675.2.1 by Jelmer Vernooij
Add RepositoryFormat.is_deprecated(). This removes the need for
334
    def is_deprecated(self):
335
        return True
336
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
337
338
class RepositoryFormat4(PreSplitOutRepositoryFormat):
339
    """Bzr repository format 4.
340
341
    This repository format has:
342
     - flat stores
343
     - TextStores for texts, inventories,revisions.
344
345
    This format is deprecated: it indexes texts using a text id which is
346
    removed in format 5; initialization and write support for this format
347
    has been removed.
348
    """
349
5582.9.1 by Jelmer Vernooij
Add flag for 'supports_funky_characters'.
350
    supports_funky_characters = False
351
5582.10.44 by Jelmer Vernooij
Clean up patch.
352
    _matchingbzrdir = weave_bzrdir.BzrDirFormat4()
2241.1.11 by Martin Pool
Get rid of RepositoryFormat*_instance objects. Instead the format
353
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
354
    def get_format_description(self):
355
        """See RepositoryFormat.get_format_description()."""
356
        return "Repository format 4"
357
358
    def initialize(self, url, shared=False, _internal=False):
359
        """Format 4 branches cannot be created."""
360
        raise errors.UninitializableFormat(self)
361
362
    def is_supported(self):
363
        """Format 4 is not supported.
364
365
        It is not supported because the model changed from 4 to 5 and the
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
366
        conversion logic is expensive - so doing it on the fly was not
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
367
        feasible.
368
        """
369
        return False
370
3350.6.4 by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores.
371
    def _get_inventories(self, repo_transport, repo, name='inventory'):
372
        # No inventories store written so far.
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
373
        return None
3350.6.4 by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores.
374
375
    def _get_revisions(self, repo_transport, repo):
5582.10.56 by Jelmer Vernooij
move xml4 to weave plugin.
376
        from bzrlib.plugins.weave_fmt.xml4 import serializer_v4
3350.6.4 by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores.
377
        return RevisionTextStore(repo_transport.clone('revision-store'),
378
            serializer_v4, True, versionedfile.PrefixMapper(),
379
            repo.is_locked, repo.is_write_locked)
380
381
    def _get_signatures(self, repo_transport, repo):
382
        return SignatureTextStore(repo_transport.clone('revision-store'),
383
            False, versionedfile.PrefixMapper(),
384
            repo.is_locked, repo.is_write_locked)
385
386
    def _get_texts(self, repo_transport, repo):
387
        return None
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
388
389
390
class RepositoryFormat5(PreSplitOutRepositoryFormat):
391
    """Bzr control format 5.
392
393
    This repository format has:
394
     - weaves for file texts and inventory
395
     - flat stores
396
     - TextStores for revisions and signatures.
397
    """
398
5582.10.42 by Jelmer Vernooij
Some weave fixes.
399
    _versionedfile_class = weave.WeaveFile
5582.10.44 by Jelmer Vernooij
Clean up patch.
400
    _matchingbzrdir = weave_bzrdir.BzrDirFormat5()
5582.9.1 by Jelmer Vernooij
Add flag for 'supports_funky_characters'.
401
    supports_funky_characters = False
402
4022.1.1 by Robert Collins
Refactoring of fetch to have a sender and sink component enabling splitting the logic over a network stream. (Robert Collins, Andrew Bennetts)
403
    @property
404
    def _serializer(self):
405
        return xml5.serializer_v5
2241.1.10 by Martin Pool
Remove more references to weaves from the repository.py file
406
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
407
    def get_format_description(self):
408
        """See RepositoryFormat.get_format_description()."""
409
        return "Weave repository format 5"
4032.1.2 by John Arbash Meinel
Track down a few more files that have trailing whitespace.
410
3990.5.1 by Andrew Bennetts
Add network_name() to RepositoryFormat.
411
    def network_name(self):
3990.5.3 by Robert Collins
Docs and polish on RepositoryFormat.network_name.
412
        """The network name for this format is the control dirs disk label."""
3990.5.1 by Andrew Bennetts
Add network_name() to RepositoryFormat.
413
        return self._matchingbzrdir.get_format_string()
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
414
3350.6.4 by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores.
415
    def _get_inventories(self, repo_transport, repo, name='inventory'):
416
        mapper = versionedfile.ConstantMapper(name)
417
        return versionedfile.ThunkedVersionedFiles(repo_transport,
5582.10.42 by Jelmer Vernooij
Some weave fixes.
418
            weave.WeaveFile, mapper, repo.is_locked)
3350.6.4 by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores.
419
420
    def _get_revisions(self, repo_transport, repo):
421
        return RevisionTextStore(repo_transport.clone('revision-store'),
4022.1.1 by Robert Collins
Refactoring of fetch to have a sender and sink component enabling splitting the logic over a network stream. (Robert Collins, Andrew Bennetts)
422
            xml5.serializer_v5, False, versionedfile.PrefixMapper(),
3350.6.4 by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores.
423
            repo.is_locked, repo.is_write_locked)
424
425
    def _get_signatures(self, repo_transport, repo):
426
        return SignatureTextStore(repo_transport.clone('revision-store'),
427
            False, versionedfile.PrefixMapper(),
428
            repo.is_locked, repo.is_write_locked)
429
430
    def _get_texts(self, repo_transport, repo):
431
        mapper = versionedfile.PrefixMapper()
432
        base_transport = repo_transport.clone('weaves')
433
        return versionedfile.ThunkedVersionedFiles(base_transport,
5582.10.42 by Jelmer Vernooij
Some weave fixes.
434
            weave.WeaveFile, mapper, repo.is_locked)
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
435
5676.1.1 by Jelmer Vernooij
Add RepositoryFormat._get_extra_interrepo_test_combinations.
436
    def _get_extra_interrepo_test_combinations(self):
437
        from bzrlib.repofmt import knitrepo
438
        return [(InterRepository, RepositoryFormat5(),
439
            knitrepo.RepositoryFormatKnit3())]
440
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
441
442
class RepositoryFormat6(PreSplitOutRepositoryFormat):
443
    """Bzr control format 6.
444
445
    This repository format has:
446
     - weaves for file texts and inventory
447
     - hash subdirectory based stores.
448
     - TextStores for revisions and signatures.
449
    """
450
5582.10.42 by Jelmer Vernooij
Some weave fixes.
451
    _versionedfile_class = weave.WeaveFile
5582.10.44 by Jelmer Vernooij
Clean up patch.
452
    _matchingbzrdir = weave_bzrdir.BzrDirFormat6()
5582.9.1 by Jelmer Vernooij
Add flag for 'supports_funky_characters'.
453
    supports_funky_characters = False
4022.1.1 by Robert Collins
Refactoring of fetch to have a sender and sink component enabling splitting the logic over a network stream. (Robert Collins, Andrew Bennetts)
454
    @property
455
    def _serializer(self):
456
        return xml5.serializer_v5
2241.1.10 by Martin Pool
Remove more references to weaves from the repository.py file
457
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
458
    def get_format_description(self):
459
        """See RepositoryFormat.get_format_description()."""
460
        return "Weave repository format 6"
461
3990.5.1 by Andrew Bennetts
Add network_name() to RepositoryFormat.
462
    def network_name(self):
3990.5.3 by Robert Collins
Docs and polish on RepositoryFormat.network_name.
463
        """The network name for this format is the control dirs disk label."""
3990.5.1 by Andrew Bennetts
Add network_name() to RepositoryFormat.
464
        return self._matchingbzrdir.get_format_string()
465
3350.6.4 by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores.
466
    def _get_inventories(self, repo_transport, repo, name='inventory'):
467
        mapper = versionedfile.ConstantMapper(name)
468
        return versionedfile.ThunkedVersionedFiles(repo_transport,
5582.10.42 by Jelmer Vernooij
Some weave fixes.
469
            weave.WeaveFile, mapper, repo.is_locked)
3350.6.4 by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores.
470
471
    def _get_revisions(self, repo_transport, repo):
472
        return RevisionTextStore(repo_transport.clone('revision-store'),
4022.1.1 by Robert Collins
Refactoring of fetch to have a sender and sink component enabling splitting the logic over a network stream. (Robert Collins, Andrew Bennetts)
473
            xml5.serializer_v5, False, versionedfile.HashPrefixMapper(),
3350.6.4 by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores.
474
            repo.is_locked, repo.is_write_locked)
475
476
    def _get_signatures(self, repo_transport, repo):
477
        return SignatureTextStore(repo_transport.clone('revision-store'),
478
            False, versionedfile.HashPrefixMapper(),
479
            repo.is_locked, repo.is_write_locked)
480
481
    def _get_texts(self, repo_transport, repo):
482
        mapper = versionedfile.HashPrefixMapper()
483
        base_transport = repo_transport.clone('weaves')
484
        return versionedfile.ThunkedVersionedFiles(base_transport,
5582.10.42 by Jelmer Vernooij
Some weave fixes.
485
            weave.WeaveFile, mapper, repo.is_locked)
3350.6.4 by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores.
486
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
487
488
class RepositoryFormat7(MetaDirRepositoryFormat):
489
    """Bzr repository 7.
490
491
    This repository format has:
492
     - weaves for file texts and inventory
493
     - hash subdirectory based stores.
494
     - TextStores for revisions and signatures.
495
     - a format marker of its own
496
     - an optional 'shared-storage' flag
497
     - an optional 'no-working-trees' flag
498
    """
499
5582.10.42 by Jelmer Vernooij
Some weave fixes.
500
    _versionedfile_class = weave.WeaveFile
2949.1.2 by Robert Collins
* Fetch with pack repositories will no longer read the entire history graph.
501
    supports_ghosts = False
4246.2.1 by Ian Clatworthy
supports_chks flag on repo formats & log tuning
502
    supports_chks = False
5609.4.1 by Jelmer Vernooij
Mark RepositoryFormat7 as not supporting funky character file names. This should fix the tests on Windows.
503
    supports_funky_characters = False
5684.2.1 by Jelmer Vernooij
Add bzrlib.tests.per_repository_vf.
504
    supports_full_versioned_files = True
4246.2.1 by Ian Clatworthy
supports_chks flag on repo formats & log tuning
505
4053.1.4 by Robert Collins
Move the fetch control attributes from Repository to RepositoryFormat.
506
    _fetch_order = 'topological'
507
    _fetch_reconcile = True
4183.5.1 by Robert Collins
Add RepositoryFormat.fast_deltas to signal fast delta creation.
508
    fast_deltas = False
4022.1.1 by Robert Collins
Refactoring of fetch to have a sender and sink component enabling splitting the logic over a network stream. (Robert Collins, Andrew Bennetts)
509
    @property
510
    def _serializer(self):
511
        return xml5.serializer_v5
2241.1.10 by Martin Pool
Remove more references to weaves from the repository.py file
512
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
513
    def get_format_string(self):
514
        """See RepositoryFormat.get_format_string()."""
515
        return "Bazaar-NG Repository format 7"
516
517
    def get_format_description(self):
518
        """See RepositoryFormat.get_format_description()."""
519
        return "Weave repository format 7"
520
3350.6.4 by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores.
521
    def _get_inventories(self, repo_transport, repo, name='inventory'):
522
        mapper = versionedfile.ConstantMapper(name)
523
        return versionedfile.ThunkedVersionedFiles(repo_transport,
5582.10.42 by Jelmer Vernooij
Some weave fixes.
524
            weave.WeaveFile, mapper, repo.is_locked)
3350.6.4 by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores.
525
526
    def _get_revisions(self, repo_transport, repo):
527
        return RevisionTextStore(repo_transport.clone('revision-store'),
4022.1.1 by Robert Collins
Refactoring of fetch to have a sender and sink component enabling splitting the logic over a network stream. (Robert Collins, Andrew Bennetts)
528
            xml5.serializer_v5, True, versionedfile.HashPrefixMapper(),
3350.6.4 by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores.
529
            repo.is_locked, repo.is_write_locked)
530
531
    def _get_signatures(self, repo_transport, repo):
532
        return SignatureTextStore(repo_transport.clone('revision-store'),
533
            True, versionedfile.HashPrefixMapper(),
534
            repo.is_locked, repo.is_write_locked)
535
536
    def _get_texts(self, repo_transport, repo):
537
        mapper = versionedfile.HashPrefixMapper()
538
        base_transport = repo_transport.clone('weaves')
539
        return versionedfile.ThunkedVersionedFiles(base_transport,
5582.10.42 by Jelmer Vernooij
Some weave fixes.
540
            weave.WeaveFile, mapper, repo.is_locked)
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
541
542
    def initialize(self, a_bzrdir, shared=False):
543
        """Create a weave repository.
544
545
        :param shared: If true the repository will be initialized as a shared
546
                       repository.
547
        """
548
        # Create an empty weave
549
        sio = StringIO()
5582.10.44 by Jelmer Vernooij
Clean up patch.
550
        weavefile.write_weave_v5(weave.Weave(), sio)
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
551
        empty_weave = sio.getvalue()
552
5184.1.1 by Vincent Ladeuil
Random cleanups to catch up with copyright updates in trunk.
553
        trace.mutter('creating repository in %s.', a_bzrdir.transport.base)
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
554
        dirs = ['revision-store', 'weaves']
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
555
        files = [('inventory.weave', StringIO(empty_weave)),
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
556
                 ]
557
        utf8_files = [('format', self.get_format_string())]
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
558
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
559
        self._upload_blank_content(a_bzrdir, dirs, files, utf8_files, shared)
560
        return self.open(a_bzrdir=a_bzrdir, _found=True)
561
562
    def open(self, a_bzrdir, _found=False, _override_transport=None):
563
        """See RepositoryFormat.open().
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
564
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
565
        :param _override_transport: INTERNAL USE ONLY. Allows opening the
566
                                    repository at a slightly different url
567
                                    than normal. I.e. during 'upgrade'.
568
        """
569
        if not _found:
570
            format = RepositoryFormat.find_format(a_bzrdir)
571
        if _override_transport is not None:
572
            repo_transport = _override_transport
573
        else:
574
            repo_transport = a_bzrdir.get_repository_transport(None)
575
        control_files = lockable_files.LockableFiles(repo_transport,
576
                                'lock', lockdir.LockDir)
3350.6.4 by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores.
577
        result = WeaveMetaDirRepository(_format=self, a_bzrdir=a_bzrdir,
578
            control_files=control_files)
579
        result.revisions = self._get_revisions(repo_transport, result)
580
        result.signatures = self._get_signatures(repo_transport, result)
581
        result.inventories = self._get_inventories(repo_transport, result)
582
        result.texts = self._get_texts(repo_transport, result)
4246.2.1 by Ian Clatworthy
supports_chks flag on repo formats & log tuning
583
        result.chk_bytes = None
3350.6.4 by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores.
584
        result._transport = repo_transport
585
        return result
586
5675.2.1 by Jelmer Vernooij
Add RepositoryFormat.is_deprecated(). This removes the need for
587
    def is_deprecated(self):
588
        return True
589
3350.6.4 by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores.
590
591
class TextVersionedFiles(VersionedFiles):
592
    """Just-a-bunch-of-files based VersionedFile stores."""
593
594
    def __init__(self, transport, compressed, mapper, is_locked, can_write):
595
        self._compressed = compressed
596
        self._transport = transport
597
        self._mapper = mapper
598
        if self._compressed:
599
            self._ext = '.gz'
600
        else:
601
            self._ext = ''
602
        self._is_locked = is_locked
603
        self._can_write = can_write
604
605
    def add_lines(self, key, parents, lines):
606
        """Add a revision to the store."""
607
        if not self._is_locked():
608
            raise errors.ObjectNotLocked(self)
609
        if not self._can_write():
610
            raise errors.ReadOnlyError(self)
611
        if '/' in key[-1]:
3350.6.10 by Martin Pool
VersionedFiles review cleanups
612
            raise ValueError('bad idea to put / in %r' % (key,))
3350.6.4 by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores.
613
        text = ''.join(lines)
614
        if self._compressed:
5590.1.6 by John Arbash Meinel
Found another tuned_gzip use in weaverepo
615
            text = tuned_gzip.bytes_to_gzip(text)
3350.6.4 by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores.
616
        path = self._map(key)
617
        self._transport.put_bytes_non_atomic(path, text, create_parent_dir=True)
618
5195.3.26 by Parth Malwankar
reverted changes done to insert_record_stream API
619
    def insert_record_stream(self, stream):
3350.6.4 by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores.
620
        adapters = {}
621
        for record in stream:
622
            # Raise an error when a record is missing.
623
            if record.storage_kind == 'absent':
624
                raise errors.RevisionNotPresent([record.key[0]], self)
625
            # adapt to non-tuple interface
626
            if record.storage_kind == 'fulltext':
627
                self.add_lines(record.key, None,
628
                    osutils.split_lines(record.get_bytes_as('fulltext')))
629
            else:
630
                adapter_key = record.storage_kind, 'fulltext'
631
                try:
632
                    adapter = adapters[adapter_key]
633
                except KeyError:
634
                    adapter_factory = adapter_registry.get(adapter_key)
635
                    adapter = adapter_factory(self)
636
                    adapters[adapter_key] = adapter
637
                lines = osutils.split_lines(adapter.get_bytes(
638
                    record, record.get_bytes_as(record.storage_kind)))
639
                try:
640
                    self.add_lines(record.key, None, lines)
641
                except RevisionAlreadyPresent:
642
                    pass
643
644
    def _load_text(self, key):
645
        if not self._is_locked():
646
            raise errors.ObjectNotLocked(self)
647
        path = self._map(key)
648
        try:
649
            text = self._transport.get_bytes(path)
650
            compressed = self._compressed
651
        except errors.NoSuchFile:
652
            if self._compressed:
653
                # try without the .gz
654
                path = path[:-3]
655
                try:
656
                    text = self._transport.get_bytes(path)
657
                    compressed = False
658
                except errors.NoSuchFile:
659
                    return None
660
            else:
661
                return None
662
        if compressed:
5590.1.6 by John Arbash Meinel
Found another tuned_gzip use in weaverepo
663
            text = gzip.GzipFile(mode='rb', fileobj=StringIO(text)).read()
3350.6.4 by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores.
664
        return text
665
666
    def _map(self, key):
667
        return self._mapper.map(key) + self._ext
668
669
670
class RevisionTextStore(TextVersionedFiles):
671
    """Legacy thunk for format 4 repositories."""
672
673
    def __init__(self, transport, serializer, compressed, mapper, is_locked,
674
        can_write):
675
        """Create a RevisionTextStore at transport with serializer."""
676
        TextVersionedFiles.__init__(self, transport, compressed, mapper,
677
            is_locked, can_write)
678
        self._serializer = serializer
679
680
    def _load_text_parents(self, key):
681
        text = self._load_text(key)
682
        if text is None:
683
            return None, None
684
        parents = self._serializer.read_revision_from_string(text).parent_ids
685
        return text, tuple((parent,) for parent in parents)
686
687
    def get_parent_map(self, keys):
688
        result = {}
689
        for key in keys:
690
            parents = self._load_text_parents(key)[1]
691
            if parents is None:
692
                continue
693
            result[key] = parents
694
        return result
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
695
4593.5.34 by John Arbash Meinel
Change the KnownGraph.merge_sort api.
696
    def get_known_graph_ancestry(self, keys):
697
        """Get a KnownGraph instance with the ancestry of keys."""
698
        keys = self.keys()
699
        parent_map = self.get_parent_map(keys)
700
        kg = _mod_graph.KnownGraph(parent_map)
701
        return kg
702
3350.6.4 by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores.
703
    def get_record_stream(self, keys, sort_order, include_delta_closure):
704
        for key in keys:
705
            text, parents = self._load_text_parents(key)
706
            if text is None:
707
                yield AbsentContentFactory(key)
708
            else:
709
                yield FulltextContentFactory(key, parents, None, text)
710
711
    def keys(self):
712
        if not self._is_locked():
713
            raise errors.ObjectNotLocked(self)
714
        relpaths = set()
715
        for quoted_relpath in self._transport.iter_files_recursive():
716
            relpath = urllib.unquote(quoted_relpath)
717
            path, ext = os.path.splitext(relpath)
718
            if ext == '.gz':
719
                relpath = path
4695.2.1 by Vincent Ladeuil
Align RevisionTextStore and SignatureTextStore keys() definitions.
720
            if not relpath.endswith('.sig'):
3350.6.4 by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores.
721
                relpaths.add(relpath)
722
        paths = list(relpaths)
723
        return set([self._mapper.unmap(path) for path in paths])
724
725
726
class SignatureTextStore(TextVersionedFiles):
727
    """Legacy thunk for format 4-7 repositories."""
728
729
    def __init__(self, transport, compressed, mapper, is_locked, can_write):
730
        TextVersionedFiles.__init__(self, transport, compressed, mapper,
731
            is_locked, can_write)
732
        self._ext = '.sig' + self._ext
733
734
    def get_parent_map(self, keys):
735
        result = {}
736
        for key in keys:
737
            text = self._load_text(key)
738
            if text is None:
739
                continue
740
            result[key] = None
741
        return result
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
742
3350.6.4 by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores.
743
    def get_record_stream(self, keys, sort_order, include_delta_closure):
744
        for key in keys:
745
            text = self._load_text(key)
746
            if text is None:
747
                yield AbsentContentFactory(key)
748
            else:
749
                yield FulltextContentFactory(key, None, None, text)
750
751
    def keys(self):
752
        if not self._is_locked():
753
            raise errors.ObjectNotLocked(self)
754
        relpaths = set()
755
        for quoted_relpath in self._transport.iter_files_recursive():
756
            relpath = urllib.unquote(quoted_relpath)
757
            path, ext = os.path.splitext(relpath)
758
            if ext == '.gz':
759
                relpath = path
760
            if not relpath.endswith('.sig'):
761
                continue
762
            relpaths.add(relpath[:-4])
763
        paths = list(relpaths)
764
        return set([self._mapper.unmap(path) for path in paths])
2803.2.1 by Robert Collins
* CommitBuilder now advertises itself as requiring the root entry to be
765
5537.2.1 by Jelmer Vernooij
Move InterWeaveRepo and InterKnitRepo to related repository files.
766
767
class InterWeaveRepo(InterSameDataRepository):
768
    """Optimised code paths between Weave based repositories.
769
    """
770
771
    @classmethod
772
    def _get_repo_format_to_test(self):
773
        return RepositoryFormat7()
774
775
    @staticmethod
776
    def is_compatible(source, target):
777
        """Be compatible with known Weave formats.
778
779
        We don't test for the stores being of specific types because that
780
        could lead to confusing results, and there is no need to be
781
        overly general.
782
        """
783
        try:
784
            return (isinstance(source._format, (RepositoryFormat5,
785
                                                RepositoryFormat6,
786
                                                RepositoryFormat7)) and
787
                    isinstance(target._format, (RepositoryFormat5,
788
                                                RepositoryFormat6,
789
                                                RepositoryFormat7)))
790
        except AttributeError:
791
            return False
792
793
    @needs_write_lock
794
    def copy_content(self, revision_id=None):
795
        """See InterRepository.copy_content()."""
796
        # weave specific optimised path:
797
        try:
798
            self.target.set_make_working_trees(self.source.make_working_trees())
799
        except (errors.RepositoryUpgradeRequired, NotImplemented):
800
            pass
801
        # FIXME do not peek!
802
        if self.source._transport.listable():
803
            pb = ui.ui_factory.nested_progress_bar()
804
            try:
805
                self.target.texts.insert_record_stream(
806
                    self.source.texts.get_record_stream(
807
                        self.source.texts.keys(), 'topological', False))
808
                pb.update('Copying inventory', 0, 1)
809
                self.target.inventories.insert_record_stream(
810
                    self.source.inventories.get_record_stream(
811
                        self.source.inventories.keys(), 'topological', False))
812
                self.target.signatures.insert_record_stream(
813
                    self.source.signatures.get_record_stream(
814
                        self.source.signatures.keys(),
815
                        'unordered', True))
816
                self.target.revisions.insert_record_stream(
817
                    self.source.revisions.get_record_stream(
818
                        self.source.revisions.keys(),
819
                        'topological', True))
820
            finally:
821
                pb.finished()
822
        else:
823
            self.target.fetch(self.source, revision_id=revision_id)
824
825
    @needs_read_lock
5539.2.10 by Andrew Bennetts
s/NotInOtherForRev/NotInOtherForRevs/, and allow passing multiple revision_ids to search_missing_revision_ids.
826
    def search_missing_revision_ids(self,
827
            revision_id=symbol_versioning.DEPRECATED_PARAMETER,
5535.3.32 by Andrew Bennetts
Implement if_present_ids behaviour in all implementations and code paths of searching_missing_revision_ids
828
            find_ghosts=True, revision_ids=None, if_present_ids=None):
5539.2.10 by Andrew Bennetts
s/NotInOtherForRev/NotInOtherForRevs/, and allow passing multiple revision_ids to search_missing_revision_ids.
829
        """See InterRepository.search_missing_revision_ids()."""
5537.2.1 by Jelmer Vernooij
Move InterWeaveRepo and InterKnitRepo to related repository files.
830
        # we want all revisions to satisfy revision_id in source.
831
        # but we don't want to stat every file here and there.
832
        # we want then, all revisions other needs to satisfy revision_id
833
        # checked, but not those that we have locally.
834
        # so the first thing is to get a subset of the revisions to
835
        # satisfy revision_id in source, and then eliminate those that
836
        # we do already have.
837
        # this is slow on high latency connection to self, but as this
838
        # disk format scales terribly for push anyway due to rewriting
839
        # inventory.weave, this is considered acceptable.
840
        # - RBC 20060209
5539.2.10 by Andrew Bennetts
s/NotInOtherForRev/NotInOtherForRevs/, and allow passing multiple revision_ids to search_missing_revision_ids.
841
        if symbol_versioning.deprecated_passed(revision_id):
842
            symbol_versioning.warn(
843
                'search_missing_revision_ids(revision_id=...) was '
5536.3.3 by Andrew Bennetts
Merge lp:bzr.
844
                'deprecated in 2.4.  Use revision_ids=[...] instead.',
5539.2.10 by Andrew Bennetts
s/NotInOtherForRev/NotInOtherForRevs/, and allow passing multiple revision_ids to search_missing_revision_ids.
845
                DeprecationWarning, stacklevel=2)
846
            if revision_ids is not None:
847
                raise AssertionError(
848
                    'revision_ids is mutually exclusive with revision_id')
849
            if revision_id is not None:
850
                revision_ids = [revision_id]
851
        del revision_id
5535.3.32 by Andrew Bennetts
Implement if_present_ids behaviour in all implementations and code paths of searching_missing_revision_ids
852
        source_ids_set = self._present_source_revisions_for(
853
            revision_ids, if_present_ids)
5537.2.1 by Jelmer Vernooij
Move InterWeaveRepo and InterKnitRepo to related repository files.
854
        # source_ids is the worst possible case we may need to pull.
855
        # now we want to filter source_ids against what we actually
856
        # have in target, but don't try to check for existence where we know
857
        # we do not have a revision as that would be pointless.
858
        target_ids = set(self.target._all_possible_ids())
859
        possibly_present_revisions = target_ids.intersection(source_ids_set)
860
        actually_present_revisions = set(
861
            self.target._eliminate_revisions_not_present(possibly_present_revisions))
862
        required_revisions = source_ids_set.difference(actually_present_revisions)
5539.2.10 by Andrew Bennetts
s/NotInOtherForRev/NotInOtherForRevs/, and allow passing multiple revision_ids to search_missing_revision_ids.
863
        if revision_ids is not None:
5537.2.1 by Jelmer Vernooij
Move InterWeaveRepo and InterKnitRepo to related repository files.
864
            # we used get_ancestry to determine source_ids then we are assured all
865
            # revisions referenced are present as they are installed in topological order.
866
            # and the tip revision was validated by get_ancestry.
867
            result_set = required_revisions
868
        else:
869
            # if we just grabbed the possibly available ids, then
870
            # we only have an estimate of whats available and need to validate
871
            # that against the revision records.
872
            result_set = set(
873
                self.source._eliminate_revisions_not_present(required_revisions))
874
        return self.source.revision_ids_to_search_result(result_set)
875
876
877
InterRepository.register_optimiser(InterWeaveRepo)
5676.1.9 by Jelmer Vernooij
Fix existing implementation.
878
879
880
def get_extra_interrepo_test_combinations():
881
    from bzrlib.repofmt import knitrepo
882
    return [(InterRepository, RepositoryFormat5(),
883
        knitrepo.RepositoryFormatKnit3())]