bzr branch
http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
| 
2220.2.1
by Martin Pool
 Start adding space for tags stored in the repository  | 
1  | 
# Copyright (C) 2005, 2006, 2007 Canonical Ltd
 | 
| 
1887.1.1
by Adeodato Simó
 Do not separate paragraphs in the copyright statement with blank lines,  | 
2  | 
#
 | 
| 
1185.65.1
by Aaron Bentley
 Refactored out ControlFiles and RevisionStore from _Branch  | 
3  | 
# This program is free software; you can redistribute it and/or modify
 | 
4  | 
# it under the terms of the GNU General Public License as published by
 | 
|
5  | 
# the Free Software Foundation; either version 2 of the License, or
 | 
|
6  | 
# (at your option) any later version.
 | 
|
| 
1887.1.1
by Adeodato Simó
 Do not separate paragraphs in the copyright statement with blank lines,  | 
7  | 
#
 | 
| 
1185.65.1
by Aaron Bentley
 Refactored out ControlFiles and RevisionStore from _Branch  | 
8  | 
# This program is distributed in the hope that it will be useful,
 | 
9  | 
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
|
10  | 
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
|
11  | 
# GNU General Public License for more details.
 | 
|
| 
1887.1.1
by Adeodato Simó
 Do not separate paragraphs in the copyright statement with blank lines,  | 
12  | 
#
 | 
| 
1185.65.1
by Aaron Bentley
 Refactored out ControlFiles and RevisionStore from _Branch  | 
13  | 
# You should have received a copy of the GNU General Public License
 | 
14  | 
# along with this program; if not, write to the Free Software
 | 
|
15  | 
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
|
| 
1185.65.10
by Robert Collins
 Rename Controlfiles to LockableFiles.  | 
16  | 
|
| 
1996.3.4
by John Arbash Meinel
 lazy_import bzrlib/repository.py  | 
17  | 
from cStringIO import StringIO  | 
18  | 
||
19  | 
from bzrlib.lazy_import import lazy_import  | 
|
20  | 
lazy_import(globals(), """  | 
|
| 
1740.3.7
by Jelmer Vernooij
 Move committer, log, revprops, timestamp and timezone to CommitBuilder.  | 
21  | 
import re
 | 
22  | 
import time
 | 
|
| 
1996.3.4
by John Arbash Meinel
 lazy_import bzrlib/repository.py  | 
23  | 
|
| 
1910.2.22
by Aaron Bentley
 Make commits preserve root entry data  | 
24  | 
from bzrlib import (
 | 
| 
1996.3.4
by John Arbash Meinel
 lazy_import bzrlib/repository.py  | 
25  | 
    bzrdir,
 | 
26  | 
    check,
 | 
|
| 
2745.1.1
by Robert Collins
 Add a number of -Devil checkpoints.  | 
27  | 
    debug,
 | 
| 
2490.2.21
by Aaron Bentley
 Rename graph to deprecated_graph  | 
28  | 
    deprecated_graph,
 | 
| 
1996.3.4
by John Arbash Meinel
 lazy_import bzrlib/repository.py  | 
29  | 
    errors,
 | 
| 
2116.4.1
by John Arbash Meinel
 Update file and revision id generators.  | 
30  | 
    generate_ids,
 | 
| 
1996.3.4
by John Arbash Meinel
 lazy_import bzrlib/repository.py  | 
31  | 
    gpg,
 | 
32  | 
    graph,
 | 
|
| 
2163.2.1
by John Arbash Meinel
 Speed up the fileids_altered_by_revision_ids processing  | 
33  | 
    lazy_regex,
 | 
| 
1996.3.4
by John Arbash Meinel
 lazy_import bzrlib/repository.py  | 
34  | 
    lockable_files,
 | 
35  | 
    lockdir,
 | 
|
| 
1910.2.22
by Aaron Bentley
 Make commits preserve root entry data  | 
36  | 
    osutils,
 | 
| 
2241.1.1
by Martin Pool
 Change RepositoryFormat to use a Registry rather than ad-hoc dictionary  | 
37  | 
    registry,
 | 
| 
2018.5.163
by Andrew Bennetts
 Deal with various review comments from Robert.  | 
38  | 
    remote,
 | 
| 
1996.3.4
by John Arbash Meinel
 lazy_import bzrlib/repository.py  | 
39  | 
    revision as _mod_revision,
 | 
40  | 
    symbol_versioning,
 | 
|
| 
1910.2.22
by Aaron Bentley
 Make commits preserve root entry data  | 
41  | 
    transactions,
 | 
| 
1996.3.4
by John Arbash Meinel
 lazy_import bzrlib/repository.py  | 
42  | 
    ui,
 | 
43  | 
    )
 | 
|
| 
2520.4.54
by Aaron Bentley
 Hang a create_bundle method off repository  | 
44  | 
from bzrlib.bundle import serializer
 | 
| 
1996.3.4
by John Arbash Meinel
 lazy_import bzrlib/repository.py  | 
45  | 
from bzrlib.revisiontree import RevisionTree
 | 
46  | 
from bzrlib.store.versioned import VersionedFileStore
 | 
|
47  | 
from bzrlib.store.text import TextStore
 | 
|
48  | 
from bzrlib.testament import Testament
 | 
|
49  | 
""")  | 
|
50  | 
||
| 
1534.4.28
by Robert Collins
 first cut at merge from integration.  | 
51  | 
from bzrlib.decorators import needs_read_lock, needs_write_lock  | 
| 
1563.2.12
by Robert Collins
 Checkpointing: created InterObject to factor out common inter object worker code, added InterVersionedFile and tests to allow making join work between any versionedfile.  | 
52  | 
from bzrlib.inter import InterObject  | 
| 
1910.2.3
by Aaron Bentley
 All tests pass  | 
53  | 
from bzrlib.inventory import Inventory, InventoryDirectory, ROOT_ID  | 
| 
1996.3.4
by John Arbash Meinel
 lazy_import bzrlib/repository.py  | 
54  | 
from bzrlib.symbol_versioning import (  | 
55  | 
deprecated_method,  | 
|
| 
1773.4.1
by Martin Pool
 Add pyflakes makefile target; fix many warnings  | 
56  | 
        )
 | 
| 
2745.1.1
by Robert Collins
 Add a number of -Devil checkpoints.  | 
57  | 
from bzrlib.trace import mutter, mutter_callsite, note, warning  | 
| 
1185.70.3
by Martin Pool
 Various updates to make storage branch mergeable:  | 
58  | 
|
| 
1185.65.1
by Aaron Bentley
 Refactored out ControlFiles and RevisionStore from _Branch  | 
59  | 
|
| 
1904.2.5
by Martin Pool
 Fix format warning inside test suite and add test  | 
60  | 
# Old formats display a warning, but only once
 | 
61  | 
_deprecation_warning_done = False  | 
|
62  | 
||
63  | 
||
| 
2818.3.1
by Robert Collins
 Change CommitBuilder factory delegation to allow simple declaration.  | 
64  | 
class CommitBuilder(object):  | 
65  | 
"""Provides an interface to build up a commit.  | 
|
66  | 
||
67  | 
    This allows describing a tree to be committed without needing to 
 | 
|
68  | 
    know the internals of the format of the repository.
 | 
|
69  | 
    """
 | 
|
70  | 
||
71  | 
    # all clients should supply tree roots.
 | 
|
72  | 
record_root_entry = True  | 
|
| 
2825.5.2
by Robert Collins
 Review feedback, and fix pointless commits with nested trees to raise PointlessCommit appropriately.  | 
73  | 
    # the default CommitBuilder does not manage trees whose root is versioned.
 | 
74  | 
_versioned_root = False  | 
|
| 
2818.3.1
by Robert Collins
 Change CommitBuilder factory delegation to allow simple declaration.  | 
75  | 
|
76  | 
def __init__(self, repository, parents, config, timestamp=None,  | 
|
77  | 
timezone=None, committer=None, revprops=None,  | 
|
78  | 
revision_id=None):  | 
|
79  | 
"""Initiate a CommitBuilder.  | 
|
80  | 
||
81  | 
        :param repository: Repository to commit to.
 | 
|
82  | 
        :param parents: Revision ids of the parents of the new revision.
 | 
|
83  | 
        :param config: Configuration to use.
 | 
|
84  | 
        :param timestamp: Optional timestamp recorded for commit.
 | 
|
85  | 
        :param timezone: Optional timezone for timestamp.
 | 
|
86  | 
        :param committer: Optional committer to set for commit.
 | 
|
87  | 
        :param revprops: Optional dictionary of revision properties.
 | 
|
88  | 
        :param revision_id: Optional revision id.
 | 
|
89  | 
        """
 | 
|
90  | 
self._config = config  | 
|
91  | 
||
92  | 
if committer is None:  | 
|
93  | 
self._committer = self._config.username()  | 
|
94  | 
else:  | 
|
95  | 
assert isinstance(committer, basestring), type(committer)  | 
|
96  | 
self._committer = committer  | 
|
97  | 
||
98  | 
self.new_inventory = Inventory(None)  | 
|
99  | 
self._new_revision_id = osutils.safe_revision_id(revision_id)  | 
|
100  | 
self.parents = parents  | 
|
101  | 
self.repository = repository  | 
|
102  | 
||
103  | 
self._revprops = {}  | 
|
104  | 
if revprops is not None:  | 
|
105  | 
self._revprops.update(revprops)  | 
|
106  | 
||
107  | 
if timestamp is None:  | 
|
108  | 
timestamp = time.time()  | 
|
109  | 
        # Restrict resolution to 1ms
 | 
|
110  | 
self._timestamp = round(timestamp, 3)  | 
|
111  | 
||
112  | 
if timezone is None:  | 
|
113  | 
self._timezone = osutils.local_time_offset()  | 
|
114  | 
else:  | 
|
115  | 
self._timezone = int(timezone)  | 
|
116  | 
||
117  | 
self._generate_revision_if_needed()  | 
|
118  | 
||
119  | 
def commit(self, message):  | 
|
120  | 
"""Make the actual commit.  | 
|
121  | 
||
122  | 
        :return: The revision id of the recorded revision.
 | 
|
123  | 
        """
 | 
|
124  | 
rev = _mod_revision.Revision(  | 
|
125  | 
timestamp=self._timestamp,  | 
|
126  | 
timezone=self._timezone,  | 
|
127  | 
committer=self._committer,  | 
|
128  | 
message=message,  | 
|
129  | 
inventory_sha1=self.inv_sha1,  | 
|
130  | 
revision_id=self._new_revision_id,  | 
|
131  | 
properties=self._revprops)  | 
|
132  | 
rev.parent_ids = self.parents  | 
|
133  | 
self.repository.add_revision(self._new_revision_id, rev,  | 
|
134  | 
self.new_inventory, self._config)  | 
|
135  | 
self.repository.commit_write_group()  | 
|
136  | 
return self._new_revision_id  | 
|
137  | 
||
138  | 
def abort(self):  | 
|
139  | 
"""Abort the commit that is being built.  | 
|
140  | 
        """
 | 
|
141  | 
self.repository.abort_write_group()  | 
|
142  | 
||
143  | 
def revision_tree(self):  | 
|
144  | 
"""Return the tree that was just committed.  | 
|
145  | 
||
146  | 
        After calling commit() this can be called to get a RevisionTree
 | 
|
147  | 
        representing the newly committed tree. This is preferred to
 | 
|
148  | 
        calling Repository.revision_tree() because that may require
 | 
|
149  | 
        deserializing the inventory, while we already have a copy in
 | 
|
150  | 
        memory.
 | 
|
151  | 
        """
 | 
|
152  | 
return RevisionTree(self.repository, self.new_inventory,  | 
|
153  | 
self._new_revision_id)  | 
|
154  | 
||
155  | 
def finish_inventory(self):  | 
|
156  | 
"""Tell the builder that the inventory is finished."""  | 
|
157  | 
if self.new_inventory.root is None:  | 
|
158  | 
symbol_versioning.warn('Root entry should be supplied to'  | 
|
159  | 
' record_entry_contents, as of bzr 0.10.',  | 
|
160  | 
DeprecationWarning, stacklevel=2)  | 
|
161  | 
self.new_inventory.add(InventoryDirectory(ROOT_ID, '', None))  | 
|
162  | 
self.new_inventory.revision_id = self._new_revision_id  | 
|
163  | 
self.inv_sha1 = self.repository.add_inventory(  | 
|
164  | 
self._new_revision_id,  | 
|
165  | 
self.new_inventory,  | 
|
166  | 
self.parents  | 
|
167  | 
            )
 | 
|
168  | 
||
169  | 
def _gen_revision_id(self):  | 
|
170  | 
"""Return new revision-id."""  | 
|
171  | 
return generate_ids.gen_revision_id(self._config.username(),  | 
|
172  | 
self._timestamp)  | 
|
173  | 
||
174  | 
def _generate_revision_if_needed(self):  | 
|
175  | 
"""Create a revision id if None was supplied.  | 
|
176  | 
        
 | 
|
177  | 
        If the repository can not support user-specified revision ids
 | 
|
178  | 
        they should override this function and raise CannotSetRevisionId
 | 
|
179  | 
        if _new_revision_id is not None.
 | 
|
180  | 
||
181  | 
        :raises: CannotSetRevisionId
 | 
|
182  | 
        """
 | 
|
183  | 
if self._new_revision_id is None:  | 
|
184  | 
self._new_revision_id = self._gen_revision_id()  | 
|
185  | 
self.random_revid = True  | 
|
186  | 
else:  | 
|
187  | 
self.random_revid = False  | 
|
188  | 
||
189  | 
def _check_root(self, ie, parent_invs, tree):  | 
|
190  | 
"""Helper for record_entry_contents.  | 
|
191  | 
||
192  | 
        :param ie: An entry being added.
 | 
|
193  | 
        :param parent_invs: The inventories of the parent revisions of the
 | 
|
194  | 
            commit.
 | 
|
195  | 
        :param tree: The tree that is being committed.
 | 
|
196  | 
        """
 | 
|
197  | 
if ie.parent_id is not None:  | 
|
198  | 
            # if ie is not root, add a root automatically.
 | 
|
199  | 
symbol_versioning.warn('Root entry should be supplied to'  | 
|
200  | 
' record_entry_contents, as of bzr 0.10.',  | 
|
201  | 
DeprecationWarning, stacklevel=2)  | 
|
202  | 
self.record_entry_contents(tree.inventory.root.copy(), parent_invs,  | 
|
203  | 
'', tree)  | 
|
204  | 
else:  | 
|
205  | 
            # In this revision format, root entries have no knit or weave When
 | 
|
206  | 
            # serializing out to disk and back in root.revision is always
 | 
|
207  | 
            # _new_revision_id
 | 
|
208  | 
ie.revision = self._new_revision_id  | 
|
209  | 
||
210  | 
def record_entry_contents(self, ie, parent_invs, path, tree):  | 
|
211  | 
"""Record the content of ie from tree into the commit if needed.  | 
|
212  | 
||
213  | 
        Side effect: sets ie.revision when unchanged
 | 
|
214  | 
||
215  | 
        :param ie: An inventory entry present in the commit.
 | 
|
216  | 
        :param parent_invs: The inventories of the parent revisions of the
 | 
|
217  | 
            commit.
 | 
|
218  | 
        :param path: The path the entry is at in the tree.
 | 
|
219  | 
        :param tree: The tree which contains this entry and should be used to 
 | 
|
220  | 
        obtain content.
 | 
|
| 
2825.5.1
by Robert Collins
 * Committing a change which is not a merge and does not change the number of  | 
221  | 
        :return: True if a new version of the entry has been recorded.
 | 
222  | 
            (Committing a merge where a file was only changed on the other side
 | 
|
223  | 
            will not return True.)
 | 
|
| 
2818.3.1
by Robert Collins
 Change CommitBuilder factory delegation to allow simple declaration.  | 
224  | 
        """
 | 
225  | 
if self.new_inventory.root is None:  | 
|
| 
2825.5.2
by Robert Collins
 Review feedback, and fix pointless commits with nested trees to raise PointlessCommit appropriately.  | 
226  | 
self._check_root(ie, parent_invs, tree)  | 
| 
2818.3.1
by Robert Collins
 Change CommitBuilder factory delegation to allow simple declaration.  | 
227  | 
self.new_inventory.add(ie)  | 
228  | 
||
229  | 
        # ie.revision is always None if the InventoryEntry is considered
 | 
|
230  | 
        # for committing. ie.snapshot will record the correct revision 
 | 
|
231  | 
        # which may be the sole parent if it is untouched.
 | 
|
232  | 
if ie.revision is not None:  | 
|
| 
2825.5.1
by Robert Collins
 * Committing a change which is not a merge and does not change the number of  | 
233  | 
return ie.revision == self._new_revision_id and (path != '' or  | 
234  | 
self._versioned_root)  | 
|
| 
2818.3.1
by Robert Collins
 Change CommitBuilder factory delegation to allow simple declaration.  | 
235  | 
|
236  | 
parent_candiate_entries = ie.parent_candidates(parent_invs)  | 
|
237  | 
heads = self.repository.get_graph().heads(parent_candiate_entries.keys())  | 
|
238  | 
        # XXX: Note that this is unordered - and this is tolerable because 
 | 
|
239  | 
        # the previous code was also unordered.
 | 
|
240  | 
previous_entries = dict((head, parent_candiate_entries[head]) for head  | 
|
241  | 
in heads)  | 
|
242  | 
        # we are creating a new revision for ie in the history store and
 | 
|
243  | 
        # inventory.
 | 
|
244  | 
ie.snapshot(self._new_revision_id, path, previous_entries, tree, self)  | 
|
| 
2825.5.1
by Robert Collins
 * Committing a change which is not a merge and does not change the number of  | 
245  | 
return ie.revision == self._new_revision_id and (path != '' or  | 
246  | 
self._versioned_root)  | 
|
| 
2818.3.1
by Robert Collins
 Change CommitBuilder factory delegation to allow simple declaration.  | 
247  | 
|
248  | 
def modified_directory(self, file_id, file_parents):  | 
|
249  | 
"""Record the presence of a symbolic link.  | 
|
250  | 
||
251  | 
        :param file_id: The file_id of the link to record.
 | 
|
252  | 
        :param file_parents: The per-file parent revision ids.
 | 
|
253  | 
        """
 | 
|
254  | 
self._add_text_to_weave(file_id, [], file_parents.keys())  | 
|
255  | 
||
256  | 
def modified_reference(self, file_id, file_parents):  | 
|
257  | 
"""Record the modification of a reference.  | 
|
258  | 
||
259  | 
        :param file_id: The file_id of the link to record.
 | 
|
260  | 
        :param file_parents: The per-file parent revision ids.
 | 
|
261  | 
        """
 | 
|
262  | 
self._add_text_to_weave(file_id, [], file_parents.keys())  | 
|
263  | 
||
264  | 
def modified_file_text(self, file_id, file_parents,  | 
|
265  | 
get_content_byte_lines, text_sha1=None,  | 
|
266  | 
text_size=None):  | 
|
267  | 
"""Record the text of file file_id  | 
|
268  | 
||
269  | 
        :param file_id: The file_id of the file to record the text of.
 | 
|
270  | 
        :param file_parents: The per-file parent revision ids.
 | 
|
271  | 
        :param get_content_byte_lines: A callable which will return the byte
 | 
|
272  | 
            lines for the file.
 | 
|
273  | 
        :param text_sha1: Optional SHA1 of the file contents.
 | 
|
274  | 
        :param text_size: Optional size of the file contents.
 | 
|
275  | 
        """
 | 
|
276  | 
        # mutter('storing text of file {%s} in revision {%s} into %r',
 | 
|
277  | 
        #        file_id, self._new_revision_id, self.repository.weave_store)
 | 
|
278  | 
        # special case to avoid diffing on renames or 
 | 
|
279  | 
        # reparenting
 | 
|
280  | 
if (len(file_parents) == 1  | 
|
281  | 
and text_sha1 == file_parents.values()[0].text_sha1  | 
|
282  | 
and text_size == file_parents.values()[0].text_size):  | 
|
283  | 
previous_ie = file_parents.values()[0]  | 
|
284  | 
versionedfile = self.repository.weave_store.get_weave(file_id,  | 
|
285  | 
self.repository.get_transaction())  | 
|
286  | 
versionedfile.clone_text(self._new_revision_id,  | 
|
287  | 
previous_ie.revision, file_parents.keys())  | 
|
288  | 
return text_sha1, text_size  | 
|
289  | 
else:  | 
|
290  | 
new_lines = get_content_byte_lines()  | 
|
291  | 
return self._add_text_to_weave(file_id, new_lines,  | 
|
292  | 
file_parents.keys())  | 
|
293  | 
||
294  | 
def modified_link(self, file_id, file_parents, link_target):  | 
|
295  | 
"""Record the presence of a symbolic link.  | 
|
296  | 
||
297  | 
        :param file_id: The file_id of the link to record.
 | 
|
298  | 
        :param file_parents: The per-file parent revision ids.
 | 
|
299  | 
        :param link_target: Target location of this link.
 | 
|
300  | 
        """
 | 
|
301  | 
self._add_text_to_weave(file_id, [], file_parents.keys())  | 
|
302  | 
||
303  | 
def _add_text_to_weave(self, file_id, new_lines, parents):  | 
|
304  | 
versionedfile = self.repository.weave_store.get_weave_or_empty(  | 
|
305  | 
file_id, self.repository.get_transaction())  | 
|
306  | 
        # Don't change this to add_lines - add_lines_with_ghosts is cheaper
 | 
|
307  | 
        # than add_lines, and allows committing when a parent is ghosted for
 | 
|
308  | 
        # some reason.
 | 
|
309  | 
        # Note: as we read the content directly from the tree, we know its not
 | 
|
310  | 
        # been turned into unicode or badly split - but a broken tree
 | 
|
311  | 
        # implementation could give us bad output from readlines() so this is
 | 
|
312  | 
        # not a guarantee of safety. What would be better is always checking
 | 
|
313  | 
        # the content during test suite execution. RBC 20070912
 | 
|
314  | 
result = versionedfile.add_lines_with_ghosts(  | 
|
315  | 
self._new_revision_id, parents, new_lines,  | 
|
316  | 
random_id=self.random_revid, check_content=False)[0:2]  | 
|
317  | 
versionedfile.clear_cache()  | 
|
318  | 
return result  | 
|
319  | 
||
320  | 
||
321  | 
class RootCommitBuilder(CommitBuilder):  | 
|
322  | 
"""This commitbuilder actually records the root id"""  | 
|
323  | 
||
| 
2825.5.2
by Robert Collins
 Review feedback, and fix pointless commits with nested trees to raise PointlessCommit appropriately.  | 
324  | 
    # the root entry gets versioned properly by this builder.
 | 
| 
2840.1.1
by Ian Clatworthy
 faster pointless commit detection (Robert Collins)  | 
325  | 
_versioned_root = True  | 
| 
2825.5.2
by Robert Collins
 Review feedback, and fix pointless commits with nested trees to raise PointlessCommit appropriately.  | 
326  | 
|
| 
2818.3.1
by Robert Collins
 Change CommitBuilder factory delegation to allow simple declaration.  | 
327  | 
def _check_root(self, ie, parent_invs, tree):  | 
328  | 
"""Helper for record_entry_contents.  | 
|
329  | 
||
330  | 
        :param ie: An entry being added.
 | 
|
331  | 
        :param parent_invs: The inventories of the parent revisions of the
 | 
|
332  | 
            commit.
 | 
|
333  | 
        :param tree: The tree that is being committed.
 | 
|
334  | 
        """
 | 
|
335  | 
        # ie must be root for this builder
 | 
|
336  | 
assert ie.parent_id is None  | 
|
337  | 
||
338  | 
||
| 
2220.2.3
by Martin Pool
 Add tag: revision namespace.  | 
339  | 
######################################################################
 | 
340  | 
# Repositories
 | 
|
341  | 
||
| 
1185.66.5
by Aaron Bentley
 Renamed RevisionStorage to Repository  | 
342  | 
class Repository(object):  | 
| 
1185.70.3
by Martin Pool
 Various updates to make storage branch mergeable:  | 
343  | 
"""Repository holding history for one or more branches.  | 
344  | 
||
345  | 
    The repository holds and retrieves historical information including
 | 
|
346  | 
    revisions and file history.  It's normally accessed only by the Branch,
 | 
|
347  | 
    which views a particular line of development through that history.
 | 
|
348  | 
||
349  | 
    The Repository builds on top of Stores and a Transport, which respectively 
 | 
|
350  | 
    describe the disk data format and the way of accessing the (possibly 
 | 
|
351  | 
    remote) disk.
 | 
|
352  | 
    """
 | 
|
| 
1185.65.17
by Robert Collins
 Merge from integration, mode-changes are broken.  | 
353  | 
|
| 
2818.3.1
by Robert Collins
 Change CommitBuilder factory delegation to allow simple declaration.  | 
354  | 
    # What class to use for a CommitBuilder. Often its simpler to change this
 | 
355  | 
    # in a Repository class subclass rather than to override
 | 
|
356  | 
    # get_commit_builder.
 | 
|
357  | 
_commit_builder_class = CommitBuilder  | 
|
358  | 
    # The search regex used by xml based repositories to determine what things
 | 
|
359  | 
    # where changed in a single commit.
 | 
|
| 
2163.2.1
by John Arbash Meinel
 Speed up the fileids_altered_by_revision_ids processing  | 
360  | 
_file_ids_altered_regex = lazy_regex.lazy_compile(  | 
361  | 
r'file_id="(?P<file_id>[^"]+)"'  | 
|
| 
2814.1.1
by Robert Collins
 * Pushing, pulling and branching branches with subtree references was not  | 
362  | 
r'.* revision="(?P<revision_id>[^"]+)"'  | 
| 
2163.2.1
by John Arbash Meinel
 Speed up the fileids_altered_by_revision_ids processing  | 
363  | 
        )
 | 
364  | 
||
| 
2617.6.2
by Robert Collins
 Add abort_write_group and wire write_groups into fetch and commit.  | 
365  | 
def abort_write_group(self):  | 
366  | 
"""Commit the contents accrued within the current write group.  | 
|
367  | 
||
368  | 
        :seealso: start_write_group.
 | 
|
369  | 
        """
 | 
|
370  | 
if self._write_group is not self.get_transaction():  | 
|
371  | 
            # has an unlock or relock occured ?
 | 
