bzr branch
http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
| 
4634.127.4
by John Arbash Meinel
 pass the to-be-obsoleted packs into _save_pack_names for 2a repos.  | 
1  | 
# Copyright (C) 2008, 2009, 2010 Canonical Ltd
 | 
| 
3735.31.2
by John Arbash Meinel
 Cleanup trailing whitespace, get test_source to pass by removing asserts.  | 
2  | 
#
 | 
| 
0.17.9
by Robert Collins
 Initial stab at repository format support.  | 
3  | 
# This program is free software; you can redistribute it and/or modify
 | 
| 
3735.31.2
by John Arbash Meinel
 Cleanup trailing whitespace, get test_source to pass by removing asserts.  | 
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  | 
#
 | 
|
| 
0.17.9
by Robert Collins
 Initial stab at repository format support.  | 
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.
 | 
|
| 
3735.31.2
by John Arbash Meinel
 Cleanup trailing whitespace, get test_source to pass by removing asserts.  | 
12  | 
#
 | 
| 
0.17.9
by Robert Collins
 Initial stab at repository format support.  | 
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
 | 
|
| 
3735.36.3
by John Arbash Meinel
 Add the new address for FSF to the new files.  | 
15  | 
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 | 
| 
0.17.9
by Robert Collins
 Initial stab at repository format support.  | 
16  | 
|
| 
4277.2.1
by Vincent Ladeuil
 Fix misleading signature and one typo.  | 
17  | 
"""Repository formats using CHK inventories and groupcompress compression."""
 | 
| 
0.17.9
by Robert Collins
 Initial stab at repository format support.  | 
18  | 
|
19  | 
import time  | 
|
20  | 
||
| 
0.20.19
by John Arbash Meinel
 Groupcompress now supports 'autopack' and 'pack'.  | 
21  | 
from bzrlib import (  | 
| 
3735.31.16
by John Arbash Meinel
 Add _get_matching_bzrdir methods to all of the GC Formats.  | 
22  | 
bzrdir,  | 
| 
3735.31.3
by John Arbash Meinel
 Rename gc_repo to groupcompress_repo, start trying to remove some of the special casing and get tests passing.  | 
23  | 
chk_map,  | 
| 
3735.31.4
by John Arbash Meinel
 Continue trying to reduce the friction for the groupcompress repo formats.  | 
24  | 
chk_serializer,  | 
| 
0.20.19
by John Arbash Meinel
 Groupcompress now supports 'autopack' and 'pack'.  | 
25  | 
debug,  | 
26  | 
errors,  | 
|
| 
3735.31.15
by John Arbash Meinel
 A bit more refactoring, try to clean up the _execute_packs code.  | 
27  | 
index as _mod_index,  | 
| 
3735.31.2
by John Arbash Meinel
 Cleanup trailing whitespace, get test_source to pass by removing asserts.  | 
28  | 
inventory,  | 
| 
0.20.19
by John Arbash Meinel
 Groupcompress now supports 'autopack' and 'pack'.  | 
29  | 
knit,  | 
| 
3735.31.2
by John Arbash Meinel
 Cleanup trailing whitespace, get test_source to pass by removing asserts.  | 
30  | 
osutils,  | 
| 
0.20.19
by John Arbash Meinel
 Groupcompress now supports 'autopack' and 'pack'.  | 
31  | 
pack,  | 
| 
4241.6.8
by Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil
 Add --development6-rich-root, disabling the legacy and unneeded development2 format, and activating the tests for CHK features disabled pending this format. (Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil)  | 
32  | 
remote,  | 
| 
3735.31.27
by John Arbash Meinel
 Implement GCCHKReconcilePacker.  | 
33  | 
revision as _mod_revision,  | 
| 
0.23.28
by John Arbash Meinel
 Gotta import 'trace' if you want to use trace.mutter()  | 
34  | 
trace,  | 
| 
0.20.19
by John Arbash Meinel
 Groupcompress now supports 'autopack' and 'pack'.  | 
35  | 
ui,  | 
36  | 
    )
 | 
|
| 
4241.6.8
by Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil
 Add --development6-rich-root, disabling the legacy and unneeded development2 format, and activating the tests for CHK features disabled pending this format. (Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil)  | 
37  | 
from bzrlib.btree_index import (  | 
38  | 
BTreeGraphIndex,  | 
|
39  | 
BTreeBuilder,  | 
|
40  | 
    )
 | 
|
| 
3735.31.1
by John Arbash Meinel
 Bring the groupcompress plugin into the brisbane-core branch.  | 
41  | 
from bzrlib.groupcompress import (  | 
| 
0.17.9
by Robert Collins
 Initial stab at repository format support.  | 
42  | 
_GCGraphIndex,  | 
43  | 
GroupCompressVersionedFiles,  | 
|
44  | 
    )
 | 
|
45  | 
from bzrlib.repofmt.pack_repo import (  | 
|
46  | 
Pack,  | 
|
47  | 
NewPack,  | 
|
48  | 
KnitPackRepository,  | 
|
| 
4360.4.4
by John Arbash Meinel
 (broken) In the middle of creating an 'optimal' knit streamer.  | 
49  | 
KnitPackStreamSource,  | 
| 
3735.31.9
by John Arbash Meinel
 Setting the _commit_builder_class makes commit with rich_root_data=True work.  | 
50  | 
PackRootCommitBuilder,  | 
| 
0.17.9
by Robert Collins
 Initial stab at repository format support.  | 
51  | 
RepositoryPackCollection,  | 
| 
4241.6.8
by Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil
 Add --development6-rich-root, disabling the legacy and unneeded development2 format, and activating the tests for CHK features disabled pending this format. (Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil)  | 
52  | 
RepositoryFormatPack,  | 
| 
4343.3.2
by John Arbash Meinel
 All stacking tests seem to be passing for dev6 repos  | 
53  | 
ResumedPack,  | 
| 
0.17.9
by Robert Collins
 Initial stab at repository format support.  | 
54  | 
Packer,  | 
| 
0.17.25
by Robert Collins
 Preliminary --gc-plain-chk support.  | 
55  | 
    )
 | 
| 
4679.9.4
by John Arbash Meinel
 A bit broken, but getting there.  | 
56  | 
from bzrlib.static_tuple import StaticTuple  | 
| 
0.17.9
by Robert Collins
 Initial stab at repository format support.  | 
57  | 
|
58  | 
||
59  | 
class GCPack(NewPack):  | 
|
60  | 
||
| 
0.17.22
by Robert Collins
 really get gc working with 1.10  | 
61  | 
def __init__(self, pack_collection, upload_suffix='', file_mode=None):  | 
| 
0.17.9
by Robert Collins
 Initial stab at repository format support.  | 
62  | 
"""Create a NewPack instance.  | 
63  | 
||
| 
0.20.30
by Ian Clatworthy
 repofmt.py code cleanups  | 
64  | 
        :param pack_collection: A PackCollection into which this is being
 | 
65  | 
            inserted.
 | 
|
| 
0.17.9
by Robert Collins
 Initial stab at repository format support.  | 
66  | 
        :param upload_suffix: An optional suffix to be given to any temporary
 | 
67  | 
            files created during the pack creation. e.g '.autopack'
 | 
|
68  | 
        :param file_mode: An optional file mode to create the new files with.
 | 
|
69  | 
        """
 | 
|
| 
3735.31.5
by John Arbash Meinel
 Move some of the monkey patching into the correct locations.  | 
70  | 
        # replaced from NewPack to:
 | 
| 
0.17.25
by Robert Collins
 Preliminary --gc-plain-chk support.  | 
71  | 
        # - change inventory reference list length to 1
 | 
72  | 
        # - change texts reference lists to 1
 | 
|
| 
3735.31.5
by John Arbash Meinel
 Move some of the monkey patching into the correct locations.  | 
73  | 
        # TODO: patch this to be parameterised
 | 
| 
3735.31.2
by John Arbash Meinel
 Cleanup trailing whitespace, get test_source to pass by removing asserts.  | 
74  | 
|
| 
0.17.9
by Robert Collins
 Initial stab at repository format support.  | 
75  | 
        # The relative locations of the packs are constrained, but all are
 | 
76  | 
        # passed in because the caller has them, so as to avoid object churn.
 | 
|
| 
0.17.22
by Robert Collins
 really get gc working with 1.10  | 
77  | 
index_builder_class = pack_collection._index_builder_class  | 
| 
3735.31.4
by John Arbash Meinel
 Continue trying to reduce the friction for the groupcompress repo formats.  | 
78  | 
        # from brisbane-core
 | 
79  | 
if pack_collection.chk_index is not None:  | 
|
80  | 
chk_index = index_builder_class(reference_lists=0)  | 
|
| 
0.17.25
by Robert Collins
 Preliminary --gc-plain-chk support.  | 
81  | 
else:  | 
| 
3735.31.4
by John Arbash Meinel
 Continue trying to reduce the friction for the groupcompress repo formats.  | 
82  | 
chk_index = None  | 
83  | 
Pack.__init__(self,  | 
|
84  | 
            # Revisions: parents list, no text compression.
 | 
|
85  | 
index_builder_class(reference_lists=1),  | 
|
86  | 
            # Inventory: We want to map compression only, but currently the
 | 
|
87  | 
            # knit code hasn't been updated enough to understand that, so we
 | 
|
88  | 
            # have a regular 2-list index giving parents and compression
 | 
|
89  | 
            # source.
 | 
|
90  | 
index_builder_class(reference_lists=1),  | 
|
| 
4371.2.2
by Vincent Ladeuil
 Fix comment as per John's review.  | 
91  | 
            # Texts: per file graph, for all fileids - so one reference list
 | 
92  | 
            # and two elements in the key tuple.
 | 
|
| 
3735.31.4
by John Arbash Meinel
 Continue trying to reduce the friction for the groupcompress repo formats.  | 
93  | 
index_builder_class(reference_lists=1, key_elements=2),  | 
94  | 
            # Signatures: Just blobs to store, no compression, no parents
 | 
|
95  | 
            # listing.
 | 
|
96  | 
index_builder_class(reference_lists=0),  | 
|
97  | 
            # CHK based storage - just blobs, no compression or parents.
 | 
|
98  | 
chk_index=chk_index  | 
|
99  | 
            )
 | 
|
| 
0.17.22
by Robert Collins
 really get gc working with 1.10  | 
100  | 
self._pack_collection = pack_collection  | 
101  | 
        # When we make readonly indices, we need this.
 | 
|
102  | 
self.index_class = pack_collection._index_class  | 
|
| 
0.17.9
by Robert Collins
 Initial stab at repository format support.  | 
103  | 
        # where should the new pack be opened
 | 
| 
0.17.22
by Robert Collins
 really get gc working with 1.10  | 
104  | 
self.upload_transport = pack_collection._upload_transport  | 
| 
0.17.9
by Robert Collins
 Initial stab at repository format support.  | 
105  | 
        # where are indices written out to
 | 
| 
0.17.22
by Robert Collins
 really get gc working with 1.10  | 
106  | 
self.index_transport = pack_collection._index_transport  | 
| 
0.17.9
by Robert Collins
 Initial stab at repository format support.  | 
107  | 
        # where is the pack renamed to when it is finished?
 | 
| 
0.17.22
by Robert Collins
 really get gc working with 1.10  | 
108  | 
self.pack_transport = pack_collection._pack_transport  | 
| 
0.17.9
by Robert Collins
 Initial stab at repository format support.  | 
109  | 
        # What file mode to upload the pack and indices with.
 | 
110  | 
self._file_mode = file_mode  | 
|
111  | 
        # tracks the content written to the .pack file.
 | 
|
| 
3735.31.2
by John Arbash Meinel
 Cleanup trailing whitespace, get test_source to pass by removing asserts.  | 
112  | 
self._hash = osutils.md5()  | 
| 
0.17.9
by Robert Collins
 Initial stab at repository format support.  | 
113  | 
        # a four-tuple with the length in bytes of the indices, once the pack
 | 
114  | 
        # is finalised. (rev, inv, text, sigs)
 | 
|
115  | 
self.index_sizes = None  | 
|
116  | 
        # How much data to cache when writing packs. Note that this is not
 | 
|
117  | 
        # synchronised with reads, because it's not in the transport layer, so
 | 
|
118  | 
        # is not safe unless the client knows it won't be reading from the pack
 | 
|
119  | 
        # under creation.
 | 
|
120  | 
self._cache_limit = 0  | 
|
121  | 
        # the temporary pack file name.
 | 
|
| 
3735.31.2
by John Arbash Meinel
 Cleanup trailing whitespace, get test_source to pass by removing asserts.  | 
122  | 
self.random_name = osutils.rand_chars(20) + upload_suffix  | 
| 
0.17.9
by Robert Collins
 Initial stab at repository format support.  | 
123  | 
        # when was this pack started ?
 | 
124  | 
self.start_time = time.time()  | 
|
125  | 
        # open an output stream for the data added to the pack.
 | 
|
126  | 
self.write_stream = self.upload_transport.open_write_stream(  | 
|
127  | 
self.random_name, mode=self._file_mode)  | 
|
128  | 
if 'pack' in debug.debug_flags:  | 
|
| 
0.23.30
by John Arbash Meinel
 Merge in Ian's groupcompress trunk updates  | 
129  | 
trace.mutter('%s: create_pack: pack stream open: %s%s t+%6.3fs',  | 
| 
0.17.9
by Robert Collins
 Initial stab at repository format support.  | 
130  | 
time.ctime(), self.upload_transport.base, self.random_name,  | 
131  | 
time.time() - self.start_time)  | 
|
| 
3735.31.2
by John Arbash Meinel
 Cleanup trailing whitespace, get test_source to pass by removing asserts.  | 
132  | 
        # A list of byte sequences to be written to the new pack, and the
 | 
133  | 
        # aggregate size of them.  Stored as a list rather than separate
 | 
|
| 
0.17.9
by Robert Collins
 Initial stab at repository format support.  | 
134  | 
        # variables so that the _write_data closure below can update them.
 | 
135  | 
self._buffer = [[], 0]  | 
|
| 
3735.31.2
by John Arbash Meinel
 Cleanup trailing whitespace, get test_source to pass by removing asserts.  | 
136  | 
        # create a callable for adding data
 | 
| 
0.17.9
by Robert Collins
 Initial stab at repository format support.  | 
137  | 
        #
 | 
138  | 
        # robertc says- this is a closure rather than a method on the object
 | 
|
139  | 
        # so that the variables are locals, and faster than accessing object
 | 
|
140  | 
        # members.
 | 
|
141  | 
def _write_data(bytes, flush=False, _buffer=self._buffer,  | 
|
142  | 
_write=self.write_stream.write, _update=self._hash.update):  | 
|
143  | 
_buffer[0].append(bytes)  | 
|
144  | 
_buffer[1] += len(bytes)  | 
|
145  | 
            # buffer cap
 | 
|
146  | 
if _buffer[1] > self._cache_limit or flush:  | 
|
147  | 
bytes = ''.join(_buffer[0])  | 
|
148  | 
_write(bytes)  | 
|
149  | 
_update(bytes)  | 
|
150  | 
_buffer[:] = [[], 0]  | 
|
151  | 
        # expose this on self, for the occasion when clients want to add data.
 | 
|
152  | 
self._write_data = _write_data  | 
|
153  | 
        # a pack writer object to serialise pack records.
 | 
|
154  | 
self._writer = pack.ContainerWriter(self._write_data)  | 
|
155  | 
self._writer.begin()  | 
|
156  | 
        # what state is the pack in? (open, finished, aborted)
 | 
|
157  | 
self._state = 'open'  | 
|
| 
4476.3.31
by Andrew Bennetts
 Fix 'pack already exists' test failure by checking if the pack name already exists when packing a single GC pack.  | 