|
372  | 
raise errors.BzrError('mismatched lock context and write group.')  | 
|
373  | 
self._abort_write_group()  | 
|
374  | 
self._write_group = None  | 
|
375  | 
||
376  | 
def _abort_write_group(self):  | 
|
377  | 
"""Template method for per-repository write group cleanup.  | 
|
378  | 
        
 | 
|
379  | 
        This is called during abort before the write group is considered to be 
 | 
|
380  | 
        finished and should cleanup any internal state accrued during the write
 | 
|
381  | 
        group. There is no requirement that data handed to the repository be
 | 
|
382  | 
        *not* made available - this is not a rollback - but neither should any
 | 
|
383  | 
        attempt be made to ensure that data added is fully commited. Abort is
 | 
|
384  | 
        invoked when an error has occured so futher disk or network operations
 | 
|
385  | 
        may not be possible or may error and if possible should not be
 | 
|
386  | 
        attempted.
 | 
|
387  | 
        """
 | 
|
388  | 
||
| 
1570.1.2
by Robert Collins
 Import bzrtools' 'fix' command as 'bzr reconcile.'  | 
389  | 
    @needs_write_lock
 | 
| 
2249.5.12
by John Arbash Meinel
 Change the APIs for VersionedFile, Store, and some of Repository into utf-8  | 
390  | 
def add_inventory(self, revision_id, inv, parents):  | 
391  | 
"""Add the inventory inv to the repository as revision_id.  | 
|
| 
1570.1.2
by Robert Collins
 Import bzrtools' 'fix' command as 'bzr reconcile.'  | 
392  | 
        
 | 
| 
2249.5.12
by John Arbash Meinel
 Change the APIs for VersionedFile, Store, and some of Repository into utf-8  | 
393  | 
        :param parents: The revision ids of the parents that revision_id
 | 
| 
1570.1.2
by Robert Collins
 Import bzrtools' 'fix' command as 'bzr reconcile.'  | 
394  | 
                        is known to have and are in the repository already.
 | 
395  | 
||
396  | 
        returns the sha1 of the serialized inventory.
 | 
|
397  | 
        """
 | 
|
| 
2249.5.12
by John Arbash Meinel
 Change the APIs for VersionedFile, Store, and some of Repository into utf-8  | 
398  | 
revision_id = osutils.safe_revision_id(revision_id)  | 
399  | 
_mod_revision.check_not_reserved_id(revision_id)  | 
|
400  | 
assert inv.revision_id is None or inv.revision_id == revision_id, \  | 
|
| 
1740.2.2
by Aaron Bentley
 Add test for the basis inventory automatically adding the revision id.  | 
401  | 
            "Mismatch between inventory revision" \
 | 
| 
2249.5.12
by John Arbash Meinel
 Change the APIs for VersionedFile, Store, and some of Repository into utf-8  | 
402  | 
" id and insertion revid (%r, %r)" % (inv.revision_id, revision_id)  | 
| 
1910.2.6
by Aaron Bentley
 Update for merge review, handle deprecations  | 
403  | 
assert inv.root is not None  | 
| 
2817.2.1
by Robert Collins
 * Inventory serialisation no longer double-sha's the content.  | 
404  | 
inv_lines = self._serialise_inventory_to_lines(inv)  | 
405  | 
inv_vf = self.get_inventory_weave()  | 
|
406  | 
return self._inventory_add_lines(inv_vf, revision_id, parents,  | 
|
407  | 
inv_lines, check_content=False)  | 
|
| 
1570.1.2
by Robert Collins
 Import bzrtools' 'fix' command as 'bzr reconcile.'  | 
408  | 
|
| 
2805.6.7
by Robert Collins
 Review feedback.  | 
409  | 
def _inventory_add_lines(self, inv_vf, revision_id, parents, lines,  | 
410  | 
check_content=True):  | 
|
| 
2817.2.1
by Robert Collins
 * Inventory serialisation no longer double-sha's the content.  | 
411  | 
"""Store lines in inv_vf and return the sha1 of the inventory."""  | 
| 
1740.3.6
by Jelmer Vernooij
 Move inventory writing to the commit builder.  | 
412  | 
final_parents = []  | 
413  | 
for parent in parents:  | 
|
414  | 
if parent in inv_vf:  | 
|
415  | 
final_parents.append(parent)  | 
|
| 
2817.2.1
by Robert Collins
 * Inventory serialisation no longer double-sha's the content.  | 
416  | 
return inv_vf.add_lines(revision_id, final_parents, lines,  | 
417  | 
check_content=check_content)[0]  | 
|
| 
1740.3.6
by Jelmer Vernooij
 Move inventory writing to the commit builder.  | 
418  | 
|
| 
1570.1.2
by Robert Collins
 Import bzrtools' 'fix' command as 'bzr reconcile.'  | 
419  | 
    @needs_write_lock
 | 
| 
2249.5.12
by John Arbash Meinel
 Change the APIs for VersionedFile, Store, and some of Repository into utf-8  | 
420  | 
def add_revision(self, revision_id, rev, inv=None, config=None):  | 
421  | 
"""Add rev to the revision store as revision_id.  | 
|
| 
1570.1.2
by Robert Collins
 Import bzrtools' 'fix' command as 'bzr reconcile.'  | 
422  | 
|
| 
2249.5.12
by John Arbash Meinel
 Change the APIs for VersionedFile, Store, and some of Repository into utf-8  | 
423  | 
        :param revision_id: the revision id to use.
 | 
| 
1570.1.2
by Robert Collins
 Import bzrtools' 'fix' command as 'bzr reconcile.'  | 
424  | 
        :param rev: The revision object.
 | 
425  | 
        :param inv: The inventory for the revision. if None, it will be looked
 | 
|
426  | 
                    up in the inventory storer
 | 
|
427  | 
        :param config: If None no digital signature will be created.
 | 
|
428  | 
                       If supplied its signature_needed method will be used
 | 
|
429  | 
                       to determine if a signature should be made.
 | 
|
430  | 
        """
 | 
|
| 
2249.5.12
by John Arbash Meinel
 Change the APIs for VersionedFile, Store, and some of Repository into utf-8  | 
431  | 
revision_id = osutils.safe_revision_id(revision_id)  | 
| 
2249.5.13
by John Arbash Meinel
 Finish auditing Repository, and fix generate_ids to always generate utf8 ids.  | 
432  | 
        # TODO: jam 20070210 Shouldn't we check rev.revision_id and
 | 
433  | 
        #       rev.parent_ids?
 | 
|
| 
2249.5.12
by John Arbash Meinel
 Change the APIs for VersionedFile, Store, and some of Repository into utf-8  | 
434  | 
_mod_revision.check_not_reserved_id(revision_id)  | 
| 
1570.1.2
by Robert Collins
 Import bzrtools' 'fix' command as 'bzr reconcile.'  | 
435  | 
if config is not None and config.signature_needed():  | 
436  | 
if inv is None:  | 
|
| 
2249.5.12
by John Arbash Meinel
 Change the APIs for VersionedFile, Store, and some of Repository into utf-8  | 
437  | 
inv = self.get_inventory(revision_id)  | 
| 
1570.1.2
by Robert Collins
 Import bzrtools' 'fix' command as 'bzr reconcile.'  | 
438  | 
plaintext = Testament(rev, inv).as_short_text()  | 
439  | 
self.store_revision_signature(  | 
|
| 
2249.5.12
by John Arbash Meinel
 Change the APIs for VersionedFile, Store, and some of Repository into utf-8  | 
440  | 
gpg.GPGStrategy(config), plaintext, revision_id)  | 
441  | 
if not revision_id in self.get_inventory_weave():  | 
|
| 
1570.1.2
by Robert Collins
 Import bzrtools' 'fix' command as 'bzr reconcile.'  | 
442  | 
if inv is None:  | 
| 
2249.5.12
by John Arbash Meinel
 Change the APIs for VersionedFile, Store, and some of Repository into utf-8  | 
443  | 
raise errors.WeaveRevisionNotPresent(revision_id,  | 
| 
1570.1.2
by Robert Collins
 Import bzrtools' 'fix' command as 'bzr reconcile.'  | 
444  | 
self.get_inventory_weave())  | 
445  | 
else:  | 
|
446  | 
                # yes, this is not suitable for adding with ghosts.
 | 
|
| 
2249.5.12
by John Arbash Meinel
 Change the APIs for VersionedFile, Store, and some of Repository into utf-8  | 
447  | 
self.add_inventory(revision_id, inv, rev.parent_ids)  | 
| 
1608.2.1
by Martin Pool
 [merge] Storage filename escaping  | 
448  | 
self._revision_store.add_revision(rev, self.get_transaction())  | 
| 
1570.1.2
by Robert Collins
 Import bzrtools' 'fix' command as 'bzr reconcile.'  | 
449  | 
|
| 
2520.4.10
by Aaron Bentley
 Enable installation of revisions  | 
450  | 
def _add_revision_text(self, revision_id, text):  | 
451  | 
revision = self._revision_store._serializer.read_revision_from_string(  | 
|
452  | 
text)  | 
|
453  | 
self._revision_store._add_revision(revision, StringIO(text),  | 
|
454  | 
self.get_transaction())  | 
|
455  | 
||
| 
1534.4.41
by Robert Collins
 Branch now uses BzrDir reasonably sanely.  | 
456  | 
    @needs_read_lock
 | 
| 
1534.4.50
by Robert Collins
 Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.  | 
457  | 
def _all_possible_ids(self):  | 
458  | 
"""Return all the possible revisions that we could find."""  | 
|
| 
1563.2.4
by Robert Collins
 First cut at including the knit implementation of versioned_file.  | 
459  | 
return self.get_inventory_weave().versions()  | 
| 
1534.4.50
by Robert Collins
 Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.  | 
460  | 
|
| 
1732.2.4
by Martin Pool
 Split check into Branch.check and Repository.check  | 
461  | 
def all_revision_ids(self):  | 
462  | 
"""Returns a list of all the revision ids in the repository.  | 
|
463  | 
||
464  | 
        This is deprecated because code should generally work on the graph
 | 
|
465  | 
        reachable from a particular revision, and ignore any other revisions
 | 
|
466  | 
        that might be present.  There is no direct replacement method.
 | 
|
467  | 
        """
 | 
|
468  | 
return self._all_revision_ids()  | 
|
469  | 
||
| 
1534.4.50
by Robert Collins
 Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.  | 
470  | 
    @needs_read_lock
 | 
| 
1732.2.4
by Martin Pool
 Split check into Branch.check and Repository.check  | 
471  | 
def _all_revision_ids(self):  | 
| 
1534.4.50
by Robert Collins
 Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.  | 
472  | 
"""Returns a list of all the revision ids in the repository.  | 
473  | 
||
474  | 
        These are in as much topological order as the underlying store can 
 | 
|
475  | 
        present: for weaves ghosts may lead to a lack of correctness until
 | 
|
476  | 
        the reweave updates the parents list.
 | 
|
477  | 
        """
 | 
|
| 
1563.2.29
by Robert Collins
 Remove all but fetch references to repository.revision_store.  | 
478  | 
if self._revision_store.text_store.listable():  | 
479  | 
return self._revision_store.all_revision_ids(self.get_transaction())  | 
|
| 
1534.4.50
by Robert Collins
 Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.  | 
480  | 
result = self._all_possible_ids()  | 
| 
2249.5.13
by John Arbash Meinel
 Finish auditing Repository, and fix generate_ids to always generate utf8 ids.  | 
481  | 
        # TODO: jam 20070210 Ensure that _all_possible_ids returns non-unicode
 | 
482  | 
        #       ids. (It should, since _revision_store's API should change to
 | 
|
483  | 
        #       return utf8 revision_ids)
 | 
|
| 
1534.4.50
by Robert Collins
 Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.  | 
484  | 
return self._eliminate_revisions_not_present(result)  | 
485  | 
||
| 
1687.1.7
by Robert Collins
 Teach Repository about break_lock.  | 
486  | 
def break_lock(self):  | 
487  | 
"""Break a lock if one is present from another instance.  | 
|
488  | 
||
489  | 
        Uses the ui factory to ask for confirmation if the lock may be from
 | 
|
490  | 
        an active process.
 | 
|
491  | 
        """
 | 
|
492  | 
self.control_files.break_lock()  | 
|
493  | 
||
| 
1534.4.50
by Robert Collins
 Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.  | 
494  | 
    @needs_read_lock
 | 
495  | 
def _eliminate_revisions_not_present(self, revision_ids):  | 
|
496  | 
"""Check every revision id in revision_ids to see if we have it.  | 
|
497  | 
||
498  | 
        Returns a set of the present revisions.
 | 
|
499  | 
        """
 | 
|
| 
1534.4.41
by Robert Collins
 Branch now uses BzrDir reasonably sanely.  | 
500  | 
result = []  | 
| 
1534.4.50
by Robert Collins
 Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.  | 
501  | 
for id in revision_ids:  | 
| 
1534.4.41
by Robert Collins
 Branch now uses BzrDir reasonably sanely.  | 
502  | 
if self.has_revision(id):  | 
503  | 
result.append(id)  | 
|
504  | 
return result  | 
|
505  | 
||
| 
1534.4.40
by Robert Collins
 Add RepositoryFormats and allow bzrdir.open or create _repository to be used.  | 
506  | 
    @staticmethod
 | 
507  | 
def create(a_bzrdir):  | 
|
508  | 
"""Construct the current default format repository in a_bzrdir."""  | 
|
509  | 
return RepositoryFormat.get_default_format().initialize(a_bzrdir)  | 
|
510  | 
||
| 
1563.2.29
by Robert Collins
 Remove all but fetch references to repository.revision_store.  | 
511  | 
def __init__(self, _format, a_bzrdir, control_files, _revision_store, control_store, text_store):  | 
| 
1556.1.3
by Robert Collins
 Rearrangment of Repository logic to be less type code driven, and bugfix InterRepository.missing_revision_ids  | 
512  | 
"""instantiate a Repository.  | 
513  | 
||
514  | 
        :param _format: The format of the repository on disk.
 | 
|
515  | 
        :param a_bzrdir: The BzrDir of the repository.
 | 
|
516  | 
||
517  | 
        In the future we will have a single api for all stores for
 | 
|
518  | 
        getting file texts, inventories and revisions, then
 | 
|
519  | 
        this construct will accept instances of those things.
 | 
|
520  | 
        """
 | 
|
| 
1608.2.1
by Martin Pool
 [merge] Storage filename escaping  | 
521  | 
super(Repository, self).__init__()  | 
| 
1534.4.40
by Robert Collins
 Add RepositoryFormats and allow bzrdir.open or create _repository to be used.  | 
522  | 
self._format = _format  | 
| 
1556.1.3
by Robert Collins
 Rearrangment of Repository logic to be less type code driven, and bugfix InterRepository.missing_revision_ids  | 
523  | 
        # the following are part of the public API for Repository:
 | 
| 
1534.4.40
by Robert Collins
 Add RepositoryFormats and allow bzrdir.open or create _repository to be used.  | 
524  | 
self.bzrdir = a_bzrdir  | 
| 
1556.1.3
by Robert Collins
 Rearrangment of Repository logic to be less type code driven, and bugfix InterRepository.missing_revision_ids  | 
525  | 
self.control_files = control_files  | 
| 
1563.2.29
by Robert Collins
 Remove all but fetch references to repository.revision_store.  | 
526  | 
self._revision_store = _revision_store  | 
| 
1759.2.1
by Jelmer Vernooij
 Fix some types (found using aspell).  | 
527  | 
        # backwards compatibility
 | 
| 
1563.2.17
by Robert Collins
 Change knits repositories to use a knit versioned file store for file texts.  | 
528  | 
self.weave_store = text_store  | 
| 
2671.4.2
by Robert Collins
 Review feedback.  | 
529  | 
        # for tests
 | 
530  | 
self._reconcile_does_inventory_gc = True  | 
|
| 
1563.2.23
by Robert Collins
 Add add_revision and get_revision methods to RevisionStore  | 
531  | 
        # not right yet - should be more semantically clear ? 
 | 
532  | 
        # 
 | 
|
533  | 
self.control_store = control_store  | 
|
534  | 
self.control_weaves = control_store  | 
|
| 
1608.2.1
by Martin Pool
 [merge] Storage filename escaping  | 
535  | 
        # TODO: make sure to construct the right store classes, etc, depending
 | 
536  | 
        # on whether escaping is required.
 | 
|
| 
1904.2.3
by Martin Pool
 Give a warning on access to old repository formats  | 
537  | 
self._warn_if_deprecated()  | 
| 
2617.6.1
by Robert Collins
 * New method on Repository - ``start_write_group``, ``end_write_group``  | 
538  | 
self._write_group = None  | 
| 
1185.65.1
by Aaron Bentley
 Refactored out ControlFiles and RevisionStore from _Branch  | 