158  | 
        # no name until we finish writing the content
 | 
159  | 
self.name = None  | 
|
| 
0.17.9
by Robert Collins
 Initial stab at repository format support.  | 
160  | 
|
| 
3735.31.17
by John Arbash Meinel
 Properly support suspend/resume by disallowing them :).  | 
161  | 
def _check_references(self):  | 
162  | 
"""Make sure our external references are present.  | 
|
163  | 
||
164  | 
        Packs are allowed to have deltas whose base is not in the pack, but it
 | 
|
165  | 
        must be present somewhere in this collection.  It is not allowed to
 | 
|
166  | 
        have deltas based on a fallback repository.
 | 
|
167  | 
        (See <https://bugs.launchpad.net/bzr/+bug/288751>)
 | 
|
168  | 
        """
 | 
|
| 
4343.3.1
by John Arbash Meinel
 Set 'supports_external_lookups=True' for dev6 repositories.  | 
169  | 
        # Groupcompress packs don't have any external references, arguably CHK
 | 
170  | 
        # pages have external references, but we cannot 'cheaply' determine
 | 
|
171  | 
        # them without actually walking all of the chk pages.
 | 
|
| 
3735.31.17
by John Arbash Meinel
 Properly support suspend/resume by disallowing them :).  | 
172  | 
|
| 
0.17.9
by Robert Collins
 Initial stab at repository format support.  | 
173  | 
|
| 
4343.3.2
by John Arbash Meinel
 All stacking tests seem to be passing for dev6 repos  | 
174  | 
class ResumedGCPack(ResumedPack):  | 
175  | 
||
| 
4343.3.8
by John Arbash Meinel
 Some cleanup passes.  | 
176  | 
def _check_references(self):  | 
177  | 
"""Make sure our external compression parents are present."""  | 
|
178  | 
        # See GCPack._check_references for why this is empty
 | 
|
179  | 
||
| 
4343.3.2
by John Arbash Meinel
 All stacking tests seem to be passing for dev6 repos  | 
180  | 
def _get_external_refs(self, index):  | 
181  | 
        # GC repositories don't have compression parents external to a given
 | 
|
182  | 
        # pack file
 | 
|
183  | 
return set()  | 
|
184  | 
||
185  | 
||
| 
3735.31.27
by John Arbash Meinel
 Implement GCCHKReconcilePacker.  | 
186  | 
class GCCHKPacker(Packer):  | 
| 
3735.31.22
by John Arbash Meinel
 Factor out the copying code into GCPacker.  | 
187  | 
"""This class understand what it takes to collect a GCCHK repo."""  | 
| 
0.17.9
by Robert Collins
 Initial stab at repository format support.  | 
188  | 
|
| 
3735.31.24
by John Arbash Meinel
 Start moving more things deeper inside the code.  | 
189  | 
def __init__(self, pack_collection, packs, suffix, revision_ids=None,  | 
190  | 
reload_func=None):  | 
|
| 
3735.31.27
by John Arbash Meinel
 Implement GCCHKReconcilePacker.  | 
191  | 
super(GCCHKPacker, self).__init__(pack_collection, packs, suffix,  | 
192  | 
revision_ids=revision_ids,  | 
|
193  | 
reload_func=reload_func)  | 
|
| 
3735.31.22
by John Arbash Meinel
 Factor out the copying code into GCPacker.  | 
194  | 
self._pack_collection = pack_collection  | 
195  | 
        # ATM, We only support this for GCCHK repositories
 | 
|
| 
4241.6.8
by Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil
 Add --development6-rich-root, disabling the legacy and unneeded development2 format, and activating the tests for CHK features disabled pending this format. (Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil)  | 
196  | 
if pack_collection.chk_index is None:  | 
197  | 
raise AssertionError('pack_collection.chk_index should not be None')  | 
|
| 
3735.31.27
by John Arbash Meinel
 Implement GCCHKReconcilePacker.  | 
198  | 
self._gather_text_refs = False  | 
| 
3735.31.22
by John Arbash Meinel
 Factor out the copying code into GCPacker.  | 
199  | 
self._chk_id_roots = []  | 
200  | 
self._chk_p_id_roots = []  | 
|
| 
3735.31.27
by John Arbash Meinel
 Implement GCCHKReconcilePacker.  | 
201  | 
self._text_refs = None  | 
| 
3735.31.25
by John Arbash Meinel
 Finish refactoring everything into _copy_X_texts() style.  | 
202  | 
        # set by .pack() if self.revision_ids is not None
 | 
203  | 
self.revision_keys = None  | 
|
| 
0.17.9
by Robert Collins
 Initial stab at repository format support.  | 
204  | 
|
| 
3735.31.25
by John Arbash Meinel
 Finish refactoring everything into _copy_X_texts() style.  | 
205  | 
def _get_progress_stream(self, source_vf, keys, message, pb):  | 
| 
3735.31.15
by John Arbash Meinel
 A bit more refactoring, try to clean up the _execute_packs code.  | 
206  | 
def pb_stream():  | 
207  | 
substream = source_vf.get_record_stream(keys, 'groupcompress', True)  | 
|
208  | 
for idx, record in enumerate(substream):  | 
|
209  | 
if pb is not None:  | 
|
| 
3735.31.25
by John Arbash Meinel
 Finish refactoring everything into _copy_X_texts() style.  | 
210  | 
pb.update(message, idx + 1, len(keys))  | 
| 
3735.31.15
by John Arbash Meinel
 A bit more refactoring, try to clean up the _execute_packs code.  | 
211  | 
yield record  | 
212  | 
return pb_stream()  | 
|
213  | 
||
| 
3735.31.25
by John Arbash Meinel
 Finish refactoring everything into _copy_X_texts() style.  | 
214  | 
def _get_filtered_inv_stream(self, source_vf, keys, message, pb=None):  | 
| 
0.22.5
by John Arbash Meinel
 Try a different method of streaming the chk pages.  | 
215  | 
"""Filter the texts of inventories, to find the chk pages."""  | 
| 
0.17.43
by John Arbash Meinel
 Give better chk and inventory progress indication during pack/autopack  | 
216  | 
total_keys = len(keys)  | 
| 
3735.31.22
by John Arbash Meinel
 Factor out the copying code into GCPacker.  | 
217  | 
def _filtered_inv_stream():  | 
218  | 
id_roots_set = set()  | 
|
219  | 
p_id_roots_set = set()  | 
|
220  | 
stream = source_vf.get_record_stream(keys, 'groupcompress', True)  | 
|
| 
0.22.5
by John Arbash Meinel
 Try a different method of streaming the chk pages.  | 
221  | 
for idx, record in enumerate(stream):  | 
| 
4431.3.7
by Jonathan Lange
 Cherrypick bzr.dev 4470, resolving conflicts.  | 
222  | 
                # Inventories should always be with revisions; assume success.
 | 
| 
0.22.5
by John Arbash Meinel
 Try a different method of streaming the chk pages.  | 
223  | 
bytes = record.get_bytes_as('fulltext')  | 
| 
3735.31.22
by John Arbash Meinel
 Factor out the copying code into GCPacker.  | 
224  | 
chk_inv = inventory.CHKInventory.deserialise(None, bytes,  | 
225  | 
record.key)  | 
|
| 
0.17.43
by John Arbash Meinel
 Give better chk and inventory progress indication during pack/autopack  | 
226  | 
if pb is not None:  | 
227  | 
pb.update('inv', idx, total_keys)  | 
|
| 
0.22.6
by John Arbash Meinel
 Clustering chk pages properly makes a big difference.  | 
228  | 
key = chk_inv.id_to_entry.key()  | 
229  | 
if key not in id_roots_set:  | 
|
| 
3735.31.22
by John Arbash Meinel
 Factor out the copying code into GCPacker.  | 
230  | 
self._chk_id_roots.append(key)  | 
| 
0.22.6
by John Arbash Meinel
 Clustering chk pages properly makes a big difference.  | 
231  | 
id_roots_set.add(key)  | 
| 
0.22.5
by John Arbash Meinel
 Try a different method of streaming the chk pages.  | 
232  | 
p_id_map = chk_inv.parent_id_basename_to_file_id  | 
| 
4241.6.8
by Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil
 Add --development6-rich-root, disabling the legacy and unneeded development2 format, and activating the tests for CHK features disabled pending this format. (Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil)  | 
233  | 
if p_id_map is None:  | 
234  | 
raise AssertionError('Parent id -> file_id map not set')  | 
|
| 
3735.31.22
by John Arbash Meinel
 Factor out the copying code into GCPacker.  | 
235  | 
key = p_id_map.key()  | 
236  | 
if key not in p_id_roots_set:  | 
|
237  | 
p_id_roots_set.add(key)  | 
|
238  | 
self._chk_p_id_roots.append(key)  | 
|
| 
0.22.5
by John Arbash Meinel
 Try a different method of streaming the chk pages.  | 
239  | 
yield record  | 
| 
3735.31.22
by John Arbash Meinel
 Factor out the copying code into GCPacker.  | 
240  | 
            # We have finished processing all of the inventory records, we
 | 
241  | 
            # don't need these sets anymore
 | 
|
242  | 
id_roots_set.clear()  | 
|
243  | 
p_id_roots_set.clear()  | 
|
| 
3735.42.3
by John Arbash Meinel
 Fix a bug introduced into GCPacker.  | 
244  | 
return _filtered_inv_stream()  | 
| 
0.22.5
by John Arbash Meinel
 Try a different method of streaming the chk pages.  | 
245  | 
|
| 
3735.31.22
by John Arbash Meinel
 Factor out the copying code into GCPacker.  | 
246  | 
def _get_chk_streams(self, source_vf, keys, pb=None):  | 
| 
0.22.5
by John Arbash Meinel
 Try a different method of streaming the chk pages.  | 
247  | 
        # We want to stream the keys from 'id_roots', and things they
 | 
248  | 
        # reference, and then stream things from p_id_roots and things they
 | 
|
249  | 
        # reference, and then any remaining keys that we didn't get to.
 | 
|
250  | 
||
| 
0.22.6
by John Arbash Meinel
 Clustering chk pages properly makes a big difference.  | 
251  | 
        # We also group referenced texts together, so if one root references a
 | 
252  | 
        # text with prefix 'a', and another root references a node with prefix
 | 
|
253  | 
        # 'a', we want to yield those nodes before we yield the nodes for 'b'
 | 
|
| 
0.20.30
by Ian Clatworthy
 repofmt.py code cleanups  | 
254  | 
        # This keeps 'similar' nodes together.
 | 
| 
0.22.6
by John Arbash Meinel
 Clustering chk pages properly makes a big difference.  | 
255  | 
|
| 
0.22.5
by John Arbash Meinel
 Try a different method of streaming the chk pages.  | 
256  | 
        # Note: We probably actually want multiple streams here, to help the
 | 
257  | 
        #       client understand that the different levels won't compress well
 | 
|
| 
0.20.30
by Ian Clatworthy
 repofmt.py code cleanups  | 
258  | 
        #       against each other.
 | 
| 
0.20.27
by John Arbash Meinel
 Update a Note/Todo  | 
259  | 
        #       Test the difference between using one Group per level, and
 | 
260  | 
        #       using 1 Group per prefix. (so '' (root) would get a group, then
 | 
|
261  | 
        #       all the references to search-key 'a' would get a group, etc.)
 | 
|
| 
0.17.43
by John Arbash Meinel
 Give better chk and inventory progress indication during pack/autopack  | 
262  | 
total_keys = len(keys)  | 
| 
0.22.5
by John Arbash Meinel
 Try a different method of streaming the chk pages.  | 
263  | 
remaining_keys = set(keys)  | 
| 
0.20.25
by John Arbash Meinel
 As expected, splitting things up into streams of streams  | 
264  | 
counter = [0]  | 
| 
3735.31.27
by John Arbash Meinel
 Implement GCCHKReconcilePacker.  | 
265  | 
if self._gather_text_refs:  | 
| 
3735.36.12
by John Arbash Meinel
 Add some direct tests for CHKInventory._entry_to_bytes  | 
266  | 
bytes_to_info = inventory.CHKInventory._bytes_to_utf8name_key  | 
| 
3735.31.27
by John Arbash Meinel
 Implement GCCHKReconcilePacker.  | 
267  | 
self._text_refs = set()  | 
268  | 
def _get_referenced_stream(root_keys, parse_leaf_nodes=False):  | 
|
| 
0.22.5
by John Arbash Meinel
 Try a different method of streaming the chk pages.  | 
269  | 
cur_keys = root_keys  | 
270  | 
while cur_keys:  | 
|
| 
0.22.6
by John Arbash Meinel
 Clustering chk pages properly makes a big difference.  | 
271  | 
keys_by_search_prefix = {}  | 
| 
0.22.5
by John Arbash Meinel
 Try a different method of streaming the chk pages.  | 
272  | 
remaining_keys.difference_update(cur_keys)  | 
273  | 
next_keys = set()  | 
|
| 
3735.31.26
by John Arbash Meinel
 A bit more internal refactoring.  | 
274  | 
def handle_internal_node(node):  | 
275  | 
for prefix, value in node._items.iteritems():  | 
|
| 
3735.2.147
by John Arbash Meinel
 Track down and fix an unexpected edge case.  | 
276  | 
                        # We don't want to request the same key twice, and we
 | 
277  | 
                        # want to order it by the first time it is seen.
 | 
|
278  | 
                        # Even further, we don't want to request a key which is
 | 
|
279  | 
                        # not in this group of pack files (it should be in the
 | 
|
280  | 
                        # repo, but it doesn't have to be in the group being
 | 
|
281  | 
                        # packed.)
 | 
|
282  | 
                        # TODO: consider how to treat externally referenced chk
 | 
|
283  | 
                        #       pages as 'external_references' so that we
 | 
|
284  | 
                        #       always fill them in for stacked branches
 | 
|
285  | 
if value not in next_keys and value in remaining_keys:  | 
|
| 
3735.31.26
by John Arbash Meinel
 A bit more internal refactoring.  | 
286  | 
keys_by_search_prefix.setdefault(prefix,  | 
287  | 
[]).append(value)  | 
|
288  | 
next_keys.add(value)  | 
|
| 
3735.31.27
by John Arbash Meinel
 Implement GCCHKReconcilePacker.  | 
289  | 
def handle_leaf_node(node):  | 
290  | 
                    # Store is None, because we know we have a LeafNode, and we
 | 
|
291  | 
                    # just want its entries
 | 
|
292  | 
for file_id, bytes in node.iteritems(None):  | 
|
| 
3735.36.12
by John Arbash Meinel
 Add some direct tests for CHKInventory._entry_to_bytes  | 
293  | 
name_utf8, file_id, revision_id = bytes_to_info(bytes)  | 
| 
3735.36.16
by John Arbash Meinel
 Handle a typo in 'handle_leaf_node' during Reconcile tests.  | 
294  | 
self._text_refs.add((file_id, revision_id))  | 
| 
0.20.26
by John Arbash Meinel
 Try even harder, now with even *more* streams.  | 
295  | 
def next_stream():  | 
| 
3735.2.147
by John Arbash Meinel
 Track down and fix an unexpected edge case.  | 
296  | 
stream = source_vf.get_record_stream(cur_keys,  | 
297  | 
'as-requested', True)  | 
|
| 
0.20.26
by John Arbash Meinel
 Try even harder, now with even *more* streams.  | 
298  | 
for record in stream:  | 
| 
4431.3.7
by Jonathan Lange
 Cherrypick bzr.dev 4470, resolving conflicts.  | 
299  | 
if record.storage_kind == 'absent':  | 
300  | 
                            # An absent CHK record: we assume that the missing
 | 