539  | 
|
| 
1668.1.3
by Martin Pool
 [patch] use the correct transaction when committing snapshot (Malone: #43959)  | 
540  | 
def __repr__(self):  | 
541  | 
return '%s(%r)' % (self.__class__.__name__,  | 
|
542  | 
self.bzrdir.transport.base)  | 
|
543  | 
||
| 
2671.1.4
by Andrew Bennetts
 Rename is_same_repository to has_same_location, thanks Aaron!  | 
544  | 
def has_same_location(self, other):  | 
| 
2671.1.3
by Andrew Bennetts
 Remove Repository.__eq__/__ne__ methods, replace with is_same_repository method.  | 
545  | 
"""Returns a boolean indicating if this repository is at the same  | 
546  | 
        location as another repository.
 | 
|
547  | 
||
548  | 
        This might return False even when two repository objects are accessing
 | 
|
549  | 
        the same physical repository via different URLs.
 | 
|
550  | 
        """
 | 
|
| 
2671.1.1
by Andrew Bennetts
 Add support for comparing Repositories with == and != operators.  | 
551  | 
if self.__class__ is not other.__class__:  | 
552  | 
return False  | 
|
553  | 
return (self.control_files._transport.base ==  | 
|
554  | 
other.control_files._transport.base)  | 
|
555  | 
||
| 
2617.6.1
by Robert Collins
 * New method on Repository - ``start_write_group``, ``end_write_group``  | 
556  | 
def is_in_write_group(self):  | 
557  | 
"""Return True if there is an open write group.  | 
|
558  | 
||
559  | 
        :seealso: start_write_group.
 | 
|
560  | 
        """
 | 
|
561  | 
return self._write_group is not None  | 
|
562  | 
||
| 
1694.2.6
by Martin Pool
 [merge] bzr.dev  | 
563  | 
def is_locked(self):  | 
564  | 
return self.control_files.is_locked()  | 
|
565  | 
||
| 
2018.5.75
by Andrew Bennetts
 Add Repository.{dont_,}leave_lock_in_place.  | 
566  | 
def lock_write(self, token=None):  | 
567  | 
"""Lock this repository for writing.  | 
|
| 
2617.6.8
by Robert Collins
 Review feedback and documentation.  | 
568  | 
|
569  | 
        This causes caching within the repository obejct to start accumlating
 | 
|
570  | 
        data during reads, and allows a 'write_group' to be obtained. Write
 | 
|
571  | 
        groups must be used for actual data insertion.
 | 
|
| 
2018.5.75
by Andrew Bennetts
 Add Repository.{dont_,}leave_lock_in_place.  | 
572  | 
        
 | 
573  | 
        :param token: if this is already locked, then lock_write will fail
 | 
|
574  | 
            unless the token matches the existing lock.
 | 
|
575  | 
        :returns: a token if this instance supports tokens, otherwise None.
 | 
|
576  | 
        :raises TokenLockingNotSupported: when a token is given but this
 | 
|
577  | 
            instance doesn't support using token locks.
 | 
|
578  | 
        :raises MismatchedToken: if the specified token doesn't match the token
 | 
|
579  | 
            of the existing lock.
 | 
|
| 
2617.6.8
by Robert Collins
 Review feedback and documentation.  | 
580  | 
        :seealso: start_write_group.
 | 
| 
2018.5.75
by Andrew Bennetts
 Add Repository.{dont_,}leave_lock_in_place.  | 
581  | 
|
| 
2018.5.145
by Andrew Bennetts
 Add a brief explanation of what tokens are used for to lock_write docstrings.  | 
582  | 
        A token should be passed in if you know that you have locked the object
 | 
583  | 
        some other way, and need to synchronise this object's state with that
 | 
|
584  | 
        fact.
 | 
|
585  | 
||
| 
2018.5.75
by Andrew Bennetts
 Add Repository.{dont_,}leave_lock_in_place.  | 
586  | 
        XXX: this docstring is duplicated in many places, e.g. lockable_files.py
 | 
587  | 
        """
 | 
|
| 
2617.6.2
by Robert Collins
 Add abort_write_group and wire write_groups into fetch and commit.  | 
588  | 
result = self.control_files.lock_write(token=token)  | 
589  | 
self._refresh_data()  | 
|
590  | 
return result  | 
|
| 
1185.65.1
by Aaron Bentley
 Refactored out ControlFiles and RevisionStore from _Branch  | 
591  | 
|
592  | 
def lock_read(self):  | 
|
| 
1553.5.55
by Martin Pool
 [revert] broken changes  | 
593  | 
self.control_files.lock_read()  | 
| 
2617.6.2
by Robert Collins
 Add abort_write_group and wire write_groups into fetch and commit.  | 
594  | 
self._refresh_data()  | 
| 
1185.65.1
by Aaron Bentley
 Refactored out ControlFiles and RevisionStore from _Branch  | 
595  | 
|
| 
1694.2.6
by Martin Pool
 [merge] bzr.dev  | 
596  | 
def get_physical_lock_status(self):  | 
597  | 
return self.control_files.get_physical_lock_status()  | 
|
| 
1624.3.36
by Olaf Conradi
 Rename is_transport_locked() to get_physical_lock_status() as the  | 
598  | 
|
| 
2018.5.75
by Andrew Bennetts
 Add Repository.{dont_,}leave_lock_in_place.  | 
599  | 
def leave_lock_in_place(self):  | 
600  | 
"""Tell this repository not to release the physical lock when this  | 
|
601  | 
        object is unlocked.
 | 
|
| 
2018.5.76
by Andrew Bennetts
 Testing that repository.{dont_,}leave_lock_in_place raises NotImplementedError if lock_write returns None.  | 
602  | 
        
 | 
603  | 
        If lock_write doesn't return a token, then this method is not supported.
 | 
|
| 
2018.5.75
by Andrew Bennetts
 Add Repository.{dont_,}leave_lock_in_place.  | 
604  | 
        """
 | 
605  | 
self.control_files.leave_in_place()  | 
|
606  | 
||
607  | 
def dont_leave_lock_in_place(self):  | 
|
608  | 
"""Tell this repository to release the physical lock when this  | 
|
609  | 
        object is unlocked, even if it didn't originally acquire it.
 | 
|
| 
2018.5.76
by Andrew Bennetts
 Testing that repository.{dont_,}leave_lock_in_place raises NotImplementedError if lock_write returns None.  | 
610  | 
|
611  | 
        If lock_write doesn't return a token, then this method is not supported.
 | 
|
| 
2018.5.75
by Andrew Bennetts
 Add Repository.{dont_,}leave_lock_in_place.  | 
612  | 
        """
 | 
613  | 
self.control_files.dont_leave_in_place()  | 
|
614  | 
||
| 
1534.4.50
by Robert Collins
 Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.  | 
615  | 
    @needs_read_lock
 | 
| 
2258.1.2
by Robert Collins
 New version of gather_stats which gathers aggregate data too.  | 
616  | 
def gather_stats(self, revid=None, committers=None):  | 
| 
2258.1.1
by Robert Collins
 Move info branch statistics gathering into the repository to allow smart server optimisation (Robert Collins).  | 
617  | 
"""Gather statistics from a revision id.  | 
618  | 
||
| 
2258.1.2
by Robert Collins
 New version of gather_stats which gathers aggregate data too.  | 
619  | 
        :param revid: The revision id to gather statistics from, if None, then
 | 
620  | 
            no revision specific statistics are gathered.
 | 
|
| 
2258.1.1
by Robert Collins
 Move info branch statistics gathering into the repository to allow smart server optimisation (Robert Collins).  | 
621  | 
        :param committers: Optional parameter controlling whether to grab
 | 
| 
2258.1.2
by Robert Collins
 New version of gather_stats which gathers aggregate data too.  | 
622  | 
            a count of committers from the revision specific statistics.
 | 
| 
2258.1.1
by Robert Collins
 Move info branch statistics gathering into the repository to allow smart server optimisation (Robert Collins).  | 
623  | 
        :return: A dictionary of statistics. Currently this contains:
 | 
624  | 
            committers: The number of committers if requested.
 | 
|
625  | 
            firstrev: A tuple with timestamp, timezone for the penultimate left
 | 
|
626  | 
                most ancestor of revid, if revid is not the NULL_REVISION.
 | 
|
627  | 
            latestrev: A tuple with timestamp, timezone for revid, if revid is
 | 
|
628  | 
                not the NULL_REVISION.
 | 
|
| 
2258.1.2
by Robert Collins
 New version of gather_stats which gathers aggregate data too.  | 
629  | 
            revisions: The total revision count in the repository.
 | 
630  | 
            size: An estimate disk size of the repository in bytes.
 | 
|
| 
2258.1.1
by Robert Collins
 Move info branch statistics gathering into the repository to allow smart server optimisation (Robert Collins).  | 
631  | 
        """
 | 
632  | 
result = {}  | 
|
| 
2258.1.2
by Robert Collins
 New version of gather_stats which gathers aggregate data too.  | 
633  | 
if revid and committers:  | 
| 
2258.1.1
by Robert Collins
 Move info branch statistics gathering into the repository to allow smart server optimisation (Robert Collins).  | 
634  | 
result['committers'] = 0  | 
| 
2258.1.2
by Robert Collins
 New version of gather_stats which gathers aggregate data too.  | 
635  | 
if revid and revid != _mod_revision.NULL_REVISION:  | 
636  | 
if committers:  | 
|
637  | 
all_committers = set()  | 
|
638  | 
revisions = self.get_ancestry(revid)  | 
|
639  | 
            # pop the leading None
 | 
|
640  | 
revisions.pop(0)  | 
|
641  | 
first_revision = None  | 
|
642  | 
if not committers:  | 
|
643  | 
                # ignore the revisions in the middle - just grab first and last
 | 
|
644  | 
revisions = revisions[0], revisions[-1]  | 
|
645  | 
for revision in self.get_revisions(revisions):  | 
|
646  | 
if not first_revision:  | 
|
647  | 
first_revision = revision  | 
|
648  | 
if committers:  | 
|
649  | 
all_committers.add(revision.committer)  | 
|
650  | 
last_revision = revision  | 
|
651  | 
if committers:  | 
|
652  | 
result['committers'] = len(all_committers)  | 
|
653  | 
result['firstrev'] = (first_revision.timestamp,  | 
|
654  | 
first_revision.timezone)  | 
|
655  | 
result['latestrev'] = (last_revision.timestamp,  | 
|
656  | 
last_revision.timezone)  | 
|
657  | 
||
658  | 
        # now gather global repository information
 | 
|
659  | 
if self.bzrdir.root_transport.listable():  | 
|
660  | 
c, t = self._revision_store.total_size(self.get_transaction())  | 
|
661  | 
result['revisions'] = c  | 
|
662  | 
result['size'] = t  | 
|
| 
2258.1.1
by Robert Collins
 Move info branch statistics gathering into the repository to allow smart server optimisation (Robert Collins).  | 
663  | 
return result  | 
664  | 
||
665  | 
    @needs_read_lock
 | 
|
| 
1534.4.50
by Robert Collins
 Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.  | 
666  | 
def missing_revision_ids(self, other, revision_id=None):  | 
667  | 
"""Return the revision ids that other has that this does not.  | 
|
668  | 
        
 | 
|
669  | 
        These are returned in topological order.
 | 
|
670  | 
||
671  | 
        revision_id: only return revision ids included by revision_id.
 | 
|
672  | 
        """
 | 
|
| 
2249.5.13
by John Arbash Meinel
 Finish auditing Repository, and fix generate_ids to always generate utf8 ids.  | 
673  | 
revision_id = osutils.safe_revision_id(revision_id)  | 
| 
1534.1.34
by Robert Collins
 Move missing_revision_ids from Repository to InterRepository, and eliminate the now unused Repository._compatible_formats method.  | 
674  | 
return InterRepository.get(other, self).missing_revision_ids(revision_id)  | 
| 
1534.4.50
by Robert Collins
 Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.  | 
675  | 
|
| 
1534.4.40
by Robert Collins
 Add RepositoryFormats and allow bzrdir.open or create _repository to be used.  | 
676  | 
    @staticmethod
 | 
677  | 
def open(base):  | 
|
678  | 
"""Open the repository rooted at base.  | 
|
679  | 
||
680  | 
        For instance, if the repository is at URL/.bzr/repository,
 | 
|
681  | 
        Repository.open(URL) -> a Repository instance.
 | 
|
682  | 
        """
 | 
|
| 
1773.4.1
by Martin Pool
 Add pyflakes makefile target; fix many warnings  | 
683  | 
control = bzrdir.BzrDir.open(base)  | 
| 
1534.4.40
by Robert Collins
 Add RepositoryFormats and allow bzrdir.open or create _repository to be used.  | 
684  | 
return control.open_repository()  | 
685  | 
||
| 
2387.1.1
by Robert Collins
 Remove the --basis parameter to clone etc. (Robert Collins)  | 
686  | 
def copy_content_into(self, destination, revision_id=None):  | 
| 
1534.6.6
by Robert Collins
 Move find_repository to bzrdir, its not quite ideal there but its simpler and until someone chooses to vary the search by branch type its completely sufficient.  | 
687  | 
"""Make a complete copy of the content in self into destination.  | 
688  | 
        
 | 
|
689  | 
        This is a destructive operation! Do not use it on existing 
 | 
|
690  | 
        repositories.
 | 
|
691  | 
        """
 | 
|
| 
2249.5.13
by John Arbash Meinel
 Finish auditing Repository, and fix generate_ids to always generate utf8 ids.  | 
692  | 
revision_id = osutils.safe_revision_id(revision_id)  | 
| 
2387.1.1
by Robert Collins
 Remove the --basis parameter to clone etc. (Robert Collins)  | 
693  | 
return InterRepository.get(self, destination).copy_content(revision_id)  | 
| 
1534.4.50
by Robert Collins
 Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.  | 
694  | 
|
| 
2617.6.2
by Robert Collins
 Add abort_write_group and wire write_groups into fetch and commit.  | 
695  | 
def commit_write_group(self):  | 
696  | 
"""Commit the contents accrued within the current write group.  | 
|
| 
2617.6.1
by Robert Collins
 * New method on Repository - ``start_write_group``, ``end_write_group``  | 
697  | 
|
698  | 
        :seealso: start_write_group.
 | 
|
699  | 
        """
 | 
|
700  | 
if self._write_group is not self.get_transaction():  | 
|
701  | 
            # has an unlock or relock occured ?
 | 
|
702  | 
raise errors.BzrError('mismatched lock context and write group.')  | 
|
| 
2617.6.2
by Robert Collins
 Add abort_write_group and wire write_groups into fetch and commit.  | 
703  | 
self._commit_write_group()  | 
| 
2617.6.1
by Robert Collins
 * New method on Repository - ``start_write_group``, ``end_write_group``  | 
704  | 
self._write_group = None  | 
705  | 
||
| 
2617.6.2
by Robert Collins
 Add abort_write_group and wire write_groups into fetch and commit.  | 
706  | 
def _commit_write_group(self):  | 
707  | 
"""Template method for per-repository write group cleanup.  | 
|
708  | 
        
 | 
|
709  | 
        This is called before the write group is considered to be 
 | 
|
710  | 
        finished and should ensure that all data handed to the repository
 | 
|
711  | 
        for writing during the write group is safely committed (to the 
 | 
|
712  | 
        extent possible considering file system caching etc).
 | 
|
713  | 
        """
 | 
|
714  | 
||
| 
1534.1.31
by Robert Collins
 Deprecated fetch.fetch and fetch.greedy_fetch for branch.fetch, and move the Repository.fetch internals to InterRepo and InterWeaveRepo.  | 
715  | 
def fetch(self, source, revision_id=None, pb=None):  | 
| 
1534.4.50
by Robert Collins
 Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.  | 
716  | 
"""Fetch the content required to construct revision_id from source.  | 
717  | 
||
718  | 
        If revision_id is None all content is copied.
 | 
|
719  | 
        """
 | 
|
| 
2249.5.13
by John Arbash Meinel
 Finish auditing Repository, and fix generate_ids to always generate utf8 ids.  | 
720  | 
revision_id = osutils.safe_revision_id(revision_id)  | 
| 
2323.8.3
by Aaron Bentley
 Reduce scope of try/except, update NEWS  | 
721  | 
inter = InterRepository.get(source, self)  | 
| 
2323.8.2
by Aaron Bentley
 Give a nicer error on fetch when repos are in incompatible formats  | 
722  | 
try:  | 
| 
2323.8.3
by Aaron Bentley
 Reduce scope of try/except, update NEWS  | 
723  | 
return inter.fetch(revision_id=revision_id, pb=pb)  | 
| 
2323.8.2
by Aaron Bentley
 Give a nicer error on fetch when repos are in incompatible formats  | 
724  | 
except NotImplementedError:  | 
725  | 
raise errors.IncompatibleRepositories(source, self)  | 
|
| 
1534.4.41
by Robert Collins
 Branch now uses BzrDir reasonably sanely.  | 
726  | 
|
| 
2520.4.54
by Aaron Bentley
 Hang a create_bundle method off repository  | 
727  | 
def create_bundle(self, target, base, fileobj, format=None):  | 
728  | 
return serializer.write_bundle(self, target, base, fileobj, format)  | 
|
729  | 
||
| 
2803.2.1
by Robert Collins
 * CommitBuilder now advertises itself as requiring the root entry to be  | 
730  | 
def get_commit_builder(self, branch, parents, config, timestamp=None,  | 
731  | 
timezone=None, committer=None, revprops=None,  | 
|
| 
1740.3.7
by Jelmer Vernooij
 Move committer, log, revprops, timestamp and timezone to CommitBuilder.  | 
732  | 
revision_id=None):  | 
733  | 
"""Obtain a CommitBuilder for this repository.  | 
|
734  | 
        
 | 
|
735  | 
        :param branch: Branch to commit to.
 | 
|
736  | 
        :param parents: Revision ids of the parents of the new revision.
 | 
|
737  | 
        :param config: Configuration to use.
 | 
|
738  | 
        :param timestamp: Optional timestamp recorded for commit.
 | 
|
739  | 
        :param timezone: Optional timezone for timestamp.
 | 
|
740  | 
        :param committer: Optional committer to set for commit.
 | 
|
741  | 
        :param revprops: Optional dictionary of revision properties.
 | 
|
742  | 
        :param revision_id: Optional revision id.
 | 
|
743  | 
        """
 | 
|
| 
2249.5.12
by John Arbash Meinel
 Change the APIs for VersionedFile, Store, and some of Repository into utf-8  | 
744  | 
revision_id = osutils.safe_revision_id(revision_id)  | 
| 
2818.3.2
by Robert Collins
 Review feedback.  | 
745  | 
result = self._commit_builder_class(self, parents, config,  | 
| 
2818.3.1
by Robert Collins
 Change CommitBuilder factory delegation to allow simple declaration.  | 
746  | 
timestamp, timezone, committer, revprops, revision_id)  | 
| 
2617.6.2
by Robert Collins
 Add abort_write_group and wire write_groups into fetch and commit.  | 
747  | 
self.start_write_group()  | 
748  | 
return result  | 
|
| 
1740.3.1
by Jelmer Vernooij
 Introduce and use CommitBuilder objects.  | 
749  | 
|
| 
1185.65.1
by Aaron Bentley
 Refactored out ControlFiles and RevisionStore from _Branch  | 
750  | 
def unlock(self):  | 
| 
2617.6.1
by Robert Collins
 * New method on Repository - ``start_write_group``, ``end_write_group``  | 
751  | 
if (self.control_files._lock_count == 1 and  | 
752  | 
self.control_files._lock_mode == 'w'):  | 
|
753  | 
if self._write_group is not None:  | 
|
754  | 
raise errors.BzrError(  | 
|
755  | 
'Must end write groups before releasing write locks.')  | 
|
| 
1185.65.1
by Aaron Bentley
 Refactored out ControlFiles and RevisionStore from _Branch  | 
756  | 
self.control_files.unlock()  | 
757  | 
||
| 
1185.65.27
by Robert Collins
 Tweak storage towards mergability.  | 
758  | 
    @needs_read_lock
 | 
| 
2387.1.1
by Robert Collins
 Remove the --basis parameter to clone etc. (Robert Collins)  | 
759  | 
def clone(self, a_bzrdir, revision_id=None):  | 
| 
1534.4.41
by Robert Collins
 Branch now uses BzrDir reasonably sanely.  | 
760  | 
"""Clone this repository into a_bzrdir using the current format.  | 
761  | 
||
762  | 
        Currently no check is made that the format of this repository and
 | 
|
763  | 
        the bzrdir format are compatible. FIXME RBC 20060201.
 | 
|
| 
2241.1.4
by Martin Pool
 Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.  | 
764  | 
|
765  | 
        :return: The newly created destination repository.
 | 
|
| 
1534.4.41
by Robert Collins
 Branch now uses BzrDir reasonably sanely.  | 
766  | 
        """
 | 
| 
2440.1.1
by Martin Pool
 Add new Repository.sprout,  | 
767  | 
        # TODO: deprecate after 0.16; cloning this with all its settings is
 | 
768  | 
        # probably not very useful -- mbp 20070423
 | 
|
769  | 
dest_repo = self._create_sprouting_repo(a_bzrdir, shared=self.is_shared())  | 
|
770  | 
self.copy_content_into(dest_repo, revision_id)  | 
|
771  | 
return dest_repo  | 
|
772  | 
||
| 
2617.6.1
by Robert Collins
 * New method on Repository - ``start_write_group``, ``end_write_group``  | 
773  | 
def start_write_group(self):  | 
774  | 
"""Start a write group in the repository.  | 
|
775  | 
||
776  | 
        Write groups are used by repositories which do not have a 1:1 mapping
 | 
|
777  | 
        between file ids and backend store to manage the insertion of data from
 | 
|
778  | 
        both fetch and commit operations.
 | 
|
779  | 
||
| 
2617.6.2
by Robert Collins
 Add abort_write_group and wire write_groups into fetch and commit.  | 
780  | 
        A write lock is required around the start_write_group/commit_write_group
 | 
| 
2617.6.1
by Robert Collins
 * New method on Repository - ``start_write_group``, ``end_write_group``  | 
781  | 
        for the support of lock-requiring repository formats.
 | 
| 
2617.6.8
by Robert Collins
 Review feedback and documentation.  | 
782  | 
|
783  | 
        One can only insert data into a repository inside a write group.
 | 
|
784  | 
||
| 
2617.6.6
by Robert Collins
 Some review feedback.  | 
785  | 
        :return: None.
 | 
| 
2617.6.1
by Robert Collins
 * New method on Repository - ``start_write_group``, ``end_write_group``  | 
786  | 
        """
 | 
787  | 
if not self.is_locked() or self.control_files._lock_mode != 'w':  | 
|
788  | 
raise errors.NotWriteLocked(self)  | 
|
789  | 
if self._write_group:  | 
|
790  | 
raise errors.BzrError('already in a write group')  | 
|
| 
2617.6.2
by Robert Collins
 Add abort_write_group and wire write_groups into fetch and commit.  | 
791  | 
self._start_write_group()  | 
792  | 
        # so we can detect unlock/relock - the write group is now entered.
 | 
|
| 
2617.6.1
by Robert Collins
 * New method on Repository - ``start_write_group``, ``end_write_group``  | 
793  | 
self._write_group = self.get_transaction()  | 
794  | 
||
| 
2617.6.2
by Robert Collins
 Add abort_write_group and wire write_groups into fetch and commit.  | 
795  | 
def _start_write_group(self):  | 
796  | 
"""Template method for per-repository write group startup.  | 
|
797  | 
        
 | 
|
798  | 
        This is called before the write group is considered to be 
 | 
|
799  | 
        entered.
 | 
|
800  | 
        """
 | 
|
801  | 
||
| 
2440.1.1
by Martin Pool
 Add new Repository.sprout,  | 
802  | 
    @needs_read_lock
 | 
803  | 
def sprout(self, to_bzrdir, revision_id=None):  | 
|
804  | 
"""Create a descendent repository for new development.  | 
|
805  | 
||
806  | 
        Unlike clone, this does not copy the settings of the repository.
 | 
|
807  | 
        """
 | 
|
808  | 
dest_repo = self._create_sprouting_repo(to_bzrdir, shared=False)  | 
|
809  | 
dest_repo.fetch(self, revision_id=revision_id)  | 
|
810  | 
return dest_repo  | 
|
811  | 
||
812  | 
def _create_sprouting_repo(self, a_bzrdir, shared):  | 
|
| 
1534.4.50
by Robert Collins
 Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.  | 
813  | 
if not isinstance(a_bzrdir._format, self.bzrdir._format.__class__):  | 
814  | 
            # use target default format.
 | 
|
| 
2241.1.4
by Martin Pool
 Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.  | 
815  | 
dest_repo = a_bzrdir.create_repository()  | 
| 
1534.4.50
by Robert Collins
 Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.  | 
816  | 
else:  | 
| 
2241.1.4
by Martin Pool
 Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.  | 
817  | 
            # Most control formats need the repository to be specifically
 | 
818  | 
            # created, but on some old all-in-one formats it's not needed
 | 
|
819  | 
try:  | 
|
| 
2440.1.1
by Martin Pool
 Add new Repository.sprout,  | 
820  | 
dest_repo = self._format.initialize(a_bzrdir, shared=shared)  | 
| 
2241.1.4
by Martin Pool
 Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.  | 
821  | 
except errors.UninitializableFormat:  | 
822  | 
dest_repo = a_bzrdir.open_repository()  | 
|
823  | 
return dest_repo  | 
|
| 
1534.4.41
by Robert Collins
 Branch now uses BzrDir reasonably sanely.  | 
824  | 
|
| 
1563.2.22
by Robert Collins
 Move responsibility for repository.has_revision into RevisionStore  | 
825  | 
    @needs_read_lock
 | 
| 
1185.65.1
by Aaron Bentley
 Refactored out ControlFiles and RevisionStore from _Branch  | 
826  | 
def has_revision(self, revision_id):  | 
| 
1563.2.22
by Robert Collins
 Move responsibility for repository.has_revision into RevisionStore  | 
827  | 
"""True if this repository has a copy of the revision."""  | 
| 
2745.1.1
by Robert Collins
 Add a number of -Devil checkpoints.  | 
828  | 
if 'evil' in debug.debug_flags:  | 
829  | 
mutter_callsite(2, "has_revision is a LBYL symptom.")  | 
|
| 
2249.5.13
by John Arbash Meinel
 Finish auditing Repository, and fix generate_ids to always generate utf8 ids.  | 
830  | 
revision_id = osutils.safe_revision_id(revision_id)  | 
| 
1563.2.22
by Robert Collins
 Move responsibility for repository.has_revision into RevisionStore  | 
831  | 
return self._revision_store.has_revision_id(revision_id,  | 
832  | 
self.get_transaction())  | 
|
| 
1185.65.1
by Aaron Bentley
 Refactored out ControlFiles and RevisionStore from _Branch  | 
833  | 
|
| 
1185.65.27
by Robert Collins
 Tweak storage towards mergability.  | 
834  | 
    @needs_read_lock
 | 
| 
1570.1.13
by Robert Collins
 Check for incorrect revision parentage in the weave during revision access.  | 
835  | 
def get_revision_reconcile(self, revision_id):  | 
836  | 
"""'reconcile' helper routine that allows access to a revision always.  | 
|
837  | 
        
 | 
|
838  | 
        This variant of get_revision does not cross check the weave graph
 | 
|
839  | 
        against the revision one as get_revision does: but it should only
 | 
|
840  | 
        be used by reconcile, or reconcile-alike commands that are correcting
 | 
|
841  | 
        or testing the revision graph.
 | 
|
842  | 
        """
 | 
|
| 
1563.2.25
by Robert Collins
 Merge in upstream.  | 
843  | 
if not revision_id or not isinstance(revision_id, basestring):  | 
| 
1996.3.4
by John Arbash Meinel
 lazy_import bzrlib/repository.py  | 
844  | 
raise errors.InvalidRevisionId(revision_id=revision_id,  | 
845  | 
branch=self)  | 
|
| 
2249.5.13
by John Arbash Meinel
 Finish auditing Repository, and fix generate_ids to always generate utf8 ids.  | 
846  | 
return self.get_revisions([revision_id])[0]  | 
847  | 
||
| 
1756.1.2
by Aaron Bentley
 Show logs using get_revisions  | 
848  | 
    @needs_read_lock
 | 
849  | 
def get_revisions(self, revision_ids):  | 
|
| 
2249.5.13
by John Arbash Meinel
 Finish auditing Repository, and fix generate_ids to always generate utf8 ids.  | 
850  | 
revision_ids = [osutils.safe_revision_id(r) for r in revision_ids]  | 
851  | 
revs = self._revision_store.get_revisions(revision_ids,  | 
|
| 
1756.1.2
by Aaron Bentley
 Show logs using get_revisions  | 
852  | 
self.get_transaction())  | 
| 
2249.5.13
by John Arbash Meinel
 Finish auditing Repository, and fix generate_ids to always generate utf8 ids.  | 
853  | 
for rev in revs:  | 
854  | 
assert not isinstance(rev.revision_id, unicode)  | 
|
855  | 
for parent_id in rev.parent_ids:  | 
|
856  | 
assert not isinstance(parent_id, unicode)  | 
|
857  | 
return revs  | 
|
| 
1185.65.1
by Aaron Bentley
 Refactored out ControlFiles and RevisionStore from _Branch  | 
858  | 
|
| 
1185.65.27
by Robert Collins
 Tweak storage towards mergability.  | 
859  | 
    @needs_read_lock
 | 
| 
1563.2.29
by Robert Collins
 Remove all but fetch references to repository.revision_store.  | 
860  | 
def get_revision_xml(self, revision_id):  | 
| 
2249.5.13
by John Arbash Meinel
 Finish auditing Repository, and fix generate_ids to always generate utf8 ids.  | 
861  | 
        # TODO: jam 20070210 This shouldn't be necessary since get_revision
 | 
862  | 
        #       would have already do it.
 | 
|
863  | 
        # TODO: jam 20070210 Just use _serializer.write_revision_to_string()
 | 
|
864  | 
revision_id = osutils.safe_revision_id(revision_id)  | 
|
865  | 
rev = self.get_revision(revision_id)  | 
|
| 
1563.2.29
by Robert Collins
 Remove all but fetch references to repository.revision_store.  | 
866  | 
rev_tmp = StringIO()  | 
867  | 
        # the current serializer..
 | 
|
868  | 
self._revision_store._serializer.write_revision(rev, rev_tmp)  | 
|
869  | 
rev_tmp.seek(0)  | 
|
870  | 
return rev_tmp.getvalue()  | 
|
871  | 
||
872  | 
    @needs_read_lock
 | 
|
| 
1570.1.13
by Robert Collins
 Check for incorrect revision parentage in the weave during revision access.  | 
873  | 
def get_revision(self, revision_id):  | 
874  | 
"""Return the Revision object for a named revision"""  | 
|
| 
2249.5.13
by John Arbash Meinel
 Finish auditing Repository, and fix generate_ids to always generate utf8 ids.  | 
875  | 
        # TODO: jam 20070210 get_revision_reconcile should do this for us
 | 
876  | 
revision_id = osutils.safe_revision_id(revision_id)  | 
|
| 
1570.1.13
by Robert Collins
 Check for incorrect revision parentage in the weave during revision access.  | 
877  | 
r = self.get_revision_reconcile(revision_id)  | 
878  | 
        # weave corruption can lead to absent revision markers that should be
 | 
|
879  | 
        # present.
 | 
|
880  | 
        # the following test is reasonably cheap (it needs a single weave read)
 | 
|
881  | 
        # and the weave is cached in read transactions. In write transactions
 | 
|
882  | 
        # it is not cached but typically we only read a small number of
 | 
|
883  | 
        # revisions. For knits when they are introduced we will probably want
 | 
|
884  | 
        # to ensure that caching write transactions are in use.
 | 
|
885  | 
inv = self.get_inventory_weave()  | 
|
| 
1570.1.14
by Robert Collins
 Enforce repository consistency during 'fetch' operations.  | 
886  | 
self._check_revision_parents(r, inv)  | 
887  | 
return r  | 
|
888  | 
||
| 
1756.3.19
by Aaron Bentley
 Documentation and cleanups  | 
889  | 
    @needs_read_lock
 | 
| 
1756.3.22
by Aaron Bentley
 Tweaks from review  | 
890  | 
def get_deltas_for_revisions(self, revisions):  | 
| 
1756.3.19
by Aaron Bentley
 Documentation and cleanups  | 
891  | 
"""Produce a generator of revision deltas.  | 
892  | 
        
 | 
|
893  | 
        Note that the input is a sequence of REVISIONS, not revision_ids.
 | 
|
894  | 
        Trees will be held in memory until the generator exits.
 | 
|
895  | 
        Each delta is relative to the revision's lefthand predecessor.
 | 
|
896  | 
        """
 | 
|
| 
1756.3.3
by Aaron Bentley
 More refactoring, introduce revision_trees.  | 
897  | 
required_trees = set()  | 
898  | 
for revision in revisions:  | 
|
899  | 
required_trees.add(revision.revision_id)  | 
|
900  | 
required_trees.update(revision.parent_ids[:1])  | 
|
901  | 
trees = dict((t.get_revision_id(), t) for  | 
|
902  | 
t in self.revision_trees(required_trees))  | 
|
903  | 
for revision in revisions:  | 
|
904  | 
if not revision.parent_ids:  | 
|
| 
1852.5.1
by Robert Collins
 Deprecate EmptyTree in favour of using Repository.revision_tree.  | 
905  | 
old_tree = self.revision_tree(None)  | 
| 
1756.3.3
by Aaron Bentley
 More refactoring, introduce revision_trees.  | 
906  | 
else:  | 
907  | 
old_tree = trees[revision.parent_ids[0]]  | 
|
| 
1852.10.3
by Robert Collins
 Remove all uses of compare_trees and replace with Tree.changes_from throughout bzrlib.  | 
908  | 
yield trees[revision.revision_id].changes_from(old_tree)  | 
| 
1756.3.3
by Aaron Bentley
 More refactoring, introduce revision_trees.  | 
909  | 
|
| 
1756.3.19
by Aaron Bentley
 Documentation and cleanups  | 
910  | 
    @needs_read_lock
 | 
| 
1744.2.2
by Johan Rydberg
 Add get_revision_delta to Repository; and make Branch.get_revision_delta use it.  | 
911  | 
def get_revision_delta(self, revision_id):  | 
912  | 
"""Return the delta for one revision.  | 
|
913  | 
||
914  | 
        The delta is relative to the left-hand predecessor of the
 | 
|
915  | 
        revision.
 | 
|
916  | 
        """
 | 
|
| 
1756.3.3
by Aaron Bentley
 More refactoring, introduce revision_trees.  | 
917  | 
r = self.get_revision(revision_id)  | 
| 
1756.3.22
by Aaron Bentley
 Tweaks from review  | 
918  | 
return list(self.get_deltas_for_revisions([r]))[0]  | 
| 
1744.2.2
by Johan Rydberg
 Add get_revision_delta to Repository; and make Branch.get_revision_delta use it.  | 
919  | 
|
| 
1570.1.14
by Robert Collins
 Enforce repository consistency during 'fetch' operations.  | 
920  | 
def _check_revision_parents(self, revision, inventory):  | 
921  | 
"""Private to Repository and Fetch.  | 
|
922  | 
        
 | 
|
923  | 
        This checks the parentage of revision in an inventory weave for 
 | 
|
924  | 
        consistency and is only applicable to inventory-weave-for-ancestry
 | 
|
925  | 
        using repository formats & fetchers.
 | 
|
926  | 
        """
 | 
|
| 
1563.2.25
by Robert Collins
 Merge in upstream.  | 
927  | 
weave_parents = inventory.get_parents(revision.revision_id)  | 
928  | 
weave_names = inventory.versions()  | 
|
| 
1570.1.14
by Robert Collins
 Enforce repository consistency during 'fetch' operations.  | 
929  | 
for parent_id in revision.parent_ids:  | 
| 
1570.1.13
by Robert Collins
 Check for incorrect revision parentage in the weave during revision access.  | 
930  | 
if parent_id in weave_names:  | 
931  | 
                # this parent must not be a ghost.
 | 
|
932  | 
if not parent_id in weave_parents:  | 
|
933  | 
                    # but it is a ghost
 | 
|
934  | 
raise errors.CorruptRepository(self)  | 
|
935  | 
||
| 
1185.65.1
by Aaron Bentley
 Refactored out ControlFiles and RevisionStore from _Branch  | 
936  | 
    @needs_write_lock
 | 
937  | 
def store_revision_signature(self, gpg_strategy, plaintext, revision_id):  | 
|
| 
2249.5.13
by John Arbash Meinel
 Finish auditing Repository, and fix generate_ids to always generate utf8 ids.  | 
938  | 
revision_id = osutils.safe_revision_id(revision_id)  | 
| 
1563.2.29
by Robert Collins
 Remove all but fetch references to repository.revision_store.  | 
939  | 
signature = gpg_strategy.sign(plaintext)  | 
940  | 
self._revision_store.add_revision_signature_text(revision_id,  | 
|
941  | 
signature,  | 
|
942  | 
self.get_transaction())  | 
|
| 
1185.65.1
by Aaron Bentley
 Refactored out ControlFiles and RevisionStore from _Branch  | 
943  | 
|
| 
1694.2.6
by Martin Pool
 [merge] bzr.dev  | 
944  | 
def fileids_altered_by_revision_ids(self, revision_ids):  | 
945  | 
"""Find the file ids and versions affected by revisions.  | 
|
946  | 
||
947  | 
        :param revisions: an iterable containing revision ids.
 | 
|
948  | 
        :return: a dictionary mapping altered file-ids to an iterable of
 | 
|
949  | 
        revision_ids. Each altered file-ids has the exact revision_ids that
 | 
|
950  | 
        altered it listed explicitly.
 | 
|
| 
1534.4.41
by Robert Collins
 Branch now uses BzrDir reasonably sanely.  | 
951  | 
        """
 | 
| 
1910.2.48
by Aaron Bentley
 Update from review comments  | 
952  | 
assert self._serializer.support_altered_by_hack, \  | 
| 
1732.2.1
by Martin Pool
 Remove obsolete fileid_involved from KnitRepository, fix error message.  | 
953  | 
("fileids_altered_by_revision_ids only supported for branches "  | 
954  | 
"which store inventory as unnested xml, not on %r" % self)  | 
|
| 
2249.5.13
by John Arbash Meinel
 Finish auditing Repository, and fix generate_ids to always generate utf8 ids.  | 
955  | 
selected_revision_ids = set(osutils.safe_revision_id(r)  | 
956  | 
for r in revision_ids)  | 
|
| 
1534.4.41
by Robert Collins
 Branch now uses BzrDir reasonably sanely.  | 
957  | 
w = self.get_inventory_weave()  | 
| 
1694.2.6
by Martin Pool
 [merge] bzr.dev  | 
958  | 
result = {}  | 
| 
1563.2.35
by Robert Collins
 cleanup deprecation warnings and finish conversion so the inventory is knit based too.  | 
959  | 
|
| 
1694.2.6
by Martin Pool
 [merge] bzr.dev  | 
960  | 
        # this code needs to read every new line in every inventory for the
 | 
961  | 
        # inventories [revision_ids]. Seeing a line twice is ok. Seeing a line
 | 
|
| 
1759.2.1
by Jelmer Vernooij
 Fix some types (found using aspell).  | 
962  | 
        # not present in one of those inventories is unnecessary but not 
 | 
| 
1594.2.6
by Robert Collins
 Introduce a api specifically for looking at lines in some versions of the inventory, for fileid_involved.  | 
963  | 
        # harmful because we are filtering by the revision id marker in the
 | 
| 
1694.2.6
by Martin Pool
 [merge] bzr.dev  | 
964  | 
        # inventory lines : we only select file ids altered in one of those  
 | 
| 
1759.2.2
by Jelmer Vernooij
 Revert some of my spelling fixes and fix some typos after review by Aaron.  | 
965  | 
        # revisions. We don't need to see all lines in the inventory because
 | 
| 
1594.2.6
by Robert Collins
 Introduce a api specifically for looking at lines in some versions of the inventory, for fileid_involved.  | 
966  | 
        # only those added in an inventory in rev X can contain a revision=X
 | 
967  | 
        # line.
 | 
|
| 
2163.2.3
by John Arbash Meinel
 Change to local variables to save another 300ms  | 
968  | 
unescape_revid_cache = {}  | 
969  | 
unescape_fileid_cache = {}  | 
|
970  | 
||
| 
2163.2.5
by John Arbash Meinel
 Inline the cache lookup, and explain why  | 
971  | 
        # jam 20061218 In a big fetch, this handles hundreds of thousands
 | 
972  | 
        # of lines, so it has had a lot of inlining and optimizing done.
 | 
|
973  | 
        # Sorry that it is a little bit messy.
 | 
|
| 
2163.2.3
by John Arbash Meinel
 Change to local variables to save another 300ms  | 
974  | 
        # Move several functions to be local variables, since this is a long
 | 
975  | 
        # running loop.
 | 
|
976  | 
search = self._file_ids_altered_regex.search  | 
|
| 
2163.2.5
by John Arbash Meinel
 Inline the cache lookup, and explain why  | 
977  | 
unescape = _unescape_xml  | 
| 
2163.2.3
by John Arbash Meinel
 Change to local variables to save another 300ms  | 
978  | 
setdefault = result.setdefault  | 
| 
2039.1.1
by Aaron Bentley
 Clean up progress properly when interrupted during fetch (#54000)  | 
979  | 
pb = ui.ui_factory.nested_progress_bar()  | 
980  | 
try:  | 
|
981  | 
for line in w.iter_lines_added_or_present_in_versions(  | 
|
| 
2163.2.3
by John Arbash Meinel
 Change to local variables to save another 300ms  | 
982  | 
selected_revision_ids, pb=pb):  | 
983  | 
match = search(line)  | 
|
| 
2163.2.1
by John Arbash Meinel
 Speed up the fileids_altered_by_revision_ids processing  | 
984  | 
if match is None:  | 
985  | 
                    continue
 | 
|
| 
2163.2.5
by John Arbash Meinel
 Inline the cache lookup, and explain why  | 
986  | 
                # One call to match.group() returning multiple items is quite a
 | 
987  | 
                # bit faster than 2 calls to match.group() each returning 1
 | 
|
| 
2163.2.1
by John Arbash Meinel
 Speed up the fileids_altered_by_revision_ids processing  | 
988  | 
file_id, revision_id = match.group('file_id', 'revision_id')  | 
| 
2163.2.5
by John Arbash Meinel
 Inline the cache lookup, and explain why  | 
989  | 
|
990  | 
                # Inlining the cache lookups helps a lot when you make 170,000
 | 
|
991  | 
                # lines and 350k ids, versus 8.4 unique ids.
 | 
|
992  | 
                # Using a cache helps in 2 ways:
 | 
|
993  | 
                #   1) Avoids unnecessary decoding calls
 | 
|
994  | 
                #   2) Re-uses cached strings, which helps in future set and
 | 
|
995  | 
                #      equality checks.
 | 
|
996  | 
                # (2) is enough that removing encoding entirely along with
 | 
|
997  | 
                # the cache (so we are using plain strings) results in no
 | 
|
998  | 
                # performance improvement.
 | 
|
999  | 
try:  | 
|
1000  | 
revision_id = unescape_revid_cache[revision_id]  | 
|
1001  | 
except KeyError:  | 
|
| 
2294.1.10
by John Arbash Meinel
 Switch all apis over to utf8 file ids. All tests pass  | 
1002  | 
unescaped = unescape(revision_id)  | 
| 
2163.2.5
by John Arbash Meinel
 Inline the cache lookup, and explain why  | 
1003  | 
unescape_revid_cache[revision_id] = unescaped  | 
1004  | 
revision_id = unescaped  | 
|
1005  | 
||
| 
2039.1.1
by Aaron Bentley
 Clean up progress properly when interrupted during fetch (#54000)  | 
1006  | 
if revision_id in selected_revision_ids:  | 
| 
2163.2.5
by John Arbash Meinel
 Inline the cache lookup, and explain why  | 
1007  | 
try:  | 
1008  | 
file_id = unescape_fileid_cache[file_id]  | 
|
1009  | 
except KeyError:  | 
|
1010  | 
unescaped = unescape(file_id)  | 
|
1011  | 
unescape_fileid_cache[file_id] = unescaped  | 
|
1012  | 
file_id = unescaped  | 
|
| 
2163.2.3
by John Arbash Meinel
 Change to local variables to save another 300ms  | 
1013  | 
setdefault(file_id, set()).add(revision_id)  | 
| 
2039.1.1
by Aaron Bentley
 Clean up progress properly when interrupted during fetch (#54000)  | 
1014  | 
finally:  | 
1015  | 
pb.finished()  | 
|
| 
1694.2.6
by Martin Pool
 [merge] bzr.dev  | 
1016  | 
return result  | 
| 
1534.4.41
by Robert Collins
 Branch now uses BzrDir reasonably sanely.  | 
1017  | 
|
| 
2708.1.7
by Aaron Bentley
 Rename extract_files_bytes to iter_files_bytes  | 
1018  | 
def iter_files_bytes(self, desired_files):  | 
| 
2708.1.9
by Aaron Bentley
 Clean-up docs and imports  | 
1019  | 
"""Iterate through file versions.  | 
1020  | 
||
| 
2708.1.10
by Aaron Bentley
 Update docstrings  | 
1021  | 
        Files will not necessarily be returned in the order they occur in
 | 
1022  | 
        desired_files.  No specific order is guaranteed.
 | 
|
1023  | 
||
| 
2708.1.9
by Aaron Bentley
 Clean-up docs and imports  | 
1024  | 
        Yields pairs of identifier, bytes_iterator.  identifier is an opaque
 | 
| 
2708.1.10
by Aaron Bentley
 Update docstrings  | 
1025  | 
        value supplied by the caller as part of desired_files.  It should
 | 
1026  | 
        uniquely identify the file version in the caller's context.  (Examples:
 | 
|
1027  | 
        an index number or a TreeTransform trans_id.)
 | 
|
1028  | 
||
1029  | 
        bytes_iterator is an iterable of bytestrings for the file.  The
 | 
|
1030  | 
        kind of iterable and length of the bytestrings are unspecified, but for
 | 
|
1031  | 
        this implementation, it is a list of lines produced by
 | 
|
1032  | 
        VersionedFile.get_lines().
 | 
|
1033  | 
||
| 
2708.1.9
by Aaron Bentley
 Clean-up docs and imports  | 
1034  | 
        :param desired_files: a list of (file_id, revision_id, identifier)
 | 
| 
2708.1.10
by Aaron Bentley
 Update docstrings  | 
1035  | 
            triples
 | 
| 
2708.1.9
by Aaron Bentley
 Clean-up docs and imports  | 
1036  | 
        """
 | 
| 
2708.1.3
by Aaron Bentley
 Implement extract_files_bytes on Repository  | 
1037  | 
transaction = self.get_transaction()  | 
1038  | 
for file_id, revision_id, callable_data in desired_files:  | 
|
| 
2708.1.11
by Aaron Bentley
 Test and tweak error handling  | 
1039  | 
try:  | 
1040  | 
weave = self.weave_store.get_weave(file_id, transaction)  | 
|
1041  | 
except errors.NoSuchFile:  | 
|
1042  | 
raise errors.NoSuchIdInRepository(self, file_id)  | 
|
| 
2708.1.6
by Aaron Bentley
 Turn extract_files_bytes into an iterator  | 
1043  | 
yield callable_data, weave.get_lines(revision_id)  | 
| 
2708.1.3
by Aaron Bentley
 Implement extract_files_bytes on Repository  | 
1044  | 
|
| 
2668.2.8
by Andrew Bennetts
 Rename get_data_to_fetch_for_revision_ids as item_keys_introduced_by.  | 
1045  | 
def item_keys_introduced_by(self, revision_ids, _files_pb=None):  | 
1046  | 
"""Get an iterable listing the keys of all the data introduced by a set  | 
|
1047  | 
        of revision IDs.
 | 
|
1048  | 
||
1049  | 
        The keys will be ordered so that the corresponding items can be safely
 | 
|
1050  | 
        fetched and inserted in that order.
 | 
|
1051  | 
||
1052  | 
        :returns: An iterable producing tuples of (knit-kind, file-id,
 | 
|
1053  | 
            versions).  knit-kind is one of 'file', 'inventory', 'signatures',
 | 
|
1054  | 
            'revisions'.  file-id is None unless knit-kind is 'file'.
 | 
|
| 
2668.2.1
by Andrew Bennetts
 Split out fetch refactoring from repo-refactor, adding Repository.get_data_about_revision_ids.  | 
1055  | 
        """
 | 
1056  | 
        # XXX: it's a bit weird to control the inventory weave caching in this
 | 
|
1057  | 
        # generator.  Ideally the caching would be done in fetch.py I think.  Or
 | 
|
1058  | 
        # maybe this generator should explicitly have the contract that it
 | 
|
1059  | 
        # should not be iterated until the previously yielded item has been
 | 
|
1060  | 
        # processed?
 | 
|
1061  | 
inv_w = self.get_inventory_weave()  | 
|
1062  | 
inv_w.enable_cache()  | 
|
1063  | 
||
1064  | 
        # file ids that changed
 | 
|
1065  | 
file_ids = self.fileids_altered_by_revision_ids(revision_ids)  | 
|
1066  | 
count = 0  | 
|
1067  | 
num_file_ids = len(file_ids)  | 
|
1068  | 
for file_id, altered_versions in file_ids.iteritems():  | 
|
| 
2668.2.8
by Andrew Bennetts
 Rename get_data_to_fetch_for_revision_ids as item_keys_introduced_by.  | 
1069  | 
if _files_pb is not None:  | 
1070  | 
_files_pb.update("fetch texts", count, num_file_ids)  | 
|
| 
2668.2.1
by Andrew Bennetts
 Split out fetch refactoring from repo-refactor, adding Repository.get_data_about_revision_ids.  | 
1071  | 
count += 1  | 
1072  | 
yield ("file", file_id, altered_versions)  | 
|
1073  | 
        # We're done with the files_pb.  Note that it finished by the caller,
 | 
|
1074  | 
        # just as it was created by the caller.
 | 
|
| 
2668.2.8
by Andrew Bennetts
 Rename get_data_to_fetch_for_revision_ids as item_keys_introduced_by.  | 
1075  | 
del _files_pb  | 
| 
2668.2.1
by Andrew Bennetts
 Split out fetch refactoring from repo-refactor, adding Repository.get_data_about_revision_ids.  | 
1076  | 
|
1077  | 
        # inventory
 | 
|
1078  | 
yield ("inventory", None, revision_ids)  | 
|
1079  | 
inv_w.clear_cache()  | 
|
1080  | 
||
1081  | 
        # signatures
 | 
|
1082  | 
revisions_with_signatures = set()  | 
|
1083  | 
for rev_id in revision_ids:  | 
|
1084  | 
try:  | 
|
1085  | 
self.get_signature_text(rev_id)  | 
|
1086  | 
except errors.NoSuchRevision:  | 
|
1087  | 
                # not signed.
 | 
|
1088  | 
                pass
 | 
|
1089  | 
else:  | 
|
1090  | 
revisions_with_signatures.add(rev_id)  | 
|
1091  | 
yield ("signatures", None, revisions_with_signatures)  | 
|
1092  | 
||
1093  | 
        # revisions
 | 
|
1094  | 
yield ("revisions", None, revision_ids)  | 
|
1095  | 
||
| 
1185.65.27
by Robert Collins
 Tweak storage towards mergability.  | 
1096  | 
    @needs_read_lock
 | 
| 
1185.65.1
by Aaron Bentley
 Refactored out ControlFiles and RevisionStore from _Branch  | 
1097  | 
def get_inventory_weave(self):  | 
1098  | 
return self.control_weaves.get_weave('inventory',  | 
|
1099  | 
self.get_transaction())  | 
|
1100  | 
||
| 
1185.65.27
by Robert Collins
 Tweak storage towards mergability.  | 
1101  | 
    @needs_read_lock
 | 
| 
1185.65.1
by Aaron Bentley
 Refactored out ControlFiles and RevisionStore from _Branch  | 
1102  | 
def get_inventory(self, revision_id):  | 
1103  | 
"""Get Inventory object by hash."""  | 
|
| 
2249.5.13
by John Arbash Meinel
 Finish auditing Repository, and fix generate_ids to always generate utf8 ids.  | 
1104  | 
        # TODO: jam 20070210 Technically we don't need to sanitize, since all
 | 
1105  | 
        #       called functions must sanitize.
 | 
|
1106  | 
revision_id = osutils.safe_revision_id(revision_id)  | 
|
| 
1740.2.3
by Aaron Bentley
 Only reserialize the working tree basis inventory when needed.  | 
1107  | 
return self.deserialise_inventory(  | 
1108  | 
revision_id, self.get_inventory_xml(revision_id))  | 
|
1109  | 
||
1110  | 
def deserialise_inventory(self, revision_id, xml):  | 
|
1111  | 
"""Transform the xml into an inventory object.  | 
|
1112  | 
||
1113  | 
        :param revision_id: The expected revision id of the inventory.
 | 
|
1114  | 
        :param xml: A serialised inventory.
 | 
|
1115  | 
        """
 | 
|
| 
2249.5.13
by John Arbash Meinel
 Finish auditing Repository, and fix generate_ids to always generate utf8 ids.  | 
1116  | 
revision_id = osutils.safe_revision_id(revision_id)  | 
| 
1910.2.48
by Aaron Bentley
 Update from review comments  | 
1117  | 
result = self._serializer.read_inventory_from_string(xml)  | 
| 
1910.2.1
by Aaron Bentley
 Ensure root entry always has a revision  | 
1118  | 
result.root.revision = revision_id  | 
1119  | 
return result  | 
|
| 
1185.65.1
by Aaron Bentley
 Refactored out ControlFiles and RevisionStore from _Branch  | 
1120  | 
|
| 
1910.2.22
by Aaron Bentley
 Make commits preserve root entry data  | 
1121  | 
def serialise_inventory(self, inv):  | 
| 
1910.2.48
by Aaron Bentley
 Update from review comments  | 
1122  | 
return self._serializer.write_inventory_to_string(inv)  | 
| 
1910.2.22
by Aaron Bentley
 Make commits preserve root entry data  | 
1123  | 
|
| 
2817.2.1
by Robert Collins
 * Inventory serialisation no longer double-sha's the content.  | 
1124  | 
def _serialise_inventory_to_lines(self, inv):  | 
1125  | 
return self._serializer.write_inventory_to_lines(inv)  | 
|
1126  | 
||
| 
2520.4.113
by Aaron Bentley
 Avoid peeking at Repository._serializer  | 
1127  | 
def get_serializer_format(self):  | 
1128  | 
return self._serializer.format_num  | 
|
1129  | 
||
| 
1185.65.27
by Robert Collins
 Tweak storage towards mergability.  | 
1130  | 
    @needs_read_lock
 | 
| 
1185.65.1
by Aaron Bentley
 Refactored out ControlFiles and RevisionStore from _Branch  | 
1131  | 
def get_inventory_xml(self, revision_id):  | 
1132  | 
"""Get inventory XML as a file object."""  | 
|
| 
2249.5.13
by John Arbash Meinel
 Finish auditing Repository, and fix generate_ids to always generate utf8 ids.  | 
1133  | 
revision_id = osutils.safe_revision_id(revision_id)  | 
| 
1185.65.1
by Aaron Bentley
 Refactored out ControlFiles and RevisionStore from _Branch  | 
1134  | 
try:  | 
| 
2249.5.13
by John Arbash Meinel
 Finish auditing Repository, and fix generate_ids to always generate utf8 ids.  | 
1135  | 
assert isinstance(revision_id, str), type(revision_id)  | 
| 
1185.65.1
by Aaron Bentley
 Refactored out ControlFiles and RevisionStore from _Branch  | 
1136  | 
iw = self.get_inventory_weave()  | 
| 
1563.2.18
by Robert Collins
 get knit repositories really using knits for text storage.  | 
1137  | 
return iw.get_text(revision_id)  | 
| 
1185.65.1
by Aaron Bentley
 Refactored out ControlFiles and RevisionStore from _Branch  | 
1138  | 
except IndexError:  | 
| 
1773.4.1
by Martin Pool
 Add pyflakes makefile target; fix many warnings  | 
1139  | 
raise errors.HistoryMissing(self, 'inventory', revision_id)  | 
| 
1185.65.1
by Aaron Bentley
 Refactored out ControlFiles and RevisionStore from _Branch  | 
1140  | 
|
| 
1185.65.27
by Robert Collins
 Tweak storage towards mergability.  | 
1141  | 
    @needs_read_lock
 | 
| 
1185.65.1
by Aaron Bentley
 Refactored out ControlFiles and RevisionStore from _Branch  | 
1142  | 
def get_inventory_sha1(self, revision_id):  | 
1143  | 
"""Return the sha1 hash of the inventory entry  | 
|
1144  | 
        """
 | 
|
| 
2249.5.13
by John Arbash Meinel
 Finish auditing Repository, and fix generate_ids to always generate utf8 ids.  | 
1145  | 
        # TODO: jam 20070210 Shouldn't this be deprecated / removed?
 | 
1146  | 
revision_id = osutils.safe_revision_id(revision_id)  | 
|
| 
1185.65.1
by Aaron Bentley
 Refactored out ControlFiles and RevisionStore from _Branch  | 
1147  | 
return self.get_revision(revision_id).inventory_sha1  | 
1148  | 
||
| 
1185.65.27
by Robert Collins
 Tweak storage towards mergability.  | 
1149  | 
    @needs_read_lock
 | 
| 
1590.1.1
by Robert Collins
 Improve common_ancestor performance.  | 
1150  | 
def get_revision_graph(self, revision_id=None):  | 
1151  | 
"""Return a dictionary containing the revision graph.  | 
|
1152  | 
        
 | 
|
| 
1836.3.1
by Robert Collins
 (robertc) Teach repository.get_revision_graph, and revision.common_ancestor, about NULL_REVISION.  | 
1153  | 
        :param revision_id: The revision_id to get a graph from. If None, then
 | 
1154  | 
        the entire revision graph is returned. This is a deprecated mode of
 | 
|
1155  | 
        operation and will be removed in the future.
 | 
|
| 
1590.1.1
by Robert Collins
 Improve common_ancestor performance.  | 
1156  | 
        :return: a dictionary of revision_id->revision_parents_list.
 | 
1157  | 
        """
 | 
|
| 
2745.1.1
by Robert Collins
 Add a number of -Devil checkpoints.  | 
1158  | 
if 'evil' in debug.debug_flags:  | 
1159  | 
mutter_callsite(2,  | 
|
1160  | 
"get_revision_graph scales with size of history.")  | 
|
| 
1836.3.1
by Robert Collins
 (robertc) Teach repository.get_revision_graph, and revision.common_ancestor, about NULL_REVISION.  | 
1161  | 
        # special case NULL_REVISION
 | 
| 
1996.3.4
by John Arbash Meinel
 lazy_import bzrlib/repository.py  | 
1162  | 
if revision_id == _mod_revision.NULL_REVISION:  | 
| 
1836.3.1
by Robert Collins
 (robertc) Teach repository.get_revision_graph, and revision.common_ancestor, about NULL_REVISION.  | 
1163  | 
return {}  | 
| 
2249.5.13
by John Arbash Meinel
 Finish auditing Repository, and fix generate_ids to always generate utf8 ids.  | 
1164  | 
revision_id = osutils.safe_revision_id(revision_id)  | 
| 
1996.3.4
by John Arbash Meinel
 lazy_import bzrlib/repository.py  | 
1165  | 
a_weave = self.get_inventory_weave()  | 
1166  | 
all_revisions = self._eliminate_revisions_not_present(  | 
|
1167  | 
a_weave.versions())  | 
|
| 
2625.8.1
by Robert Collins
 LIBRARY API BREAKS:  | 
1168  | 
entire_graph = dict([(node, tuple(a_weave.get_parents(node))) for  | 
| 
1590.1.1
by Robert Collins
 Improve common_ancestor performance.  | 
1169  | 
node in all_revisions])  | 
1170  | 
if revision_id is None:  | 
|
1171  | 
return entire_graph  | 
|
1172  | 
elif revision_id not in entire_graph:  | 
|
1173  | 
raise errors.NoSuchRevision(self, revision_id)  | 
|
1174  | 
else:  | 
|
1175  | 
            # add what can be reached from revision_id
 | 
|
1176  | 
result = {}  | 
|
1177  | 
pending = set([revision_id])  | 
|
1178  | 
while len(pending) > 0:  | 
|
1179  | 
node = pending.pop()  | 
|
1180  | 
result[node] = entire_graph[node]  | 
|
1181  | 
for revision_id in result[node]:  | 
|
1182  | 
if revision_id not in result:  | 
|
1183  | 
pending.add(revision_id)  | 
|
1184  | 
return result  | 
|
1185  | 
||
1186  | 
    @needs_read_lock
 | 
|
| 
1594.2.3
by Robert Collins
 bugfix revision.MultipleRevisionSources.get_revision_graph to integrate ghosts between sources. [slow on weaves, fast on knits.  | 
1187  | 
def get_revision_graph_with_ghosts(self, revision_ids=None):  | 
1188  | 
"""Return a graph of the revisions with ghosts marked as applicable.  | 
|
1189  | 
||
1190  | 
        :param revision_ids: an iterable of revisions to graph or None for all.
 | 
|
1191  | 
        :return: a Graph object with the graph reachable from revision_ids.
 | 
|
1192  | 
        """
 | 
|
| 
2745.1.1
by Robert Collins
 Add a number of -Devil checkpoints.  | 
1193  | 
if 'evil' in debug.debug_flags:  | 
1194  | 
mutter_callsite(2,  | 
|
1195  | 
"get_revision_graph_with_ghosts scales with size of history.")  | 
|
| 
2490.2.21
by Aaron Bentley
 Rename graph to deprecated_graph  | 
1196  | 
result = deprecated_graph.Graph()  | 
| 
1594.2.3
by Robert Collins
 bugfix revision.MultipleRevisionSources.get_revision_graph to integrate ghosts between sources. [slow on weaves, fast on knits.  | 
1197  | 
if not revision_ids:  | 
| 
1773.4.2
by Martin Pool
 Cleanup of imports; undeprecate all_revision_ids()  | 
1198  | 
pending = set(self.all_revision_ids())  | 
| 
1594.2.3
by Robert Collins
 bugfix revision.MultipleRevisionSources.get_revision_graph to integrate ghosts between sources. [slow on weaves, fast on knits.  | 
1199  | 
required = set([])  | 
1200  | 
else:  | 
|
| 
2249.5.13
by John Arbash Meinel
 Finish auditing Repository, and fix generate_ids to always generate utf8 ids.  | 
1201  | 
pending = set(osutils.safe_revision_id(r) for r in revision_ids)  | 
| 
1836.3.1
by Robert Collins
 (robertc) Teach repository.get_revision_graph, and revision.common_ancestor, about NULL_REVISION.  | 
1202  | 
            # special case NULL_REVISION
 | 
| 
1996.3.4
by John Arbash Meinel
 lazy_import bzrlib/repository.py  | 
1203  | 
if _mod_revision.NULL_REVISION in pending:  | 
1204  | 
pending.remove(_mod_revision.NULL_REVISION)  | 
|
| 
1836.3.1
by Robert Collins
 (robertc) Teach repository.get_revision_graph, and revision.common_ancestor, about NULL_REVISION.  | 
1205  | 
required = set(pending)  | 
| 
1594.2.3
by Robert Collins
 bugfix revision.MultipleRevisionSources.get_revision_graph to integrate ghosts between sources. [slow on weaves, fast on knits.  | 
1206  | 
done = set([])  | 
1207  | 
while len(pending):  | 
|
1208  | 
revision_id = pending.pop()  | 
|
1209  | 
try:  | 
|
1210  | 
rev = self.get_revision(revision_id)  | 
|
1211  | 
except errors.NoSuchRevision:  | 
|
1212  | 
if revision_id in required:  | 
|
1213  | 
                    raise
 | 
|
1214  | 
                # a ghost
 | 
|
1215  | 
result.add_ghost(revision_id)  | 
|
1216  | 
                continue
 | 
|
1217  | 
for parent_id in rev.parent_ids:  | 
|
1218  | 
                # is this queued or done ?
 | 
|
1219  | 
if (parent_id not in pending and  | 
|
1220  | 
parent_id not in done):  | 
|
1221  | 
                    # no, queue it.
 | 
|
1222  | 
pending.add(parent_id)  | 
|
1223  | 
result.add_node(revision_id, rev.parent_ids)  | 
|
| 
1594.2.15
by Robert Collins
 Unfuck performance.  | 
1224  | 
done.add(revision_id)  | 
| 
1594.2.3
by Robert Collins
 bugfix revision.MultipleRevisionSources.get_revision_graph to integrate ghosts between sources. [slow on weaves, fast on knits.  | 
1225  | 
return result  | 
1226  | 
||
| 
2230.3.54
by Aaron Bentley
 Move reverse history iteration to repository  | 
1227  | 
def _get_history_vf(self):  | 
1228  | 
"""Get a versionedfile whose history graph reflects all revisions.  | 
|
1229  | 
||
1230  | 
        For weave repositories, this is the inventory weave.
 | 
|
1231  | 
        """
 | 
|
1232  | 
return self.get_inventory_weave()  | 
|
1233  | 
||
1234  | 
def iter_reverse_revision_history(self, revision_id):  | 
|
1235  | 
"""Iterate backwards through revision ids in the lefthand history  | 
|
1236  | 
||
1237  | 
        :param revision_id: The revision id to start with.  All its lefthand
 | 
|
1238  | 
            ancestors will be traversed.
 | 
|
1239  | 
        """
 | 
|
| 
2249.5.17
by John Arbash Meinel
 [merge] bzr.dev 2293 and resolve conflicts, but still broken  | 
1240  | 
revision_id = osutils.safe_revision_id(revision_id)  | 
| 
2230.3.54
by Aaron Bentley
 Move reverse history iteration to repository  | 
1241  | 
if revision_id in (None, _mod_revision.NULL_REVISION):  | 
1242  | 
            return
 | 
|
1243  | 
next_id = revision_id  | 
|
1244  | 
versionedfile = self._get_history_vf()  | 
|
1245  | 
while True:  | 
|
1246  | 
yield next_id  | 
|
1247  | 
parents = versionedfile.get_parents(next_id)  | 
|
1248  | 
if len(parents) == 0:  | 
|
1249  | 
                return
 | 
|
1250  | 
else:  | 
|
1251  | 
next_id = parents[0]  | 
|
1252  | 
||
| 
1594.2.3
by Robert Collins
 bugfix revision.MultipleRevisionSources.get_revision_graph to integrate ghosts between sources. [slow on weaves, fast on knits.  | 
1253  | 
    @needs_read_lock
 | 
| 
1185.65.1
by Aaron Bentley
 Refactored out ControlFiles and RevisionStore from _Branch  | 
1254  | 
def get_revision_inventory(self, revision_id):  | 
1255  | 
"""Return inventory of a past revision."""  | 
|
1256  | 
        # TODO: Unify this with get_inventory()
 | 
|
1257  | 
        # bzr 0.0.6 and later imposes the constraint that the inventory_id
 | 
|
1258  | 
        # must be the same as its revision, so this is trivial.
 | 
|
| 
1534.4.28
by Robert Collins
 first cut at merge from integration.  | 
1259  | 
if revision_id is None:  | 
| 
1185.65.1
by Aaron Bentley
 Refactored out ControlFiles and RevisionStore from _Branch  | 
1260  | 
            # This does not make sense: if there is no revision,
 | 
1261  | 
            # then it is the current tree inventory surely ?!
 | 
|
1262  | 
            # and thus get_root_id() is something that looks at the last
 | 
|
1263  | 
            # commit on the branch, and the get_root_id is an inventory check.
 | 
|
1264  | 
raise NotImplementedError  | 
|
1265  | 
            # return Inventory(self.get_root_id())
 | 
|
1266  | 
else:  | 
|
1267  | 
return self.get_inventory(revision_id)  | 
|
1268  | 
||
| 
1185.65.27
by Robert Collins
 Tweak storage towards mergability.  | 
1269  | 
    @needs_read_lock
 | 
| 
1534.6.3
by Robert Collins
 find_repository sufficiently robust.  | 
1270  | 
def is_shared(self):  | 
1271  | 
"""Return True if this repository is flagged as a shared repository."""  | 
|
| 
1596.2.12
by Robert Collins
 Merge and make Knit Repository use the revision store for all possible queries.  | 
1272  | 
raise NotImplementedError(self.is_shared)  | 
| 
1534.6.3
by Robert Collins
 find_repository sufficiently robust.  | 
1273  | 
|
| 
1594.2.7
by Robert Collins
 Add versionedfile.fix_parents api for correcting data post hoc.  | 
1274  | 
    @needs_write_lock
 | 
| 
1692.1.1
by Robert Collins
 * Repository.reconcile now takes a thorough keyword parameter to allow  | 
1275  | 
def reconcile(self, other=None, thorough=False):  | 
| 
1594.2.7
by Robert Collins
 Add versionedfile.fix_parents api for correcting data post hoc.  | 
1276  | 
"""Reconcile this repository."""  | 
1277  | 
from bzrlib.reconcile import RepoReconciler  | 
|
| 
1692.1.1
by Robert Collins
 * Repository.reconcile now takes a thorough keyword parameter to allow  | 
1278  | 
reconciler = RepoReconciler(self, thorough=thorough)  | 
| 
1594.2.7
by Robert Collins
 Add versionedfile.fix_parents api for correcting data post hoc.  | 
1279  | 
reconciler.reconcile()  | 
1280  | 
return reconciler  | 
|
| 
2440.1.1
by Martin Pool
 Add new Repository.sprout,  | 
1281  | 
|
| 
2617.6.2
by Robert Collins
 Add abort_write_group and wire write_groups into fetch and commit.  | 
1282  | 
def _refresh_data(self):  | 
1283  | 
"""Helper called from lock_* to ensure coherency with disk.  | 
|
1284  | 
||
1285  | 
        The default implementation does nothing; it is however possible
 | 
|
1286  | 
        for repositories to maintain loaded indices across multiple locks
 | 
|
1287  | 
        by checking inside their implementation of this method to see
 | 
|
1288  | 
        whether their indices are still valid. This depends of course on
 | 
|
1289  | 
        the disk format being validatable in this manner.
 | 
|
1290  | 
        """
 | 
|
1291  | 
||
| 
1534.6.3
by Robert Collins
 find_repository sufficiently robust.  | 
1292  | 
    @needs_read_lock
 | 
| 
1185.65.1
by Aaron Bentley
 Refactored out ControlFiles and RevisionStore from _Branch  | 
1293  | 
def revision_tree(self, revision_id):  | 
1294  | 
"""Return Tree for a revision on this branch.  | 
|
1295  | 
||
| 
1852.5.1
by Robert Collins
 Deprecate EmptyTree in favour of using Repository.revision_tree.  | 
1296  | 
        `revision_id` may be None for the empty tree revision.
 | 
1297  | 
        """
 | 
|
| 
1185.65.1
by Aaron Bentley
 Refactored out ControlFiles and RevisionStore from _Branch  | 
1298  | 
        # TODO: refactor this to use an existing revision object
 | 
1299  | 
        # so we don't need to read it in twice.
 | 
|
| 
1996.3.4
by John Arbash Meinel
 lazy_import bzrlib/repository.py  | 
1300  | 
if revision_id is None or revision_id == _mod_revision.NULL_REVISION:  | 
| 
1731.1.61
by Aaron Bentley
 Merge bzr.dev  | 
1301  | 
return RevisionTree(self, Inventory(root_id=None),  | 
1302  | 
_mod_revision.NULL_REVISION)  | 
|
| 
1185.65.1
by Aaron Bentley
 Refactored out ControlFiles and RevisionStore from _Branch  | 
1303  | 
else:  | 
| 
2249.5.13
by John Arbash Meinel
 Finish auditing Repository, and fix generate_ids to always generate utf8 ids.  | 
1304  | 
revision_id = osutils.safe_revision_id(revision_id)  | 
| 
1185.65.1
by Aaron Bentley
 Refactored out ControlFiles and RevisionStore from _Branch  | 
1305  | 
inv = self.get_revision_inventory(revision_id)  | 
| 
1185.65.17
by Robert Collins
 Merge from integration, mode-changes are broken.  | 
1306  | 
return RevisionTree(self, inv, revision_id)  | 
| 
1185.65.1
by Aaron Bentley
 Refactored out ControlFiles and RevisionStore from _Branch  | 
1307  | 
|
| 
1185.65.27
by Robert Collins
 Tweak storage towards mergability.  | 
1308  | 
    @needs_read_lock
 | 
| 
1756.3.3
by Aaron Bentley
 More refactoring, introduce revision_trees.  | 
1309  | 
def revision_trees(self, revision_ids):  | 
1310  | 
"""Return Tree for a revision on this branch.  | 
|
1311  | 
||
| 
1756.3.19
by Aaron Bentley
 Documentation and cleanups  | 
1312  | 
        `revision_id` may not be None or 'null:'"""
 | 
| 
1756.3.3
by Aaron Bentley
 More refactoring, introduce revision_trees.  | 
1313  | 
assert None not in revision_ids  | 
| 
1996.3.4
by John Arbash Meinel
 lazy_import bzrlib/repository.py  | 
1314  | 
assert _mod_revision.NULL_REVISION not in revision_ids  | 
| 
1756.3.5
by Aaron Bentley
 Switch to get_texts, optimize get_texts  | 
1315  | 
texts = self.get_inventory_weave().get_texts(revision_ids)  | 
| 
1756.3.3
by Aaron Bentley
 More refactoring, introduce revision_trees.  | 
1316  | 
for text, revision_id in zip(texts, revision_ids):  | 
1317  | 
inv = self.deserialise_inventory(revision_id, text)  | 
|
1318  | 
yield RevisionTree(self, inv, revision_id)  | 
|
1319  | 
||
1320  | 
    @needs_read_lock
 | 
|
| 
2530.1.1
by Aaron Bentley
 Make topological sorting optional for get_ancestry  | 
1321  | 
def get_ancestry(self, revision_id, topo_sorted=True):  | 
| 
1185.66.2
by Aaron Bentley
 Moved get_ancestry to RevisionStorage  | 
1322  | 
"""Return a list of revision-ids integrated by a revision.  | 
| 
1732.2.4
by Martin Pool
 Split check into Branch.check and Repository.check  | 
1323  | 
|
1324  | 
        The first element of the list is always None, indicating the origin 
 | 
|
1325  | 
        revision.  This might change when we have history horizons, or 
 | 
|
1326  | 
        perhaps we should have a new API.
 | 
|
| 
1185.66.2
by Aaron Bentley
 Moved get_ancestry to RevisionStorage  | 
1327  | 
        
 | 
1328  | 
        This is topologically sorted.
 | 
|
1329  | 
        """
 | 
|
| 
2598.5.1
by Aaron Bentley
 Start eliminating the use of None to indicate null revision  | 
1330  | 
if _mod_revision.is_null(revision_id):  | 
| 
1185.66.2
by Aaron Bentley
 Moved get_ancestry to RevisionStorage  | 
1331  | 
return [None]  | 
| 
2249.5.13
by John Arbash Meinel
 Finish auditing Repository, and fix generate_ids to always generate utf8 ids.  | 
1332  | 
revision_id = osutils.safe_revision_id(revision_id)  | 
| 
1534.4.41
by Robert Collins
 Branch now uses BzrDir reasonably sanely.  | 
1333  | 
if not self.has_revision(revision_id):  | 
1334  | 
raise errors.NoSuchRevision(self, revision_id)  | 
|
| 
1185.66.2
by Aaron Bentley
 Moved get_ancestry to RevisionStorage  | 
1335  | 
w = self.get_inventory_weave()  | 
| 
2490.2.33
by Aaron Bentley
 Disable topological sorting of get_ancestry where sensible  | 
1336  | 
candidates = w.get_ancestry(revision_id, topo_sorted)  | 
| 
1594.2.9
by Robert Collins
 Teach Knit repositories how to handle ghosts without corrupting at all.  | 
1337  | 
return [None] + candidates # self._eliminate_revisions_not_present(candidates)  | 
| 
1185.66.2
by Aaron Bentley
 Moved get_ancestry to RevisionStorage  | 
1338  | 
|
| 
2604.2.1
by Robert Collins
 (robertc) Introduce a pack command.  | 
1339  | 
def pack(self):  | 
1340  | 
"""Compress the data within the repository.  | 
|
1341  | 
||
1342  | 
        This operation only makes sense for some repository types. For other
 | 
|
1343  | 
        types it should be a no-op that just returns.
 | 
|
1344  | 
||
1345  | 
        This stub method does not require a lock, but subclasses should use
 | 
|
1346  | 
        @needs_write_lock as this is a long running call its reasonable to 
 | 
|
1347  | 
        implicitly lock for the user.
 | 
|
1348  | 
        """
 | 
|
1349  | 
||
| 
1185.65.4
by Aaron Bentley
 Fixed cat command  | 
1350  | 
    @needs_read_lock
 | 
1351  | 
def print_file(self, file, revision_id):  | 
|
| 
1185.65.29
by Robert Collins
 Implement final review suggestions.  | 
1352  | 
"""Print `file` to stdout.  | 
1353  | 
        
 | 
|
1354  | 
        FIXME RBC 20060125 as John Meinel points out this is a bad api
 | 
|
1355  | 
        - it writes to stdout, it assumes that that is valid etc. Fix
 | 
|
1356  | 
        by creating a new more flexible convenience function.
 | 
|
1357  | 
        """
 | 
|
| 
2249.5.13
by John Arbash Meinel
 Finish auditing Repository, and fix generate_ids to always generate utf8 ids.  | 
1358  | 
revision_id = osutils.safe_revision_id(revision_id)  | 
| 
1185.65.4
by Aaron Bentley
 Fixed cat command  | 
1359  | 
tree = self.revision_tree(revision_id)  | 
1360  | 
        # use inventory as it was in that revision
 | 
|
1361  | 
file_id = tree.inventory.path2id(file)  | 
|
1362  | 
if not file_id:  | 
|
| 
1685.1.26
by John Arbash Meinel
 Repository had a bug with what exception was raised when a file was missing  | 
1363  | 
            # TODO: jam 20060427 Write a test for this code path
 | 
1364  | 
            #       it had a bug in it, and was raising the wrong
 | 
|
1365  | 
            #       exception.
 | 
|
1366  | 
raise errors.BzrError("%r is not present in revision %s" % (file, revision_id))  | 
|
| 
1185.65.4
by Aaron Bentley
 Fixed cat command  | 
1367  | 
tree.print_file(file_id)  | 
1368  | 
||
| 
1185.65.1
by Aaron Bentley
 Refactored out ControlFiles and RevisionStore from _Branch  | 
1369  | 
def get_transaction(self):  | 
1370  | 
return self.control_files.get_transaction()  | 
|
1371  | 
||
| 
2249.5.13
by John Arbash Meinel
 Finish auditing Repository, and fix generate_ids to always generate utf8 ids.  | 
1372  | 
def revision_parents(self, revision_id):  | 
1373  | 
revision_id = osutils.safe_revision_id(revision_id)  | 
|
1374  | 
return self.get_inventory_weave().parent_names(revision_id)  | 
|
| 
1590.1.1
by Robert Collins
 Improve common_ancestor performance.  | 
1375  | 
|
| 
2490.2.13
by Aaron Bentley
 Update distinct -> lowest, refactor, add ParentsProvider concept  | 
1376  | 
def get_parents(self, revision_ids):  | 
| 
2490.2.22
by Aaron Bentley
 Rename GraphWalker -> Graph, _AncestryWalker -> _BreadthFirstSearcher  | 
1377  | 
"""See StackedParentsProvider.get_parents"""  | 
| 
2490.2.13
by Aaron Bentley
 Update distinct -> lowest, refactor, add ParentsProvider concept  | 
1378  | 
parents_list = []  | 
1379  | 
for revision_id in revision_ids:  | 
|
1380  | 
if revision_id == _mod_revision.NULL_REVISION:  | 
|
1381  | 
parents = []  | 
|
1382  | 
else:  | 
|
1383  | 
try:  | 
|
1384  | 
parents = self.get_revision(revision_id).parent_ids  | 
|
1385  | 
except errors.NoSuchRevision:  | 
|
1386  | 
parents = None  | 
|
1387  | 
else:  | 
|
1388  | 
if len(parents) == 0:  | 
|
1389  | 
parents = [_mod_revision.NULL_REVISION]  | 
|
1390  | 
parents_list.append(parents)  | 
|
1391  | 
return parents_list  | 
|
1392  | 
||
1393  | 
def _make_parents_provider(self):  | 
|
1394  | 
return self  | 
|
1395  | 
||
| 
2490.2.21
by Aaron Bentley
 Rename graph to deprecated_graph  | 
1396  | 
def get_graph(self, other_repository=None):  | 
| 
2490.2.13
by Aaron Bentley
 Update distinct -> lowest, refactor, add ParentsProvider concept  | 
1397  | 
"""Return the graph walker for this repository format"""  | 
1398  | 
parents_provider = self._make_parents_provider()  | 
|
| 
2490.2.14
by Aaron Bentley
 Avoid StackedParentsProvider when underlying repos match  | 
1399  | 
if (other_repository is not None and  | 
1400  | 
other_repository.bzrdir.transport.base !=  | 
|
1401  | 
self.bzrdir.transport.base):  | 
|
| 
2490.2.21
by Aaron Bentley
 Rename graph to deprecated_graph  | 
1402  | 
parents_provider = graph._StackedParentsProvider(  | 
| 
2490.2.13
by Aaron Bentley
 Update distinct -> lowest, refactor, add ParentsProvider concept  | 
1403  | 
[parents_provider, other_repository._make_parents_provider()])  | 
| 
2490.2.22
by Aaron Bentley
 Rename GraphWalker -> Graph, _AncestryWalker -> _BreadthFirstSearcher  | 
1404  | 
return graph.Graph(parents_provider)  | 
| 
2490.2.13
by Aaron Bentley
 Update distinct -> lowest, refactor, add ParentsProvider concept  | 
1405  | 
|
| 
1185.65.27
by Robert Collins
 Tweak storage towards mergability.  | 
1406  | 
    @needs_write_lock
 | 
| 
1534.6.5
by Robert Collins
 Cloning of repos preserves shared and make-working-tree attributes.  | 
1407  | 
def set_make_working_trees(self, new_value):  | 
1408  | 
"""Set the policy flag for making working trees when creating branches.  | 
|
1409  | 
||
1410  | 
        This only applies to branches that use this repository.
 | 
|
1411  | 
||
1412  | 
        The default is 'True'.
 | 
|
1413  | 
        :param new_value: True to restore the default, False to disable making
 | 
|
1414  | 
                          working trees.
 | 
|
1415  | 
        """
 | 
|
| 
1596.2.12
by Robert Collins
 Merge and make Knit Repository use the revision store for all possible queries.  | 
1416  | 
raise NotImplementedError(self.set_make_working_trees)  | 
| 
1534.6.5
by Robert Collins
 Cloning of repos preserves shared and make-working-tree attributes.  | 
1417  | 
|
1418  | 
def make_working_trees(self):  | 
|
1419  | 
"""Returns the policy for making working trees on new branches."""  | 
|
| 
1596.2.12
by Robert Collins
 Merge and make Knit Repository use the revision store for all possible queries.  | 
1420  | 
raise NotImplementedError(self.make_working_trees)  | 
| 
1534.6.5
by Robert Collins
 Cloning of repos preserves shared and make-working-tree attributes.  | 
1421  | 
|
1422  | 
    @needs_write_lock
 | 
|
| 
1185.65.1
by Aaron Bentley
 Refactored out ControlFiles and RevisionStore from _Branch  | 
1423  | 
def sign_revision(self, revision_id, gpg_strategy):  | 
| 
2249.5.13
by John Arbash Meinel
 Finish auditing Repository, and fix generate_ids to always generate utf8 ids.  | 
1424  | 
revision_id = osutils.safe_revision_id(revision_id)  | 
| 
1185.65.1
by Aaron Bentley
 Refactored out ControlFiles and RevisionStore from _Branch  | 
1425  | 
plaintext = Testament.from_revision(self, revision_id).as_short_text()  | 
1426  | 
self.store_revision_signature(gpg_strategy, plaintext, revision_id)  | 
|
| 
1534.4.40
by Robert Collins
 Add RepositoryFormats and allow bzrdir.open or create _repository to be used.  | 
1427  | 
|
| 
1563.2.29
by Robert Collins
 Remove all but fetch references to repository.revision_store.  | 
1428  | 
    @needs_read_lock
 | 
1429  | 
def has_signature_for_revision_id(self, revision_id):  | 
|
1430  | 
"""Query for a revision signature for revision_id in the repository."""  | 
|
| 
2249.5.13
by John Arbash Meinel
 Finish auditing Repository, and fix generate_ids to always generate utf8 ids.  | 
1431  | 
revision_id = osutils.safe_revision_id(revision_id)  | 
| 
1563.2.29
by Robert Collins
 Remove all but fetch references to repository.revision_store.  | 
1432  | 
return self._revision_store.has_signature(revision_id,  | 
1433  | 
self.get_transaction())  | 
|
1434  | 
||
| 
1563.2.31
by Robert Collins
 Convert Knit repositories to use knits.  | 
1435  | 
    @needs_read_lock
 | 
1436  | 
def get_signature_text(self, revision_id):  | 
|
1437  | 
"""Return the text for a signature."""  | 
|
| 
2249.5.13
by John Arbash Meinel
 Finish auditing Repository, and fix generate_ids to always generate utf8 ids.  | 
1438  | 
revision_id = osutils.safe_revision_id(revision_id)  | 
| 
1563.2.31
by Robert Collins
 Convert Knit repositories to use knits.  | 
1439  | 
return self._revision_store.get_signature_text(revision_id,  | 
1440  | 
self.get_transaction())  | 
|
1441  | 
||
| 
1732.2.4
by Martin Pool
 Split check into Branch.check and Repository.check  | 
1442  | 
    @needs_read_lock
 | 
1443  | 
def check(self, revision_ids):  | 
|
1444  | 
"""Check consistency of all history of given revision_ids.  | 
|
1445  | 
||
1446  | 
        Different repository implementations should override _check().
 | 
|
1447  | 
||
1448  | 
        :param revision_ids: A non-empty list of revision_ids whose ancestry
 | 
|
1449  | 
             will be checked.  Typically the last revision_id of a branch.
 | 
|
1450  | 
        """
 | 
|
1451  | 
if not revision_ids:  | 
|
1452  | 
raise ValueError("revision_ids must be non-empty in %s.check"  | 
|
1453  | 
% (self,))  | 
|
| 
2249.5.13
by John Arbash Meinel
 Finish auditing Repository, and fix generate_ids to always generate utf8 ids.  | 
1454  | 
revision_ids = [osutils.safe_revision_id(r) for r in revision_ids]  | 
| 
1732.2.4
by Martin Pool
 Split check into Branch.check and Repository.check  | 
1455  | 
return self._check(revision_ids)  | 
1456  | 
||
1457  | 
def _check(self, revision_ids):  | 
|
| 
1773.4.1
by Martin Pool
 Add pyflakes makefile target; fix many warnings  | 
1458  | 
result = check.Check(self)  | 
| 
1732.2.4
by Martin Pool
 Split check into Branch.check and Repository.check  | 
1459  | 
result.check()  | 
1460  | 
return result  | 
|
1461  | 
||
| 
1904.2.3
by Martin Pool
 Give a warning on access to old repository formats  | 
1462  | 
def _warn_if_deprecated(self):  | 
| 
1904.2.5
by Martin Pool
 Fix format warning inside test suite and add test  | 
1463  | 
global _deprecation_warning_done  | 
1464  | 
if _deprecation_warning_done:  | 
|
1465  | 
            return
 | 
|
1466  | 
_deprecation_warning_done = True  | 
|
| 
1904.2.3
by Martin Pool
 Give a warning on access to old repository formats  | 
1467  | 
warning("Format %s for %s is deprecated - please use 'bzr upgrade' to get better performance"  | 
1468  | 
% (self._format, self.bzrdir.transport.base))  | 
|
1469  | 
||
| 
1910.2.63
by Aaron Bentley
 Add supports_rich_root member to repository  | 
1470  | 
def supports_rich_root(self):  | 
1471  | 
return self._format.rich_root_data  | 
|
1472  | 
||
| 
2150.2.2
by Robert Collins
 Change the commit builder selected-revision-id test to use a unicode revision id where possible, leading to stricter testing of the hypothetical unicode revision id support in bzr.  | 
1473  | 
def _check_ascii_revisionid(self, revision_id, method):  | 
1474  | 
"""Private helper for ascii-only repositories."""  | 
|
1475  | 
        # weave repositories refuse to store revisionids that are non-ascii.
 | 
|
1476  | 
if revision_id is not None:  | 
|
1477  | 
            # weaves require ascii revision ids.
 | 
|
1478  | 
if isinstance(revision_id, unicode):  | 
|
1479  | 
try:  | 
|
1480  | 
revision_id.encode('ascii')  | 
|
1481  | 
except UnicodeEncodeError:  | 
|
1482  | 
raise errors.NonAsciiRevisionId(method, self)  | 
|
| 
2249.5.12
by John Arbash Meinel
 Change the APIs for VersionedFile, Store, and some of Repository into utf-8  | 
1483  | 
else:  | 
1484  | 
try:  | 
|
1485  | 
revision_id.decode('ascii')  | 
|
1486  | 
except UnicodeDecodeError:  | 
|
1487  | 
raise errors.NonAsciiRevisionId(method, self)  | 
|
| 
2150.2.2
by Robert Collins
 Change the commit builder selected-revision-id test to use a unicode revision id where possible, leading to stricter testing of the hypothetical unicode revision id support in bzr.  | 
1488  | 
|
| 
1534.4.40
by Robert Collins
 Add RepositoryFormats and allow bzrdir.open or create _repository to be used.  | 
1489  | 
|
| 
2241.1.14
by Martin Pool
 Add deprecated forwarders for old formats from repository.py  | 
1490  | 
|
| 
2241.1.18
by mbp at sourcefrog
 Restore use of deprecating delegator for old formats in bzrlib.repository.  | 
1491  | 
# remove these delegates a while after bzr 0.15
 | 
1492  | 
def __make_delegated(name, from_module):  | 
|
1493  | 
def _deprecated_repository_forwarder():  | 
|
1494  | 
symbol_versioning.warn('%s moved to %s in bzr 0.15'  | 
|
1495  | 
% (name, from_module),  | 
|
| 
2241.1.20
by mbp at sourcefrog
 update tests for new locations of weave repos  | 
1496  | 
DeprecationWarning,  | 
1497  | 
stacklevel=2)  | 
|
| 
2241.1.18
by mbp at sourcefrog
 Restore use of deprecating delegator for old formats in bzrlib.repository.  | 
1498  | 
m = __import__(from_module, globals(), locals(), [name])  | 
1499  | 
try:  | 
|
1500  | 
return getattr(m, name)  | 
|
1501  | 
except AttributeError:  | 
|
1502  | 
raise AttributeError('module %s has no name %s'  | 
|
1503  | 
% (m, name))  | 
|
1504  | 
globals()[name] = _deprecated_repository_forwarder  | 
|
1505  | 
||
1506  | 
for _name in [  | 
|
1507  | 
'AllInOneRepository',  | 
|
1508  | 
'WeaveMetaDirRepository',  | 
|
1509  | 
'PreSplitOutRepositoryFormat',  | 
|
1510  | 
'RepositoryFormat4',  | 
|
1511  | 
'RepositoryFormat5',  | 
|
1512  | 
'RepositoryFormat6',  | 
|
1513  | 
'RepositoryFormat7',  | 
|
1514  | 
        ]:
 | 
|
1515  | 
__make_delegated(_name, 'bzrlib.repofmt.weaverepo')  | 
|
1516  | 
||
1517  | 
for _name in [  | 
|
1518  | 
'KnitRepository',  | 
|
1519  | 
'RepositoryFormatKnit',  | 
|
1520  | 
'RepositoryFormatKnit1',  | 
|
1521  | 
        ]:
 | 
|
1522  | 
__make_delegated(_name, 'bzrlib.repofmt.knitrepo')  | 
|
1523  | 
||
1524  | 
||
| 
1185.82.84
by Aaron Bentley
 Moved stuff around  | 
1525  | 
def install_revision(repository, rev, revision_tree):  | 
1526  | 
"""Install all revision data into a repository."""  | 
|
1527  | 
present_parents = []  | 
|
1528  | 
parent_trees = {}  | 
|
1529  | 
for p_id in rev.parent_ids:  | 
|
1530  | 
if repository.has_revision(p_id):  | 
|
1531  | 
present_parents.append(p_id)  | 
|
1532  | 
parent_trees[p_id] = repository.revision_tree(p_id)  | 
|
1533  | 
else:  | 
|
| 
1852.5.1
by Robert Collins
 Deprecate EmptyTree in favour of using Repository.revision_tree.  | 
1534  | 
parent_trees[p_id] = repository.revision_tree(None)  | 
| 
1185.82.84
by Aaron Bentley
 Moved stuff around  | 
1535  | 
|
1536  | 
inv = revision_tree.inventory  | 
|
| 
1910.2.51
by Aaron Bentley
 Bundles now corrupt repositories  | 
1537  | 
entries = inv.iter_entries()  | 
| 
2617.6.6
by Robert Collins
 Some review feedback.  | 
1538  | 
    # backwards compatibility hack: skip the root id.
 | 
| 
1910.2.63
by Aaron Bentley
 Add supports_rich_root member to repository  | 
1539  | 
if not repository.supports_rich_root():  | 
| 
1910.2.60
by Aaron Bentley
 Ensure that new-model revisions aren't installed into old-model repos  | 
1540  | 
path, root = entries.next()  | 
1541  | 
if root.revision != rev.revision_id:  | 
|
| 
1910.2.63
by Aaron Bentley
 Add supports_rich_root member to repository  | 
1542  | 
raise errors.IncompatibleRevision(repr(repository))  | 
| 
1185.82.84
by Aaron Bentley
 Moved stuff around  | 
1543  | 
    # Add the texts that are not already present
 | 
| 
1852.6.3
by Robert Collins
 Make iter(Tree) consistent for all tree types.  | 
1544  | 
for path, ie in entries:  | 
| 
1185.82.84
by Aaron Bentley
 Moved stuff around  | 
1545  | 
w = repository.weave_store.get_weave_or_empty(ie.file_id,  | 
1546  | 
repository.get_transaction())  | 
|
1547  | 
if ie.revision not in w:  | 
|
1548  | 
text_parents = []  | 
|
| 
1740.2.2
by Aaron Bentley
 Add test for the basis inventory automatically adding the revision id.  | 
1549  | 
            # FIXME: TODO: The following loop *may* be overlapping/duplicate
 | 
| 
1759.2.1
by Jelmer Vernooij
 Fix some types (found using aspell).  | 
1550  | 
            # with InventoryEntry.find_previous_heads(). if it is, then there
 | 
| 
1740.2.2
by Aaron Bentley
 Add test for the basis inventory automatically adding the revision id.  | 
1551  | 
            # is a latent bug here where the parents may have ancestors of each
 | 
1552  | 
            # other. RBC, AB
 | 
|
| 
1185.82.84
by Aaron Bentley
 Moved stuff around  | 
1553  | 
for revision, tree in parent_trees.iteritems():  | 
1554  | 
if ie.file_id not in tree:  | 
|
1555  | 
                    continue
 | 
|
1556  | 
parent_id = tree.inventory[ie.file_id].revision  | 
|
1557  | 
if parent_id in text_parents:  | 
|
1558  | 
                    continue
 | 
|
1559  | 
text_parents.append(parent_id)  | 
|
1560  | 
||
1561  | 
vfile = repository.weave_store.get_weave_or_empty(ie.file_id,  | 
|
1562  | 
repository.get_transaction())  | 
|
1563  | 
lines = revision_tree.get_file(ie.file_id).readlines()  | 
|
1564  | 
vfile.add_lines(rev.revision_id, text_parents, lines)  | 
|
1565  | 
try:  | 
|
1566  | 
        # install the inventory
 | 
|
1567  | 
repository.add_inventory(rev.revision_id, inv, present_parents)  | 
|
1568  | 
except errors.RevisionAlreadyPresent:  | 
|
1569  | 
        pass
 | 
|
1570  | 
repository.add_revision(rev.revision_id, rev, inv)  | 
|
1571  | 
||
1572  | 
||
| 
1556.1.3
by Robert Collins
 Rearrangment of Repository logic to be less type code driven, and bugfix InterRepository.missing_revision_ids  | 
1573  | 
class MetaDirRepository(Repository):  | 
1574  | 
"""Repositories in the new meta-dir layout."""  | 
|
1575  | 
||
| 
1563.2.29
by Robert Collins
 Remove all but fetch references to repository.revision_store.  | 
1576  | 
def __init__(self, _format, a_bzrdir, control_files, _revision_store, control_store, text_store):  | 
| 
1556.1.3
by Robert Collins
 Rearrangment of Repository logic to be less type code driven, and bugfix InterRepository.missing_revision_ids  | 
1577  | 
super(MetaDirRepository, self).__init__(_format,  | 
1578  | 
a_bzrdir,  | 
|
1579  | 
control_files,  | 
|
| 
1563.2.29
by Robert Collins
 Remove all but fetch references to repository.revision_store.  | 
1580  | 
_revision_store,  | 
| 
1563.2.23
by Robert Collins
 Add add_revision and get_revision methods to RevisionStore  | 
1581  | 
control_store,  | 
| 
1563.2.17
by Robert Collins
 Change knits repositories to use a knit versioned file store for file texts.  | 
1582  | 
text_store)  | 
| 
1556.1.3
by Robert Collins
 Rearrangment of Repository logic to be less type code driven, and bugfix InterRepository.missing_revision_ids  | 
1583  | 
dir_mode = self.control_files._dir_mode  | 
1584  | 
file_mode = self.control_files._file_mode  | 
|
1585  | 
||
| 
1596.2.12
by Robert Collins
 Merge and make Knit Repository use the revision store for all possible queries.  | 
1586  | 
    @needs_read_lock
 | 
1587  | 
def is_shared(self):  | 
|
1588  | 
"""Return True if this repository is flagged as a shared repository."""  | 
|
1589  | 
return self.control_files._transport.has('shared-storage')  | 
|
1590  | 
||
1591  | 
    @needs_write_lock
 | 
|
1592  | 
def set_make_working_trees(self, new_value):  | 
|
1593  | 
"""Set the policy flag for making working trees when creating branches.  | 
|
1594  | 
||
1595  | 
        This only applies to branches that use this repository.
 | 
|
1596  | 
||
1597  | 
        The default is 'True'.
 | 
|
1598  | 
        :param new_value: True to restore the default, False to disable making
 | 
|
1599  | 
                          working trees.
 | 
|
1600  | 
        """
 | 
|
1601  | 
if new_value:  | 
|
1602  | 
try:  | 
|
1603  | 
self.control_files._transport.delete('no-working-trees')  | 
|
1604  | 
except errors.NoSuchFile:  | 
|
1605  | 
                pass
 | 
|
1606  | 
else:  | 
|
1607  | 
self.control_files.put_utf8('no-working-trees', '')  | 
|
1608  | 
||
1609  | 
def make_working_trees(self):  | 
|
1610  | 
"""Returns the policy for making working trees on new branches."""  | 
|
1611  | 
return not self.control_files._transport.has('no-working-trees')  | 
|
1612  | 
||
| 
1556.1.3
by Robert Collins
 Rearrangment of Repository logic to be less type code driven, and bugfix InterRepository.missing_revision_ids  | 
1613  | 
|
| 
2241.1.2
by Martin Pool
 change to using external Repository format registry  | 
1614  | 
class RepositoryFormatRegistry(registry.Registry):  | 
1615  | 
"""Registry of RepositoryFormats.  | 
|
1616  | 
    """
 | 
|
| 
2241.1.11
by Martin Pool
 Get rid of RepositoryFormat*_instance objects. Instead the format  | 
1617  | 
|
1618  | 
def get(self, format_string):  | 
|
1619  | 
r = registry.Registry.get(self, format_string)  | 
|
1620  | 
if callable(r):  | 
|
1621  | 
r = r()  | 
|
1622  | 
return r  | 
|
| 
2241.1.2
by Martin Pool
 change to using external Repository format registry  | 
1623  | 
|
1624  | 
||
1625  | 
format_registry = RepositoryFormatRegistry()  | 
|
| 
2241.1.11
by Martin Pool
 Get rid of RepositoryFormat*_instance objects. Instead the format  | 
1626  | 
"""Registry of formats, indexed by their identifying format string.
 | 
1627  | 
||
1628  | 
This can contain either format instances themselves, or classes/factories that
 | 
|
1629  | 
can be called to obtain one.
 | 
|
1630  | 
"""
 | 
|
| 
2241.1.2
by Martin Pool
 change to using external Repository format registry  | 
1631  | 
|
| 
2220.2.3
by Martin Pool
 Add tag: revision namespace.  | 
1632  | 
|
1633  | 
#####################################################################
 | 
|
1634  | 
# Repository Formats
 | 
|
| 
1910.2.46
by Aaron Bentley
 Whitespace fix  | 
1635  | 
|
| 
1534.4.40
by Robert Collins
 Add RepositoryFormats and allow bzrdir.open or create _repository to be used.  | 
1636  | 
class RepositoryFormat(object):  | 
1637  | 
"""A repository format.  | 
|
1638  | 
||
1639  | 
    Formats provide three things:
 | 
|
1640  | 
     * An initialization routine to construct repository data on disk.
 | 
|
1641  | 
     * a format string which is used when the BzrDir supports versioned
 | 
|
1642  | 
       children.
 | 
|
1643  | 
     * an open routine which returns a Repository instance.
 | 
|
1644  | 
||
1645  | 
    Formats are placed in an dict by their format string for reference 
 | 
|
1646  | 
    during opening. These should be subclasses of RepositoryFormat
 | 
|
1647  | 
    for consistency.
 | 
|
1648  | 
||
1649  | 
    Once a format is deprecated, just deprecate the initialize and open
 | 
|
1650  | 
    methods on the format class. Do not deprecate the object, as the 
 | 
|
1651  | 
    object will be created every system load.
 | 
|
1652  | 
||
1653  | 
    Common instance attributes:
 | 
|
1654  | 
    _matchingbzrdir - the bzrdir format that the repository format was
 | 
|
1655  | 
    originally written to work with. This can be used if manually
 | 
|
1656  | 
    constructing a bzrdir and repository, or more commonly for test suite
 | 
|
1657  | 
    parameterisation.
 | 
|
1658  | 
    """
 | 
|
1659  | 
||
| 
1904.2.3
by Martin Pool
 Give a warning on access to old repository formats  | 
1660  | 
def __str__(self):  | 
1661  | 
return "<%s>" % self.__class__.__name__  | 
|
1662  | 
||
| 
2241.1.11
by Martin Pool
 Get rid of RepositoryFormat*_instance objects. Instead the format  | 
1663  | 
def __eq__(self, other):  | 
1664  | 
        # format objects are generally stateless
 | 
|
1665  | 
return isinstance(other, self.__class__)  | 
|
1666  | 
||
| 
2100.3.35
by Aaron Bentley
 equality operations on bzrdir  | 
1667  | 
def __ne__(self, other):  | 
| 
2100.3.31
by Aaron Bentley
 Merged bzr.dev (17 tests failing)  | 
1668  | 
return not self == other  | 
1669  | 
||
| 
1534.4.40
by Robert Collins
 Add RepositoryFormats and allow bzrdir.open or create _repository to be used.  | 
1670  | 
    @classmethod
 | 
| 
1534.4.47
by Robert Collins
 Split out repository into .bzr/repository  | 
1671  | 
def find_format(klass, a_bzrdir):  | 
| 
2241.1.1
by Martin Pool
 Change RepositoryFormat to use a Registry rather than ad-hoc dictionary  | 
1672  | 
"""Return the format for the repository object in a_bzrdir.  | 
1673  | 
        
 | 
|
1674  | 
        This is used by bzr native formats that have a "format" file in
 | 
|
1675  | 
        the repository.  Other methods may be used by different types of 
 | 
|
1676  | 
        control directory.
 | 
|
1677  | 
        """
 | 
|
| 
1534.4.47
by Robert Collins
 Split out repository into .bzr/repository  | 
1678  | 
try:  | 
1679  | 
transport = a_bzrdir.get_repository_transport(None)  | 
|
1680  | 
format_string = transport.get("format").read()  | 
|
| 
2241.1.2
by Martin Pool
 change to using external Repository format registry  | 
1681  | 
return format_registry.get(format_string)  | 
| 
1534.4.47
by Robert Collins
 Split out repository into .bzr/repository  | 
1682  | 
except errors.NoSuchFile:  | 
1683  | 
raise errors.NoRepositoryPresent(a_bzrdir)  | 
|
1684  | 
except KeyError:  | 
|
| 
1740.5.6
by Martin Pool
 Clean up many exception classes.  | 
1685  | 
raise errors.UnknownFormatError(format=format_string)  | 
| 
1534.4.47
by Robert Collins
 Split out repository into .bzr/repository  | 
1686  | 
|
| 
2241.1.1
by Martin Pool
 Change RepositoryFormat to use a Registry rather than ad-hoc dictionary  | 
1687  | 
    @classmethod
 | 
| 
2241.1.2
by Martin Pool
 change to using external Repository format registry  | 
1688  | 
def register_format(klass, format):  | 
1689  | 
format_registry.register(format.get_format_string(), format)  | 
|
| 
2241.1.1
by Martin Pool
 Change RepositoryFormat to use a Registry rather than ad-hoc dictionary  | 
1690  | 
|
1691  | 
    @classmethod
 | 
|
1692  | 
def unregister_format(klass, format):  | 
|
| 
2241.1.2
by Martin Pool
 change to using external Repository format registry  | 
1693  | 
format_registry.remove(format.get_format_string())  | 
| 
1563.2.23
by Robert Collins
 Add add_revision and get_revision methods to RevisionStore  | 
1694  | 
|
| 
1534.4.47
by Robert Collins
 Split out repository into .bzr/repository  | 
1695  | 
    @classmethod
 | 
| 
1534.4.40
by Robert Collins
 Add RepositoryFormats and allow bzrdir.open or create _repository to be used.  | 
1696  | 
def get_default_format(klass):  | 
1697  | 
"""Return the current default format."""  | 
|
| 
2204.5.3
by Aaron Bentley
 zap old repository default handling  | 
1698  | 
from bzrlib import bzrdir  | 
1699  | 
return bzrdir.format_registry.make_bzrdir('default').repository_format  | 
|
| 
2241.1.1
by Martin Pool
 Change RepositoryFormat to use a Registry rather than ad-hoc dictionary  | 
1700  | 
|
1701  | 
def _get_control_store(self, repo_transport, control_files):  | 
|
1702  | 
"""Return the control store for this repository."""  | 
|
1703  | 
raise NotImplementedError(self._get_control_store)  | 
|
| 
1534.4.40
by Robert Collins
 Add RepositoryFormats and allow bzrdir.open or create _repository to be used.  | 
1704  | 
|
1705  | 
def get_format_string(self):  | 
|
1706  | 
"""Return the ASCII format string that identifies this format.  | 
|
1707  | 
        
 | 
|
1708  | 
        Note that in pre format ?? repositories the format string is 
 | 
|
1709  | 
        not permitted nor written to disk.
 | 
|
1710  | 
        """
 | 
|
1711  | 
raise NotImplementedError(self.get_format_string)  | 
|
1712  | 
||
| 
1624.3.19
by Olaf Conradi
 New call get_format_description to give a user-friendly description of a  | 
1713  | 
def get_format_description(self):  | 
| 
1759.2.1
by Jelmer Vernooij
 Fix some types (found using aspell).  | 
1714  | 
"""Return the short description for this format."""  | 
| 
1624.3.19
by Olaf Conradi
 New call get_format_description to give a user-friendly description of a  | 
1715  | 
raise NotImplementedError(self.get_format_description)  | 
1716  | 
||
| 
1556.1.3
by Robert Collins
 Rearrangment of Repository logic to be less type code driven, and bugfix InterRepository.missing_revision_ids  | 
1717  | 
def _get_revision_store(self, repo_transport, control_files):  | 
1718  | 
"""Return the revision store object for this a_bzrdir."""  | 
|
| 
1556.1.5
by Robert Collins
 Review feedback.  | 
1719  | 
raise NotImplementedError(self._get_revision_store)  | 
| 
1556.1.3
by Robert Collins
 Rearrangment of Repository logic to be less type code driven, and bugfix InterRepository.missing_revision_ids  | 
1720  | 
|
| 
1563.2.22
by Robert Collins
 Move responsibility for repository.has_revision into RevisionStore  | 
1721  | 
def _get_text_rev_store(self,  | 
1722  | 
transport,  | 
|
1723  | 
control_files,  | 
|
1724  | 
name,  | 
|
1725  | 
compressed=True,  | 
|
| 
1563.2.28
by Robert Collins
 Add total_size to the revision_store api.  | 
1726  | 
prefixed=False,  | 
1727  | 
serializer=None):  | 
|
| 
1556.1.3
by Robert Collins
 Rearrangment of Repository logic to be less type code driven, and bugfix InterRepository.missing_revision_ids  | 
1728  | 
"""Common logic for getting a revision store for a repository.  | 
1729  | 
        
 | 
|
| 
1563.2.17
by Robert Collins
 Change knits repositories to use a knit versioned file store for file texts.  | 
1730  | 
        see self._get_revision_store for the subclass-overridable method to 
 | 
| 
1556.1.3
by Robert Collins
 Rearrangment of Repository logic to be less type code driven, and bugfix InterRepository.missing_revision_ids  | 
1731  | 
        get the store for a repository.
 | 
1732  | 
        """
 | 
|
| 
1563.2.22
by Robert Collins
 Move responsibility for repository.has_revision into RevisionStore  | 
1733  | 
from bzrlib.store.revision.text import TextRevisionStore  | 
| 
1556.1.3
by Robert Collins
 Rearrangment of Repository logic to be less type code driven, and bugfix InterRepository.missing_revision_ids  | 
1734  | 
dir_mode = control_files._dir_mode  | 
1735  | 
file_mode = control_files._file_mode  | 
|
| 
2220.2.2
by Martin Pool
 Add tag command and basic implementation  | 
1736  | 
text_store = TextStore(transport.clone(name),  | 
| 
1563.2.22
by Robert Collins
 Move responsibility for repository.has_revision into RevisionStore  | 
1737  | 
prefixed=prefixed,  | 
1738  | 
compressed=compressed,  | 
|
1739  | 
dir_mode=dir_mode,  | 
|
1740  | 
file_mode=file_mode)  | 
|
| 
1563.2.29
by Robert Collins
 Remove all but fetch references to repository.revision_store.  | 
1741  | 
_revision_store = TextRevisionStore(text_store, serializer)  | 
1742  | 
return _revision_store  | 
|
| 
1556.1.3
by Robert Collins
 Rearrangment of Repository logic to be less type code driven, and bugfix InterRepository.missing_revision_ids  | 
1743  | 
|
| 
2241.1.6
by Martin Pool
 Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and  | 
1744  | 
    # TODO: this shouldn't be in the base class, it's specific to things that
 | 
1745  | 
    # use weaves or knits -- mbp 20070207
 | 
|
| 
1563.2.17
by Robert Collins
 Change knits repositories to use a knit versioned file store for file texts.  | 
1746  | 
def _get_versioned_file_store(self,  | 
1747  | 
name,  | 
|
1748  | 
transport,  | 
|
1749  | 
control_files,  | 
|
1750  | 
prefixed=True,  | 
|
| 
2241.1.10
by Martin Pool
 Remove more references to weaves from the repository.py file  | 
1751  | 
versionedfile_class=None,  | 
| 
1946.2.5
by John Arbash Meinel
 Make knit stores delay creation, but not control stores  | 
1752  | 
versionedfile_kwargs={},  | 
| 
1608.2.12
by Martin Pool
 Store-escaping must quote uppercase characters too, so that they're safely  | 
1753  | 
escaped=False):  | 
| 
2241.1.10
by Martin Pool
 Remove more references to weaves from the repository.py file  | 
1754  | 
if versionedfile_class is None:  | 
1755  | 
versionedfile_class = self._versionedfile_class  | 
|
| 
1563.2.17
by Robert Collins
 Change knits repositories to use a knit versioned file store for file texts.  | 
1756  | 
weave_transport = control_files._transport.clone(name)  | 
1757  | 
dir_mode = control_files._dir_mode  | 
|
1758  | 
file_mode = control_files._file_mode  | 
|
1759  | 
return VersionedFileStore(weave_transport, prefixed=prefixed,  | 
|
| 
1608.2.12
by Martin Pool
 Store-escaping must quote uppercase characters too, so that they're safely  | 
1760  | 
dir_mode=dir_mode,  | 
1761  | 
file_mode=file_mode,  | 
|
1762  | 
versionedfile_class=versionedfile_class,  | 
|
| 
1946.2.5
by John Arbash Meinel
 Make knit stores delay creation, but not control stores  | 
1763  | 
versionedfile_kwargs=versionedfile_kwargs,  | 
| 
1608.2.12
by Martin Pool
 Store-escaping must quote uppercase characters too, so that they're safely  | 
1764  | 
escaped=escaped)  | 
| 
1563.2.17
by Robert Collins
 Change knits repositories to use a knit versioned file store for file texts.  | 
1765  | 
|
| 
1534.6.1
by Robert Collins
 allow API creation of shared repositories  | 
1766  | 
def initialize(self, a_bzrdir, shared=False):  | 
1767  | 
"""Initialize a repository of this format in a_bzrdir.  | 
|
1768  | 
||
1769  | 
        :param a_bzrdir: The bzrdir to put the new repository in it.
 | 
|
1770  | 
        :param shared: The repository should be initialized as a sharable one.
 | 
|
| 
1752.2.52
by Andrew Bennetts
 Flesh out more Remote* methods needed to open and initialise remote branches/trees/repositories.  | 
1771  | 
        :returns: The new repository object.
 | 
1772  | 
        
 | 
|
| 
1534.6.1
by Robert Collins
 allow API creation of shared repositories  | 
1773  | 
        This may raise UninitializableFormat if shared repository are not
 | 
1774  | 
        compatible the a_bzrdir.
 | 
|
| 
1534.4.40
by Robert Collins
 Add RepositoryFormats and allow bzrdir.open or create _repository to be used.  | 
1775  | 
        """
 | 
| 
1752.2.52
by Andrew Bennetts
 Flesh out more Remote* methods needed to open and initialise remote branches/trees/repositories.  | 
1776  | 
raise NotImplementedError(self.initialize)  | 
| 
1534.4.40
by Robert Collins
 Add RepositoryFormats and allow bzrdir.open or create _repository to be used.  | 
1777  | 
|
1778  | 
def is_supported(self):  | 
|
1779  | 
"""Is this format supported?  | 
|
1780  | 
||
1781  | 
        Supported formats must be initializable and openable.
 | 
|
1782  | 
        Unsupported formats may not support initialization or committing or 
 | 
|
1783  | 
        some other features depending on the reason for not being supported.
 | 
|
1784  | 
        """
 | 
|
1785  | 
return True  | 
|
1786  | 
||
| 
1910.2.12
by Aaron Bentley
 Implement knit repo format 2  | 
1787  | 
def check_conversion_target(self, target_format):  | 
1788  | 
raise NotImplementedError(self.check_conversion_target)  | 
|
1789  | 
||
| 
1534.4.40
by Robert Collins
 Add RepositoryFormats and allow bzrdir.open or create _repository to be used.  | 
1790  | 
def open(self, a_bzrdir, _found=False):  | 
1791  | 
"""Return an instance of this format for the bzrdir a_bzrdir.  | 
|
1792  | 
        
 | 
|
1793  | 
        _found is a private parameter, do not use it.
 | 
|
1794  | 
        """
 | 
|
| 
1556.1.3
by Robert Collins
 Rearrangment of Repository logic to be less type code driven, and bugfix InterRepository.missing_revision_ids  | 
1795  | 
raise NotImplementedError(self.open)  | 
| 
1534.4.40
by Robert Collins
 Add RepositoryFormats and allow bzrdir.open or create _repository to be used.  | 
1796  | 
|
| 
1556.1.3
by Robert Collins
 Rearrangment of Repository logic to be less type code driven, and bugfix InterRepository.missing_revision_ids  | 
1797  | 
|
1798  | 
class MetaDirRepositoryFormat(RepositoryFormat):  | 
|
| 
1759.2.1
by Jelmer Vernooij
 Fix some types (found using aspell).  | 
1799  | 
"""Common base class for the new repositories using the metadir layout."""  | 
| 
1556.1.3
by Robert Collins
 Rearrangment of Repository logic to be less type code driven, and bugfix InterRepository.missing_revision_ids  | 
1800  | 
|
| 
1910.2.14
by Aaron Bentley
 Fail when trying to use interrepository on Knit2 and Knit1  | 
1801  | 
rich_root_data = False  | 
| 
2323.5.17
by Martin Pool
 Add supports_tree_reference to all repo formats (robert)  | 
1802  | 
supports_tree_reference = False  | 
| 
2241.1.11
by Martin Pool
 Get rid of RepositoryFormat*_instance objects. Instead the format  | 
1803  | 
_matchingbzrdir = bzrdir.BzrDirMetaFormat1()  | 
| 
1910.2.14
by Aaron Bentley
 Fail when trying to use interrepository on Knit2 and Knit1  | 
1804  | 
|
| 
1556.1.4
by Robert Collins
 Add a new format for what will become knit, and the surrounding logic to upgrade repositories within metadirs, and tests for the same.  | 
1805  | 
def __init__(self):  | 
1806  | 
super(MetaDirRepositoryFormat, self).__init__()  | 
|
1807  | 
||
| 
1556.1.3
by Robert Collins
 Rearrangment of Repository logic to be less type code driven, and bugfix InterRepository.missing_revision_ids  | 
1808  | 
def _create_control_files(self, a_bzrdir):  | 
1809  | 
"""Create the required files and the initial control_files object."""  | 
|
| 
1759.2.2
by Jelmer Vernooij
 Revert some of my spelling fixes and fix some typos after review by Aaron.  | 
1810  | 
        # FIXME: RBC 20060125 don't peek under the covers
 | 
| 
1534.4.47
by Robert Collins
 Split out repository into .bzr/repository  | 
1811  | 
        # NB: no need to escape relative paths that are url safe.
 | 
1812  | 
repository_transport = a_bzrdir.get_repository_transport(self)  | 
|
| 
1996.3.4
by John Arbash Meinel
 lazy_import bzrlib/repository.py  | 
1813  | 
control_files = lockable_files.LockableFiles(repository_transport,  | 
1814  | 
'lock', lockdir.LockDir)  | 
|
| 
1553.5.61
by Martin Pool
 Locks protecting LockableFiles must now be explicitly created before use.  | 
1815  | 
control_files.create_lock()  | 
| 
1556.1.3
by Robert Collins
 Rearrangment of Repository logic to be less type code driven, and bugfix InterRepository.missing_revision_ids  | 
1816  | 
return control_files  | 
1817  | 
||
1818  | 
def _upload_blank_content(self, a_bzrdir, dirs, files, utf8_files, shared):  | 
|
1819  | 
"""Upload the initial blank content."""  | 
|
1820  | 
control_files = self._create_control_files(a_bzrdir)  | 
|
| 
1534.4.47
by Robert Collins
 Split out repository into .bzr/repository  | 
1821  | 
control_files.lock_write()  | 
1822  | 
try:  | 
|
| 
1553.5.49
by Martin Pool
 Use LockDirs for repo format 7  | 
1823  | 
control_files._transport.mkdir_multi(dirs,  | 
1824  | 
mode=control_files._dir_mode)  | 
|
| 
1534.4.47
by Robert Collins
 Split out repository into .bzr/repository  | 
1825  | 
for file, content in files:  | 
1826  | 
control_files.put(file, content)  | 
|
1827  | 
for file, content in utf8_files:  | 
|
1828  | 
control_files.put_utf8(file, content)  | 
|
| 
1534.6.1
by Robert Collins
 allow API creation of shared repositories  | 
1829  | 
if shared == True:  | 
1830  | 
control_files.put_utf8('shared-storage', '')  | 
|
| 
1534.4.47
by Robert Collins
 Split out repository into .bzr/repository  | 
1831  | 
finally:  | 
1832  | 
control_files.unlock()  | 
|
| 
1556.1.3
by Robert Collins
 Rearrangment of Repository logic to be less type code driven, and bugfix InterRepository.missing_revision_ids  | 
1833  | 
|
1834  | 
||
| 
1534.4.40
by Robert Collins
 Add RepositoryFormats and allow bzrdir.open or create _repository to be used.  | 
1835  | 
# formats which have no format string are not discoverable
 | 
| 
2241.1.4
by Martin Pool
 Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.  | 
1836  | 
# and not independently creatable, so are not registered.  They're 
 | 
| 
2241.1.11
by Martin Pool
 Get rid of RepositoryFormat*_instance objects. Instead the format  | 
1837  | 
# all in bzrlib.repofmt.weaverepo now.  When an instance of one of these is
 | 
1838  | 
# needed, it's constructed directly by the BzrDir.  Non-native formats where
 | 
|
1839  | 
# the repository is not separately opened are similar.
 | 
|
1840  | 
||
| 
2241.1.4
by Martin Pool
 Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.  | 
1841  | 
format_registry.register_lazy(  | 
1842  | 
'Bazaar-NG Repository format 7',  | 
|
1843  | 
'bzrlib.repofmt.weaverepo',  | 
|
| 
2241.1.11
by Martin Pool
 Get rid of RepositoryFormat*_instance objects. Instead the format  | 
1844  | 
    'RepositoryFormat7'
 | 
| 
2241.1.4
by Martin Pool
 Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.  | 
1845  | 
    )
 | 
| 
2241.1.1
by Martin Pool
 Change RepositoryFormat to use a Registry rather than ad-hoc dictionary  | 
1846  | 
# KEEP in sync with bzrdir.format_registry default, which controls the overall
 | 
1847  | 
# default control directory format
 | 
|
| 
2241.1.6
by Martin Pool
 Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and  | 
1848  | 
|
1849  | 
format_registry.register_lazy(  | 
|
1850  | 
'Bazaar-NG Knit Repository Format 1',  | 
|
1851  | 
'bzrlib.repofmt.knitrepo',  | 
|
| 
2241.1.11
by Martin Pool
 Get rid of RepositoryFormat*_instance objects. Instead the format  | 
1852  | 
'RepositoryFormatKnit1',  | 
| 
2241.1.6
by Martin Pool
 Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and  | 
1853  | 
    )
 | 
1854  | 
format_registry.default_key = 'Bazaar-NG Knit Repository Format 1'  | 
|
1855  | 
||
| 
2241.1.5
by Martin Pool
 Move KnitFormat2 into repofmt  | 
1856  | 
format_registry.register_lazy(  | 
| 
2255.2.230
by Robert Collins
 Update tree format signatures to mention introducing bzr version.  | 
1857  | 
'Bazaar Knit Repository Format 3 (bzr 0.15)\n',  | 
| 
2100.3.31
by Aaron Bentley
 Merged bzr.dev (17 tests failing)  | 
1858  | 
'bzrlib.repofmt.knitrepo',  | 
1859  | 
'RepositoryFormatKnit3',  | 
|
1860  | 
    )
 | 
|
| 
1534.4.40
by Robert Collins
 Add RepositoryFormats and allow bzrdir.open or create _repository to be used.  | 
1861  | 
|
1862  | 
||
| 
1563.2.12
by Robert Collins
 Checkpointing: created InterObject to factor out common inter object worker code, added InterVersionedFile and tests to allow making join work between any versionedfile.  | 
1863  | 
class InterRepository(InterObject):  | 
| 
1534.1.27
by Robert Collins
 Start InterRepository with InterRepository.get.  | 
1864  | 
"""This class represents operations taking place between two repositories.  | 
1865  | 
||
| 
1534.1.33
by Robert Collins
 Move copy_content_into into InterRepository and InterWeaveRepo, and disable the default codepath test as we have optimised paths for all current combinations.  | 
1866  | 
    Its instances have methods like copy_content and fetch, and contain
 | 
| 
1534.1.27
by Robert Collins
 Start InterRepository with InterRepository.get.  | 
1867  | 
    references to the source and target repositories these operations can be 
 | 
1868  | 
    carried out on.
 | 
|
1869  | 
||
1870  | 
    Often we will provide convenience methods on 'repository' which carry out
 | 
|
1871  | 
    operations with another repository - they will always forward to
 | 
|
1872  | 
    InterRepository.get(other).method_name(parameters).
 | 
|
1873  | 
    """
 | 
|
1874  | 
||
| 
1910.2.15
by Aaron Bentley
 Back out inter.get changes, make optimizers an ordered list  | 
1875  | 
_optimisers = []  | 
| 
1534.1.28
by Robert Collins
 Allow for optimised InterRepository selection.  | 
1876  | 
"""The available optimised InterRepository types."""  | 
1877  | 
||
| 
2387.1.1
by Robert Collins
 Remove the --basis parameter to clone etc. (Robert Collins)  | 
1878  | 
def copy_content(self, revision_id=None):  | 
| 
1910.2.15
by Aaron Bentley
 Back out inter.get changes, make optimizers an ordered list  | 
1879  | 
raise NotImplementedError(self.copy_content)  | 
1880  | 
||
1881  | 
def fetch(self, revision_id=None, pb=None):  | 
|
| 
1534.1.31
by Robert Collins
 Deprecated fetch.fetch and fetch.greedy_fetch for branch.fetch, and move the Repository.fetch internals to InterRepo and InterWeaveRepo.  | 
1882  | 
"""Fetch the content required to construct revision_id.  | 
1883  | 
||
| 
1910.7.17
by Andrew Bennetts
 Various cosmetic changes.  | 
1884  | 
        The content is copied from self.source to self.target.
 | 
| 
1534.1.31
by Robert Collins
 Deprecated fetch.fetch and fetch.greedy_fetch for branch.fetch, and move the Repository.fetch internals to InterRepo and InterWeaveRepo.  | 
1885  | 
|
1886  | 
        :param revision_id: if None all content is copied, if NULL_REVISION no
 | 
|
1887  | 
                            content is copied.
 | 
|
1888  | 
        :param pb: optional progress bar to use for progress reports. If not
 | 
|
1889  | 
                   provided a default one will be created.
 | 
|
1890  | 
||
1891  | 
        Returns the copied revision count and the failed revisions in a tuple:
 | 
|
1892  | 
        (copied, failures).
 | 
|
1893  | 
        """
 | 
|
| 
1910.2.15
by Aaron Bentley
 Back out inter.get changes, make optimizers an ordered list  | 
1894  | 
raise NotImplementedError(self.fetch)  | 
1895  | 
||
1896  | 
    @needs_read_lock
 | 
|
1897  | 
def missing_revision_ids(self, revision_id=None):  | 
|
1898  | 
"""Return the revision ids that source has that target does not.  | 
|
1899  | 
        
 | 
|
1900  | 
        These are returned in topological order.
 | 
|
1901  | 
||
1902  | 
        :param revision_id: only return revision ids included by this
 | 
|
1903  | 
                            revision_id.
 | 
|
1904  | 
        """
 | 
|
1905  | 
        # generic, possibly worst case, slow code path.
 | 
|
1906  | 
target_ids = set(self.target.all_revision_ids())  | 
|
1907  | 
if revision_id is not None:  | 
|
| 
2249.5.13
by John Arbash Meinel
 Finish auditing Repository, and fix generate_ids to always generate utf8 ids.  | 
1908  | 
            # TODO: jam 20070210 InterRepository is internal enough that it
 | 
1909  | 
            #       should assume revision_ids are already utf-8
 | 
|
1910  | 
revision_id = osutils.safe_revision_id(revision_id)  | 
|
| 
1910.2.15
by Aaron Bentley
 Back out inter.get changes, make optimizers an ordered list  | 
1911  | 
source_ids = self.source.get_ancestry(revision_id)  | 
| 
1963.2.6
by Robey Pointer
 pychecker is on crack; go back to using 'is None'.  | 
1912  | 
assert source_ids[0] is None  | 
| 
1910.2.15
by Aaron Bentley
 Back out inter.get changes, make optimizers an ordered list  | 
1913  | 
source_ids.pop(0)  | 
1914  | 
else:  | 
|
1915  | 
source_ids = self.source.all_revision_ids()  | 
|
1916  | 
result_set = set(source_ids).difference(target_ids)  | 
|
1917  | 
        # this may look like a no-op: its not. It preserves the ordering
 | 
|
1918  | 
        # other_ids had while only returning the members from other_ids
 | 
|
1919  | 
        # that we've decided we need.
 | 
|
1920  | 
return [rev_id for rev_id in source_ids if rev_id in result_set]  | 
|
1921  | 
||
1922  | 
||
1923  | 
class InterSameDataRepository(InterRepository):  | 
|
1924  | 
"""Code for converting between repositories that represent the same data.  | 
|
1925  | 
    
 | 
|
1926  | 
    Data format and model must match for this to work.
 | 
|
1927  | 
    """
 | 
|
1928  | 
||
| 
2241.1.6
by Martin Pool
 Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and  | 
1929  | 
    @classmethod
 | 
| 
2241.1.7
by Martin Pool
 rename method  | 
1930  | 
def _get_repo_format_to_test(self):  | 
| 
2814.1.1
by Robert Collins
 * Pushing, pulling and branching branches with subtree references was not  | 
1931  | 
"""Repository format for testing with.  | 
1932  | 
        
 | 
|
1933  | 
        InterSameData can pull from subtree to subtree and from non-subtree to
 | 
|
1934  | 
        non-subtree, so we test this with the richest repository format.
 | 
|
1935  | 
        """
 | 
|
1936  | 
from bzrlib.repofmt import knitrepo  | 
|
1937  | 
return knitrepo.RepositoryFormatKnit3()  | 
|
| 
1910.2.15
by Aaron Bentley
 Back out inter.get changes, make optimizers an ordered list  | 
1938  | 
|
| 
1910.2.14
by Aaron Bentley
 Fail when trying to use interrepository on Knit2 and Knit1  | 
1939  | 
    @staticmethod
 | 
1940  | 
def is_compatible(source, target):  | 
|
| 
2018.5.96
by Andrew Bennetts
 Merge from bzr.dev, resolving the worst of the semantic conflicts, but there's  | 
1941  | 
if source.supports_rich_root() != target.supports_rich_root():  | 
| 
2100.3.20
by Aaron Bentley
 Implement tree comparison for tree references  | 
1942  | 
return False  | 
| 
2305.2.4
by Andrew Bennetts
 Reinstate checking of source & targer _serializer that I accidentally clobbered.  | 
1943  | 
if source._serializer != target._serializer:  | 
1944  | 
return False  | 
|
| 
2018.5.96
by Andrew Bennetts
 Merge from bzr.dev, resolving the worst of the semantic conflicts, but there's  | 
1945  | 
return True  | 
| 
1910.2.14
by Aaron Bentley
 Fail when trying to use interrepository on Knit2 and Knit1  | 
1946  | 
|
| 
1534.1.33
by Robert Collins
 Move copy_content_into into InterRepository and InterWeaveRepo, and disable the default codepath test as we have optimised paths for all current combinations.  | 
1947  | 
    @needs_write_lock
 | 
| 
2387.1.1
by Robert Collins
 Remove the --basis parameter to clone etc. (Robert Collins)  | 
1948  | 
def copy_content(self, revision_id=None):  | 
| 
1534.1.33
by Robert Collins
 Move copy_content_into into InterRepository and InterWeaveRepo, and disable the default codepath test as we have optimised paths for all current combinations.  | 
1949  | 
"""Make a complete copy of the content in self into destination.  | 
| 
2440.1.1
by Martin Pool
 Add new Repository.sprout,  | 
1950  | 
|
1951  | 
        This copies both the repository's revision data, and configuration information
 | 
|
1952  | 
        such as the make_working_trees setting.
 | 
|
| 
1534.1.33
by Robert Collins
 Move copy_content_into into InterRepository and InterWeaveRepo, and disable the default codepath test as we have optimised paths for all current combinations.  | 
1953  | 
        
 | 
1954  | 
        This is a destructive operation! Do not use it on existing 
 | 
|
1955  | 
        repositories.
 | 
|
1956  | 
||
1957  | 
        :param revision_id: Only copy the content needed to construct
 | 
|
1958  | 
                            revision_id and its parents.
 | 
|
1959  | 
        """
 | 
|
1960  | 
try:  | 
|
1961  | 
self.target.set_make_working_trees(self.source.make_working_trees())  | 
|
1962  | 
except NotImplementedError:  | 
|
1963  | 
            pass
 | 
|
| 
2249.5.13
by John Arbash Meinel
 Finish auditing Repository, and fix generate_ids to always generate utf8 ids.  | 
1964  | 
        # TODO: jam 20070210 This is fairly internal, so we should probably
 | 
1965  | 
        #       just assert that revision_id is not unicode.
 | 
|
1966  | 
revision_id = osutils.safe_revision_id(revision_id)  | 
|
| 
1759.2.2
by Jelmer Vernooij
 Revert some of my spelling fixes and fix some typos after review by Aaron.  | 
1967  | 
        # but don't bother fetching if we have the needed data now.
 | 
| 
1996.3.20
by John Arbash Meinel
 [merge] bzr.dev 2063  | 
1968  | 
if (revision_id not in (None, _mod_revision.NULL_REVISION) and  | 
| 
1534.1.33
by Robert Collins
 Move copy_content_into into InterRepository and InterWeaveRepo, and disable the default codepath test as we have optimised paths for all current combinations.  | 
1969  | 
self.target.has_revision(revision_id)):  | 
1970  | 
            return
 | 
|
1971  | 
self.target.fetch(self.source, revision_id=revision_id)  | 
|
1972  | 
||
1973  | 
    @needs_write_lock
 | 
|
| 
1534.1.31
by Robert Collins
 Deprecated fetch.fetch and fetch.greedy_fetch for branch.fetch, and move the Repository.fetch internals to InterRepo and InterWeaveRepo.  | 
1974  | 
def fetch(self, revision_id=None, pb=None):  | 
| 
1910.7.20
by Andrew Bennetts
 Merge from bzr.dev  | 
1975  | 
"""See InterRepository.fetch()."""  | 
| 
1563.2.31
by Robert Collins
 Convert Knit repositories to use knits.  | 
1976  | 
from bzrlib.fetch import GenericRepoFetcher  | 
| 
1534.1.31
by Robert Collins
 Deprecated fetch.fetch and fetch.greedy_fetch for branch.fetch, and move the Repository.fetch internals to InterRepo and InterWeaveRepo.  | 
1977  | 
mutter("Using fetch logic to copy between %s(%s) and %s(%s)",  | 
| 
1910.2.15
by Aaron Bentley
 Back out inter.get changes, make optimizers an ordered list  | 
1978  | 
self.source, self.source._format, self.target,  | 
1979  | 
self.target._format)  | 
|
| 
2249.5.13
by John Arbash Meinel
 Finish auditing Repository, and fix generate_ids to always generate utf8 ids.  | 
1980  | 
        # TODO: jam 20070210 This should be an assert, not a translate
 | 
1981  | 
revision_id = osutils.safe_revision_id(revision_id)  | 
|
| 
1563.2.31
by Robert Collins
 Convert Knit repositories to use knits.  | 
1982  | 
f = GenericRepoFetcher(to_repository=self.target,  | 
1983  | 
from_repository=self.source,  | 
|
1984  | 
last_revision=revision_id,  | 
|
1985  | 
pb=pb)  | 
|
| 
1534.1.33
by Robert Collins
 Move copy_content_into into InterRepository and InterWeaveRepo, and disable the default codepath test as we have optimised paths for all current combinations.  | 
1986  | 
return f.count_copied, f.failed_revisions  | 
| 
1534.1.31
by Robert Collins
 Deprecated fetch.fetch and fetch.greedy_fetch for branch.fetch, and move the Repository.fetch internals to InterRepo and InterWeaveRepo.  | 
1987  | 
|
| 
1910.2.15
by Aaron Bentley
 Back out inter.get changes, make optimizers an ordered list  | 
1988  | 
|
| 
2241.1.12
by Martin Pool
 Restore InterWeaveRepo  | 
1989  | 
class InterWeaveRepo(InterSameDataRepository):  | 
1990  | 
"""Optimised code paths between Weave based repositories."""  | 
|
1991  | 
||
| 
2241.1.13
by Martin Pool
 Re-register InterWeaveRepo, fix test integration, add test for it  | 
1992  | 
    @classmethod
 | 
| 
2241.1.12
by Martin Pool
 Restore InterWeaveRepo  | 
1993  | 
def _get_repo_format_to_test(self):  | 
1994  | 
from bzrlib.repofmt import weaverepo  | 
|
1995  | 
return weaverepo.RepositoryFormat7()  | 
|
1996  | 
||
1997  | 
    @staticmethod
 | 
|
1998  | 
def is_compatible(source, target):  | 
|
1999  | 
"""Be compatible with known Weave formats.  | 
|
2000  | 
        
 | 
|
2001  | 
        We don't test for the stores being of specific types because that
 | 
|
2002  | 
        could lead to confusing results, and there is no need to be 
 | 
|
2003  | 
        overly general.
 | 
|
2004  | 
        """
 | 
|
2005  | 
from bzrlib.repofmt.weaverepo import (  | 
|
2006  | 
RepositoryFormat5,  | 
|
2007  | 
RepositoryFormat6,  | 
|
2008  | 
RepositoryFormat7,  | 
|
2009  | 
                )
 | 
|
2010  | 
try:  | 
|
2011  | 
return (isinstance(source._format, (RepositoryFormat5,  | 
|
2012  | 
RepositoryFormat6,  | 
|
2013  | 
RepositoryFormat7)) and  | 
|
2014  | 
isinstance(target._format, (RepositoryFormat5,  | 
|
2015  | 
RepositoryFormat6,  | 
|
2016  | 
RepositoryFormat7)))  | 
|
2017  | 
except AttributeError:  | 
|
2018  | 
return False  | 
|
2019  | 
||
2020  | 
    @needs_write_lock
 | 
|
| 
2387.1.1
by Robert Collins
 Remove the --basis parameter to clone etc. (Robert Collins)  | 
2021  | 
def copy_content(self, revision_id=None):  | 
| 
2241.1.12
by Martin Pool
 Restore InterWeaveRepo  | 
2022  | 
"""See InterRepository.copy_content()."""  | 
2023  | 
        # weave specific optimised path:
 | 
|
| 
2249.5.13
by John Arbash Meinel
 Finish auditing Repository, and fix generate_ids to always generate utf8 ids.  | 
2024  | 
        # TODO: jam 20070210 Internal, should be an assert, not translate
 | 
2025  | 
revision_id = osutils.safe_revision_id(revision_id)  | 
|
| 
2387.1.1
by Robert Collins
 Remove the --basis parameter to clone etc. (Robert Collins)  | 
2026  | 
try:  | 
2027  | 
self.target.set_make_working_trees(self.source.make_working_trees())  | 
|
2028  | 
except NotImplementedError:  | 
|
2029  | 
            pass
 | 
|
2030  | 
        # FIXME do not peek!
 | 
|
2031  | 
if self.source.control_files._transport.listable():  | 
|
2032  | 
pb = ui.ui_factory.nested_progress_bar()  | 
|
| 
2241.1.12
by Martin Pool
 Restore InterWeaveRepo  | 
2033  | 
try:  | 
| 
2387.1.1
by Robert Collins
 Remove the --basis parameter to clone etc. (Robert Collins)  | 
2034  | 
self.target.weave_store.copy_all_ids(  | 
2035  | 
self.source.weave_store,  | 
|
2036  | 
pb=pb,  | 
|
2037  | 
from_transaction=self.source.get_transaction(),  | 
|
2038  | 
to_transaction=self.target.get_transaction())  | 
|
2039  | 
pb.update('copying inventory', 0, 1)  | 
|
2040  | 
self.target.control_weaves.copy_multi(  | 
|
2041  | 
self.source.control_weaves, ['inventory'],  | 
|
2042  | 
from_transaction=self.source.get_transaction(),  | 
|
2043  | 
to_transaction=self.target.get_transaction())  | 
|
2044  | 
self.target._revision_store.text_store.copy_all_ids(  | 
|
2045  | 
self.source._revision_store.text_store,  | 
|
2046  | 
pb=pb)  | 
|
2047  | 
finally:  | 
|
2048  | 
pb.finished()  | 
|
2049  | 
else:  | 
|
| 
2241.1.12
by Martin Pool
 Restore InterWeaveRepo  | 
2050  | 
self.target.fetch(self.source, revision_id=revision_id)  | 
2051  | 
||
2052  | 
    @needs_write_lock
 | 
|
2053  | 
def fetch(self, revision_id=None, pb=None):  | 
|
2054  | 
"""See InterRepository.fetch()."""  | 
|
2055  | 
from bzrlib.fetch import GenericRepoFetcher  | 
|
2056  | 
mutter("Using fetch logic to copy between %s(%s) and %s(%s)",  | 
|
2057  | 
self.source, self.source._format, self.target, self.target._format)  | 
|
| 
2249.5.13
by John Arbash Meinel
 Finish auditing Repository, and fix generate_ids to always generate utf8 ids.  | 
2058  | 
        # TODO: jam 20070210 This should be an assert, not a translate
 | 
2059  | 
revision_id = osutils.safe_revision_id(revision_id)  | 
|
| 
2241.1.12
by Martin Pool
 Restore InterWeaveRepo  | 
2060  | 
f = GenericRepoFetcher(to_repository=self.target,  | 
2061  | 
from_repository=self.source,  | 
|
2062  | 
last_revision=revision_id,  | 
|
2063  | 
pb=pb)  | 
|
2064  | 
return f.count_copied, f.failed_revisions  | 
|
2065  | 
||
2066  | 
    @needs_read_lock
 | 
|
2067  | 
def missing_revision_ids(self, revision_id=None):  | 
|
2068  | 
"""See InterRepository.missing_revision_ids()."""  | 
|
2069  | 
        # we want all revisions to satisfy revision_id in source.
 | 
|
2070  | 
        # but we don't want to stat every file here and there.
 | 
|
2071  | 
        # we want then, all revisions other needs to satisfy revision_id 
 | 
|
2072  | 
        # checked, but not those that we have locally.
 | 
|
2073  | 
        # so the first thing is to get a subset of the revisions to 
 | 
|
2074  | 
        # satisfy revision_id in source, and then eliminate those that
 | 
|
2075  | 
        # we do already have. 
 | 
|
2076  | 
        # this is slow on high latency connection to self, but as as this
 | 
|
2077  | 
        # disk format scales terribly for push anyway due to rewriting 
 | 
|
2078  | 
        # inventory.weave, this is considered acceptable.
 | 
|
2079  | 
        # - RBC 20060209
 | 
|
2080  | 
if revision_id is not None:  | 
|
2081  | 
source_ids = self.source.get_ancestry(revision_id)  | 
|
2082  | 
assert source_ids[0] is None  | 
|
2083  | 
source_ids.pop(0)  | 
|
2084  | 
else:  | 
|
2085  | 
source_ids = self.source._all_possible_ids()  | 
|
2086  | 
source_ids_set = set(source_ids)  | 
|
2087  | 
        # source_ids is the worst possible case we may need to pull.
 | 
|
2088  | 
        # now we want to filter source_ids against what we actually
 | 
|
2089  | 
        # have in target, but don't try to check for existence where we know
 | 
|
2090  | 
        # we do not have a revision as that would be pointless.
 | 
|
2091  | 
target_ids = set(self.target._all_possible_ids())  | 
|
2092  | 
possibly_present_revisions = target_ids.intersection(source_ids_set)  | 
|
2093  | 
actually_present_revisions = set(self.target._eliminate_revisions_not_present(possibly_present_revisions))  | 
|
2094  | 
required_revisions = source_ids_set.difference(actually_present_revisions)  | 
|
2095  | 
required_topo_revisions = [rev_id for rev_id in source_ids if rev_id in required_revisions]  | 
|
2096  | 
if revision_id is not None:  | 
|
2097  | 
            # we used get_ancestry to determine source_ids then we are assured all
 | 
|
2098  | 
            # revisions referenced are present as they are installed in topological order.
 | 
|
2099  | 
            # and the tip revision was validated by get_ancestry.
 | 
|
2100  | 
return required_topo_revisions  | 
|
2101  | 
else:  | 
|
2102  | 
            # if we just grabbed the possibly available ids, then 
 | 
|
2103  | 
            # we only have an estimate of whats available and need to validate
 | 
|
2104  | 
            # that against the revision records.
 | 
|
2105  | 
return self.source._eliminate_revisions_not_present(required_topo_revisions)  | 
|
2106  | 
||
2107  | 
||
| 
1910.2.15
by Aaron Bentley
 Back out inter.get changes, make optimizers an ordered list  | 
2108  | 
class InterKnitRepo(InterSameDataRepository):  | 
| 
1563.2.31
by Robert Collins
 Convert Knit repositories to use knits.  | 
2109  | 
"""Optimised code paths between Knit based repositories."""  | 
2110  | 
||
| 
2241.1.6
by Martin Pool
 Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and  | 
2111  | 
    @classmethod
 | 
| 
2241.1.7
by Martin Pool
 rename method  | 
2112  | 
def _get_repo_format_to_test(self):  | 
| 
2241.1.6
by Martin Pool
 Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and  | 
2113  | 
from bzrlib.repofmt import knitrepo  | 
2114  | 
return knitrepo.RepositoryFormatKnit1()  | 
|
| 
1563.2.31
by Robert Collins
 Convert Knit repositories to use knits.  | 
2115  | 
|
2116  | 
    @staticmethod
 | 
|
2117  | 
def is_compatible(source, target):  | 
|
2118  | 
"""Be compatible with known Knit formats.  | 
|
2119  | 
        
 | 
|
| 
1759.2.2
by Jelmer Vernooij
 Revert some of my spelling fixes and fix some typos after review by Aaron.  | 
2120  | 
        We don't test for the stores being of specific types because that
 | 
| 
1563.2.31
by Robert Collins
 Convert Knit repositories to use knits.  | 
2121  | 
        could lead to confusing results, and there is no need to be 
 | 
2122  | 
        overly general.
 | 
|
2123  | 
        """
 | 
|
| 
2241.1.6
by Martin Pool
 Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and  | 
2124  | 
from bzrlib.repofmt.knitrepo import RepositoryFormatKnit1  | 
| 
1563.2.31
by Robert Collins
 Convert Knit repositories to use knits.  | 
2125  | 
try:  | 
2126  | 
return (isinstance(source._format, (RepositoryFormatKnit1)) and  | 
|
2127  | 
isinstance(target._format, (RepositoryFormatKnit1)))  | 
|
2128  | 
except AttributeError:  | 
|
2129  | 
return False  | 
|
2130  | 
||
2131  | 
    @needs_write_lock
 | 
|
2132  | 
def fetch(self, revision_id=None, pb=None):  | 
|
2133  | 
"""See InterRepository.fetch()."""  | 
|
2134  | 
from bzrlib.fetch import KnitRepoFetcher  | 
|
2135  | 
mutter("Using fetch logic to copy between %s(%s) and %s(%s)",  | 
|
2136  | 
self.source, self.source._format, self.target, self.target._format)  | 
|
| 
2249.5.13
by John Arbash Meinel
 Finish auditing Repository, and fix generate_ids to always generate utf8 ids.  | 
2137  | 
        # TODO: jam 20070210 This should be an assert, not a translate
 | 
2138  | 
revision_id = osutils.safe_revision_id(revision_id)  | 
|
| 
1563.2.31
by Robert Collins
 Convert Knit repositories to use knits.  | 
2139  | 
f = KnitRepoFetcher(to_repository=self.target,  | 
2140  | 
from_repository=self.source,  | 
|
2141  | 
last_revision=revision_id,  | 
|
2142  | 
pb=pb)  | 
|
2143  | 
return f.count_copied, f.failed_revisions  | 
|
2144  | 
||
2145  | 
    @needs_read_lock
 | 
|
2146  | 
def missing_revision_ids(self, revision_id=None):  | 
|
2147  | 
"""See InterRepository.missing_revision_ids()."""  | 
|
2148  | 
if revision_id is not None:  | 
|
2149  | 
source_ids = self.source.get_ancestry(revision_id)  | 
|
| 
1963.2.6
by Robey Pointer
 pychecker is on crack; go back to using 'is None'.  | 
2150  | 
assert source_ids[0] is None  | 
| 
1668.1.14
by Martin Pool
 merge olaf - InvalidRevisionId fixes  | 
2151  | 
source_ids.pop(0)  | 
| 
1563.2.31
by Robert Collins
 Convert Knit repositories to use knits.  | 
2152  | 
else:  | 
2153  | 
source_ids = self.source._all_possible_ids()  | 
|
2154  | 
source_ids_set = set(source_ids)  | 
|
2155  | 
        # source_ids is the worst possible case we may need to pull.
 | 
|
2156  | 
        # now we want to filter source_ids against what we actually
 | 
|
| 
1759.2.2
by Jelmer Vernooij
 Revert some of my spelling fixes and fix some typos after review by Aaron.  | 
2157  | 
        # have in target, but don't try to check for existence where we know
 | 
| 
1563.2.31
by Robert Collins
 Convert Knit repositories to use knits.  | 
2158  | 
        # we do not have a revision as that would be pointless.
 | 
2159  | 
target_ids = set(self.target._all_possible_ids())  | 
|
2160  | 
possibly_present_revisions = target_ids.intersection(source_ids_set)  | 
|
2161  | 
actually_present_revisions = set(self.target._eliminate_revisions_not_present(possibly_present_revisions))  | 
|
2162  | 
required_revisions = source_ids_set.difference(actually_present_revisions)  | 
|
2163  | 
required_topo_revisions = [rev_id for rev_id in source_ids if rev_id in required_revisions]  | 
|
2164  | 
if revision_id is not None:  | 
|
2165  | 
            # we used get_ancestry to determine source_ids then we are assured all
 | 
|
2166  | 
            # revisions referenced are present as they are installed in topological order.
 | 
|
2167  | 
            # and the tip revision was validated by get_ancestry.
 | 
|
2168  | 
return required_topo_revisions  | 
|
2169  | 
else:  | 
|
2170  | 
            # if we just grabbed the possibly available ids, then 
 | 
|
2171  | 
            # we only have an estimate of whats available and need to validate
 | 
|
2172  | 
            # that against the revision records.
 | 
|
2173  | 
return self.source._eliminate_revisions_not_present(required_topo_revisions)  | 
|
2174  | 
||
| 
1910.2.17
by Aaron Bentley
 Get fetching from 1 to 2 under test  | 
2175  | 
|
| 
1910.2.24
by Aaron Bentley
 Got intra-repository fetch working between model1 and 2 for all types  | 
2176  | 
class InterModel1and2(InterRepository):  | 
2177  | 
||
| 
2241.1.6
by Martin Pool
 Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and  | 
2178  | 
    @classmethod
 | 
| 
2241.1.7
by Martin Pool
 rename method  | 
2179  | 
def _get_repo_format_to_test(self):  | 
| 
2241.1.6
by Martin Pool
 Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and  | 
2180  | 
return None  | 
| 
1910.2.24
by Aaron Bentley
 Got intra-repository fetch working between model1 and 2 for all types  | 
2181  | 
|
2182  | 
    @staticmethod
 | 
|
2183  | 
def is_compatible(source, target):  | 
|
| 
2305.2.1
by Andrew Bennetts
 Use repo.supports_rich_root() everywhere rather than  | 
2184  | 
if not source.supports_rich_root() and target.supports_rich_root():  | 
| 
1910.2.24
by Aaron Bentley
 Got intra-repository fetch working between model1 and 2 for all types  | 
2185  | 
return True  | 
2186  | 
else:  | 
|
2187  | 
return False  | 
|
2188  | 
||
2189  | 
    @needs_write_lock
 | 
|
2190  | 
def fetch(self, revision_id=None, pb=None):  | 
|
2191  | 
"""See InterRepository.fetch()."""  | 
|
2192  | 
from bzrlib.fetch import Model1toKnit2Fetcher  | 
|
| 
2249.5.13
by John Arbash Meinel
 Finish auditing Repository, and fix generate_ids to always generate utf8 ids.  | 
2193  | 
        # TODO: jam 20070210 This should be an assert, not a translate
 | 
2194  | 
revision_id = osutils.safe_revision_id(revision_id)  | 
|
| 
1910.2.24
by Aaron Bentley
 Got intra-repository fetch working between model1 and 2 for all types  | 
2195  | 
f = Model1toKnit2Fetcher(to_repository=self.target,  | 
2196  | 
from_repository=self.source,  | 
|
2197  | 
last_revision=revision_id,  | 
|
2198  | 
pb=pb)  | 
|
2199  | 
return f.count_copied, f.failed_revisions  | 
|
2200  | 
||
| 
1910.2.26
by Aaron Bentley
 Fix up some test cases  | 
2201  | 
    @needs_write_lock
 | 
| 
2387.1.1
by Robert Collins
 Remove the --basis parameter to clone etc. (Robert Collins)  | 
2202  | 
def copy_content(self, revision_id=None):  | 
| 
1910.2.26
by Aaron Bentley
 Fix up some test cases  | 
2203  | 
"""Make a complete copy of the content in self into destination.  | 
2204  | 
        
 | 
|
2205  | 
        This is a destructive operation! Do not use it on existing 
 | 
|
2206  | 
        repositories.
 | 
|
2207  | 
||
2208  | 
        :param revision_id: Only copy the content needed to construct
 | 
|
2209  | 
                            revision_id and its parents.
 | 
|
2210  | 
        """
 | 
|
2211  | 
try:  | 
|
2212  | 
self.target.set_make_working_trees(self.source.make_working_trees())  | 
|
2213  | 
except NotImplementedError:  | 
|
2214  | 
            pass
 | 
|
| 
2249.5.13
by John Arbash Meinel
 Finish auditing Repository, and fix generate_ids to always generate utf8 ids.  | 
2215  | 
        # TODO: jam 20070210 Internal, assert, don't translate
 | 
2216  | 
revision_id = osutils.safe_revision_id(revision_id)  | 
|
| 
1910.2.26
by Aaron Bentley
 Fix up some test cases  | 
2217  | 
        # but don't bother fetching if we have the needed data now.
 | 
| 
1996.3.20
by John Arbash Meinel
 [merge] bzr.dev 2063  | 
2218  | 
if (revision_id not in (None, _mod_revision.NULL_REVISION) and  | 
| 
1910.2.26
by Aaron Bentley
 Fix up some test cases  | 
2219  | 
self.target.has_revision(revision_id)):  | 
2220  | 
            return
 | 
|
2221  | 
self.target.fetch(self.source, revision_id=revision_id)  | 
|
2222  | 
||
| 
1910.2.24
by Aaron Bentley
 Got intra-repository fetch working between model1 and 2 for all types  | 
2223  | 
|
| 
1910.2.17
by Aaron Bentley
 Get fetching from 1 to 2 under test  | 
2224  | 
class InterKnit1and2(InterKnitRepo):  | 
2225  | 
||
| 
2241.1.6
by Martin Pool
 Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and  | 
2226  | 
    @classmethod
 | 
| 
2241.1.7
by Martin Pool
 rename method  | 
2227  | 
def _get_repo_format_to_test(self):  | 
| 
2241.1.6
by Martin Pool
 Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and  | 
2228  | 
return None  | 
| 
1910.2.24
by Aaron Bentley
 Got intra-repository fetch working between model1 and 2 for all types  | 
2229  | 
|
| 
1910.2.17
by Aaron Bentley
 Get fetching from 1 to 2 under test  | 
2230  | 
    @staticmethod
 | 
2231  | 
def is_compatible(source, target):  | 
|
| 
2255.2.211
by Robert Collins
 Remove knit2 repository format- it has never been supported.  | 
2232  | 
"""Be compatible with Knit1 source and Knit3 target"""  | 
2233  | 
from bzrlib.repofmt.knitrepo import RepositoryFormatKnit3  | 
|
| 
1910.2.17
by Aaron Bentley
 Get fetching from 1 to 2 under test  | 
2234  | 
try:  | 
| 
2241.1.6
by Martin Pool
 Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and  | 
2235  | 
from bzrlib.repofmt.knitrepo import RepositoryFormatKnit1, \  | 
| 
2255.2.211
by Robert Collins
 Remove knit2 repository format- it has never been supported.  | 
2236  | 
                    RepositoryFormatKnit3
 | 
| 
1910.2.17
by Aaron Bentley
 Get fetching from 1 to 2 under test  | 
2237  | 
return (isinstance(source._format, (RepositoryFormatKnit1)) and  | 
| 
2255.2.211
by Robert Collins
 Remove knit2 repository format- it has never been supported.  | 
2238  | 
isinstance(target._format, (RepositoryFormatKnit3)))  | 
| 
1910.2.17
by Aaron Bentley
 Get fetching from 1 to 2 under test  | 
2239  | 
except AttributeError:  | 
2240  | 
return False  | 
|
2241  | 
||
2242  | 
    @needs_write_lock
 | 
|
2243  | 
def fetch(self, revision_id=None, pb=None):  | 
|
2244  | 
"""See InterRepository.fetch()."""  | 
|
2245  | 
from bzrlib.fetch import Knit1to2Fetcher  | 
|
2246  | 
mutter("Using fetch logic to copy between %s(%s) and %s(%s)",  | 
|
2247  | 
self.source, self.source._format, self.target,  | 
|
2248  | 
self.target._format)  | 
|
| 
2249.5.13
by John Arbash Meinel
 Finish auditing Repository, and fix generate_ids to always generate utf8 ids.  | 
2249  | 
        # TODO: jam 20070210 This should be an assert, not a translate
 | 
2250  | 
revision_id = osutils.safe_revision_id(revision_id)  | 
|
| 
1910.2.17
by Aaron Bentley
 Get fetching from 1 to 2 under test  | 
2251  | 
f = Knit1to2Fetcher(to_repository=self.target,  | 
2252  | 
from_repository=self.source,  | 
|
2253  | 
last_revision=revision_id,  | 
|
2254  | 
pb=pb)  | 
|
2255  | 
return f.count_copied, f.failed_revisions  | 
|
2256  | 
||
2257  | 
||
| 
2018.5.163
by Andrew Bennetts
 Deal with various review comments from Robert.  | 
2258  | 
class InterRemoteRepository(InterRepository):  | 
2259  | 
"""Code for converting between RemoteRepository objects.  | 
|
2260  | 
||
2261  | 
    This just gets an non-remote repository from the RemoteRepository, and calls
 | 
|
2262  | 
    InterRepository.get again.
 | 
|
2263  | 
    """
 | 
|
2264  | 
||
2265  | 
def __init__(self, source, target):  | 
|
2266  | 
if isinstance(source, remote.RemoteRepository):  | 
|
2267  | 
source._ensure_real()  | 
|
2268  | 
real_source = source._real_repository  | 
|
2269  | 
else:  | 
|
2270  | 
real_source = source  | 
|
2271  | 
if isinstance(target, remote.RemoteRepository):  | 
|
2272  | 
target._ensure_real()  | 
|
2273  | 
real_target = target._real_repository  | 
|
2274  | 
else:  | 
|
2275  | 
real_target = target  | 
|
2276  | 
self.real_inter = InterRepository.get(real_source, real_target)  | 
|
2277  | 
||
2278  | 
    @staticmethod
 | 
|
2279  | 
def is_compatible(source, target):  | 
|
2280  | 
if isinstance(source, remote.RemoteRepository):  | 
|
2281  | 
return True  | 
|
2282  | 
if isinstance(target, remote.RemoteRepository):  | 
|
2283  | 
return True  | 
|
2284  | 
return False  | 
|
2285  | 
||
2286  | 
def copy_content(self, revision_id=None):  | 
|
2287  | 
self.real_inter.copy_content(revision_id=revision_id)  | 
|
2288  | 
||
2289  | 
def fetch(self, revision_id=None, pb=None):  | 
|
2290  | 
self.real_inter.fetch(revision_id=revision_id, pb=pb)  | 
|
2291  | 
||
2292  | 
    @classmethod
 | 
|
2293  | 
def _get_repo_format_to_test(self):  | 
|
2294  | 
return None  | 
|
2295  | 
||
2296  | 
||
| 
1910.2.15
by Aaron Bentley
 Back out inter.get changes, make optimizers an ordered list  | 
2297  | 
InterRepository.register_optimiser(InterSameDataRepository)  | 
| 
2241.1.13
by Martin Pool
 Re-register InterWeaveRepo, fix test integration, add test for it  | 
2298  | 
InterRepository.register_optimiser(InterWeaveRepo)  | 
| 
1563.2.31
by Robert Collins
 Convert Knit repositories to use knits.  | 
2299  | 
InterRepository.register_optimiser(InterKnitRepo)  | 
| 
1910.2.24
by Aaron Bentley
 Got intra-repository fetch working between model1 and 2 for all types  | 
2300  | 
InterRepository.register_optimiser(InterModel1and2)  | 
| 
1910.2.17
by Aaron Bentley
 Get fetching from 1 to 2 under test  | 
2301  | 
InterRepository.register_optimiser(InterKnit1and2)  | 
| 
2018.5.163
by Andrew Bennetts
 Deal with various review comments from Robert.  | 
2302  | 
InterRepository.register_optimiser(InterRemoteRepository)  | 
| 
1534.1.31
by Robert Collins
 Deprecated fetch.fetch and fetch.greedy_fetch for branch.fetch, and move the Repository.fetch internals to InterRepo and InterWeaveRepo.  | 
2303  | 
|
2304  | 
||
| 
1556.1.4
by Robert Collins
 Add a new format for what will become knit, and the surrounding logic to upgrade repositories within metadirs, and tests for the same.  | 
2305  | 
class CopyConverter(object):  | 
2306  | 
"""A repository conversion tool which just performs a copy of the content.  | 
|
2307  | 
    
 | 
|
2308  | 
    This is slow but quite reliable.
 | 
|
2309  | 
    """
 | 
|
2310  | 
||
2311  | 
def __init__(self, target_format):  | 
|
2312  | 
"""Create a CopyConverter.  | 
|
2313  | 
||
2314  | 
        :param target_format: The format the resulting repository should be.
 | 
|
2315  | 
        """
 | 
|
2316  | 
self.target_format = target_format  | 
|
2317  | 
||
2318  | 
def convert(self, repo, pb):  | 
|
2319  | 
"""Perform the conversion of to_convert, giving feedback via pb.  | 
|
2320  | 
||
2321  | 
        :param to_convert: The disk object to convert.
 | 
|
2322  | 
        :param pb: a progress bar to use for progress information.
 | 
|
2323  | 
        """
 | 
|
2324  | 
self.pb = pb  | 
|
2325  | 
self.count = 0  | 
|
| 
1596.2.22
by Robert Collins
 Fetch changes to use new pb.  | 
2326  | 
self.total = 4  | 
| 
1556.1.4
by Robert Collins
 Add a new format for what will become knit, and the surrounding logic to upgrade repositories within metadirs, and tests for the same.  | 
2327  | 
        # this is only useful with metadir layouts - separated repo content.
 | 
2328  | 
        # trigger an assertion if not such
 | 
|
2329  | 
repo._format.get_format_string()  | 
|
2330  | 
self.repo_dir = repo.bzrdir  | 
|
2331  | 
self.step('Moving repository to repository.backup')  | 
|
2332  | 
self.repo_dir.transport.move('repository', 'repository.backup')  | 
|
2333  | 
backup_transport = self.repo_dir.transport.clone('repository.backup')  | 
|
| 
1910.2.12
by Aaron Bentley
 Implement knit repo format 2  | 
2334  | 
repo._format.check_conversion_target(self.target_format)  | 
| 
1556.1.4
by Robert Collins
 Add a new format for what will become knit, and the surrounding logic to upgrade repositories within metadirs, and tests for the same.  | 
2335  | 
self.source_repo = repo._format.open(self.repo_dir,  | 
2336  | 
_found=True,  | 
|
2337  | 
_override_transport=backup_transport)  | 
|
2338  | 
self.step('Creating new repository')  | 
|
2339  | 
converted = self.target_format.initialize(self.repo_dir,  | 
|
2340  | 
self.source_repo.is_shared())  | 
|
2341  | 
converted.lock_write()  | 
|
2342  | 
try:  | 
|
2343  | 
self.step('Copying content into repository.')  | 
|
2344  | 
self.source_repo.copy_content_into(converted)  | 
|
2345  | 
finally:  | 
|
2346  | 
converted.unlock()  | 
|
2347  | 
self.step('Deleting old repository content.')  | 
|
2348  | 
self.repo_dir.transport.delete_tree('repository.backup')  | 
|
2349  | 
self.pb.note('repository converted')  | 
|
2350  | 
||
2351  | 
def step(self, message):  | 
|
2352  | 
"""Update the pb by a step."""  | 
|
2353  | 
self.count +=1  | 
|
2354  | 
self.pb.update(message, self.count, self.total)  | 
|
| 
1596.1.1
by Martin Pool
 Use simple xml unescaping rather than importing xml.sax  | 
2355  | 
|
2356  | 
||
| 
1843.2.4
by Aaron Bentley
 Switch to John Meinel's _unescape_xml implementation  | 
2357  | 
_unescape_map = {  | 
2358  | 
'apos':"'",  | 
|
2359  | 
'quot':'"',  | 
|
2360  | 
'amp':'&',  | 
|
2361  | 
'lt':'<',  | 
|
2362  | 
'gt':'>'  | 
|
2363  | 
}
 | 
|
2364  | 
||
2365  | 
||
2366  | 
def _unescaper(match, _map=_unescape_map):  | 
|
| 
2294.1.2
by John Arbash Meinel
 Track down and add tests that all tree.commit() can handle  | 
2367  | 
code = match.group(1)  | 
2368  | 
try:  | 
|
2369  | 
return _map[code]  | 
|
2370  | 
except KeyError:  | 
|
2371  | 
if not code.startswith('#'):  | 
|
2372  | 
            raise
 | 
|
| 
2294.1.10
by John Arbash Meinel
 Switch all apis over to utf8 file ids. All tests pass  | 
2373  | 
return unichr(int(code[1:])).encode('utf8')  | 
| 
1843.2.4
by Aaron Bentley
 Switch to John Meinel's _unescape_xml implementation  | 
2374  | 
|
2375  | 
||
2376  | 
_unescape_re = None  | 
|
2377  | 
||
2378  | 
||
| 
1596.1.1
by Martin Pool
 Use simple xml unescaping rather than importing xml.sax  | 
2379  | 
def _unescape_xml(data):  | 
| 
1843.2.4
by Aaron Bentley
 Switch to John Meinel's _unescape_xml implementation  | 
2380  | 
"""Unescape predefined XML entities in a string of data."""  | 
2381  | 
global _unescape_re  | 
|
2382  | 
if _unescape_re is None:  | 
|
| 
2120.2.1
by John Arbash Meinel
 Remove tabs from source files, and add a test to keep it that way.  | 
2383  | 
_unescape_re = re.compile('\&([^;]*);')  | 
| 
1843.2.4
by Aaron Bentley
 Switch to John Meinel's _unescape_xml implementation  | 
2384  | 
return _unescape_re.sub(_unescaper, data)  |