|
301  | 
                            # record is in a different pack - e.g. a page not
 | 
|
302  | 
                            # altered by the commit we're packing.
 | 
|
303  | 
                            continue
 | 
|
| 
0.20.26
by John Arbash Meinel
 Try even harder, now with even *more* streams.  | 
304  | 
bytes = record.get_bytes_as('fulltext')  | 
305  | 
                        # We don't care about search_key_func for this code,
 | 
|
306  | 
                        # because we only care about external references.
 | 
|
307  | 
node = chk_map._deserialise(bytes, record.key,  | 
|
308  | 
search_key_func=None)  | 
|
309  | 
common_base = node._search_prefix  | 
|
310  | 
if isinstance(node, chk_map.InternalNode):  | 
|
| 
3735.31.26
by John Arbash Meinel
 A bit more internal refactoring.  | 
311  | 
handle_internal_node(node)  | 
| 
3735.31.27
by John Arbash Meinel
 Implement GCCHKReconcilePacker.  | 
312  | 
elif parse_leaf_nodes:  | 
313  | 
handle_leaf_node(node)  | 
|
| 
0.20.26
by John Arbash Meinel
 Try even harder, now with even *more* streams.  | 
314  | 
counter[0] += 1  | 
315  | 
if pb is not None:  | 
|
| 
0.17.43
by John Arbash Meinel
 Give better chk and inventory progress indication during pack/autopack  | 
316  | 
pb.update('chk node', counter[0], total_keys)  | 
| 
0.20.26
by John Arbash Meinel
 Try even harder, now with even *more* streams.  | 
317  | 
yield record  | 
318  | 
yield next_stream()  | 
|
| 
0.22.6
by John Arbash Meinel
 Clustering chk pages properly makes a big difference.  | 
319  | 
                # Double check that we won't be emitting any keys twice
 | 
| 
3735.31.26
by John Arbash Meinel
 A bit more internal refactoring.  | 
320  | 
                # If we get rid of the pre-calculation of all keys, we could
 | 
321  | 
                # turn this around and do
 | 
|
322  | 
                # next_keys.difference_update(seen_keys)
 | 
|
| 
3735.2.147
by John Arbash Meinel
 Track down and fix an unexpected edge case.  | 
323  | 
                # However, we also may have references to chk pages in another
 | 
324  | 
                # pack file during autopack. We filter earlier, so we should no
 | 
|
325  | 
                # longer need to do this
 | 
|
326  | 
                # next_keys = next_keys.intersection(remaining_keys)
 | 
|
| 
0.22.6
by John Arbash Meinel
 Clustering chk pages properly makes a big difference.  | 
327  | 
cur_keys = []  | 
328  | 
for prefix in sorted(keys_by_search_prefix):  | 
|
| 
3735.34.1
by John Arbash Meinel
 Some testing to see if we can decrease the peak memory consumption a bit.  | 
329  | 
cur_keys.extend(keys_by_search_prefix.pop(prefix))  | 
| 
3735.31.27
by John Arbash Meinel
 Implement GCCHKReconcilePacker.  | 
330  | 
for stream in _get_referenced_stream(self._chk_id_roots,  | 
331  | 
self._gather_text_refs):  | 
|
| 
0.20.26
by John Arbash Meinel
 Try even harder, now with even *more* streams.  | 
332  | 
yield stream  | 
| 
3735.31.25
by John Arbash Meinel
 Finish refactoring everything into _copy_X_texts() style.  | 
333  | 
del self._chk_id_roots  | 
| 
3735.2.147
by John Arbash Meinel
 Track down and fix an unexpected edge case.  | 
334  | 
        # while it isn't really possible for chk_id_roots to not be in the
 | 
335  | 
        # local group of packs, it is possible that the tree shape has not
 | 
|
336  | 
        # changed recently, so we need to filter _chk_p_id_roots by the
 | 
|
337  | 
        # available keys
 | 
|
338  | 
chk_p_id_roots = [key for key in self._chk_p_id_roots  | 
|
339  | 
if key in remaining_keys]  | 
|
| 
3735.31.25
by John Arbash Meinel
 Finish refactoring everything into _copy_X_texts() style.  | 
340  | 
del self._chk_p_id_roots  | 
| 
3735.2.147
by John Arbash Meinel
 Track down and fix an unexpected edge case.  | 
341  | 
for stream in _get_referenced_stream(chk_p_id_roots, False):  | 
342  | 
yield stream  | 
|
| 
0.22.5
by John Arbash Meinel
 Try a different method of streaming the chk pages.  | 
343  | 
if remaining_keys:  | 
| 
3735.31.25
by John Arbash Meinel
 Finish refactoring everything into _copy_X_texts() style.  | 
344  | 
trace.mutter('There were %d keys in the chk index, %d of which'  | 
345  | 
' were not referenced', total_keys,  | 
|
346  | 
len(remaining_keys))  | 
|
347  | 
if self.revision_ids is None:  | 
|
348  | 
stream = source_vf.get_record_stream(remaining_keys,  | 
|
349  | 
'unordered', True)  | 
|
350  | 
yield stream  | 
|
| 
0.22.5
by John Arbash Meinel
 Try a different method of streaming the chk pages.  | 
351  | 
|
| 
3735.31.22
by John Arbash Meinel
 Factor out the copying code into GCPacker.  | 
352  | 
def _build_vf(self, index_name, parents, delta, for_write=False):  | 
| 
3735.31.15
by John Arbash Meinel
 A bit more refactoring, try to clean up the _execute_packs code.  | 
353  | 
"""Build a VersionedFiles instance on top of this group of packs."""  | 
354  | 
index_name = index_name + '_index'  | 
|
355  | 
index_to_pack = {}  | 
|
| 
4634.113.1
by John Arbash Meinel
 handle when content goes missing during an autopack (bug #495000)  | 
356  | 
access = knit._DirectPackAccess(index_to_pack,  | 
357  | 
reload_func=self._reload_func)  | 
|
| 
3735.31.15
by John Arbash Meinel
 A bit more refactoring, try to clean up the _execute_packs code.  | 
358  | 
if for_write:  | 
| 
3735.31.22
by John Arbash Meinel
 Factor out the copying code into GCPacker.  | 
359  | 
            # Use new_pack
 | 
| 
4241.6.8
by Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil
 Add --development6-rich-root, disabling the legacy and unneeded development2 format, and activating the tests for CHK features disabled pending this format. (Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil)  | 
360  | 
if self.new_pack is None:  | 
361  | 
raise AssertionError('No new pack has been set')  | 
|
| 
3735.31.23
by John Arbash Meinel
 Change the GCPacker to inherit from Packer now that there isn't as much difference.  | 
362  | 
index = getattr(self.new_pack, index_name)  | 
363  | 
index_to_pack[index] = self.new_pack.access_tuple()  | 
|
| 
3735.31.15
by John Arbash Meinel
 A bit more refactoring, try to clean up the _execute_packs code.  | 
364  | 
index.set_optimize(for_size=True)  | 
| 
3735.31.23
by John Arbash Meinel
 Change the GCPacker to inherit from Packer now that there isn't as much difference.  | 
365  | 
access.set_writer(self.new_pack._writer, index,  | 
366  | 
self.new_pack.access_tuple())  | 
|
| 
3735.31.15
by John Arbash Meinel
 A bit more refactoring, try to clean up the _execute_packs code.  | 
367  | 
add_callback = index.add_nodes  | 
368  | 
else:  | 
|
369  | 
indices = []  | 
|
| 
3735.31.23
by John Arbash Meinel
 Change the GCPacker to inherit from Packer now that there isn't as much difference.  | 
370  | 
for pack in self.packs:  | 
| 
3735.31.15
by John Arbash Meinel
 A bit more refactoring, try to clean up the _execute_packs code.  | 
371  | 
sub_index = getattr(pack, index_name)  | 
372  | 
index_to_pack[sub_index] = pack.access_tuple()  | 
|
373  | 
indices.append(sub_index)  | 
|
374  | 
index = _mod_index.CombinedGraphIndex(indices)  | 
|
375  | 
add_callback = None  | 
|
376  | 
vf = GroupCompressVersionedFiles(  | 
|
377  | 
_GCGraphIndex(index,  | 
|
378  | 
add_callback=add_callback,  | 
|
379  | 
parents=parents,  | 
|
| 
3735.31.22
by John Arbash Meinel
 Factor out the copying code into GCPacker.  | 
380  | 
is_locked=self._pack_collection.repo.is_locked),  | 
| 
3735.31.15
by John Arbash Meinel
 A bit more refactoring, try to clean up the _execute_packs code.  | 
381  | 
access=access,  | 
382  | 
delta=delta)  | 
|
383  | 
return vf  | 
|
384  | 
||
| 
3735.31.24
by John Arbash Meinel
 Start moving more things deeper inside the code.  | 
385  | 
def _build_vfs(self, index_name, parents, delta):  | 
386  | 
"""Build the source and target VersionedFiles."""  | 
|
387  | 
source_vf = self._build_vf(index_name, parents,  | 
|
388  | 
delta, for_write=False)  | 
|
389  | 
target_vf = self._build_vf(index_name, parents,  | 
|
390  | 
delta, for_write=True)  | 
|
391  | 
return source_vf, target_vf  | 
|
392  | 
||
| 
3735.31.25
by John Arbash Meinel
 Finish refactoring everything into _copy_X_texts() style.  | 
393  | 
def _copy_stream(self, source_vf, target_vf, keys, message, vf_to_stream,  | 
394  | 
pb_offset):  | 
|
395  | 
trace.mutter('repacking %d %s', len(keys), message)  | 
|
| 
3735.2.146
by John Arbash Meinel
 Give the right progress message.  | 
396  | 
self.pb.update('repacking %s' % (message,), pb_offset)  | 
| 
3735.31.25
by John Arbash Meinel
 Finish refactoring everything into _copy_X_texts() style.  | 
397  | 
child_pb = ui.ui_factory.nested_progress_bar()  | 
398  | 
try:  | 
|
399  | 
stream = vf_to_stream(source_vf, keys, message, child_pb)  | 
|
| 
3735.32.22
by John Arbash Meinel
 Change the code so that the GCPacker knows to set reuse_blocks=False.  | 
400  | 
for _ in target_vf._insert_record_stream(stream,  | 
| 
3735.32.28
by John Arbash Meinel
 We can use 'random_id=True' when copying the streams.  | 
401  | 
random_id=True,  | 
| 
3735.32.22
by John Arbash Meinel
 Change the code so that the GCPacker knows to set reuse_blocks=False.  | 
402  | 
reuse_blocks=False):  | 
403  | 
                pass
 | 
|
| 
3735.31.25
by John Arbash Meinel
 Finish refactoring everything into _copy_X_texts() style.  | 
404  | 
finally:  | 
405  | 
child_pb.finished()  | 
|
406  | 
||
407  | 
def _copy_revision_texts(self):  | 
|
408  | 
source_vf, target_vf = self._build_vfs('revision', True, False)  | 
|
409  | 
if not self.revision_keys:  | 
|
410  | 
            # We are doing a full fetch, aka 'pack'
 | 
|
411  | 
self.revision_keys = source_vf.keys()  | 
|
412  | 
self._copy_stream(source_vf, target_vf, self.revision_keys,  | 
|
413  | 
'revisions', self._get_progress_stream, 1)  | 
|
414  | 
||
415  | 
def _copy_inventory_texts(self):  | 
|
416  | 
source_vf, target_vf = self._build_vfs('inventory', True, True)  | 
|
| 
4597.1.6
by John Arbash Meinel
 Add a test that inventory texts are preserved during pack.  | 
417  | 
        # It is not sufficient to just use self.revision_keys, as stacked
 | 
418  | 
        # repositories can have more inventories than they have revisions.
 | 
|
419  | 
        # One alternative would be to do something with
 | 
|
420  | 
        # get_parent_map(self.revision_keys), but that shouldn't be any faster
 | 
|
421  | 
        # than this.
 | 
|
422  | 
inventory_keys = source_vf.keys()  | 
|
| 
4597.1.8
by John Arbash Meinel
 Add a safety check that there is an inventory being transmitted for  | 
423  | 
missing_inventories = set(self.revision_keys).difference(inventory_keys)  | 
424  | 
if missing_inventories:  | 
|
425  | 
missing_inventories = sorted(missing_inventories)  | 
|
426  | 
raise ValueError('We are missing inventories for revisions: %s'  | 
|
427  | 
% (missing_inventories,))  | 
|
| 
4597.1.6
by John Arbash Meinel
 Add a test that inventory texts are preserved during pack.  | 
428  | 
self._copy_stream(source_vf, target_vf, inventory_keys,  | 
| 
3735.31.27
by John Arbash Meinel
 Implement GCCHKReconcilePacker.  | 
429  | 
'inventories', self._get_filtered_inv_stream, 2)  | 
| 
3735.31.25
by John Arbash Meinel
 Finish refactoring everything into _copy_X_texts() style.  | 
430  | 
|
431  | 
def _copy_chk_texts(self):  | 
|
432  | 
source_vf, target_vf = self._build_vfs('chk', False, False)  | 
|
433  | 
        # TODO: This is technically spurious... if it is a performance issue,
 | 
|
434  | 
        #       remove it
 | 
|
435  | 
total_keys = source_vf.keys()  | 
|
436  | 
trace.mutter('repacking chk: %d id_to_entry roots,'  | 
|
437  | 
' %d p_id_map roots, %d total keys',  | 
|
438  | 
len(self._chk_id_roots), len(self._chk_p_id_roots),  | 
|
439  | 
len(total_keys))  | 
|
440  | 
self.pb.update('repacking chk', 3)  | 
|
441  | 
child_pb = ui.ui_factory.nested_progress_bar()  | 
|
442  | 
try:  | 
|
443  | 
for stream in self._get_chk_streams(source_vf, total_keys,  | 
|
444  | 
pb=child_pb):  | 
|
| 
3735.32.22
by John Arbash Meinel
 Change the code so that the GCPacker knows to set reuse_blocks=False.  | 
445  | 
for _ in target_vf._insert_record_stream(stream,  | 
| 
3735.32.28
by John Arbash Meinel
 We can use 'random_id=True' when copying the streams.  | 
446  | 
random_id=True,  | 
| 
3735.32.22
by John Arbash Meinel
 Change the code so that the GCPacker knows to set reuse_blocks=False.  | 
447  | 
reuse_blocks=False):  | 
448  | 
                    pass
 | 
|
| 
3735.31.25
by John Arbash Meinel
 Finish refactoring everything into _copy_X_texts() style.  | 
449  | 
finally:  | 
450  | 
child_pb.finished()  | 
|
451  | 
||
452  | 
def _copy_text_texts(self):  | 
|
453  | 
source_vf, target_vf = self._build_vfs('text', True, True)  | 
|
454  | 
        # XXX: We don't walk the chk map to determine referenced (file_id,
 | 
|
455  | 
        #      revision_id) keys.  We don't do it yet because you really need
 | 
|
456  | 
        #      to filter out the ones that are present in the parents of the
 | 
|
457  | 
        #      rev just before the ones you are copying, otherwise the filter
 | 
|
458  | 
        #      is grabbing too many keys...
 | 
|
459  | 
text_keys = source_vf.keys()  | 
|
460  | 
self._copy_stream(source_vf, target_vf, text_keys,  | 
|
| 
4511.2.1
by Matt Nordhoff
 Fix pluralisation of gc's "repacking N texts" message  | 
461  | 
'texts', self._get_progress_stream, 4)  | 
| 
3735.31.25
by John Arbash Meinel
 Finish refactoring everything into _copy_X_texts() style.  | 
462  | 
|
463  | 
def _copy_signature_texts(self):  | 
|
464  | 
source_vf, target_vf = self._build_vfs('signature', False, False)  | 
|
465  | 
signature_keys = source_vf.keys()  | 
|
466  | 
signature_keys.intersection(self.revision_keys)  | 
|
467  | 
self._copy_stream(source_vf, target_vf, signature_keys,  | 
|
468  | 
'signatures', self._get_progress_stream, 5)  | 
|
469  | 
||
| 
3735.31.23
by John Arbash Meinel
 Change the GCPacker to inherit from Packer now that there isn't as much difference.  | 
470  | 
def _create_pack_from_packs(self):  | 
| 
3735.31.25
by John Arbash Meinel
 Finish refactoring everything into _copy_X_texts() style.  | 
471  | 
self.pb.update('repacking', 0, 7)  | 
| 
3735.31.23
by John Arbash Meinel
 Change the GCPacker to inherit from Packer now that there isn't as much difference.  | 
472  | 
self.new_pack = self.open_pack()  | 
473  | 
        # Is this necessary for GC ?
 | 
|
474  | 
self.new_pack.set_write_cache_size(1024*1024)  | 
|
| 
3735.31.25
by John Arbash Meinel
 Finish refactoring everything into _copy_X_texts() style.  | 
475  | 
self._copy_revision_texts()  | 
476  | 
self._copy_inventory_texts()  | 
|
477  | 
self._copy_chk_texts()  | 
|
478  | 
self._copy_text_texts()  | 
|
479  | 
self._copy_signature_texts()  | 
|
| 
3735.31.23
by John Arbash Meinel
 Change the GCPacker to inherit from Packer now that there isn't as much difference.  | 
480  | 
self.new_pack._check_references()  | 
481  | 
if not self._use_pack(self.new_pack):  | 
|
482  | 
self.new_pack.abort()  | 
|
483  | 
return None  | 
|
| 
4476.3.31
by Andrew Bennetts
 Fix 'pack already exists' test failure by checking if the pack name already exists when packing a single GC pack.  | 
484  | 
self.new_pack.finish_content()  | 
485  | 
if len(self.packs) == 1:  | 
|
486  | 
old_pack = self.packs[0]  | 
|
487  | 
if old_pack.name == self.new_pack._hash.hexdigest():  | 
|
488  | 
                # The single old pack was already optimally packed.
 | 
|
| 
4476.3.68
by Andrew Bennetts
 Review comments from John.  | 
489  | 
trace.mutter('single pack %s was already optimally packed',  | 
| 
4476.3.67
by Andrew Bennetts
 mutter when gc packer encounters a single, optimally packed pack.  | 
490  | 
old_pack.name)  | 
| 
4476.3.31
by Andrew Bennetts
 Fix 'pack already exists' test failure by checking if the pack name already exists when packing a single GC pack.  | 
491  | 
self.new_pack.abort()  | 
492  | 
return None  | 
|
| 
3735.31.25
by John Arbash Meinel
 Finish refactoring everything into _copy_X_texts() style.  | 
493  | 
self.pb.update('finishing repack', 6, 7)  | 
| 
3735.31.23
by John Arbash Meinel
 Change the GCPacker to inherit from Packer now that there isn't as much difference.  | 
494  | 
self.new_pack.finish()  | 
495  | 
self._pack_collection.allocate(self.new_pack)  | 
|
496  | 
return self.new_pack  | 
|
| 
3735.31.15
by John Arbash Meinel
 A bit more refactoring, try to clean up the _execute_packs code.  | 
497  | 
|
| 
3735.31.22
by John Arbash Meinel
 Factor out the copying code into GCPacker.  | 
498  | 
|
| 
3735.31.27
by John Arbash Meinel
 Implement GCCHKReconcilePacker.  | 
499  | 
class GCCHKReconcilePacker(GCCHKPacker):  | 
500  | 
"""A packer which regenerates indices etc as it copies.  | 
|
501  | 
||
502  | 
    This is used by ``bzr reconcile`` to cause parent text pointers to be
 | 
|
503  | 
    regenerated.
 | 
|
504  | 
    """
 | 
|
505  | 
||
506  | 
def __init__(self, *args, **kwargs):  | 
|
507  | 
super(GCCHKReconcilePacker, self).__init__(*args, **kwargs)  | 
|
508  | 
self._data_changed = False  | 
|
509  | 
self._gather_text_refs = True  | 
|
510  | 
||
511  | 
def _copy_inventory_texts(self):  | 
|
512  | 
source_vf, target_vf = self._build_vfs('inventory', True, True)  | 
|
513  | 
self._copy_stream(source_vf, target_vf, self.revision_keys,  | 
|
514  | 
'inventories', self._get_filtered_inv_stream, 2)  | 
|
515  | 
if source_vf.keys() != self.revision_keys:  | 
|
516  | 
self._data_changed = True  | 
|
517  | 
||
518  | 
def _copy_text_texts(self):  | 
|
519  | 
"""generate what texts we should have and then copy."""  | 
|
520  | 
source_vf, target_vf = self._build_vfs('text', True, True)  | 
|
521  | 
trace.mutter('repacking %d texts', len(self._text_refs))  | 
|
522  | 
self.pb.update("repacking texts", 4)  | 
|
523  | 
        # we have three major tasks here:
 | 
|
524  | 
        # 1) generate the ideal index
 | 
|
525  | 
repo = self._pack_collection.repo  | 
|
526  | 
        # We want the one we just wrote, so base it on self.new_pack
 | 
|
527  | 
revision_vf = self._build_vf('revision', True, False, for_write=True)  | 
|
528  | 
ancestor_keys = revision_vf.get_parent_map(revision_vf.keys())  | 
|
529  | 
        # Strip keys back into revision_ids.
 | 
|
530  | 
ancestors = dict((k[0], tuple([p[0] for p in parents]))  | 
|
531  | 
for k, parents in ancestor_keys.iteritems())  | 
|
532  | 
del ancestor_keys  | 
|
533  | 
        # TODO: _generate_text_key_index should be much cheaper to generate from
 | 
|
534  | 
        #       a chk repository, rather than the current implementation
 | 
|
535  | 
ideal_index = repo._generate_text_key_index(None, ancestors)  | 
|
536  | 
file_id_parent_map = source_vf.get_parent_map(self._text_refs)  | 
|
537  | 
        # 2) generate a keys list that contains all the entries that can
 | 
|
538  | 
        #    be used as-is, with corrected parents.
 | 
|
539  | 
ok_keys = []  | 
|
540  | 
new_parent_keys = {} # (key, parent_keys)  | 
|
541  | 
discarded_keys = []  | 
|
542  | 
NULL_REVISION = _mod_revision.NULL_REVISION  | 
|
543  | 
for key in self._text_refs:  | 
|
544  | 
            # 0 - index
 | 
|
545  | 
            # 1 - key
 | 
|
546  | 
            # 2 - value
 | 
|
547  | 
            # 3 - refs
 | 
|
548  | 
try:  | 
|
549  | 
ideal_parents = tuple(ideal_index[key])  | 
|
550  | 
except KeyError:  | 
|
551  | 
discarded_keys.append(key)  | 
|
552  | 
self._data_changed = True  | 
|
553  | 
else:  | 
|
554  | 
if ideal_parents == (NULL_REVISION,):  | 
|
555  | 
ideal_parents = ()  | 
|
556  | 
source_parents = file_id_parent_map[key]  | 
|
557  | 
if ideal_parents == source_parents:  | 
|
558  | 
                    # no change needed.
 | 
|
559  | 
ok_keys.append(key)  | 
|
560  | 
else:  | 
|
561  | 
                    # We need to change the parent graph, but we don't need to
 | 
|
562  | 
                    # re-insert the text (since we don't pun the compression
 | 
|
563  | 
                    # parent with the parents list)
 | 
|
564  | 
self._data_changed = True  | 
|
565  | 
new_parent_keys[key] = ideal_parents  | 
|
566  | 
        # we're finished with some data.
 | 
|
567  | 
del ideal_index  | 
|
568  | 
del file_id_parent_map  | 
|
569  | 
        # 3) bulk copy the data, updating records than need it
 | 
|
570  | 
def _update_parents_for_texts():  | 
|
571  | 
stream = source_vf.get_record_stream(self._text_refs,  | 
|
572  | 
'groupcompress', False)  | 
|
573  | 
for record in stream:  | 
|
574  | 
if record.key in new_parent_keys:  | 
|
575  | 
record.parents = new_parent_keys[record.key]  | 
|
576  | 
yield record  | 
|
577  | 
target_vf.insert_record_stream(_update_parents_for_texts())  | 
|
578  | 
||
579  | 
def _use_pack(self, new_pack):  | 
|
580  | 
"""Override _use_pack to check for reconcile having changed content."""  | 
|
581  | 
return new_pack.data_inserted() and self._data_changed  | 
|
582  | 
||
583  | 
||
| 
3735.31.22
by John Arbash Meinel
 Factor out the copying code into GCPacker.  | 
584  | 
class GCRepositoryPackCollection(RepositoryPackCollection):  | 
585  | 
||
586  | 
pack_factory = GCPack  | 
|
| 
4343.3.2
by John Arbash Meinel
 All stacking tests seem to be passing for dev6 repos  | 
587  | 
resumed_pack_factory = ResumedGCPack  | 
| 
3735.31.22
by John Arbash Meinel
 Factor out the copying code into GCPacker.  | 
588  | 
|
| 
4634.29.11
by Andrew Bennetts
 Move chk_bytes-aware _check_new_inventories to GCRepositoryPackCollection.  | 
589  | 
def _check_new_inventories(self):  | 
590  | 
"""Detect missing inventories or chk root entries for the new revisions  | 
|
591  | 
        in this write group.
 | 
|
592  | 
||
| 
4634.35.8
by Andrew Bennetts
 Return a list of problem descriptions rather than raising BzrCheckError on the first problem.  | 
593  | 
        :returns: list of strs, summarising any problems found.  If the list is
 | 
594  | 
            empty no problems were found.
 | 
|
| 
4634.29.11
by Andrew Bennetts
 Move chk_bytes-aware _check_new_inventories to GCRepositoryPackCollection.  | 
595  | 
        """
 | 
596  | 
        # Ensure that all revisions added in this write group have:
 | 
|
597  | 
        #   - corresponding inventories,
 | 
|
598  | 
        #   - chk root entries for those inventories,
 | 
|
599  | 
        #   - and any present parent inventories have their chk root
 | 
|
600  | 
        #     entries too.
 | 
|
601  | 
        # And all this should be independent of any fallback repository.
 | 
|
| 
4634.35.8
by Andrew Bennetts
 Return a list of problem descriptions rather than raising BzrCheckError on the first problem.  | 
602  | 
problems = []  | 
| 
4634.29.11
by Andrew Bennetts
 Move chk_bytes-aware _check_new_inventories to GCRepositoryPackCollection.  | 
603  | 
key_deps = self.repo.revisions._index._key_dependencies  | 
604  | 
new_revisions_keys = key_deps.get_new_keys()  | 
|
605  | 
no_fallback_inv_index = self.repo.inventories._index  | 
|
606  | 
no_fallback_chk_bytes_index = self.repo.chk_bytes._index  | 
|
| 
4634.35.5
by Andrew Bennetts
 Check for missing texts, too.  | 
607  | 
no_fallback_texts_index = self.repo.texts._index  | 
| 
4634.29.11
by Andrew Bennetts
 Move chk_bytes-aware _check_new_inventories to GCRepositoryPackCollection.  | 
608  | 
inv_parent_map = no_fallback_inv_index.get_parent_map(  | 
609  | 
new_revisions_keys)  | 
|
610  | 
        # Are any inventories for corresponding to the new revisions missing?
 | 
|
611  | 
corresponding_invs = set(inv_parent_map)  | 
|
612  | 
missing_corresponding = set(new_revisions_keys)  | 
|
613  | 
missing_corresponding.difference_update(corresponding_invs)  | 
|
614  | 
if missing_corresponding:  | 
|
| 
4634.35.8
by Andrew Bennetts
 Return a list of problem descriptions rather than raising BzrCheckError on the first problem.  | 
615  | 
problems.append("inventories missing for revisions %s" %  | 
616  | 
(sorted(missing_corresponding),))  | 
|
617  | 
return problems  | 
|
| 
4634.29.11
by Andrew Bennetts
 Move chk_bytes-aware _check_new_inventories to GCRepositoryPackCollection.  | 
618  | 
        # Are any chk root entries missing for any inventories?  This includes
 | 
619  | 
        # any present parent inventories, which may be used when calculating
 | 
|
620  | 
        # deltas for streaming.
 | 
|
621  | 
all_inv_keys = set(corresponding_invs)  | 
|
622  | 
for parent_inv_keys in inv_parent_map.itervalues():  | 
|
623  | 
all_inv_keys.update(parent_inv_keys)  | 
|
624  | 
        # Filter out ghost parents.
 | 
|
625  | 
all_inv_keys.intersection_update(  | 
|
626  | 
no_fallback_inv_index.get_parent_map(all_inv_keys))  | 
|
| 
4634.35.1
by Andrew Bennetts
 Check for all necessary chk nodes, not just roots.  | 
627  | 
parent_invs_only_keys = all_inv_keys.symmetric_difference(  | 
628  | 
corresponding_invs)  | 
|
| 
4634.29.11
by Andrew Bennetts
 Move chk_bytes-aware _check_new_inventories to GCRepositoryPackCollection.  | 
629  | 
all_missing = set()  | 
630  | 
inv_ids = [key[-1] for key in all_inv_keys]  | 
|
| 
4634.35.7
by Andrew Bennetts
 Reuse a little more logic for calculating (un)interesting chk root keys.  | 
631  | 
parent_invs_only_ids = [key[-1] for key in parent_invs_only_keys]  | 
632  | 
root_key_info = _build_interesting_key_sets(  | 
|
633  | 
self.repo, inv_ids, parent_invs_only_ids)  | 
|
634  | 
expected_chk_roots = root_key_info.all_keys()  | 
|
635  | 
present_chk_roots = no_fallback_chk_bytes_index.get_parent_map(  | 
|
636  | 
expected_chk_roots)  | 
|
637  | 
missing_chk_roots = expected_chk_roots.difference(present_chk_roots)  | 
|
638  | 
if missing_chk_roots:  | 
|
| 
4634.35.8
by Andrew Bennetts
 Return a list of problem descriptions rather than raising BzrCheckError on the first problem.  | 
639  | 
problems.append("missing referenced chk root keys: %s"  | 
640  | 
% (sorted(missing_chk_roots),))  | 
|
| 
4634.35.1
by Andrew Bennetts
 Check for all necessary chk nodes, not just roots.  | 
641  | 
            # Don't bother checking any further.
 | 
| 
4634.35.8
by Andrew Bennetts
 Return a list of problem descriptions rather than raising BzrCheckError on the first problem.  | 
642  | 
return problems  | 
| 
4634.35.7
by Andrew Bennetts
 Reuse a little more logic for calculating (un)interesting chk root keys.  | 
643  | 
        # Find all interesting chk_bytes records, and make sure they are
 | 
644  | 
        # present, as well as the text keys they reference.
 | 
|
| 
4634.35.1
by Andrew Bennetts
 Check for all necessary chk nodes, not just roots.  | 
645  | 
chk_bytes_no_fallbacks = self.repo.chk_bytes.without_fallbacks()  | 
646  | 
chk_bytes_no_fallbacks._search_key_func = \  | 
|
647  | 
self.repo.chk_bytes._search_key_func  | 
|
648  | 
chk_diff = chk_map.iter_interesting_nodes(  | 
|
| 
4634.35.7
by Andrew Bennetts
 Reuse a little more logic for calculating (un)interesting chk root keys.  | 
649  | 
chk_bytes_no_fallbacks, root_key_info.interesting_root_keys,  | 
650  | 
root_key_info.uninteresting_root_keys)  | 
|
| 
4634.35.5
by Andrew Bennetts
 Check for missing texts, too.  | 
651  | 
bytes_to_info = inventory.CHKInventory._bytes_to_utf8name_key  | 
652  | 
text_keys = set()  | 
|
653  | 
try:  | 
|
| 
4634.35.6
by Andrew Bennetts
 Start reusing common logic for calculating text keys.  | 
654  | 
for record in _filter_text_keys(chk_diff, text_keys, bytes_to_info):  | 
655  | 
                pass
 | 
|
| 
4634.35.5
by Andrew Bennetts
 Check for missing texts, too.  | 
656  | 
except errors.NoSuchRevision, e:  | 
| 
4634.35.6
by Andrew Bennetts
 Start reusing common logic for calculating text keys.  | 
657  | 
            # XXX: It would be nice if we could give a more precise error here.
 | 
| 
4634.35.8
by Andrew Bennetts
 Return a list of problem descriptions rather than raising BzrCheckError on the first problem.  | 
658  | 
problems.append("missing chk node(s) for id_to_entry maps")  | 
| 
4634.35.5
by Andrew Bennetts
 Check for missing texts, too.  | 
659  | 
chk_diff = chk_map.iter_interesting_nodes(  | 
| 
4634.35.7
by Andrew Bennetts
 Reuse a little more logic for calculating (un)interesting chk root keys.  | 
660  | 
chk_bytes_no_fallbacks, root_key_info.interesting_pid_root_keys,  | 
661  | 
root_key_info.uninteresting_pid_root_keys)  | 
|
| 
4634.35.1
by Andrew Bennetts
 Check for all necessary chk nodes, not just roots.  | 
662  | 
try:  | 
663  | 
for interesting_rec, interesting_map in chk_diff:  | 
|
664  | 
                pass
 | 
|
665  | 
except errors.NoSuchRevision, e:  | 
|
| 
4634.35.8
by Andrew Bennetts
 Return a list of problem descriptions rather than raising BzrCheckError on the first problem.  | 
666  | 
problems.append(  | 
667  | 
"missing chk node(s) for parent_id_basename_to_file_id maps")  | 
|
| 
4634.35.5
by Andrew Bennetts
 Check for missing texts, too.  | 
668  | 
present_text_keys = no_fallback_texts_index.get_parent_map(text_keys)  | 
669  | 
missing_text_keys = text_keys.difference(present_text_keys)  | 
|
670  | 
if missing_text_keys:  | 
|
| 
4634.35.8
by Andrew Bennetts
 Return a list of problem descriptions rather than raising BzrCheckError on the first problem.  | 
671  | 
problems.append("missing text keys: %r"  | 
672  | 
% (sorted(missing_text_keys),))  | 
|
673  | 
return problems  | 
|
| 
4634.35.5
by Andrew Bennetts
 Check for missing texts, too.  | 
674  | 
|
| 
3735.31.27
by John Arbash Meinel
 Implement GCCHKReconcilePacker.  | 
675  | 
def _execute_pack_operations(self, pack_operations,  | 
676  | 
_packer_class=GCCHKPacker,  | 
|
| 
0.22.1
by John Arbash Meinel
 A first-cut at implementing an auto-pack by copying everything.  | 
677  | 
reload_func=None):  | 
678  | 
"""Execute a series of pack operations.  | 
|
679  | 
||
680  | 
        :param pack_operations: A list of [revision_count, packs_to_combine].
 | 
|
681  | 
        :param _packer_class: The class of packer to use (default: Packer).
 | 
|
682  | 
        :return: None.
 | 
|
683  | 
        """
 | 
|
| 
3735.31.23
by John Arbash Meinel
 Change the GCPacker to inherit from Packer now that there isn't as much difference.  | 
684  | 
        # XXX: Copied across from RepositoryPackCollection simply because we
 | 
685  | 
        #      want to override the _packer_class ... :(
 | 
|
| 
0.22.1
by John Arbash Meinel
 A first-cut at implementing an auto-pack by copying everything.  | 
686  | 
for revision_count, packs in pack_operations:  | 
687  | 
            # we may have no-ops from the setup logic
 | 
|
688  | 
if len(packs) == 0:  | 
|
689  | 
                continue
 | 
|
| 
3735.31.27
by John Arbash Meinel
 Implement GCCHKReconcilePacker.  | 
690  | 
packer = GCCHKPacker(self, packs, '.autopack',  | 
691  | 
reload_func=reload_func)  | 
|
| 
0.22.1
by John Arbash Meinel
 A first-cut at implementing an auto-pack by copying everything.  | 
692  | 
try:  | 
| 
4476.3.81
by Andrew Bennetts
 Merge bzr.dev. Fix some minor fallout. per_interrepository/test_fetch.py has some duplicated assertions as a first pass at resolving conflicts.  | 
693  | 
result = packer.pack()  | 
| 
3735.31.23
by John Arbash Meinel
 Change the GCPacker to inherit from Packer now that there isn't as much difference.  | 
694  | 
except errors.RetryWithNewPacks:  | 
695  | 
                # An exception is propagating out of this context, make sure
 | 
|
696  | 
                # this packer has cleaned up. Packer() doesn't set its new_pack
 | 
|
697  | 
                # state into the RepositoryPackCollection object, so we only
 | 
|
698  | 
                # have access to it directly here.
 | 
|
699  | 
if packer.new_pack is not None:  | 
|
700  | 
packer.new_pack.abort()  | 
|
| 
0.20.19
by John Arbash Meinel
 Groupcompress now supports 'autopack' and 'pack'.  | 
701  | 
                raise
 | 
| 
4476.3.81
by Andrew Bennetts
 Merge bzr.dev. Fix some minor fallout. per_interrepository/test_fetch.py has some duplicated assertions as a first pass at resolving conflicts.  | 
702  | 
if result is None:  | 
703  | 
                return
 | 
|
| 
0.22.1
by John Arbash Meinel
 A first-cut at implementing an auto-pack by copying everything.  | 
704  | 
for pack in packs:  | 
705  | 
self._remove_pack_from_memory(pack)  | 
|
706  | 
        # record the newly available packs and stop advertising the old
 | 
|
707  | 
        # packs
 | 
|
| 
4634.127.4
by John Arbash Meinel
 pass the to-be-obsoleted packs into _save_pack_names for 2a repos.  | 
708  | 
to_be_obsoleted = []  | 
709  | 
for _, packs in pack_operations:  | 
|
710  | 
to_be_obsoleted.extend(packs)  | 
|
711  | 
result = self._save_pack_names(clear_obsolete_packs=True,  | 
|
712  | 
obsolete_packs=to_be_obsoleted)  | 
|
| 
4634.30.1
by Robert Collins
 Properly pack 2a repositories during conversion operations. (Robert Collins. #423818)  | 
713  | 
return result  | 
| 
0.20.7
by John Arbash Meinel
 (ugly hack) autopacking doesn't work, so don't do it.  | 
714  | 
|
| 
0.17.9
by Robert Collins
 Initial stab at repository format support.  | 
715  | 
|
| 
4241.6.8
by Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil
 Add --development6-rich-root, disabling the legacy and unneeded development2 format, and activating the tests for CHK features disabled pending this format. (Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil)  | 
716  | 
class CHKInventoryRepository(KnitPackRepository):  | 
717  | 
"""subclass of KnitPackRepository that uses CHK based inventories."""  | 
|
| 
0.17.26
by Robert Collins
 Working better --gc-plain-chk.  | 
718  | 
|
| 
3735.31.4
by John Arbash Meinel
 Continue trying to reduce the friction for the groupcompress repo formats.  | 
719  | 
def __init__(self, _format, a_bzrdir, control_files, _commit_builder_class,  | 
720  | 
_serializer):  | 
|
721  | 
"""Overridden to change pack collection class."""  | 
|
722  | 
KnitPackRepository.__init__(self, _format, a_bzrdir, control_files,  | 
|
723  | 
_commit_builder_class, _serializer)  | 
|
724  | 
        # and now replace everything it did :)
 | 
|
725  | 
index_transport = self._transport.clone('indices')  | 
|
726  | 
self._pack_collection = GCRepositoryPackCollection(self,  | 
|
727  | 
self._transport, index_transport,  | 
|
728  | 
self._transport.clone('upload'),  | 
|
729  | 
self._transport.clone('packs'),  | 
|
730  | 
_format.index_builder_class,  | 
|
731  | 
_format.index_class,  | 
|
732  | 
use_chk_index=self._format.supports_chks,  | 
|
733  | 
            )
 | 
|
734  | 
self.inventories = GroupCompressVersionedFiles(  | 
|
735  | 
_GCGraphIndex(self._pack_collection.inventory_index.combined_index,  | 
|
736  | 
add_callback=self._pack_collection.inventory_index.add_callback,  | 
|
| 
4465.2.5
by Aaron Bentley
 Make inconsistency in skipped records fatal for revisions.  | 
737  | 
parents=True, is_locked=self.is_locked,  | 
| 
4634.29.6
by Andrew Bennetts
 Put new key tracking in _KeyRefs rather than alongside it.  | 
738  | 
inconsistency_fatal=False),  | 
| 
3735.31.4
by John Arbash Meinel
 Continue trying to reduce the friction for the groupcompress repo formats.  | 
739  | 
access=self._pack_collection.inventory_index.data_access)  | 
740  | 
self.revisions = GroupCompressVersionedFiles(  | 
|
741  | 
_GCGraphIndex(self._pack_collection.revision_index.combined_index,  | 
|
742  | 
add_callback=self._pack_collection.revision_index.add_callback,  | 
|
| 
4343.3.21
by John Arbash Meinel
 Implement get_missing_parents in terms of _KeyRefs.  | 
743  | 
parents=True, is_locked=self.is_locked,  | 
| 
4634.29.6
by Andrew Bennetts
 Put new key tracking in _KeyRefs rather than alongside it.  | 
744  | 
track_external_parent_refs=True, track_new_keys=True),  | 
| 
3735.31.4
by John Arbash Meinel
 Continue trying to reduce the friction for the groupcompress repo formats.  | 
745  | 
access=self._pack_collection.revision_index.data_access,  | 
746  | 
delta=False)  | 
|
747  | 
self.signatures = GroupCompressVersionedFiles(  | 
|
748  | 
_GCGraphIndex(self._pack_collection.signature_index.combined_index,  | 
|
749  | 
add_callback=self._pack_collection.signature_index.add_callback,  | 
|
| 
4465.2.5
by Aaron Bentley
 Make inconsistency in skipped records fatal for revisions.  | 
750  | 
parents=False, is_locked=self.is_locked,  | 
751  | 
inconsistency_fatal=False),  | 
|
| 
3735.31.4
by John Arbash Meinel
 Continue trying to reduce the friction for the groupcompress repo formats.  | 
752  | 
access=self._pack_collection.signature_index.data_access,  | 
753  | 
delta=False)  | 
|
754  | 
self.texts = GroupCompressVersionedFiles(  | 
|
755  | 
_GCGraphIndex(self._pack_collection.text_index.combined_index,  | 
|
756  | 
add_callback=self._pack_collection.text_index.add_callback,  | 
|
| 
4465.2.5
by Aaron Bentley
 Make inconsistency in skipped records fatal for revisions.  | 
757  | 
parents=True, is_locked=self.is_locked,  | 
758  | 
inconsistency_fatal=False),  | 
|
| 
3735.31.4
by John Arbash Meinel
 Continue trying to reduce the friction for the groupcompress repo formats.  | 
759  | 
access=self._pack_collection.text_index.data_access)  | 
760  | 
        # No parents, individual CHK pages don't have specific ancestry
 | 
|
761  | 
self.chk_bytes = GroupCompressVersionedFiles(  | 
|
762  | 
_GCGraphIndex(self._pack_collection.chk_index.combined_index,  | 
|
763  | 
add_callback=self._pack_collection.chk_index.add_callback,  | 
|
| 
4465.2.5
by Aaron Bentley
 Make inconsistency in skipped records fatal for revisions.  | 
764  | 
parents=False, is_locked=self.is_locked,  | 
765  | 
inconsistency_fatal=False),  | 
|
| 
3735.31.4
by John Arbash Meinel
 Continue trying to reduce the friction for the groupcompress repo formats.  | 
766  | 
access=self._pack_collection.chk_index.data_access)  | 
| 
4476.1.17
by John Arbash Meinel
 Start running all of the iter_interesting_nodes tests  | 
767  | 
search_key_name = self._format._serializer.search_key_name  | 
768  | 
search_key_func = chk_map.search_key_registry.get(search_key_name)  | 
|
769  | 
self.chk_bytes._search_key_func = search_key_func  | 
|
| 
3735.31.4
by John Arbash Meinel
 Continue trying to reduce the friction for the groupcompress repo formats.  | 
770  | 
        # True when the repository object is 'write locked' (as opposed to the
 | 
771  | 
        # physical lock only taken out around changes to the pack-names list.)
 | 
|
772  | 
        # Another way to represent this would be a decorator around the control
 | 
|
773  | 
        # files object that presents logical locks as physical ones - if this
 | 
|
774  | 
        # gets ugly consider that alternative design. RBC 20071011
 | 
|
775  | 
self._write_lock_count = 0  | 
|
776  | 
self._transaction = None  | 
|
777  | 
        # for tests
 | 
|
778  | 
self._reconcile_does_inventory_gc = True  | 
|
779  | 
self._reconcile_fixes_text_parents = True  | 
|
780  | 
self._reconcile_backsup_inventory = False  | 
|
| 
0.17.26
by Robert Collins
 Working better --gc-plain-chk.  | 
781  | 
|
| 
4241.6.8
by Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil
 Add --development6-rich-root, disabling the legacy and unneeded development2 format, and activating the tests for CHK features disabled pending this format. (Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil)  | 
782  | 
def _add_inventory_checked(self, revision_id, inv, parents):  | 
783  | 
"""Add inv to the repository after checking the inputs.  | 
|
784  | 
||
785  | 
        This function can be overridden to allow different inventory styles.
 | 
|
786  | 
||
787  | 
        :seealso: add_inventory, for the contract.
 | 
|
788  | 
        """
 | 
|
789  | 
        # make inventory
 | 
|
790  | 
serializer = self._format._serializer  | 
|
791  | 
result = inventory.CHKInventory.from_inventory(self.chk_bytes, inv,  | 
|
792  | 
maximum_size=serializer.maximum_size,  | 
|
793  | 
search_key_name=serializer.search_key_name)  | 
|
794  | 
inv_lines = result.to_lines()  | 
|
795  | 
return self._inventory_add_lines(revision_id, parents,  | 
|
796  | 
inv_lines, check_content=False)  | 
|
797  | 
||
| 
4413.5.11
by John Arbash Meinel
 Pull out the common 'populate this CHKInventory' code out into a helper  | 
798  | 
def _create_inv_from_null(self, delta, revision_id):  | 
| 
4413.5.1
by John Arbash Meinel
 Prototype an alternative way to handle 'first commit'  | 
799  | 
"""This will mutate new_inv directly.  | 
800  | 
||
801  | 
        This is a simplified form of create_by_apply_delta which knows that all
 | 
|
802  | 
        the old values must be None, so everything is a create.
 | 
|
803  | 
        """
 | 
|
| 
4413.5.4
by John Arbash Meinel
 Change CHKMap.from_dict to create a LeafNode and split it.  | 
804  | 
serializer = self._format._serializer  | 
805  | 
new_inv = inventory.CHKInventory(serializer.search_key_name)  | 
|
| 
4413.5.11
by John Arbash Meinel
 Pull out the common 'populate this CHKInventory' code out into a helper  | 
806  | 
new_inv.revision_id = revision_id  | 
| 
4413.5.1
by John Arbash Meinel
 Prototype an alternative way to handle 'first commit'  | 
807  | 
entry_to_bytes = new_inv._entry_to_bytes  | 
| 
4413.5.4
by John Arbash Meinel
 Change CHKMap.from_dict to create a LeafNode and split it.  | 
808  | 
id_to_entry_dict = {}  | 
809  | 
parent_id_basename_dict = {}  | 
|
| 
4413.5.1
by John Arbash Meinel
 Prototype an alternative way to handle 'first commit'  | 
810  | 
for old_path, new_path, file_id, entry in delta:  | 
| 
4413.5.8
by John Arbash Meinel
 Change some asserts into raise: calls.  | 
811  | 
if old_path is not None:  | 
812  | 
raise ValueError('Invalid delta, somebody tried to delete %r'  | 
|
813  | 
                                 ' from the NULL_REVISION'
 | 
|
814  | 
% ((old_path, file_id),))  | 
|
815  | 
if new_path is None:  | 
|
816  | 
raise ValueError('Invalid delta, delta from NULL_REVISION has'  | 
|
817  | 
' no new_path %r' % (file_id,))  | 
|
| 
4413.5.1
by John Arbash Meinel
 Prototype an alternative way to handle 'first commit'  | 
818  | 
if new_path == '':  | 
819  | 
new_inv.root_id = file_id  | 
|
| 
4679.9.15
by John Arbash Meinel
 Cleanup some code paths. Make _check_key a helper that can be used  | 
820  | 
parent_id_basename_key = StaticTuple('', '').intern()  | 
| 
4413.5.1
by John Arbash Meinel
 Prototype an alternative way to handle 'first commit'  | 
821  | 
else:  | 
822  | 
utf8_entry_name = entry.name.encode('utf-8')  | 
|
| 
4679.9.4
by John Arbash Meinel
 A bit broken, but getting there.  | 
823  | 
parent_id_basename_key = StaticTuple(entry.parent_id,  | 
| 
4679.9.15
by John Arbash Meinel
 Cleanup some code paths. Make _check_key a helper that can be used  | 
824  | 
utf8_entry_name).intern()  | 
| 
4413.5.1
by John Arbash Meinel
 Prototype an alternative way to handle 'first commit'  | 
825  | 
new_value = entry_to_bytes(entry)  | 
| 
4413.5.10
by John Arbash Meinel
 Clean upt the test_inv tests that assumed _root_node was real and not just a key.  | 
826  | 
            # Populate Caches?
 | 
827  | 
            # new_inv._path_to_fileid_cache[new_path] = file_id
 | 
|
| 
4679.9.4
by John Arbash Meinel
 A bit broken, but getting there.  | 
828  | 
key = StaticTuple(file_id).intern()  | 
829  | 
id_to_entry_dict[key] = new_value  | 
|
| 
4413.5.4
by John Arbash Meinel
 Change CHKMap.from_dict to create a LeafNode and split it.  | 
830  | 
parent_id_basename_dict[parent_id_basename_key] = file_id  | 
831  | 
||
| 
4413.5.11
by John Arbash Meinel
 Pull out the common 'populate this CHKInventory' code out into a helper  | 
832  | 
new_inv._populate_from_dicts(self.chk_bytes, id_to_entry_dict,  | 
833  | 
parent_id_basename_dict, maximum_size=serializer.maximum_size)  | 
|
| 
4413.5.4
by John Arbash Meinel
 Change CHKMap.from_dict to create a LeafNode and split it.  | 
834  | 
return new_inv  | 
| 
4413.5.1
by John Arbash Meinel
 Prototype an alternative way to handle 'first commit'  | 
835  | 
|
| 
4241.6.8
by Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil
 Add --development6-rich-root, disabling the legacy and unneeded development2 format, and activating the tests for CHK features disabled pending this format. (Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil)  | 
836  | 
def add_inventory_by_delta(self, basis_revision_id, delta, new_revision_id,  | 
837  | 
parents, basis_inv=None, propagate_caches=False):  | 
|
838  | 
"""Add a new inventory expressed as a delta against another revision.  | 
|
839  | 
||
840  | 
        :param basis_revision_id: The inventory id the delta was created
 | 
|
841  | 
            against.
 | 
|
842  | 
        :param delta: The inventory delta (see Inventory.apply_delta for
 | 
|
843  | 
            details).
 | 
|
844  | 
        :param new_revision_id: The revision id that the inventory is being
 | 
|
845  | 
            added for.
 | 
|
846  | 
        :param parents: The revision ids of the parents that revision_id is
 | 
|
847  | 
            known to have and are in the repository already. These are supplied
 | 
|
848  | 
            for repositories that depend on the inventory graph for revision
 | 
|
849  | 
            graph access, as well as for those that pun ancestry with delta
 | 
|
850  | 
            compression.
 | 
|
851  | 
        :param basis_inv: The basis inventory if it is already known,
 | 
|
852  | 
            otherwise None.
 | 
|
853  | 
        :param propagate_caches: If True, the caches for this inventory are
 | 
|
854  | 
          copied to and updated for the result if possible.
 | 
|
855  | 
||
856  | 
        :returns: (validator, new_inv)
 | 
|
857  | 
            The validator(which is a sha1 digest, though what is sha'd is
 | 
|
858  | 
            repository format specific) of the serialized inventory, and the
 | 
|
859  | 
            resulting inventory.
 | 
|
860  | 
        """
 | 
|
861  | 
if not self.is_in_write_group():  | 
|
862  | 
raise AssertionError("%r not in write group" % (self,))  | 
|
863  | 
_mod_revision.check_not_reserved_id(new_revision_id)  | 
|
| 
4413.5.1
by John Arbash Meinel
 Prototype an alternative way to handle 'first commit'  | 
864  | 
basis_tree = None  | 
865  | 
if basis_inv is None:  | 
|
866  | 
if basis_revision_id == _mod_revision.NULL_REVISION:  | 
|
| 
4413.5.4
by John Arbash Meinel
 Change CHKMap.from_dict to create a LeafNode and split it.  | 
867  | 
new_inv = self._create_inv_from_null(delta, new_revision_id)  | 
| 
4413.5.1
by John Arbash Meinel
 Prototype an alternative way to handle 'first commit'  | 
868  | 
inv_lines = new_inv.to_lines()  | 
869  | 
return self._inventory_add_lines(new_revision_id, parents,  | 
|
870  | 
inv_lines, check_content=False), new_inv  | 
|
871  | 
else:  | 
|
872  | 
basis_tree = self.revision_tree(basis_revision_id)  | 
|
873  | 
basis_tree.lock_read()  | 
|
| 
4241.6.8
by Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil
 Add --development6-rich-root, disabling the legacy and unneeded development2 format, and activating the tests for CHK features disabled pending this format. (Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil)  | 
874  | 
basis_inv = basis_tree.inventory  | 
| 
4413.5.1
by John Arbash Meinel
 Prototype an alternative way to handle 'first commit'  | 
875  | 
try:  | 
| 
4241.6.8
by Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil
 Add --development6-rich-root, disabling the legacy and unneeded development2 format, and activating the tests for CHK features disabled pending this format. (Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil)  | 
876  | 
result = basis_inv.create_by_apply_delta(delta, new_revision_id,  | 
877  | 
propagate_caches=propagate_caches)  | 
|
878  | 
inv_lines = result.to_lines()  | 
|
879  | 
return self._inventory_add_lines(new_revision_id, parents,  | 
|
880  | 
inv_lines, check_content=False), result  | 
|
881  | 
finally:  | 
|
| 
4413.5.1
by John Arbash Meinel
 Prototype an alternative way to handle 'first commit'  | 
882  | 
if basis_tree is not None:  | 
883  | 
basis_tree.unlock()  | 
|
| 
4241.6.8
by Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil
 Add --development6-rich-root, disabling the legacy and unneeded development2 format, and activating the tests for CHK features disabled pending this format. (Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil)  | 
884  | 
|
| 
4988.3.3
by Jelmer Vernooij
 rename Repository.deserialise_inventory to Repository._deserialise_inventory.  | 
885  | 
def _deserialise_inventory(self, revision_id, bytes):  | 
| 
4332.3.27
by Robert Collins
 Fix deserialise_inventory to work with CHK repositories.  | 
886  | 
return inventory.CHKInventory.deserialise(self.chk_bytes, bytes,  | 
887  | 
(revision_id,))  | 
|
888  | 
||
| 
4476.3.1
by Andrew Bennetts
 Initial hacking to use inventory deltas for cross-format fetch.  | 
889  | 
def _iter_inventories(self, revision_ids, ordering):  | 
| 
4241.6.8
by Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil
 Add --development6-rich-root, disabling the legacy and unneeded development2 format, and activating the tests for CHK features disabled pending this format. (Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil)  | 
890  | 
"""Iterate over many inventory objects."""  | 
| 
4476.3.68
by Andrew Bennetts
 Review comments from John.  | 
891  | 
if ordering is None:  | 
892  | 
ordering = 'unordered'  | 
|
| 
4241.6.8
by Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil
 Add --development6-rich-root, disabling the legacy and unneeded development2 format, and activating the tests for CHK features disabled pending this format. (Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil)  | 
893  | 
keys = [(revision_id,) for revision_id in revision_ids]  | 
| 
4476.3.1
by Andrew Bennetts
 Initial hacking to use inventory deltas for cross-format fetch.  | 
894  | 
stream = self.inventories.get_record_stream(keys, ordering, True)  | 
| 
4241.6.8
by Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil
 Add --development6-rich-root, disabling the legacy and unneeded development2 format, and activating the tests for CHK features disabled pending this format. (Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil)  | 
895  | 
texts = {}  | 
896  | 
for record in stream:  | 
|
897  | 
if record.storage_kind != 'absent':  | 
|
898  | 
texts[record.key] = record.get_bytes_as('fulltext')  | 
|
899  | 
else:  | 
|
900  | 
raise errors.NoSuchRevision(self, record.key)  | 
|
901  | 
for key in keys:  | 
|
902  | 
yield inventory.CHKInventory.deserialise(self.chk_bytes, texts[key], key)  | 
|
903  | 
||
| 
4476.3.1
by Andrew Bennetts
 Initial hacking to use inventory deltas for cross-format fetch.  | 
904  | 
def _iter_inventory_xmls(self, revision_ids, ordering):  | 
| 
4606.5.1
by Robert Collins
 Support get_inventory_xml on CHKRepository.  | 
905  | 
        # Without a native 'xml' inventory, this method doesn't make sense.
 | 
906  | 
        # However older working trees, and older bundles want it - so we supply
 | 
|
| 
4988.5.1
by Jelmer Vernooij
 Rename Repository.get_inventory_xml -> Repository._get_inventory_xml.  | 
907  | 
        # it allowing _get_inventory_xml to work. Bundles currently use the
 | 
| 
4606.5.1
by Robert Collins
 Support get_inventory_xml on CHKRepository.  | 
908  | 
        # serializer directly; this also isn't ideal, but there isn't an xml
 | 
909  | 
        # iteration interface offered at all for repositories. We could make
 | 
|
910  | 
        # _iter_inventory_xmls be part of the contract, even if kept private.
 | 
|
911  | 
inv_to_str = self._serializer.write_inventory_to_string  | 
|
| 
4606.5.2
by Robert Collins
 Merge trunk to fixup inventory API change.  | 
912  | 
for inv in self.iter_inventories(revision_ids, ordering=ordering):  | 
| 
4606.5.1
by Robert Collins
 Support get_inventory_xml on CHKRepository.  | 
913  | 
yield inv_to_str(inv), inv.revision_id  | 
| 
4241.6.8
by Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil
 Add --development6-rich-root, disabling the legacy and unneeded development2 format, and activating the tests for CHK features disabled pending this format. (Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil)  | 
914  | 
|
| 
4360.4.12
by John Arbash Meinel
 Work out some issues with revision_ids vs revision_keys.  | 
915  | 
def _find_present_inventory_keys(self, revision_keys):  | 
916  | 
parent_map = self.inventories.get_parent_map(revision_keys)  | 
|
917  | 
present_inventory_keys = set(k for k in parent_map)  | 
|
918  | 
return present_inventory_keys  | 
|
| 
4241.6.8
by Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil
 Add --development6-rich-root, disabling the legacy and unneeded development2 format, and activating the tests for CHK features disabled pending this format. (Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil)  | 
919  | 
|
920  | 
def fileids_altered_by_revision_ids(self, revision_ids, _inv_weave=None):  | 
|
921  | 
"""Find the file ids and versions affected by revisions.  | 
|
922  | 
||
923  | 
        :param revisions: an iterable containing revision ids.
 | 
|
924  | 
        :param _inv_weave: The inventory weave from this repository or None.
 | 
|
925  | 
            If None, the inventory weave will be opened automatically.
 | 
|
926  | 
        :return: a dictionary mapping altered file-ids to an iterable of
 | 
|
927  | 
            revision_ids. Each altered file-ids has the exact revision_ids that
 | 
|
928  | 
            altered it listed explicitly.
 | 
|
929  | 
        """
 | 
|
| 
4343.3.23
by John Arbash Meinel
 Change RepositoryCHK1.fileids_altered_by to handle ghosts the way XML does.  | 
930  | 
rich_root = self.supports_rich_root()  | 
931  | 
bytes_to_info = inventory.CHKInventory._bytes_to_utf8name_key  | 
|
932  | 
file_id_revisions = {}  | 
|
| 
4241.6.8
by Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil
 Add --development6-rich-root, disabling the legacy and unneeded development2 format, and activating the tests for CHK features disabled pending this format. (Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil)  | 
933  | 
pb = ui.ui_factory.nested_progress_bar()  | 
934  | 
try:  | 
|
| 
4360.4.12
by John Arbash Meinel
 Work out some issues with revision_ids vs revision_keys.  | 
935  | 
revision_keys = [(r,) for r in revision_ids]  | 
936  | 
parent_keys = self._find_parent_keys_of_revisions(revision_keys)  | 
|
937  | 
            # TODO: instead of using _find_present_inventory_keys, change the
 | 
|
938  | 
            #       code paths to allow missing inventories to be tolerated.
 | 
|
939  | 
            #       However, we only want to tolerate missing parent
 | 
|
940  | 
            #       inventories, not missing inventories for revision_ids
 | 
|
941  | 
present_parent_inv_keys = self._find_present_inventory_keys(  | 
|
942  | 
parent_keys)  | 
|
943  | 
present_parent_inv_ids = set(  | 
|
944  | 
[k[-1] for k in present_parent_inv_keys])  | 
|
945  | 
inventories_to_read = set(revision_ids)  | 
|
946  | 
inventories_to_read.update(present_parent_inv_ids)  | 
|
| 
4634.35.7
by Andrew Bennetts
 Reuse a little more logic for calculating (un)interesting chk root keys.  | 
947  | 
root_key_info = _build_interesting_key_sets(  | 
948  | 
self, inventories_to_read, present_parent_inv_ids)  | 
|
949  | 
interesting_root_keys = root_key_info.interesting_root_keys  | 
|
950  | 
uninteresting_root_keys = root_key_info.uninteresting_root_keys  | 
|
| 
4343.3.23
by John Arbash Meinel
 Change RepositoryCHK1.fileids_altered_by to handle ghosts the way XML does.  | 
951  | 
chk_bytes = self.chk_bytes  | 
952  | 
for record, items in chk_map.iter_interesting_nodes(chk_bytes,  | 
|
953  | 
interesting_root_keys, uninteresting_root_keys,  | 
|
954  | 
pb=pb):  | 
|
955  | 
for name, bytes in items:  | 
|
956  | 
(name_utf8, file_id, revision_id) = bytes_to_info(bytes)  | 
|
| 
4679.9.23
by John Arbash Meinel
 Mostly TODO entries.  | 
957  | 
                    # TODO: consider interning file_id, revision_id here, or
 | 
958  | 
                    #       pushing that intern() into bytes_to_info()
 | 
|
959  | 
                    # TODO: rich_root should always be True here, for all
 | 
|
960  | 
                    #       repositories that support chk_bytes
 | 
|
| 
4343.3.23
by John Arbash Meinel
 Change RepositoryCHK1.fileids_altered_by to handle ghosts the way XML does.  | 
961  | 
if not rich_root and name_utf8 == '':  | 
962  | 
                        continue
 | 
|
963  | 
try:  | 
|
964  | 
file_id_revisions[file_id].add(revision_id)  | 
|
965  | 
except KeyError:  | 
|
966  | 
file_id_revisions[file_id] = set([revision_id])  | 
|
| 
4241.6.8
by Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil
 Add --development6-rich-root, disabling the legacy and unneeded development2 format, and activating the tests for CHK features disabled pending this format. (Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil)  | 
967  | 
finally:  | 
968  | 
pb.finished()  | 
|
| 
4343.3.23
by John Arbash Meinel
 Change RepositoryCHK1.fileids_altered_by to handle ghosts the way XML does.  | 
969  | 
return file_id_revisions  | 
| 
4241.6.8
by Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil
 Add --development6-rich-root, disabling the legacy and unneeded development2 format, and activating the tests for CHK features disabled pending this format. (Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil)  | 
970  | 
|
971  | 
def find_text_key_references(self):  | 
|
972  | 
"""Find the text key references within the repository.  | 
|
973  | 
||
974  | 
        :return: A dictionary mapping text keys ((fileid, revision_id) tuples)
 | 
|
975  | 
            to whether they were referred to by the inventory of the
 | 
|
976  | 
            revision_id that they contain. The inventory texts from all present
 | 
|
977  | 
            revision ids are assessed to generate this report.
 | 
|
978  | 
        """
 | 
|
979  | 
        # XXX: Slow version but correct: rewrite as a series of delta
 | 
|
980  | 
        # examinations/direct tree traversal. Note that that will require care
 | 
|
981  | 
        # as a common node is reachable both from the inventory that added it,
 | 
|
982  | 
        # and others afterwards.
 | 
|
983  | 
revision_keys = self.revisions.keys()  | 
|
984  | 
result = {}  | 
|
985  | 
rich_roots = self.supports_rich_root()  | 
|
986  | 
pb = ui.ui_factory.nested_progress_bar()  | 
|
987  | 
try:  | 
|
988  | 
all_revs = self.all_revision_ids()  | 
|
989  | 
total = len(all_revs)  | 
|
990  | 
for pos, inv in enumerate(self.iter_inventories(all_revs)):  | 
|
991  | 
pb.update("Finding text references", pos, total)  | 
|
992  | 
for _, entry in inv.iter_entries():  | 
|
993  | 
if not rich_roots and entry.file_id == inv.root_id:  | 
|
994  | 
                        continue
 | 
|
995  | 
key = (entry.file_id, entry.revision)  | 
|
996  | 
result.setdefault(key, False)  | 
|
997  | 
if entry.revision == inv.revision_id:  | 
|
998  | 
result[key] = True  | 
|
999  | 
return result  | 
|
1000  | 
finally:  | 
|
1001  | 
pb.finished()  | 
|
1002  | 
||
1003  | 
def _reconcile_pack(self, collection, packs, extension, revs, pb):  | 
|
1004  | 
packer = GCCHKReconcilePacker(collection, packs, extension)  | 
|
1005  | 
return packer.pack(pb)  | 
|
1006  | 
||
| 
3735.42.1
by John Arbash Meinel
 Create a GC => GC fetch code path.  | 
1007  | 
def _get_source(self, to_format):  | 
1008  | 
"""Return a source for streaming from this repository."""  | 
|
| 
4476.3.74
by Andrew Bennetts
 Remove unnecessary clause from if.  | 
1009  | 
if self._format._serializer == to_format._serializer:  | 
| 
3735.42.1
by John Arbash Meinel
 Create a GC => GC fetch code path.  | 
1010  | 
            # We must be exactly the same format, otherwise stuff like the chk
 | 
| 
4476.3.29
by Andrew Bennetts
 Add Repository.get_stream_1.18 verb.  | 
1011  | 
            # page layout might be different.
 | 
1012  | 
            # Actually, this test is just slightly looser than exact so that
 | 
|
1013  | 
            # CHK2 <-> 2a transfers will work.
 | 
|
| 
3735.42.1
by John Arbash Meinel
 Create a GC => GC fetch code path.  | 
1014  | 
return GroupCHKStreamSource(self, to_format)  | 
| 
4241.6.8
by Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil
 Add --development6-rich-root, disabling the legacy and unneeded development2 format, and activating the tests for CHK features disabled pending this format. (Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil)  | 
1015  | 
return super(CHKInventoryRepository, self)._get_source(to_format)  | 
| 
3735.42.1
by John Arbash Meinel
 Create a GC => GC fetch code path.  | 
1016  | 
|
1017  | 
||
| 
4360.4.4
by John Arbash Meinel
 (broken) In the middle of creating an 'optimal' knit streamer.  | 
1018  | 
class GroupCHKStreamSource(KnitPackStreamSource):  | 
| 
3735.42.1
by John Arbash Meinel
 Create a GC => GC fetch code path.  | 
1019  | 
"""Used when both the source and target repo are GroupCHK repos."""  | 
1020  | 
||
1021  | 
def __init__(self, from_repository, to_format):  | 
|
1022  | 
"""Create a StreamSource streaming from from_repository."""  | 
|
1023  | 
super(GroupCHKStreamSource, self).__init__(from_repository, to_format)  | 
|
1024  | 
self._revision_keys = None  | 
|
1025  | 
self._text_keys = None  | 
|
| 
4634.20.1
by Robert Collins
 Fix bug 402652 by recompressing all texts that are streamed - slightly slower at fetch, substantially faster and more compact at read.  | 
1026  | 
self._text_fetch_order = 'groupcompress'  | 
| 
3735.42.1
by John Arbash Meinel
 Create a GC => GC fetch code path.  | 
1027  | 
self._chk_id_roots = None  | 
1028  | 
self._chk_p_id_roots = None  | 
|
1029  | 
||
| 
4392.2.2
by John Arbash Meinel
 Add tests that ensure we can fetch branches with ghosts in their ancestry.  | 
1030  | 
def _get_inventory_stream(self, inventory_keys, allow_absent=False):  | 
| 
3735.42.1
by John Arbash Meinel
 Create a GC => GC fetch code path.  | 
1031  | 
"""Get a stream of inventory texts.  | 
1032  | 
||
1033  | 
        When this function returns, self._chk_id_roots and self._chk_p_id_roots
 | 
|
1034  | 
        should be populated.
 | 
|
1035  | 
        """
 | 
|
1036  | 
self._chk_id_roots = []  | 
|
1037  | 
self._chk_p_id_roots = []  | 
|
1038  | 
def _filtered_inv_stream():  | 
|
1039  | 
id_roots_set = set()  | 
|
1040  | 
p_id_roots_set = set()  | 
|
1041  | 
source_vf = self.from_repository.inventories  | 
|
| 
4343.3.4
by John Arbash Meinel
 Custom implementation for GroupCHKStreamSource.get_stream_for_missing_keys.  | 
1042  | 
stream = source_vf.get_record_stream(inventory_keys,  | 
| 
4634.20.1
by Robert Collins
 Fix bug 402652 by recompressing all texts that are streamed - slightly slower at fetch, substantially faster and more compact at read.  | 
1043  | 
'groupcompress', True)  | 
| 
3735.42.1
by John Arbash Meinel
 Create a GC => GC fetch code path.  | 
1044  | 
for record in stream:  | 
| 
4392.2.2
by John Arbash Meinel
 Add tests that ensure we can fetch branches with ghosts in their ancestry.  | 
1045  | 
if record.storage_kind == 'absent':  | 
1046  | 
if allow_absent:  | 
|
1047  | 
                        continue
 | 
|
1048  | 
else:  | 
|
1049  | 
raise errors.NoSuchRevision(self, record.key)  | 
|
| 
3735.42.1
by John Arbash Meinel
 Create a GC => GC fetch code path.  | 
1050  | 
bytes = record.get_bytes_as('fulltext')  | 
1051  | 
chk_inv = inventory.CHKInventory.deserialise(None, bytes,  | 
|
1052  | 
record.key)  | 
|
1053  | 
key = chk_inv.id_to_entry.key()  | 
|
1054  | 
if key not in id_roots_set:  | 
|
1055  | 
self._chk_id_roots.append(key)  | 
|
1056  | 
id_roots_set.add(key)  | 
|
1057  | 
p_id_map = chk_inv.parent_id_basename_to_file_id  | 
|
1058  | 
if p_id_map is None:  | 
|
1059  | 
raise AssertionError('Parent id -> file_id map not set')  | 
|
1060  | 
key = p_id_map.key()  | 
|
1061  | 
if key not in p_id_roots_set:  | 
|
1062  | 
p_id_roots_set.add(key)  | 
|
1063  | 
self._chk_p_id_roots.append(key)  | 
|
1064  | 
yield record  | 
|
1065  | 
            # We have finished processing all of the inventory records, we
 | 
|
1066  | 
            # don't need these sets anymore
 | 
|
1067  | 
id_roots_set.clear()  | 
|
1068  | 
p_id_roots_set.clear()  | 
|
1069  | 
return ('inventories', _filtered_inv_stream())  | 
|
1070  | 
||
| 
4360.4.12
by John Arbash Meinel
 Work out some issues with revision_ids vs revision_keys.  | 
1071  | 
def _get_filtered_chk_streams(self, excluded_revision_keys):  | 
| 
3735.42.1
by John Arbash Meinel
 Create a GC => GC fetch code path.  | 
1072  | 
self._text_keys = set()  | 
| 
4360.4.12
by John Arbash Meinel
 Work out some issues with revision_ids vs revision_keys.  | 
1073  | 
excluded_revision_keys.discard(_mod_revision.NULL_REVISION)  | 
1074  | 
if not excluded_revision_keys:  | 
|
| 
3735.42.1
by John Arbash Meinel
 Create a GC => GC fetch code path.  | 
1075  | 
uninteresting_root_keys = set()  | 
1076  | 
uninteresting_pid_root_keys = set()  | 
|
1077  | 
else:  | 
|
| 
4343.3.26
by John Arbash Meinel
 Handle get_stream when a parent is actually a ghost.  | 
1078  | 
            # filter out any excluded revisions whose inventories are not
 | 
1079  | 
            # actually present
 | 
|
1080  | 
            # TODO: Update Repository.iter_inventories() to add
 | 
|
1081  | 
            #       ignore_missing=True
 | 
|
| 
4360.4.12
by John Arbash Meinel
 Work out some issues with revision_ids vs revision_keys.  | 
1082  | 
present_keys = self.from_repository._find_present_inventory_keys(  | 
1083  | 
excluded_revision_keys)  | 
|
1084  | 
present_ids = [k[-1] for k in present_keys]  | 
|
| 
3735.42.1
by John Arbash Meinel
 Create a GC => GC fetch code path.  | 
1085  | 
uninteresting_root_keys = set()  | 
1086  | 
uninteresting_pid_root_keys = set()  | 
|
| 
4343.3.26
by John Arbash Meinel
 Handle get_stream when a parent is actually a ghost.  | 
1087  | 
for inv in self.from_repository.iter_inventories(present_ids):  | 
| 
3735.42.1
by John Arbash Meinel
 Create a GC => GC fetch code path.  | 
1088  | 
uninteresting_root_keys.add(inv.id_to_entry.key())  | 
1089  | 
uninteresting_pid_root_keys.add(  | 
|
1090  | 
inv.parent_id_basename_to_file_id.key())  | 
|
1091  | 
bytes_to_info = inventory.CHKInventory._bytes_to_utf8name_key  | 
|
1092  | 
chk_bytes = self.from_repository.chk_bytes  | 
|
1093  | 
def _filter_id_to_entry():  | 
|
| 
4634.35.6
by Andrew Bennetts
 Start reusing common logic for calculating text keys.  | 
1094  | 
interesting_nodes = chk_map.iter_interesting_nodes(chk_bytes,  | 
1095  | 
self._chk_id_roots, uninteresting_root_keys)  | 
|
1096  | 
for record in _filter_text_keys(interesting_nodes, self._text_keys,  | 
|
1097  | 
bytes_to_info):  | 
|
| 
3735.42.1
by John Arbash Meinel
 Create a GC => GC fetch code path.  | 
1098  | 
if record is not None:  | 
1099  | 
yield record  | 
|
| 
4343.3.8
by John Arbash Meinel
 Some cleanup passes.  | 
1100  | 
            # Consumed
 | 
1101  | 
self._chk_id_roots = None  | 
|
| 
3735.42.1
by John Arbash Meinel
 Create a GC => GC fetch code path.  | 
1102  | 
yield 'chk_bytes', _filter_id_to_entry()  | 
1103  | 
def _get_parent_id_basename_to_file_id_pages():  | 
|
1104  | 
for record, items in chk_map.iter_interesting_nodes(chk_bytes,  | 
|
1105  | 
self._chk_p_id_roots, uninteresting_pid_root_keys):  | 
|
1106  | 
if record is not None:  | 
|
1107  | 
yield record  | 
|
| 
4343.3.8
by John Arbash Meinel
 Some cleanup passes.  | 
1108  | 
            # Consumed
 | 
1109  | 
self._chk_p_id_roots = None  | 
|
| 
3735.42.1
by John Arbash Meinel
 Create a GC => GC fetch code path.  | 
1110  | 
yield 'chk_bytes', _get_parent_id_basename_to_file_id_pages()  | 
1111  | 
||
1112  | 
def get_stream(self, search):  | 
|
1113  | 
revision_ids = search.get_keys()  | 
|
1114  | 
for stream_info in self._fetch_revision_texts(revision_ids):  | 
|
1115  | 
yield stream_info  | 
|
1116  | 
self._revision_keys = [(rev_id,) for rev_id in revision_ids]  | 
|
| 
4744.2.5
by John Arbash Meinel
 Change to a generic 'VersionedFiles.clear_cache()' api.  | 
1117  | 
self.from_repository.revisions.clear_cache()  | 
| 
4744.2.8
by John Arbash Meinel
 Don't forget to clear the signatures cache.  | 
1118  | 
self.from_repository.signatures.clear_cache()  | 
| 
4343.3.4
by John Arbash Meinel
 Custom implementation for GroupCHKStreamSource.get_stream_for_missing_keys.  | 
1119  | 
yield self._get_inventory_stream(self._revision_keys)  | 
| 
4744.2.5
by John Arbash Meinel
 Change to a generic 'VersionedFiles.clear_cache()' api.  | 
1120  | 
self.from_repository.inventories.clear_cache()  | 
| 
4343.3.12
by John Arbash Meinel
 instead of trusting the Search, use a get_parent_map call.  | 
1121  | 
        # TODO: The keys to exclude might be part of the search recipe
 | 
1122  | 
        # For now, exclude all parents that are at the edge of ancestry, for
 | 
|
1123  | 
        # which we have inventories
 | 
|
| 
4343.3.36
by John Arbash Meinel
 Some review feedback from Andrew.  | 
1124  | 
from_repo = self.from_repository  | 
| 
4360.4.12
by John Arbash Meinel
 Work out some issues with revision_ids vs revision_keys.  | 
1125  | 
parent_keys = from_repo._find_parent_keys_of_revisions(  | 
1126  | 
self._revision_keys)  | 
|
1127  | 
for stream_info in self._get_filtered_chk_streams(parent_keys):  | 
|
| 
3735.42.1
by John Arbash Meinel
 Create a GC => GC fetch code path.  | 
1128  | 
yield stream_info  | 
| 
4744.2.5
by John Arbash Meinel
 Change to a generic 'VersionedFiles.clear_cache()' api.  | 
1129  | 
self.from_repository.chk_bytes.clear_cache()  | 
| 
3735.42.1
by John Arbash Meinel
 Create a GC => GC fetch code path.  | 
1130  | 
yield self._get_text_stream()  | 
| 
4744.2.5
by John Arbash Meinel
 Change to a generic 'VersionedFiles.clear_cache()' api.  | 
1131  | 
self.from_repository.texts.clear_cache()  | 
| 
4241.6.8
by Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil
 Add --development6-rich-root, disabling the legacy and unneeded development2 format, and activating the tests for CHK features disabled pending this format. (Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil)  | 
1132  | 
|
| 
4343.3.4
by John Arbash Meinel
 Custom implementation for GroupCHKStreamSource.get_stream_for_missing_keys.  | 
1133  | 
def get_stream_for_missing_keys(self, missing_keys):  | 
1134  | 
        # missing keys can only occur when we are byte copying and not
 | 
|
1135  | 
        # translating (because translation means we don't send
 | 
|
1136  | 
        # unreconstructable deltas ever).
 | 
|
| 
4343.3.8
by John Arbash Meinel
 Some cleanup passes.  | 
1137  | 
missing_inventory_keys = set()  | 
| 
4343.3.4
by John Arbash Meinel
 Custom implementation for GroupCHKStreamSource.get_stream_for_missing_keys.  | 
1138  | 
for key in missing_keys:  | 
| 
4343.3.8
by John Arbash Meinel
 Some cleanup passes.  | 
1139  | 
if key[0] != 'inventories':  | 
| 
4343.3.4
by John Arbash Meinel
 Custom implementation for GroupCHKStreamSource.get_stream_for_missing_keys.  | 
1140  | 
raise AssertionError('The only missing keys we should'  | 
1141  | 
' be filling in are inventory keys, not %s'  | 
|
| 
4343.3.8
by John Arbash Meinel
 Some cleanup passes.  | 
1142  | 
% (key[0],))  | 
1143  | 
missing_inventory_keys.add(key[1:])  | 
|
1144  | 
if self._chk_id_roots or self._chk_p_id_roots:  | 
|
1145  | 
raise AssertionError('Cannot call get_stream_for_missing_keys'  | 
|
| 
4634.35.5
by Andrew Bennetts
 Check for missing texts, too.  | 
1146  | 
' until all of get_stream() has been consumed.')  | 
| 
4343.3.4
by John Arbash Meinel
 Custom implementation for GroupCHKStreamSource.get_stream_for_missing_keys.  | 
1147  | 
        # Yield the inventory stream, so we can find the chk stream
 | 
| 
4392.2.2
by John Arbash Meinel
 Add tests that ensure we can fetch branches with ghosts in their ancestry.  | 
1148  | 
        # Some of the missing_keys will be missing because they are ghosts.
 | 
1149  | 
        # As such, we can ignore them. The Sink is required to verify there are
 | 
|
1150  | 
        # no unavailable texts when the ghost inventories are not filled in.
 | 
|
1151  | 
yield self._get_inventory_stream(missing_inventory_keys,  | 
|
1152  | 
allow_absent=True)  | 
|
| 
4360.4.12
by John Arbash Meinel
 Work out some issues with revision_ids vs revision_keys.  | 
1153  | 
        # We use the empty set for excluded_revision_keys, to make it clear
 | 
1154  | 
        # that we want to transmit all referenced chk pages.
 | 
|
| 
4343.3.4
by John Arbash Meinel
 Custom implementation for GroupCHKStreamSource.get_stream_for_missing_keys.  | 
1155  | 
for stream_info in self._get_filtered_chk_streams(set()):  | 
1156  | 
yield stream_info  | 
|
1157  | 
||
| 
4241.6.8
by Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil
 Add --development6-rich-root, disabling the legacy and unneeded development2 format, and activating the tests for CHK features disabled pending this format. (Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil)  | 
1158  | 
|
| 
4634.35.7
by Andrew Bennetts
 Reuse a little more logic for calculating (un)interesting chk root keys.  | 
1159  | 
class _InterestingKeyInfo(object):  | 
1160  | 
def __init__(self):  | 
|
1161  | 
self.interesting_root_keys = set()  | 
|
1162  | 
self.interesting_pid_root_keys = set()  | 
|
1163  | 
self.uninteresting_root_keys = set()  | 
|
1164  | 
self.uninteresting_pid_root_keys = set()  | 
|
1165  | 
||
1166  | 
def all_interesting(self):  | 
|
1167  | 
return self.interesting_root_keys.union(self.interesting_pid_root_keys)  | 
|
1168  | 
||
1169  | 
def all_uninteresting(self):  | 
|
1170  | 
return self.uninteresting_root_keys.union(  | 
|
1171  | 
self.uninteresting_pid_root_keys)  | 
|
1172  | 
||
1173  | 
def all_keys(self):  | 
|
1174  | 
return self.all_interesting().union(self.all_uninteresting())  | 
|
1175  | 
||
1176  | 
||
1177  | 
def _build_interesting_key_sets(repo, inventory_ids, parent_only_inv_ids):  | 
|
1178  | 
result = _InterestingKeyInfo()  | 
|
1179  | 
for inv in repo.iter_inventories(inventory_ids, 'unordered'):  | 
|
1180  | 
root_key = inv.id_to_entry.key()  | 
|
1181  | 
pid_root_key = inv.parent_id_basename_to_file_id.key()  | 
|
1182  | 
if inv.revision_id in parent_only_inv_ids:  | 
|
1183  | 
result.uninteresting_root_keys.add(root_key)  | 
|
1184  | 
result.uninteresting_pid_root_keys.add(pid_root_key)  | 
|
1185  | 
else:  | 
|
1186  | 
result.interesting_root_keys.add(root_key)  | 
|
1187  | 
result.interesting_pid_root_keys.add(pid_root_key)  | 
|
1188  | 
return result  | 
|
1189  | 
||
1190  | 
||
| 
4634.35.6
by Andrew Bennetts
 Start reusing common logic for calculating text keys.  | 
1191  | 
def _filter_text_keys(interesting_nodes_iterable, text_keys, bytes_to_info):  | 
1192  | 
"""Iterate the result of iter_interesting_nodes, yielding the records  | 
|
1193  | 
    and adding to text_keys.
 | 
|
1194  | 
    """
 | 
|
1195  | 
for record, items in interesting_nodes_iterable:  | 
|
1196  | 
for name, bytes in items:  | 
|
1197  | 
            # Note: we don't care about name_utf8, because groupcompress repos
 | 
|
1198  | 
            # are always rich-root, so there are no synthesised root records to
 | 
|
1199  | 
            # ignore.
 | 
|
1200  | 
_, file_id, revision_id = bytes_to_info(bytes)  | 
|
| 
4679.9.17
by John Arbash Meinel
 Checkpoint.... I think I've cut off another 50MB or so peak mem.  | 
1201  | 
file_id = intern(file_id)  | 
1202  | 
revision_id = intern(revision_id)  | 
|
1203  | 
text_keys.add(StaticTuple(file_id, revision_id).intern())  | 
|
| 
4634.35.6
by Andrew Bennetts
 Start reusing common logic for calculating text keys.  | 
1204  | 
yield record  | 
1205  | 
||
1206  | 
||
1207  | 
||
1208  | 
||
| 
4241.6.8
by Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil
 Add --development6-rich-root, disabling the legacy and unneeded development2 format, and activating the tests for CHK features disabled pending this format. (Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil)  | 
1209  | 
class RepositoryFormatCHK1(RepositoryFormatPack):  | 
1210  | 
"""A hashed CHK+group compress pack repository."""  | 
|
1211  | 
||
1212  | 
repository_class = CHKInventoryRepository  | 
|
| 
4343.3.1
by John Arbash Meinel
 Set 'supports_external_lookups=True' for dev6 repositories.  | 
1213  | 
supports_external_lookups = True  | 
| 
4241.6.8
by Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil
 Add --development6-rich-root, disabling the legacy and unneeded development2 format, and activating the tests for CHK features disabled pending this format. (Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil)  | 
1214  | 
supports_chks = True  | 
| 
4476.3.42
by Andrew Bennetts
 Restore InterDifferingSerializer, but only for local source & target.  | 
1215  | 
    # For right now, setting this to True gives us InterModel1And2 rather
 | 
1216  | 
    # than InterDifferingSerializer
 | 
|
| 
4241.6.8
by Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil
 Add --development6-rich-root, disabling the legacy and unneeded development2 format, and activating the tests for CHK features disabled pending this format. (Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil)  | 
1217  | 
_commit_builder_class = PackRootCommitBuilder  | 
1218  | 
rich_root_data = True  | 
|
1219  | 
_serializer = chk_serializer.chk_serializer_255_bigpage  | 
|
1220  | 
_commit_inv_deltas = True  | 
|
1221  | 
    # What index classes to use
 | 
|
1222  | 
index_builder_class = BTreeBuilder  | 
|
1223  | 
index_class = BTreeGraphIndex  | 
|
1224  | 
    # Note: We cannot unpack a delta that references a text we haven't
 | 
|
1225  | 
    # seen yet. There are 2 options, work in fulltexts, or require
 | 
|
1226  | 
    # topological sorting. Using fulltexts is more optimal for local
 | 
|
1227  | 
    # operations, because the source can be smart about extracting
 | 
|
1228  | 
    # multiple in-a-row (and sharing strings). Topological is better
 | 
|
1229  | 
    # for remote, because we access less data.
 | 
|
1230  | 
_fetch_order = 'unordered'  | 
|
| 
4265.1.2
by John Arbash Meinel
 Set _fetch_uses_deltas back to False, so that conversions from arbitrary sources can still fetch 'unordered'  | 
1231  | 
_fetch_uses_deltas = False # essentially ignored by the groupcompress code.  | 
| 
4241.6.8
by Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil
 Add --development6-rich-root, disabling the legacy and unneeded development2 format, and activating the tests for CHK features disabled pending this format. (Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil)  | 
1232  | 
fast_deltas = True  | 
| 
4431.3.7
by Jonathan Lange
 Cherrypick bzr.dev 4470, resolving conflicts.  | 
1233  | 
pack_compresses = True  | 
| 
4241.6.8
by Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil
 Add --development6-rich-root, disabling the legacy and unneeded development2 format, and activating the tests for CHK features disabled pending this format. (Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil)  | 
1234  | 
|
1235  | 
def _get_matching_bzrdir(self):  | 
|
1236  | 
return bzrdir.format_registry.make_bzrdir('development6-rich-root')  | 
|
1237  | 
||
1238  | 
def _ignore_setting_bzrdir(self, format):  | 
|
1239  | 
        pass
 | 
|
1240  | 
||
1241  | 
_matchingbzrdir = property(_get_matching_bzrdir, _ignore_setting_bzrdir)  | 
|
1242  | 
||
1243  | 
def get_format_string(self):  | 
|
1244  | 
"""See RepositoryFormat.get_format_string()."""  | 
|
1245  | 
return ('Bazaar development format - group compression and chk inventory'  | 
|
1246  | 
' (needs bzr.dev from 1.14)\n')  | 
|
1247  | 
||
1248  | 
def get_format_description(self):  | 
|
1249  | 
"""See RepositoryFormat.get_format_description()."""  | 
|
1250  | 
return ("Development repository format - rich roots, group compression"  | 
|
1251  | 
" and chk inventories")  | 
|
1252  | 
||
| 
4290.1.7
by Jelmer Vernooij
 Add development7-rich-root format that uses the RIO Serializer.  | 
1253  | 
|
1254  | 
class RepositoryFormatCHK2(RepositoryFormatCHK1):  | 
|
| 
4290.1.12
by Jelmer Vernooij
 Use bencode rather than rio in the new revision serialiszer.  | 
1255  | 
"""A CHK repository that uses the bencode revision serializer."""  | 
| 
4290.1.7
by Jelmer Vernooij
 Add development7-rich-root format that uses the RIO Serializer.  | 
1256  | 
|
| 
4290.1.12
by Jelmer Vernooij
 Use bencode rather than rio in the new revision serialiszer.  | 
1257  | 
_serializer = chk_serializer.chk_bencode_serializer  | 
| 
4290.1.7
by Jelmer Vernooij
 Add development7-rich-root format that uses the RIO Serializer.  | 
1258  | 
|
1259  | 
def _get_matching_bzrdir(self):  | 
|
1260  | 
return bzrdir.format_registry.make_bzrdir('development7-rich-root')  | 
|
1261  | 
||
1262  | 
def _ignore_setting_bzrdir(self, format):  | 
|
1263  | 
        pass
 | 
|
1264  | 
||
1265  | 
_matchingbzrdir = property(_get_matching_bzrdir, _ignore_setting_bzrdir)  | 
|
1266  | 
||
1267  | 
def get_format_string(self):  | 
|
1268  | 
"""See RepositoryFormat.get_format_string()."""  | 
|
| 
4290.1.12
by Jelmer Vernooij
 Use bencode rather than rio in the new revision serialiszer.  | 
1269  | 
return ('Bazaar development format - chk repository with bencode '  | 
| 
4413.3.1
by Jelmer Vernooij
 Mention bzr 1.16 in the dev7 format description.  | 
1270  | 
'revision serialization (needs bzr.dev from 1.16)\n')  | 
| 
4290.1.7
by Jelmer Vernooij
 Add development7-rich-root format that uses the RIO Serializer.  | 
1271  | 
|
1272  | 
||
| 
4428.2.1
by Martin Pool
 Add 2a format  | 
1273  | 
class RepositoryFormat2a(RepositoryFormatCHK2):  | 
1274  | 
"""A CHK repository that uses the bencode revision serializer.  | 
|
| 
4597.1.6
by John Arbash Meinel
 Add a test that inventory texts are preserved during pack.  | 
1275  | 
|
| 
4428.2.1
by Martin Pool
 Add 2a format  | 
1276  | 
    This is the same as RepositoryFormatCHK2 but with a public name.
 | 
1277  | 
    """
 | 
|
1278  | 
||
1279  | 
_serializer = chk_serializer.chk_bencode_serializer  | 
|
1280  | 
||
1281  | 
def _get_matching_bzrdir(self):  | 
|
1282  | 
return bzrdir.format_registry.make_bzrdir('2a')  | 
|
1283  | 
||
1284  | 
def _ignore_setting_bzrdir(self, format):  | 
|
1285  | 
        pass
 | 
|
1286  | 
||
1287  | 
_matchingbzrdir = property(_get_matching_bzrdir, _ignore_setting_bzrdir)  | 
|
1288  | 
||
1289  | 
def get_format_string(self):  | 
|
1290  | 
return ('Bazaar repository format 2a (needs bzr 1.16 or later)\n')  | 
|
| 
4634.28.1
by John Arbash Meinel
 Update format description for --2a, it is no longer a 'development format'  | 
1291  | 
|
1292  | 
def get_format_description(self):  | 
|
1293  | 
"""See RepositoryFormat.get_format_description()."""  | 
|
1294  | 
return ("Repository format 2a - rich roots, group compression"  | 
|
1295  | 
" and chk inventories")  |