~bzr-pqm/bzr/bzr.dev

1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
1
# Copyright (C) 2005, 2006 Canonical Ltd
1553.5.70 by Martin Pool
doc
2
#
1 by mbp at sourcefrog
import from baz patch-364
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.
1553.5.70 by Martin Pool
doc
7
#
1 by mbp at sourcefrog
import from baz patch-364
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.
1553.5.70 by Martin Pool
doc
12
#
1 by mbp at sourcefrog
import from baz patch-364
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
17
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
18
from copy import deepcopy
1534.4.2 by Robert Collins
Introduce BranchFormats - factoring out intialisation of Branches.
19
from cStringIO import StringIO
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
20
from unittest import TestSuite
1372 by Martin Pool
- avoid converting inventories to/from StringIO
21
from warnings import warn
1553.5.70 by Martin Pool
doc
22
1 by mbp at sourcefrog
import from baz patch-364
23
import bzrlib
1551.8.4 by Aaron Bentley
Tweak import style
24
from bzrlib import (
1911.2.7 by John Arbash Meinel
[merge] bzr.dev 1924
25
        bzrdir,
26
        cache_utf8,
27
        errors,
28
        lockdir,
29
        osutils,
1551.8.4 by Aaron Bentley
Tweak import style
30
        revision,
1911.2.9 by John Arbash Meinel
Fix accidental import removal
31
        transport,
1551.8.4 by Aaron Bentley
Tweak import style
32
        tree,
33
        ui,
1911.2.7 by John Arbash Meinel
[merge] bzr.dev 1924
34
        urlutils,
1551.8.4 by Aaron Bentley
Tweak import style
35
        )
1534.4.2 by Robert Collins
Introduce BranchFormats - factoring out intialisation of Branches.
36
from bzrlib.config import TreeConfig
1534.4.28 by Robert Collins
first cut at merge from integration.
37
from bzrlib.decorators import needs_read_lock, needs_write_lock
1534.4.2 by Robert Collins
Introduce BranchFormats - factoring out intialisation of Branches.
38
import bzrlib.errors as errors
1767.3.1 by Jelmer Vernooij
Fix missing import of BzrCheckError.
39
from bzrlib.errors import (BzrError, BzrCheckError, DivergedBranches, 
40
                           HistoryMissing, InvalidRevisionId, 
41
                           InvalidRevisionNumber, LockError, NoSuchFile, 
42
                           NoSuchRevision, NoWorkingTree, NotVersionedError,
43
                           NotBranchError, UninitializableFormat, 
44
                           UnlistableStore, UnlistableBranch, 
45
                           )
1553.5.63 by Martin Pool
Lock type is now mandatory for LockableFiles constructor
46
from bzrlib.lockable_files import LockableFiles, TransportLock
1773.4.1 by Martin Pool
Add pyflakes makefile target; fix many warnings
47
from bzrlib.symbol_versioning import (deprecated_function,
48
                                      deprecated_method,
49
                                      DEPRECATED_PARAMETER,
50
                                      deprecated_passed,
1770.2.12 by Aaron Bentley
Merge bzr.dev
51
                                      zero_eight, zero_nine,
1773.4.1 by Martin Pool
Add pyflakes makefile target; fix many warnings
52
                                      )
1685.1.70 by Wouter van Heyst
working on get_parent, set_parent and relative urls, broken
53
from bzrlib.trace import mutter, note
1104 by Martin Pool
- Add a simple UIFactory
54
1094 by Martin Pool
- merge aaron's merge improvements 999..1008
55
1186 by Martin Pool
- start implementing v5 format; Branch refuses to operate on old branches
56
BZR_BRANCH_FORMAT_4 = "Bazaar-NG branch, format 0.0.4\n"
57
BZR_BRANCH_FORMAT_5 = "Bazaar-NG branch, format 5\n"
1429 by Robert Collins
merge in niemeyers prefixed-store patch
58
BZR_BRANCH_FORMAT_6 = "Bazaar-NG branch, format 6\n"
1185.70.3 by Martin Pool
Various updates to make storage branch mergeable:
59
60
61
# TODO: Maybe include checks for common corruption of newlines, etc?
1 by mbp at sourcefrog
import from baz patch-364
62
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
63
# TODO: Some operations like log might retrieve the same revisions
64
# repeatedly to calculate deltas.  We could perhaps have a weakref
1223 by Martin Pool
- store inventories in weave
65
# cache in memory to make this faster.  In general anything can be
1185.65.29 by Robert Collins
Implement final review suggestions.
66
# cached in memory between lock and unlock operations. .. nb thats
67
# what the transaction identity map provides
416 by Martin Pool
- bzr log and bzr root now accept an http URL
68
1442.1.63 by Robert Collins
Remove self.lock_*...finally: self.unlock() dead chickens from branch.py.
69
1 by mbp at sourcefrog
import from baz patch-364
70
######################################################################
71
# branch objects
72
558 by Martin Pool
- All top-level classes inherit from object
73
class Branch(object):
1 by mbp at sourcefrog
import from baz patch-364
74
    """Branch holding a history of revisions.
75
343 by Martin Pool
doc
76
    base
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
77
        Base directory/url of the branch.
78
    """
1534.4.1 by Robert Collins
Allow parameterisation of the branch initialisation for bzrlib.
79
    # this is really an instance variable - FIXME move it there
80
    # - RBC 20060112
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
81
    base = None
82
83
    def __init__(self, *ignored, **ignored_too):
84
        raise NotImplementedError('The Branch class is abstract')
85
1687.1.8 by Robert Collins
Teach Branch about break_lock.
86
    def break_lock(self):
87
        """Break a lock if one is present from another instance.
88
89
        Uses the ui factory to ask for confirmation if the lock may be from
90
        an active process.
91
92
        This will probe the repository for its lock as well.
93
        """
94
        self.control_files.break_lock()
95
        self.repository.break_lock()
1687.1.10 by Robert Collins
Branch.break_lock should handle bound branches too
96
        master = self.get_master_branch()
97
        if master is not None:
98
            master.break_lock()
1687.1.8 by Robert Collins
Teach Branch about break_lock.
99
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
100
    @staticmethod
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
101
    @deprecated_method(zero_eight)
1393.1.2 by Martin Pool
- better representation in Branch factories of opening old formats
102
    def open_downlevel(base):
1534.4.7 by Robert Collins
Move downlevel check up to the Branch.open logic, removing it from the Branch constructor and deprecating relax_version_check to the same.
103
        """Open a branch which may be of an old format."""
104
        return Branch.open(base, _unsupported=True)
1393.1.2 by Martin Pool
- better representation in Branch factories of opening old formats
105
        
106
    @staticmethod
1534.4.7 by Robert Collins
Move downlevel check up to the Branch.open logic, removing it from the Branch constructor and deprecating relax_version_check to the same.
107
    def open(base, _unsupported=False):
1815.1.1 by Jelmer Vernooij
Fix copy-pasted comment.
108
        """Open the branch rooted at base.
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
109
1815.1.1 by Jelmer Vernooij
Fix copy-pasted comment.
110
        For instance, if the branch is at URL/.bzr/branch,
111
        Branch.open(URL) -> a Branch instance.
1534.4.7 by Robert Collins
Move downlevel check up to the Branch.open logic, removing it from the Branch constructor and deprecating relax_version_check to the same.
112
        """
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
113
        control = bzrdir.BzrDir.open(base, _unsupported)
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
114
        return control.open_branch(_unsupported)
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
115
116
    @staticmethod
1185.2.8 by Lalo Martins
creating the new branch constructors
117
    def open_containing(url):
1185.1.41 by Robert Collins
massive patch from Alexander Belchenko - many PEP8 fixes, removes unused function uuid
118
        """Open an existing branch which contains url.
119
        
120
        This probes for a branch at url, and searches upwards from there.
1185.17.2 by Martin Pool
[pick] avoid problems in fetching when .bzr is not listable
121
122
        Basically we keep looking up until we find the control directory or
123
        run into the root.  If there isn't one, raises NotBranchError.
1534.4.22 by Robert Collins
update TODOs and move abstract methods that were misplaced on BzrBranchFormat5 to Branch.
124
        If there is one and it is either an unrecognised format or an unsupported 
125
        format, UnknownFormatError or UnsupportedFormatError are raised.
1442.1.64 by Robert Collins
Branch.open_containing now returns a tuple (Branch, relative-path).
126
        If there is one, it is returned, along with the unused portion of url.
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
127
        """
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
128
        control, relpath = bzrdir.BzrDir.open_containing(url)
129
        return control.open_branch(), relpath
1534.4.1 by Robert Collins
Allow parameterisation of the branch initialisation for bzrlib.
130
131
    @staticmethod
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
132
    @deprecated_function(zero_eight)
133
    def initialize(base):
134
        """Create a new working tree and branch, rooted at 'base' (url)
1551.1.2 by Martin Pool
Deprecation warnings for popular APIs that will change in BzrDir
135
136
        NOTE: This will soon be deprecated in favour of creation
137
        through a BzrDir.
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
138
        """
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.
139
        return bzrdir.BzrDir.create_standalone_workingtree(base).branch
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
140
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
141
    def setup_caching(self, cache_root):
142
        """Subclasses that care about caching should override this, and set
143
        up cached stores located under cache_root.
144
        """
1185.70.6 by Martin Pool
review fixups from John
145
        # seems to be unused, 2006-01-13 mbp
146
        warn('%s is deprecated' % self.setup_caching)
1400.1.1 by Robert Collins
implement a basic test for the ui branch command from http servers
147
        self.cache_root = cache_root
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
148
1770.2.9 by Aaron Bentley
Add Branch.get_config, update BranchConfig() callers
149
    def get_config(self):
150
        return bzrlib.config.BranchConfig(self)
151
1185.35.11 by Aaron Bentley
Added support for branch nicks
152
    def _get_nick(self):
1770.2.9 by Aaron Bentley
Add Branch.get_config, update BranchConfig() callers
153
        return self.get_config().get_nickname()
1185.35.11 by Aaron Bentley
Added support for branch nicks
154
155
    def _set_nick(self, nick):
1770.2.9 by Aaron Bentley
Add Branch.get_config, update BranchConfig() callers
156
        self.get_config().set_user_option('nickname', nick)
1185.35.11 by Aaron Bentley
Added support for branch nicks
157
158
    nick = property(_get_nick, _set_nick)
1694.2.6 by Martin Pool
[merge] bzr.dev
159
160
    def is_locked(self):
161
        raise NotImplementedError('is_locked is abstract')
162
1495.1.2 by Jelmer Vernooij
Move some generic methods of NativeBranch to Branch.
163
    def lock_write(self):
164
        raise NotImplementedError('lock_write is abstract')
1694.2.6 by Martin Pool
[merge] bzr.dev
165
1495.1.2 by Jelmer Vernooij
Move some generic methods of NativeBranch to Branch.
166
    def lock_read(self):
167
        raise NotImplementedError('lock_read is abstract')
168
169
    def unlock(self):
170
        raise NotImplementedError('unlock is abstract')
171
1185.70.3 by Martin Pool
Various updates to make storage branch mergeable:
172
    def peek_lock_mode(self):
173
        """Return lock mode for the Branch: 'r', 'w' or None"""
1185.70.6 by Martin Pool
review fixups from John
174
        raise NotImplementedError(self.peek_lock_mode)
1185.70.3 by Martin Pool
Various updates to make storage branch mergeable:
175
1694.2.6 by Martin Pool
[merge] bzr.dev
176
    def get_physical_lock_status(self):
177
        raise NotImplementedError('get_physical_lock_status is abstract')
178
1495.1.2 by Jelmer Vernooij
Move some generic methods of NativeBranch to Branch.
179
    def abspath(self, name):
180
        """Return absolute filename for something in the branch
181
        
182
        XXX: Robert Collins 20051017 what is this used for? why is it a branch
183
        method and not a tree method.
184
        """
185
        raise NotImplementedError('abspath is abstract')
186
1587.1.6 by Robert Collins
Update bound branch implementation to 0.8.
187
    def bind(self, other):
188
        """Bind the local branch the other branch.
189
190
        :param other: The branch to bind to
191
        :type other: Branch
192
        """
193
        raise errors.UpgradeRequired(self.base)
194
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.
195
    @needs_write_lock
196
    def fetch(self, from_branch, last_revision=None, pb=None):
197
        """Copy revisions from from_branch into this branch.
198
199
        :param from_branch: Where to copy from.
200
        :param last_revision: What revision to stop at (None for at the end
201
                              of the branch.
202
        :param pb: An optional progress bar to use.
203
204
        Returns the copied revision count and the failed revisions in a tuple:
205
        (copied, failures).
206
        """
207
        if self.base == from_branch.base:
1558.4.11 by Aaron Bentley
Allow merge against self, make fetching self a noop
208
            return (0, [])
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.
209
        if pb is None:
1773.4.1 by Martin Pool
Add pyflakes makefile target; fix many warnings
210
            nested_pb = ui.ui_factory.nested_progress_bar()
1594.1.3 by Robert Collins
Fixup pb usage to use nested_progress_bar.
211
            pb = nested_pb
212
        else:
213
            nested_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.
214
215
        from_branch.lock_read()
216
        try:
217
            if last_revision is None:
218
                pb.update('get source history')
219
                from_history = from_branch.revision_history()
220
                if from_history:
221
                    last_revision = from_history[-1]
222
                else:
223
                    # no history in the source branch
1773.4.2 by Martin Pool
Cleanup of imports; undeprecate all_revision_ids()
224
                    last_revision = revision.NULL_REVISION
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.
225
            return self.repository.fetch(from_branch.repository,
226
                                         revision_id=last_revision,
1594.1.3 by Robert Collins
Fixup pb usage to use nested_progress_bar.
227
                                         pb=nested_pb)
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.
228
        finally:
1594.1.3 by Robert Collins
Fixup pb usage to use nested_progress_bar.
229
            if nested_pb is not None:
230
                nested_pb.finished()
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.
231
            from_branch.unlock()
232
1587.1.6 by Robert Collins
Update bound branch implementation to 0.8.
233
    def get_bound_location(self):
1558.7.6 by Aaron Bentley
Fixed typo (Olaf Conradi)
234
        """Return the URL of the branch we are bound to.
1587.1.6 by Robert Collins
Update bound branch implementation to 0.8.
235
236
        Older format branches cannot bind, please be sure to use a metadir
237
        branch.
238
        """
239
        return None
1740.3.1 by Jelmer Vernooij
Introduce and use CommitBuilder objects.
240
    
1740.3.7 by Jelmer Vernooij
Move committer, log, revprops, timestamp and timezone to CommitBuilder.
241
    def get_commit_builder(self, parents, config=None, timestamp=None, 
242
                           timezone=None, committer=None, revprops=None, 
243
                           revision_id=None):
244
        """Obtain a CommitBuilder for this branch.
245
        
246
        :param parents: Revision ids of the parents of the new revision.
247
        :param config: Optional configuration to use.
248
        :param timestamp: Optional timestamp recorded for commit.
249
        :param timezone: Optional timezone for timestamp.
250
        :param committer: Optional committer to set for commit.
251
        :param revprops: Optional dictionary of revision properties.
252
        :param revision_id: Optional revision id.
253
        """
254
255
        if config is None:
1770.2.9 by Aaron Bentley
Add Branch.get_config, update BranchConfig() callers
256
            config = self.get_config()
1740.3.7 by Jelmer Vernooij
Move committer, log, revprops, timestamp and timezone to CommitBuilder.
257
        
258
        return self.repository.get_commit_builder(self, parents, config, 
259
            timestamp, timezone, committer, revprops, revision_id)
1587.1.6 by Robert Collins
Update bound branch implementation to 0.8.
260
261
    def get_master_branch(self):
262
        """Return the branch we are bound to.
263
        
264
        :return: Either a Branch, or None
265
        """
266
        return None
1495.1.2 by Jelmer Vernooij
Move some generic methods of NativeBranch to Branch.
267
1770.3.2 by Jelmer Vernooij
Move BzrBranch.get_revision_delta() to Branch.get_revision_delta() as it is generic.
268
    def get_revision_delta(self, revno):
269
        """Return the delta for one revision.
270
271
        The delta is relative to its mainline predecessor, or the
272
        empty tree for revision 1.
273
        """
274
        assert isinstance(revno, int)
275
        rh = self.revision_history()
276
        if not (1 <= revno <= len(rh)):
277
            raise InvalidRevisionNumber(revno)
278
        return self.repository.get_revision_delta(rh[revno-1])
279
1495.1.2 by Jelmer Vernooij
Move some generic methods of NativeBranch to Branch.
280
    def get_root_id(self):
281
        """Return the id of this branches root"""
282
        raise NotImplementedError('get_root_id is abstract')
283
1185.50.9 by John Arbash Meinel
[bug 3632] Matthieu Moy- bzr cat should default to last revision
284
    def print_file(self, file, revision_id):
1495.1.2 by Jelmer Vernooij
Move some generic methods of NativeBranch to Branch.
285
        """Print `file` to stdout."""
286
        raise NotImplementedError('print_file is abstract')
287
288
    def append_revision(self, *revision_ids):
289
        raise NotImplementedError('append_revision is abstract')
290
291
    def set_revision_history(self, rev_history):
292
        raise NotImplementedError('set_revision_history is abstract')
293
294
    def revision_history(self):
295
        """Return sequence of revision hashes on to this branch."""
296
        raise NotImplementedError('revision_history is abstract')
297
298
    def revno(self):
299
        """Return current revision number for this branch.
300
301
        That is equivalent to the number of revisions committed to
302
        this branch.
303
        """
304
        return len(self.revision_history())
305
1587.1.6 by Robert Collins
Update bound branch implementation to 0.8.
306
    def unbind(self):
307
        """Older format branches cannot bind or unbind."""
308
        raise errors.UpgradeRequired(self.base)
309
1495.1.2 by Jelmer Vernooij
Move some generic methods of NativeBranch to Branch.
310
    def last_revision(self):
1819.1.7 by Martin Pool
Fix up code to get revision_id of bzr for benchmark log file
311
        """Return last revision id, or None"""
1495.1.2 by Jelmer Vernooij
Move some generic methods of NativeBranch to Branch.
312
        ph = self.revision_history()
313
        if ph:
314
            return ph[-1]
315
        else:
316
            return None
317
1505.1.21 by John Arbash Meinel
Removing changes for bound branch by invading set-revision-history.
318
    def missing_revisions(self, other, stop_revision=None):
1495.1.2 by Jelmer Vernooij
Move some generic methods of NativeBranch to Branch.
319
        """Return a list of new revisions that would perfectly fit.
320
        
321
        If self and other have not diverged, return a list of the revisions
322
        present in other, but missing from self.
323
        """
324
        self_history = self.revision_history()
325
        self_len = len(self_history)
1505.1.21 by John Arbash Meinel
Removing changes for bound branch by invading set-revision-history.
326
        other_history = other.revision_history()
1495.1.2 by Jelmer Vernooij
Move some generic methods of NativeBranch to Branch.
327
        other_len = len(other_history)
328
        common_index = min(self_len, other_len) -1
329
        if common_index >= 0 and \
330
            self_history[common_index] != other_history[common_index]:
331
            raise DivergedBranches(self, other)
332
333
        if stop_revision is None:
334
            stop_revision = other_len
335
        else:
336
            assert isinstance(stop_revision, int)
337
            if stop_revision > other_len:
1773.4.1 by Martin Pool
Add pyflakes makefile target; fix many warnings
338
                raise errors.NoSuchRevision(self, stop_revision)
1495.1.2 by Jelmer Vernooij
Move some generic methods of NativeBranch to Branch.
339
        return other_history[self_len:stop_revision]
1185.66.1 by Aaron Bentley
Merged from mainline
340
1505.1.21 by John Arbash Meinel
Removing changes for bound branch by invading set-revision-history.
341
    def update_revisions(self, other, stop_revision=None):
1505.1.16 by John Arbash Meinel
[merge] robertc's integration, updated tests to check for retcode=3
342
        """Pull in new perfect-fit revisions.
343
344
        :param other: Another Branch to pull from
345
        :param stop_revision: Updated until the given revision
346
        :return: None
347
        """
1495.1.2 by Jelmer Vernooij
Move some generic methods of NativeBranch to Branch.
348
        raise NotImplementedError('update_revisions is abstract')
349
350
    def revision_id_to_revno(self, revision_id):
351
        """Given a revision id, return its revno"""
352
        if revision_id is None:
353
            return 0
354
        history = self.revision_history()
355
        try:
356
            return history.index(revision_id) + 1
357
        except ValueError:
358
            raise bzrlib.errors.NoSuchRevision(self, revision_id)
359
360
    def get_rev_id(self, revno, history=None):
361
        """Find the revision id of the specified revno."""
362
        if revno == 0:
363
            return None
364
        if history is None:
365
            history = self.revision_history()
366
        elif revno <= 0 or revno > len(history):
367
            raise bzrlib.errors.NoSuchRevision(self, revno)
368
        return history[revno - 1]
369
1185.76.1 by Erik BÃ¥gfors
Support for --revision in pull
370
    def pull(self, source, overwrite=False, stop_revision=None):
1495.1.2 by Jelmer Vernooij
Move some generic methods of NativeBranch to Branch.
371
        raise NotImplementedError('pull is abstract')
372
373
    def basis_tree(self):
1852.5.1 by Robert Collins
Deprecate EmptyTree in favour of using Repository.revision_tree.
374
        """Return `Tree` object for last revision."""
1185.67.2 by Aaron Bentley
Renamed Branch.storage to Branch.repository
375
        return self.repository.revision_tree(self.last_revision())
1495.1.2 by Jelmer Vernooij
Move some generic methods of NativeBranch to Branch.
376
377
    def rename_one(self, from_rel, to_rel):
378
        """Rename one file.
379
380
        This can change the directory or the filename or both.
381
        """
382
        raise NotImplementedError('rename_one is abstract')
383
384
    def move(self, from_paths, to_name):
385
        """Rename files.
386
387
        to_name must exist as a versioned directory.
388
389
        If to_name exists and is a directory, the files are moved into
390
        it, keeping their old names.  If it is a directory, 
391
392
        Note that to_name is only the last component of the new name;
393
        this doesn't change the directory.
394
395
        This returns a list of (from_path, to_path) pairs for each
396
        entry that is moved.
397
        """
398
        raise NotImplementedError('move is abstract')
399
400
    def get_parent(self):
401
        """Return the parent location of the branch.
402
403
        This is the default location for push/pull/missing.  The usual
404
        pattern is that the user can override it by specifying a
405
        location.
406
        """
407
        raise NotImplementedError('get_parent is abstract')
408
1804.1.1 by Aaron Bentley
Add support for submit location to bundles
409
    def get_submit_branch(self):
410
        """Return the submit location of the branch.
411
412
        This is the default location for bundle.  The usual
413
        pattern is that the user can override it by specifying a
414
        location.
415
        """
416
        return self.get_config().get_user_option('submit_branch')
417
418
    def set_submit_branch(self, location):
419
        """Return the submit location of the branch.
420
421
        This is the default location for bundle.  The usual
422
        pattern is that the user can override it by specifying a
423
        location.
424
        """
425
        self.get_config().set_user_option('submit_branch', location)
426
1495.1.2 by Jelmer Vernooij
Move some generic methods of NativeBranch to Branch.
427
    def get_push_location(self):
428
        """Return the None or the location to push this branch to."""
429
        raise NotImplementedError('get_push_location is abstract')
430
431
    def set_push_location(self, location):
432
        """Set a new push location for this branch."""
433
        raise NotImplementedError('set_push_location is abstract')
434
435
    def set_parent(self, url):
436
        raise NotImplementedError('set_parent is abstract')
437
1587.1.10 by Robert Collins
update updates working tree and branch together.
438
    @needs_write_lock
439
    def update(self):
440
        """Synchronise this branch with the master branch if any. 
441
442
        :return: None or the last_revision pivoted out during the update.
443
        """
444
        return None
445
1495.1.2 by Jelmer Vernooij
Move some generic methods of NativeBranch to Branch.
446
    def check_revno(self, revno):
447
        """\
448
        Check whether a revno corresponds to any revision.
449
        Zero (the NULL revision) is considered valid.
450
        """
451
        if revno != 0:
452
            self.check_real_revno(revno)
453
            
454
    def check_real_revno(self, revno):
455
        """\
456
        Check whether a revno corresponds to a real revision.
457
        Zero (the NULL revision) is considered invalid
458
        """
459
        if revno < 1 or revno > self.revno():
460
            raise InvalidRevisionNumber(revno)
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.
461
462
    @needs_read_lock
463
    def clone(self, *args, **kwargs):
464
        """Clone this branch into to_bzrdir preserving all semantic values.
465
        
466
        revision_id: if not None, the revision history in the new branch will
467
                     be truncated to end with revision_id.
468
        """
1759.2.1 by Jelmer Vernooij
Fix some types (found using aspell).
469
        # for API compatibility, until 0.8 releases we provide the old api:
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
        # def clone(self, to_location, revision=None, basis_branch=None, to_branch_format=None):
471
        # after 0.8 releases, the *args and **kwargs should be changed:
472
        # def clone(self, to_bzrdir, revision_id=None):
473
        if (kwargs.get('to_location', None) or
474
            kwargs.get('revision', None) or
475
            kwargs.get('basis_branch', None) or
476
            (len(args) and isinstance(args[0], basestring))):
1759.2.1 by Jelmer Vernooij
Fix some types (found using aspell).
477
            # backwards compatibility api:
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.
478
            warn("Branch.clone() has been deprecated for BzrDir.clone() from"
479
                 " bzrlib 0.8.", DeprecationWarning, stacklevel=3)
480
            # get basis_branch
481
            if len(args) > 2:
482
                basis_branch = args[2]
483
            else:
484
                basis_branch = kwargs.get('basis_branch', None)
485
            if basis_branch:
486
                basis = basis_branch.bzrdir
487
            else:
488
                basis = None
489
            # get revision
490
            if len(args) > 1:
491
                revision_id = args[1]
492
            else:
493
                revision_id = kwargs.get('revision', None)
494
            # get location
495
            if len(args):
496
                url = args[0]
497
            else:
498
                # no default to raise if not provided.
499
                url = kwargs.get('to_location')
500
            return self.bzrdir.clone(url,
501
                                     revision_id=revision_id,
502
                                     basis=basis).open_branch()
503
        # new cleaner api.
504
        # generate args by hand 
505
        if len(args) > 1:
506
            revision_id = args[1]
507
        else:
508
            revision_id = kwargs.get('revision_id', None)
509
        if len(args):
510
            to_bzrdir = args[0]
511
        else:
512
            # no default to raise if not provided.
513
            to_bzrdir = kwargs.get('to_bzrdir')
514
        result = self._format.initialize(to_bzrdir)
515
        self.copy_content_into(result, revision_id=revision_id)
516
        return  result
517
518
    @needs_read_lock
519
    def sprout(self, to_bzrdir, revision_id=None):
520
        """Create a new line of development from the branch, into to_bzrdir.
521
        
522
        revision_id: if not None, the revision history in the new branch will
523
                     be truncated to end with revision_id.
524
        """
525
        result = self._format.initialize(to_bzrdir)
526
        self.copy_content_into(result, revision_id=revision_id)
527
        result.set_parent(self.bzrdir.root_transport.base)
528
        return result
529
530
    @needs_read_lock
531
    def copy_content_into(self, destination, revision_id=None):
532
        """Copy the content of self into destination.
533
534
        revision_id: if not None, the revision history in the new branch will
535
                     be truncated to end with revision_id.
536
        """
537
        new_history = self.revision_history()
538
        if revision_id is not None:
1534.4.35 by Robert Collins
Give branch its own basis tree and last_revision methods; deprecated branch.working_tree()
539
            try:
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.
540
                new_history = new_history[:new_history.index(revision_id) + 1]
541
            except ValueError:
542
                rev = self.repository.get_revision(revision_id)
543
                new_history = rev.get_history(self.repository)[1:]
544
        destination.set_revision_history(new_history)
1864.7.2 by John Arbash Meinel
Test that we copy the parent across properly (if it is available)
545
        try:
546
            parent = self.get_parent()
547
        except errors.InaccessibleParent, e:
548
            mutter('parent was not accessible to copy: %s', e)
549
        else:
550
            if parent:
551
                destination.set_parent(parent)
1185.66.1 by Aaron Bentley
Merged from mainline
552
1732.2.4 by Martin Pool
Split check into Branch.check and Repository.check
553
    @needs_read_lock
554
    def check(self):
555
        """Check consistency of the branch.
556
557
        In particular this checks that revisions given in the revision-history
558
        do actually match up in the revision graph, and that they're all 
559
        present in the repository.
1773.4.1 by Martin Pool
Add pyflakes makefile target; fix many warnings
560
        
561
        Callers will typically also want to check the repository.
1732.2.4 by Martin Pool
Split check into Branch.check and Repository.check
562
563
        :return: A BranchCheckResult.
564
        """
565
        mainline_parent_id = None
566
        for revision_id in self.revision_history():
567
            try:
568
                revision = self.repository.get_revision(revision_id)
569
            except errors.NoSuchRevision, e:
1773.4.1 by Martin Pool
Add pyflakes makefile target; fix many warnings
570
                raise errors.BzrCheckError("mainline revision {%s} not in repository"
571
                            % revision_id)
1732.2.4 by Martin Pool
Split check into Branch.check and Repository.check
572
            # In general the first entry on the revision history has no parents.
573
            # But it's not illegal for it to have parents listed; this can happen
574
            # in imports from Arch when the parents weren't reachable.
575
            if mainline_parent_id is not None:
576
                if mainline_parent_id not in revision.parent_ids:
1773.4.1 by Martin Pool
Add pyflakes makefile target; fix many warnings
577
                    raise errors.BzrCheckError("previous revision {%s} not listed among "
1732.2.4 by Martin Pool
Split check into Branch.check and Repository.check
578
                                        "parents of {%s}"
579
                                        % (mainline_parent_id, revision_id))
580
            mainline_parent_id = revision_id
581
        return BranchCheckResult(self)
582
1551.8.5 by Aaron Bentley
Change name to create_checkout
583
    def create_checkout(self, to_location, revision_id=None, 
584
                        lightweight=False):
1551.8.3 by Aaron Bentley
Make create_checkout_convenience a Branch method
585
        """Create a checkout of a branch.
586
        
587
        :param to_location: The url to produce the checkout at
588
        :param revision_id: The revision to check out
1551.8.5 by Aaron Bentley
Change name to create_checkout
589
        :param lightweight: If True, produce a lightweight checkout, otherwise,
1551.8.3 by Aaron Bentley
Make create_checkout_convenience a Branch method
590
        produce a bound branch (heavyweight checkout)
591
        :return: The tree of the created checkout
592
        """
593
        if lightweight:
594
            t = transport.get_transport(to_location)
595
            try:
596
                t.mkdir('.')
597
            except errors.FileExists:
598
                pass
599
            checkout = bzrdir.BzrDirMetaFormat1().initialize_on_transport(t)
600
            BranchReferenceFormat().initialize(checkout, self)
601
        else:
602
            checkout_branch = bzrdir.BzrDir.create_branch_convenience(
603
                to_location, force_new_tree=False)
604
            checkout = checkout_branch.bzrdir
605
            checkout_branch.bind(self)
606
            if revision_id is not None:
607
                rh = checkout_branch.revision_history()
608
                new_rh = rh[:rh.index(revision_id) + 1]
609
                checkout_branch.set_revision_history(new_rh)
610
        return checkout.create_workingtree(revision_id)
611
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
612
613
class BranchFormat(object):
1534.4.2 by Robert Collins
Introduce BranchFormats - factoring out intialisation of Branches.
614
    """An encapsulation of the initialization and open routines for a format.
615
616
    Formats provide three things:
617
     * An initialization routine,
618
     * a format string,
619
     * an open routine.
620
621
    Formats are placed in an dict by their format string for reference 
622
    during branch opening. Its not required that these be instances, they
623
    can be classes themselves with class methods - it simply depends on 
624
    whether state is needed for a given format or not.
625
626
    Once a format is deprecated, just deprecate the initialize and open
627
    methods on the format class. Do not deprecate the object, as the 
628
    object will be created every time regardless.
629
    """
630
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
631
    _default_format = None
632
    """The default format used for new branches."""
633
1534.4.2 by Robert Collins
Introduce BranchFormats - factoring out intialisation of Branches.
634
    _formats = {}
635
    """The known formats."""
636
637
    @classmethod
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
638
    def find_format(klass, a_bzrdir):
639
        """Return the format for the branch object in a_bzrdir."""
640
        try:
641
            transport = a_bzrdir.get_branch_transport(None)
642
            format_string = transport.get("format").read()
643
            return klass._formats[format_string]
644
        except NoSuchFile:
645
            raise NotBranchError(path=transport.base)
646
        except KeyError:
1740.5.6 by Martin Pool
Clean up many exception classes.
647
            raise errors.UnknownFormatError(format=format_string)
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
648
649
    @classmethod
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
650
    def get_default_format(klass):
651
        """Return the current default format."""
652
        return klass._default_format
1534.4.2 by Robert Collins
Introduce BranchFormats - factoring out intialisation of Branches.
653
654
    def get_format_string(self):
655
        """Return the ASCII format string that identifies this format."""
656
        raise NotImplementedError(self.get_format_string)
657
1624.3.19 by Olaf Conradi
New call get_format_description to give a user-friendly description of a
658
    def get_format_description(self):
659
        """Return the short format description for this format."""
660
        raise NotImplementedError(self.get_format_string)
661
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
662
    def initialize(self, a_bzrdir):
663
        """Create a branch of this format in a_bzrdir."""
1759.2.1 by Jelmer Vernooij
Fix some types (found using aspell).
664
        raise NotImplementedError(self.initialize)
1534.4.2 by Robert Collins
Introduce BranchFormats - factoring out intialisation of Branches.
665
1534.4.7 by Robert Collins
Move downlevel check up to the Branch.open logic, removing it from the Branch constructor and deprecating relax_version_check to the same.
666
    def is_supported(self):
667
        """Is this format supported?
668
669
        Supported formats can be initialized and opened.
670
        Unsupported formats may not support initialization or committing or 
671
        some other features depending on the reason for not being supported.
672
        """
673
        return True
674
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
675
    def open(self, a_bzrdir, _found=False):
676
        """Return the branch object for a_bzrdir
677
678
        _found is a private parameter, do not use it. It is used to indicate
679
               if format probing has already be done.
680
        """
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
681
        raise NotImplementedError(self.open)
1534.4.2 by Robert Collins
Introduce BranchFormats - factoring out intialisation of Branches.
682
683
    @classmethod
684
    def register_format(klass, format):
685
        klass._formats[format.get_format_string()] = format
686
1534.4.7 by Robert Collins
Move downlevel check up to the Branch.open logic, removing it from the Branch constructor and deprecating relax_version_check to the same.
687
    @classmethod
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
688
    def set_default_format(klass, format):
689
        klass._default_format = format
690
691
    @classmethod
1534.4.7 by Robert Collins
Move downlevel check up to the Branch.open logic, removing it from the Branch constructor and deprecating relax_version_check to the same.
692
    def unregister_format(klass, format):
693
        assert klass._formats[format.get_format_string()] is format
694
        del klass._formats[format.get_format_string()]
695
1553.4.8 by Michael Ellerman
Define __str__ for BranchFormat, just return the format string with the
696
    def __str__(self):
697
        return self.get_format_string().rstrip()
698
1534.4.2 by Robert Collins
Introduce BranchFormats - factoring out intialisation of Branches.
699
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
700
class BzrBranchFormat4(BranchFormat):
1534.4.2 by Robert Collins
Introduce BranchFormats - factoring out intialisation of Branches.
701
    """Bzr branch format 4.
702
703
    This format has:
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
704
     - a revision-history file.
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
705
     - a branch-lock lock file [ to be shared with the bzrdir ]
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
706
    """
707
1624.3.19 by Olaf Conradi
New call get_format_description to give a user-friendly description of a
708
    def get_format_description(self):
709
        """See BranchFormat.get_format_description()."""
710
        return "Branch format 4"
711
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
712
    def initialize(self, a_bzrdir):
713
        """Create a branch of this format in a_bzrdir."""
714
        mutter('creating branch in %s', a_bzrdir.transport.base)
715
        branch_transport = a_bzrdir.get_branch_transport(self)
716
        utf8_files = [('revision-history', ''),
717
                      ('branch-name', ''),
718
                      ]
1553.5.63 by Martin Pool
Lock type is now mandatory for LockableFiles constructor
719
        control_files = LockableFiles(branch_transport, 'branch-lock',
720
                                      TransportLock)
721
        control_files.create_lock()
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
722
        control_files.lock_write()
723
        try:
724
            for file, content in utf8_files:
725
                control_files.put_utf8(file, content)
726
        finally:
727
            control_files.unlock()
728
        return self.open(a_bzrdir, _found=True)
729
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
730
    def __init__(self):
731
        super(BzrBranchFormat4, self).__init__()
732
        self._matchingbzrdir = bzrdir.BzrDirFormat6()
733
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
734
    def open(self, a_bzrdir, _found=False):
735
        """Return the branch object for a_bzrdir
736
737
        _found is a private parameter, do not use it. It is used to indicate
738
               if format probing has already be done.
739
        """
740
        if not _found:
741
            # we are being called directly and must probe.
742
            raise NotImplementedError
743
        return BzrBranch(_format=self,
1534.5.3 by Robert Collins
Make format 4/5/6 branches share a single LockableFiles instance across wt/branch/repository.
744
                         _control_files=a_bzrdir._control_files,
1534.6.4 by Robert Collins
Creating or opening a branch will use the repository if the format supports that.
745
                         a_bzrdir=a_bzrdir,
746
                         _repository=a_bzrdir.open_repository())
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
747
1553.4.8 by Michael Ellerman
Define __str__ for BranchFormat, just return the format string with the
748
    def __str__(self):
749
        return "Bazaar-NG branch format 4"
750
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
751
752
class BzrBranchFormat5(BranchFormat):
753
    """Bzr branch format 5.
754
755
    This format has:
756
     - a revision-history file.
757
     - a format string
1553.5.71 by Martin Pool
Change branch format 5 to use LockDirs, not transport locks
758
     - a lock dir guarding the branch itself
759
     - all of this stored in a branch/ subdirectory
1534.6.4 by Robert Collins
Creating or opening a branch will use the repository if the format supports that.
760
     - works with shared repositories.
1553.5.71 by Martin Pool
Change branch format 5 to use LockDirs, not transport locks
761
762
    This format is new in bzr 0.8.
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
763
    """
764
765
    def get_format_string(self):
766
        """See BranchFormat.get_format_string()."""
767
        return "Bazaar-NG branch format 5\n"
1624.3.19 by Olaf Conradi
New call get_format_description to give a user-friendly description of a
768
769
    def get_format_description(self):
770
        """See BranchFormat.get_format_description()."""
771
        return "Branch format 5"
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
772
        
773
    def initialize(self, a_bzrdir):
774
        """Create a branch of this format in a_bzrdir."""
1553.5.71 by Martin Pool
Change branch format 5 to use LockDirs, not transport locks
775
        mutter('creating branch %r in %s', self, a_bzrdir.transport.base)
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
776
        branch_transport = a_bzrdir.get_branch_transport(self)
777
        utf8_files = [('revision-history', ''),
778
                      ('branch-name', ''),
779
                      ]
1773.4.2 by Martin Pool
Cleanup of imports; undeprecate all_revision_ids()
780
        control_files = LockableFiles(branch_transport, 'lock', lockdir.LockDir)
1553.5.63 by Martin Pool
Lock type is now mandatory for LockableFiles constructor
781
        control_files.create_lock()
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
782
        control_files.lock_write()
783
        control_files.put_utf8('format', self.get_format_string())
784
        try:
785
            for file, content in utf8_files:
786
                control_files.put_utf8(file, content)
787
        finally:
788
            control_files.unlock()
789
        return self.open(a_bzrdir, _found=True, )
790
791
    def __init__(self):
792
        super(BzrBranchFormat5, self).__init__()
793
        self._matchingbzrdir = bzrdir.BzrDirMetaFormat1()
794
795
    def open(self, a_bzrdir, _found=False):
796
        """Return the branch object for a_bzrdir
797
798
        _found is a private parameter, do not use it. It is used to indicate
799
               if format probing has already be done.
800
        """
801
        if not _found:
802
            format = BranchFormat.find_format(a_bzrdir)
803
            assert format.__class__ == self.__class__
804
        transport = a_bzrdir.get_branch_transport(None)
1773.4.2 by Martin Pool
Cleanup of imports; undeprecate all_revision_ids()
805
        control_files = LockableFiles(transport, 'lock', lockdir.LockDir)
1587.1.6 by Robert Collins
Update bound branch implementation to 0.8.
806
        return BzrBranch5(_format=self,
807
                          _control_files=control_files,
808
                          a_bzrdir=a_bzrdir,
809
                          _repository=a_bzrdir.find_repository())
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
810
1587.1.14 by Robert Collins
Make bound branch creation happen via 'checkout'
811
    def __str__(self):
812
        return "Bazaar-NG Metadir branch format 5"
813
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
814
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.
815
class BranchReferenceFormat(BranchFormat):
816
    """Bzr branch reference format.
817
818
    Branch references are used in implementing checkouts, they
819
    act as an alias to the real branch which is at some other url.
820
821
    This format has:
822
     - A location file
823
     - a format string
824
    """
825
826
    def get_format_string(self):
827
        """See BranchFormat.get_format_string()."""
828
        return "Bazaar-NG Branch Reference Format 1\n"
1624.3.19 by Olaf Conradi
New call get_format_description to give a user-friendly description of a
829
830
    def get_format_description(self):
831
        """See BranchFormat.get_format_description()."""
832
        return "Checkout reference format 1"
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.
833
        
834
    def initialize(self, a_bzrdir, target_branch=None):
835
        """Create a branch of this format in a_bzrdir."""
836
        if target_branch is None:
837
            # this format does not implement branch itself, thus the implicit
838
            # creation contract must see it as uninitializable
839
            raise errors.UninitializableFormat(self)
840
        mutter('creating branch reference in %s', a_bzrdir.transport.base)
841
        branch_transport = a_bzrdir.get_branch_transport(self)
842
        # FIXME rbc 20060209 one j-a-ms encoding branch lands this str() cast is not needed.
843
        branch_transport.put('location', StringIO(str(target_branch.bzrdir.root_transport.base)))
844
        branch_transport.put('format', StringIO(self.get_format_string()))
845
        return self.open(a_bzrdir, _found=True)
846
847
    def __init__(self):
848
        super(BranchReferenceFormat, self).__init__()
849
        self._matchingbzrdir = bzrdir.BzrDirMetaFormat1()
850
851
    def _make_reference_clone_function(format, a_branch):
852
        """Create a clone() routine for a branch dynamically."""
853
        def clone(to_bzrdir, revision_id=None):
854
            """See Branch.clone()."""
855
            return format.initialize(to_bzrdir, a_branch)
856
            # cannot obey revision_id limits when cloning a reference ...
857
            # FIXME RBC 20060210 either nuke revision_id for clone, or
858
            # emit some sort of warning/error to the caller ?!
859
        return clone
860
861
    def open(self, a_bzrdir, _found=False):
862
        """Return the branch that the branch reference in a_bzrdir points at.
863
864
        _found is a private parameter, do not use it. It is used to indicate
865
               if format probing has already be done.
866
        """
867
        if not _found:
868
            format = BranchFormat.find_format(a_bzrdir)
869
            assert format.__class__ == self.__class__
870
        transport = a_bzrdir.get_branch_transport(None)
871
        real_bzrdir = bzrdir.BzrDir.open(transport.get('location').read())
872
        result = real_bzrdir.open_branch()
873
        # this changes the behaviour of result.clone to create a new reference
874
        # rather than a copy of the content of the branch.
875
        # I did not use a proxy object because that needs much more extensive
876
        # testing, and we are only changing one behaviour at the moment.
877
        # If we decide to alter more behaviours - i.e. the implicit nickname
878
        # then this should be refactored to introduce a tested proxy branch
879
        # and a subclass of that for use in overriding clone() and ....
880
        # - RBC 20060210
881
        result.clone = self._make_reference_clone_function(result)
882
        return result
883
884
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
885
# formats which have no format string are not discoverable
886
# and not independently creatable, so are not registered.
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
887
__default_format = BzrBranchFormat5()
888
BranchFormat.register_format(__default_format)
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.
889
BranchFormat.register_format(BranchReferenceFormat())
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
890
BranchFormat.set_default_format(__default_format)
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
891
_legacy_formats = [BzrBranchFormat4(),
892
                   ]
1534.4.5 by Robert Collins
Turn branch format.open into a factory.
893
1495.1.5 by Jelmer Vernooij
Rename NativeBranch -> BzrBranch
894
class BzrBranch(Branch):
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
895
    """A branch stored in the actual filesystem.
896
897
    Note that it's "local" in the context of the filesystem; it doesn't
898
    really matter if it's on an nfs/smb/afs/coda/... share, as long as
899
    it's writable, and can be accessed via the normal filesystem API.
1 by mbp at sourcefrog
import from baz patch-364
900
    """
353 by Martin Pool
- Per-branch locks in read and write modes.
901
    
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
902
    def __init__(self, transport=DEPRECATED_PARAMETER, init=DEPRECATED_PARAMETER,
1534.4.32 by Robert Collins
Rename deprecated_nonce to DEPRECATED_PARAMETER
903
                 relax_version_check=DEPRECATED_PARAMETER, _format=None,
1534.6.4 by Robert Collins
Creating or opening a branch will use the repository if the format supports that.
904
                 _control_files=None, a_bzrdir=None, _repository=None):
1 by mbp at sourcefrog
import from baz patch-364
905
        """Create new branch object at a particular location.
906
907.1.2 by John Arbash Meinel
Working on making Branch() do all of it's work over a Transport.
907
        transport -- A Transport object, defining how to access files.
62 by mbp at sourcefrog
- new find_branch_root function; based on suggestion from aaron
908
        
254 by Martin Pool
- Doc cleanups from Magnus Therning
909
        init -- If True, create new control files in a previously
1 by mbp at sourcefrog
import from baz patch-364
910
             unversioned directory.  If False, the branch must already
911
             be versioned.
912
1293 by Martin Pool
- add Branch constructor option to relax version check
913
        relax_version_check -- If true, the usual check for the branch
914
            version is not applied.  This is intended only for
915
            upgrade/recovery type use; it's not guaranteed that
916
            all operations will work on old format branches.
1 by mbp at sourcefrog
import from baz patch-364
917
        """
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
918
        if a_bzrdir is None:
919
            self.bzrdir = bzrdir.BzrDir.open(transport.base)
920
        else:
921
            self.bzrdir = a_bzrdir
922
        self._transport = self.bzrdir.transport.clone('..')
1534.4.28 by Robert Collins
first cut at merge from integration.
923
        self._base = self._transport.base
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
924
        self._format = _format
1534.4.28 by Robert Collins
first cut at merge from integration.
925
        if _control_files is None:
1773.4.1 by Martin Pool
Add pyflakes makefile target; fix many warnings
926
            raise ValueError('BzrBranch _control_files is None')
1534.4.28 by Robert Collins
first cut at merge from integration.
927
        self.control_files = _control_files
1534.4.2 by Robert Collins
Introduce BranchFormats - factoring out intialisation of Branches.
928
        if deprecated_passed(init):
929
            warn("BzrBranch.__init__(..., init=XXX): The init parameter is "
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
930
                 "deprecated as of bzr 0.8. Please use Branch.create().",
931
                 DeprecationWarning,
932
                 stacklevel=2)
1534.4.2 by Robert Collins
Introduce BranchFormats - factoring out intialisation of Branches.
933
            if init:
934
                # this is slower than before deprecation, oh well never mind.
935
                # -> its deprecated.
936
                self._initialize(transport.base)
1534.4.28 by Robert Collins
first cut at merge from integration.
937
        self._check_format(_format)
1534.4.7 by Robert Collins
Move downlevel check up to the Branch.open logic, removing it from the Branch constructor and deprecating relax_version_check to the same.
938
        if deprecated_passed(relax_version_check):
939
            warn("BzrBranch.__init__(..., relax_version_check=XXX_: The "
940
                 "relax_version_check parameter is deprecated as of bzr 0.8. "
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
941
                 "Please use BzrDir.open_downlevel, or a BzrBranchFormat's "
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
942
                 "open() method.",
943
                 DeprecationWarning,
944
                 stacklevel=2)
1534.4.7 by Robert Collins
Move downlevel check up to the Branch.open logic, removing it from the Branch constructor and deprecating relax_version_check to the same.
945
            if (not relax_version_check
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
946
                and not self._format.is_supported()):
1740.5.6 by Martin Pool
Clean up many exception classes.
947
                raise errors.UnsupportedFormatError(format=fmt)
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
948
        if deprecated_passed(transport):
949
            warn("BzrBranch.__init__(transport=XXX...): The transport "
950
                 "parameter is deprecated as of bzr 0.8. "
951
                 "Please use Branch.open, or bzrdir.open_branch().",
952
                 DeprecationWarning,
953
                 stacklevel=2)
1534.6.4 by Robert Collins
Creating or opening a branch will use the repository if the format supports that.
954
        self.repository = _repository
1534.4.1 by Robert Collins
Allow parameterisation of the branch initialisation for bzrlib.
955
1 by mbp at sourcefrog
import from baz patch-364
956
    def __str__(self):
1185.65.11 by Robert Collins
Disable inheritance for getting at LockableFiles, rather use composition.
957
        return '%s(%r)' % (self.__class__.__name__, self.base)
1 by mbp at sourcefrog
import from baz patch-364
958
959
    __repr__ = __str__
960
578 by Martin Pool
- start to move toward Branch.lock and unlock methods,
961
    def __del__(self):
907.1.23 by John Arbash Meinel
Branch objects now automatically create Cached stores if the protocol is_remote.
962
        # TODO: It might be best to do this somewhere else,
963
        # but it is nice for a Branch object to automatically
964
        # cache it's information.
965
        # Alternatively, we could have the Transport objects cache requests
966
        # See the earlier discussion about how major objects (like Branch)
967
        # should never expect their __del__ function to run.
1185.70.6 by Martin Pool
review fixups from John
968
        # XXX: cache_root seems to be unused, 2006-01-13 mbp
1185.11.9 by John Arbash Meinel
Most tests pass, some problems with unavailable socket recv
969
        if hasattr(self, 'cache_root') and self.cache_root is not None:
907.1.23 by John Arbash Meinel
Branch objects now automatically create Cached stores if the protocol is_remote.
970
            try:
1773.4.2 by Martin Pool
Cleanup of imports; undeprecate all_revision_ids()
971
                osutils.rmtree(self.cache_root)
907.1.23 by John Arbash Meinel
Branch objects now automatically create Cached stores if the protocol is_remote.
972
            except:
973
                pass
974
            self.cache_root = None
975
907.1.17 by John Arbash Meinel
Adding a Branch.base property, removing pull_loc()
976
    def _get_base(self):
1185.69.2 by John Arbash Meinel
Changed LockableFiles to take the root directory directly. Moved mode information into LockableFiles instead of Branch
977
        return self._base
907.1.17 by John Arbash Meinel
Adding a Branch.base property, removing pull_loc()
978
1442.1.5 by Robert Collins
Give branch.base a docstring.
979
    base = property(_get_base, doc="The URL for the root of this branch.")
578 by Martin Pool
- start to move toward Branch.lock and unlock methods,
980
1417.1.6 by Robert Collins
introduce transactions for grouping actions done to and with branches
981
    def _finish_transaction(self):
982
        """Exit the current transaction."""
1185.65.13 by Robert Collins
Merge from integration
983
        return self.control_files._finish_transaction()
1417.1.6 by Robert Collins
introduce transactions for grouping actions done to and with branches
984
985
    def get_transaction(self):
1185.65.13 by Robert Collins
Merge from integration
986
        """Return the current active transaction.
987
988
        If no transaction is active, this returns a passthrough object
989
        for which all data is immediately flushed and no caching happens.
990
        """
991
        # this is an explicit function so that we can do tricky stuff
992
        # when the storage in rev_storage is elsewhere.
993
        # we probably need to hook the two 'lock a location' and 
994
        # 'have a transaction' together more delicately, so that
995
        # we can have two locks (branch and storage) and one transaction
996
        # ... and finishing the transaction unlocks both, but unlocking
997
        # does not. - RBC 20051121
998
        return self.control_files.get_transaction()
999
1000
    def _set_transaction(self, transaction):
1417.1.6 by Robert Collins
introduce transactions for grouping actions done to and with branches
1001
        """Set a new active transaction."""
1185.65.13 by Robert Collins
Merge from integration
1002
        return self.control_files._set_transaction(transaction)
353 by Martin Pool
- Per-branch locks in read and write modes.
1003
67 by mbp at sourcefrog
use abspath() for the function that makes an absolute
1004
    def abspath(self, name):
1495.1.2 by Jelmer Vernooij
Move some generic methods of NativeBranch to Branch.
1005
        """See Branch.abspath."""
1185.65.11 by Robert Collins
Disable inheritance for getting at LockableFiles, rather use composition.
1006
        return self.control_files._transport.abspath(name)
1185.58.4 by John Arbash Meinel
Added permission checking to Branch, and propogated that change into the stores.
1007
1534.4.7 by Robert Collins
Move downlevel check up to the Branch.open logic, removing it from the Branch constructor and deprecating relax_version_check to the same.
1008
    def _check_format(self, format):
1534.4.8 by Robert Collins
Unfuck upgrade.
1009
        """Identify the branch format if needed.
1 by mbp at sourcefrog
import from baz patch-364
1010
1534.4.8 by Robert Collins
Unfuck upgrade.
1011
        The format is stored as a reference to the format object in
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
1012
        self._format for code that needs to check it later.
1 by mbp at sourcefrog
import from baz patch-364
1013
1534.4.5 by Robert Collins
Turn branch format.open into a factory.
1014
        The format parameter is either None or the branch format class
1015
        used to open this branch.
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
1016
1017
        FIXME: DELETE THIS METHOD when pre 0.8 support is removed.
163 by mbp at sourcefrog
merge win32 portability fixes
1018
        """
1534.4.5 by Robert Collins
Turn branch format.open into a factory.
1019
        if format is None:
1773.4.1 by Martin Pool
Add pyflakes makefile target; fix many warnings
1020
            format = BranchFormat.find_format(self.bzrdir)
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
1021
        self._format = format
1022
        mutter("got branch format %s", self._format)
907.1.2 by John Arbash Meinel
Working on making Branch() do all of it's work over a Transport.
1023
1508.1.15 by Robert Collins
Merge from mpool.
1024
    @needs_read_lock
909 by Martin Pool
- merge John's code to give the tree root an explicit file id
1025
    def get_root_id(self):
1495.1.2 by Jelmer Vernooij
Move some generic methods of NativeBranch to Branch.
1026
        """See Branch.get_root_id."""
1534.4.28 by Robert Collins
first cut at merge from integration.
1027
        tree = self.repository.revision_tree(self.last_revision())
1028
        return tree.inventory.root.file_id
1 by mbp at sourcefrog
import from baz patch-364
1029
1694.2.6 by Martin Pool
[merge] bzr.dev
1030
    def is_locked(self):
1031
        return self.control_files.is_locked()
1032
1185.65.3 by Aaron Bentley
Fixed locking-- all tests pass
1033
    def lock_write(self):
1711.8.3 by John Arbash Meinel
Branch should lock Repository before it locks self, and unlock self before Repository
1034
        self.repository.lock_write()
1711.8.1 by John Arbash Meinel
Branch.lock_read/lock_write/unlock should handle failures
1035
        try:
1711.8.3 by John Arbash Meinel
Branch should lock Repository before it locks self, and unlock self before Repository
1036
            self.control_files.lock_write()
1711.8.1 by John Arbash Meinel
Branch.lock_read/lock_write/unlock should handle failures
1037
        except:
1711.8.3 by John Arbash Meinel
Branch should lock Repository before it locks self, and unlock self before Repository
1038
            self.repository.unlock()
1711.8.1 by John Arbash Meinel
Branch.lock_read/lock_write/unlock should handle failures
1039
            raise
1185.65.1 by Aaron Bentley
Refactored out ControlFiles and RevisionStore from _Branch
1040
1185.65.3 by Aaron Bentley
Fixed locking-- all tests pass
1041
    def lock_read(self):
1711.8.3 by John Arbash Meinel
Branch should lock Repository before it locks self, and unlock self before Repository
1042
        self.repository.lock_read()
1711.8.1 by John Arbash Meinel
Branch.lock_read/lock_write/unlock should handle failures
1043
        try:
1711.8.3 by John Arbash Meinel
Branch should lock Repository before it locks self, and unlock self before Repository
1044
            self.control_files.lock_read()
1711.8.1 by John Arbash Meinel
Branch.lock_read/lock_write/unlock should handle failures
1045
        except:
1711.8.3 by John Arbash Meinel
Branch should lock Repository before it locks self, and unlock self before Repository
1046
            self.repository.unlock()
1711.8.1 by John Arbash Meinel
Branch.lock_read/lock_write/unlock should handle failures
1047
            raise
1185.65.1 by Aaron Bentley
Refactored out ControlFiles and RevisionStore from _Branch
1048
1049
    def unlock(self):
1185.65.11 by Robert Collins
Disable inheritance for getting at LockableFiles, rather use composition.
1050
        # TODO: test for failed two phase locks. This is known broken.
1687.1.8 by Robert Collins
Teach Branch about break_lock.
1051
        try:
1711.8.3 by John Arbash Meinel
Branch should lock Repository before it locks self, and unlock self before Repository
1052
            self.control_files.unlock()
1687.1.8 by Robert Collins
Teach Branch about break_lock.
1053
        finally:
1711.8.3 by John Arbash Meinel
Branch should lock Repository before it locks self, and unlock self before Repository
1054
            self.repository.unlock()
1587.1.6 by Robert Collins
Update bound branch implementation to 0.8.
1055
        
1185.70.3 by Martin Pool
Various updates to make storage branch mergeable:
1056
    def peek_lock_mode(self):
1057
        if self.control_files._lock_count == 0:
1058
            return None
1059
        else:
1060
            return self.control_files._lock_mode
1061
1694.2.6 by Martin Pool
[merge] bzr.dev
1062
    def get_physical_lock_status(self):
1063
        return self.control_files.get_physical_lock_status()
1064
1442.1.63 by Robert Collins
Remove self.lock_*...finally: self.unlock() dead chickens from branch.py.
1065
    @needs_read_lock
1185.50.9 by John Arbash Meinel
[bug 3632] Matthieu Moy- bzr cat should default to last revision
1066
    def print_file(self, file, revision_id):
1495.1.2 by Jelmer Vernooij
Move some generic methods of NativeBranch to Branch.
1067
        """See Branch.print_file."""
1185.67.2 by Aaron Bentley
Renamed Branch.storage to Branch.repository
1068
        return self.repository.print_file(file, revision_id)
1442.1.63 by Robert Collins
Remove self.lock_*...finally: self.unlock() dead chickens from branch.py.
1069
1070
    @needs_write_lock
905 by Martin Pool
- merge aaron's append_multiple.patch
1071
    def append_revision(self, *revision_ids):
1495.1.2 by Jelmer Vernooij
Move some generic methods of NativeBranch to Branch.
1072
        """See Branch.append_revision."""
905 by Martin Pool
- merge aaron's append_multiple.patch
1073
        for revision_id in revision_ids:
1074
            mutter("add {%s} to revision-history" % revision_id)
1442.1.63 by Robert Collins
Remove self.lock_*...finally: self.unlock() dead chickens from branch.py.
1075
        rev_history = self.revision_history()
1076
        rev_history.extend(revision_ids)
1442.1.68 by Robert Collins
'bzr pull' now accepts '--clobber'.
1077
        self.set_revision_history(rev_history)
1078
1079
    @needs_write_lock
1080
    def set_revision_history(self, rev_history):
1495.1.2 by Jelmer Vernooij
Move some generic methods of NativeBranch to Branch.
1081
        """See Branch.set_revision_history."""
1185.65.12 by Robert Collins
Remove the only-used-once put_controlfiles, and change put_controlfile to put and put_utf8.
1082
        self.control_files.put_utf8(
1185.65.11 by Robert Collins
Disable inheritance for getting at LockableFiles, rather use composition.
1083
            'revision-history', '\n'.join(rev_history))
1563.2.34 by Robert Collins
Remove the commit and rollback transaction methods as misleading, and implement a WriteTransaction
1084
        transaction = self.get_transaction()
1085
        history = transaction.map.find_revision_history()
1086
        if history is not None:
1087
            # update the revision history in the identity map.
1088
            history[:] = list(rev_history)
1089
            # this call is disabled because revision_history is 
1090
            # not really an object yet, and the transaction is for objects.
1091
            # transaction.register_dirty(history)
1092
        else:
1093
            transaction.map.add_revision_history(rev_history)
1094
            # this call is disabled because revision_history is 
1095
            # not really an object yet, and the transaction is for objects.
1096
            # transaction.register_clean(history)
233 by mbp at sourcefrog
- more output from test.sh
1097
1442.1.63 by Robert Collins
Remove self.lock_*...finally: self.unlock() dead chickens from branch.py.
1098
    @needs_read_lock
1 by mbp at sourcefrog
import from baz patch-364
1099
    def revision_history(self):
1495.1.2 by Jelmer Vernooij
Move some generic methods of NativeBranch to Branch.
1100
        """See Branch.revision_history."""
1442.1.63 by Robert Collins
Remove self.lock_*...finally: self.unlock() dead chickens from branch.py.
1101
        transaction = self.get_transaction()
1102
        history = transaction.map.find_revision_history()
1103
        if history is not None:
1908.3.1 by Carl Friedrich Bolz
Clean up some mutter() calls.
1104
            # mutter("cache hit for revision-history in %s", self)
1417.1.12 by Robert Collins
cache revision history during read transactions
1105
            return list(history)
1911.2.4 by John Arbash Meinel
use cached strings for Branch.revision_history
1106
        decode_utf8 = cache_utf8.decode
1107
        history = [decode_utf8(l.rstrip('\r\n')) for l in
1108
                self.control_files.get('revision-history').readlines()]
1442.1.63 by Robert Collins
Remove self.lock_*...finally: self.unlock() dead chickens from branch.py.
1109
        transaction.map.add_revision_history(history)
1110
        # this call is disabled because revision_history is 
1111
        # not really an object yet, and the transaction is for objects.
1112
        # transaction.register_clean(history, precious=True)
1113
        return list(history)
1 by mbp at sourcefrog
import from baz patch-364
1114
1649.1.1 by Robert Collins
* 'pull' and 'push' now normalise the revision history, so that any two
1115
    @needs_write_lock
1792.1.1 by Robert Collins
Factor out revision-history synthesis to make it reusable as Branch.generate_revision_history.
1116
    def generate_revision_history(self, revision_id, last_rev=None, 
1117
        other_branch=None):
1118
        """Create a new revision history that will finish with revision_id.
1119
        
1120
        :param revision_id: the new tip to use.
1121
        :param last_rev: The previous last_revision. If not None, then this
1122
            must be a ancestory of revision_id, or DivergedBranches is raised.
1123
        :param other_branch: The other branch that DivergedBranches should
1124
            raise with respect to.
1125
        """
1126
        # stop_revision must be a descendant of last_revision
1127
        stop_graph = self.repository.get_revision_graph(revision_id)
1128
        if last_rev is not None and last_rev not in stop_graph:
1129
            # our previous tip is not merged into stop_revision
1130
            raise errors.DivergedBranches(self, other_branch)
1131
        # make a new revision history from the graph
1132
        current_rev_id = revision_id
1133
        new_history = []
1800.1.1 by Robert Collins
(robertc)Merge Branch.generate_revision_history() helper routine to create new revision histories.
1134
        while current_rev_id not in (None, revision.NULL_REVISION):
1792.1.1 by Robert Collins
Factor out revision-history synthesis to make it reusable as Branch.generate_revision_history.
1135
            new_history.append(current_rev_id)
1136
            current_rev_id_parents = stop_graph[current_rev_id]
1137
            try:
1138
                current_rev_id = current_rev_id_parents[0]
1139
            except IndexError:
1140
                current_rev_id = None
1141
        new_history.reverse()
1142
        self.set_revision_history(new_history)
1143
1144
    @needs_write_lock
1505.1.21 by John Arbash Meinel
Removing changes for bound branch by invading set-revision-history.
1145
    def update_revisions(self, other, stop_revision=None):
1495.1.2 by Jelmer Vernooij
Move some generic methods of NativeBranch to Branch.
1146
        """See Branch.update_revisions."""
1649.1.1 by Robert Collins
* 'pull' and 'push' now normalise the revision history, so that any two
1147
        other.lock_read()
1148
        try:
1149
            if stop_revision is None:
1150
                stop_revision = other.last_revision()
1151
                if stop_revision is None:
1152
                    # if there are no commits, we're done.
1153
                    return
1154
            # whats the current last revision, before we fetch [and change it
1155
            # possibly]
1156
            last_rev = self.last_revision()
1157
            # we fetch here regardless of whether we need to so that we pickup
1158
            # filled in ghosts.
1159
            self.fetch(other, stop_revision)
1160
            my_ancestry = self.repository.get_ancestry(last_rev)
1161
            if stop_revision in my_ancestry:
1162
                # last_revision is a descendant of stop_revision
1163
                return
1800.1.1 by Robert Collins
(robertc)Merge Branch.generate_revision_history() helper routine to create new revision histories.
1164
            self.generate_revision_history(stop_revision, last_rev=last_rev,
1165
                other_branch=other)
1649.1.1 by Robert Collins
* 'pull' and 'push' now normalise the revision history, so that any two
1166
        finally:
1167
            other.unlock()
1185.12.44 by abentley
Restored branch convergence to bzr pull
1168
1185.33.59 by Martin Pool
[patch] keep a cached basis inventory (Johan Rydberg)
1169
    def basis_tree(self):
1170
        """See Branch.basis_tree."""
1534.4.35 by Robert Collins
Give branch its own basis tree and last_revision methods; deprecated branch.working_tree()
1171
        return self.repository.revision_tree(self.last_revision())
1185.33.59 by Martin Pool
[patch] keep a cached basis inventory (Johan Rydberg)
1172
1534.4.35 by Robert Collins
Give branch its own basis tree and last_revision methods; deprecated branch.working_tree()
1173
    @deprecated_method(zero_eight)
1 by mbp at sourcefrog
import from baz patch-364
1174
    def working_tree(self):
1534.4.35 by Robert Collins
Give branch its own basis tree and last_revision methods; deprecated branch.working_tree()
1175
        """Create a Working tree object for this branch."""
1773.4.3 by Martin Pool
[merge] bzr.dev
1176
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
1177
        from bzrlib.transport.local import LocalTransport
1534.4.28 by Robert Collins
first cut at merge from integration.
1178
        if (self.base.find('://') != -1 or 
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
1179
            not isinstance(self._transport, LocalTransport)):
1497 by Robert Collins
Move Branch.read_working_inventory to WorkingTree.
1180
            raise NoWorkingTree(self.base)
1508.1.19 by Robert Collins
Give format3 working trees their own last-revision marker.
1181
        return self.bzrdir.open_workingtree()
1 by mbp at sourcefrog
import from baz patch-364
1182
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
1183
    @needs_write_lock
1185.76.1 by Erik BÃ¥gfors
Support for --revision in pull
1184
    def pull(self, source, overwrite=False, stop_revision=None):
1495.1.2 by Jelmer Vernooij
Move some generic methods of NativeBranch to Branch.
1185
        """See Branch.pull."""
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
1186
        source.lock_read()
1187
        try:
1185.33.44 by Martin Pool
[patch] show number of revisions pushed/pulled/merged (Robey Pointer)
1188
            old_count = len(self.revision_history())
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
1189
            try:
1185.76.1 by Erik BÃ¥gfors
Support for --revision in pull
1190
                self.update_revisions(source,stop_revision)
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
1191
            except DivergedBranches:
1192
                if not overwrite:
1193
                    raise
1185.50.5 by John Arbash Meinel
pull --overwrite should always overwrite, not just if diverged. (Test case from Robey Pointer)
1194
            if overwrite:
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
1195
                self.set_revision_history(source.revision_history())
1185.33.44 by Martin Pool
[patch] show number of revisions pushed/pulled/merged (Robey Pointer)
1196
            new_count = len(self.revision_history())
1197
            return new_count - old_count
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
1198
        finally:
1199
            source.unlock()
1 by mbp at sourcefrog
import from baz patch-364
1200
1149 by Martin Pool
- make get_parent() be a method of Branch; add simple tests for it
1201
    def get_parent(self):
1495.1.2 by Jelmer Vernooij
Move some generic methods of NativeBranch to Branch.
1202
        """See Branch.get_parent."""
1773.4.3 by Martin Pool
[merge] bzr.dev
1203
1149 by Martin Pool
- make get_parent() be a method of Branch; add simple tests for it
1204
        _locs = ['parent', 'pull', 'x-pull']
1685.1.70 by Wouter van Heyst
working on get_parent, set_parent and relative urls, broken
1205
        assert self.base[-1] == '/'
1149 by Martin Pool
- make get_parent() be a method of Branch; add simple tests for it
1206
        for l in _locs:
1207
            try:
1711.2.46 by John Arbash Meinel
Allow backwards compatibility with absolute local paths in parent
1208
                parent = self.control_files.get(l).read().strip('\n')
1185.31.45 by John Arbash Meinel
Refactoring Exceptions found some places where the wrong exception was caught.
1209
            except NoSuchFile:
1711.2.46 by John Arbash Meinel
Allow backwards compatibility with absolute local paths in parent
1210
                continue
1211
            # This is an old-format absolute path to a local branch
1212
            # turn it into a url
1213
            if parent.startswith('/'):
1711.2.48 by John Arbash Meinel
fix a typo in bzrlib/branch
1214
                parent = urlutils.local_path_to_url(parent.decode('utf8'))
1864.7.1 by John Arbash Meinel
Let Branch.get_parent() return None if parent is not accessible, (bug #52976)
1215
            try:
1216
                return urlutils.join(self.base[:-1], parent)
1217
            except errors.InvalidURLJoin, e:
1864.7.2 by John Arbash Meinel
Test that we copy the parent across properly (if it is available)
1218
                raise errors.InaccessibleParent(parent, self.base)
1149 by Martin Pool
- make get_parent() be a method of Branch; add simple tests for it
1219
        return None
1220
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
1221
    def get_push_location(self):
1495.1.2 by Jelmer Vernooij
Move some generic methods of NativeBranch to Branch.
1222
        """See Branch.get_push_location."""
1770.2.9 by Aaron Bentley
Add Branch.get_config, update BranchConfig() callers
1223
        push_loc = self.get_config().get_user_option('push_location')
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
1224
        return push_loc
1225
1226
    def set_push_location(self, location):
1495.1.2 by Jelmer Vernooij
Move some generic methods of NativeBranch to Branch.
1227
        """See Branch.set_push_location."""
1770.2.9 by Aaron Bentley
Add Branch.get_config, update BranchConfig() callers
1228
        self.get_config().set_user_option('push_location', location, 
1229
                                          local=True)
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
1230
1442.1.63 by Robert Collins
Remove self.lock_*...finally: self.unlock() dead chickens from branch.py.
1231
    @needs_write_lock
1150 by Martin Pool
- add new Branch.set_parent and tests
1232
    def set_parent(self, url):
1495.1.2 by Jelmer Vernooij
Move some generic methods of NativeBranch to Branch.
1233
        """See Branch.set_parent."""
1150 by Martin Pool
- add new Branch.set_parent and tests
1234
        # TODO: Maybe delete old location files?
1185.65.29 by Robert Collins
Implement final review suggestions.
1235
        # URLs should never be unicode, even on the local fs,
1236
        # FIXUP this and get_parent in a future branch format bump:
1237
        # read and rewrite the file, and have the new format code read
1238
        # using .get not .get_utf8. RBC 20060125
1614.2.5 by Olaf Conradi
Added testcase for bzr merge --remember.
1239
        if url is None:
1240
            self.control_files._transport.delete('parent')
1241
        else:
1685.1.71 by Wouter van Heyst
change branch.{get,set}_parent to store a relative path but return full urls
1242
            if isinstance(url, unicode):
1243
                try: 
1244
                    url = url.encode('ascii')
1245
                except UnicodeEncodeError:
1246
                    raise bzrlib.errors.InvalidURL(url,
1247
                        "Urls must be 7-bit ascii, "
1248
                        "use bzrlib.urlutils.escape")
1249
                    
1685.1.70 by Wouter van Heyst
working on get_parent, set_parent and relative urls, broken
1250
            url = urlutils.relative_url(self.base, url)
1251
            self.control_files.put('parent', url + '\n')
1150 by Martin Pool
- add new Branch.set_parent and tests
1252
1770.2.11 by Aaron Bentley
Deprecated Branch.tree_config
1253
    @deprecated_function(zero_nine)
1185.35.11 by Aaron Bentley
Added support for branch nicks
1254
    def tree_config(self):
1770.2.11 by Aaron Bentley
Deprecated Branch.tree_config
1255
        """DEPRECATED; call get_config instead.  
1256
        TreeConfig has become part of BranchConfig."""
1185.35.11 by Aaron Bentley
Added support for branch nicks
1257
        return TreeConfig(self)
1258
1587.1.6 by Robert Collins
Update bound branch implementation to 0.8.
1259
1260
class BzrBranch5(BzrBranch):
1261
    """A format 5 branch. This supports new features over plan branches.
1262
1263
    It has support for a master_branch which is the data for bound branches.
1264
    """
1265
1266
    def __init__(self,
1267
                 _format,
1268
                 _control_files,
1269
                 a_bzrdir,
1270
                 _repository):
1271
        super(BzrBranch5, self).__init__(_format=_format,
1272
                                         _control_files=_control_files,
1273
                                         a_bzrdir=a_bzrdir,
1274
                                         _repository=_repository)
1275
        
1442.1.63 by Robert Collins
Remove self.lock_*...finally: self.unlock() dead chickens from branch.py.
1276
    @needs_write_lock
1587.1.6 by Robert Collins
Update bound branch implementation to 0.8.
1277
    def pull(self, source, overwrite=False, stop_revision=None):
1278
        """Updates branch.pull to be bound branch aware."""
1279
        bound_location = self.get_bound_location()
1280
        if source.base != bound_location:
1281
            # not pulling from master, so we need to update master.
1282
            master_branch = self.get_master_branch()
1283
            if master_branch:
1284
                master_branch.pull(source)
1285
                source = master_branch
1286
        return super(BzrBranch5, self).pull(source, overwrite, stop_revision)
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
1287
1505.1.3 by John Arbash Meinel
(broken) Adding more tests, and some functionality
1288
    def get_bound_location(self):
1185.66.8 by Aaron Bentley
Applied Jelmer's patch to make clone a branch operation
1289
        try:
1587.1.6 by Robert Collins
Update bound branch implementation to 0.8.
1290
            return self.control_files.get_utf8('bound').read()[:-1]
1291
        except errors.NoSuchFile:
1505.1.3 by John Arbash Meinel
(broken) Adding more tests, and some functionality
1292
            return None
1185.66.8 by Aaron Bentley
Applied Jelmer's patch to make clone a branch operation
1293
1294
    @needs_read_lock
1505.1.25 by John Arbash Meinel
Updated pull. Now all paths which call set_revision_history maintain the branch invariant. All tests pass.
1295
    def get_master_branch(self):
1505.1.24 by John Arbash Meinel
Updated commit to handle bound branches. Included test to handle commit after merge
1296
        """Return the branch we are bound to.
1297
        
1298
        :return: Either a Branch, or None
1587.1.6 by Robert Collins
Update bound branch implementation to 0.8.
1299
1759.2.2 by Jelmer Vernooij
Revert some of my spelling fixes and fix some typos after review by Aaron.
1300
        This could memoise the branch, but if thats done
1587.1.6 by Robert Collins
Update bound branch implementation to 0.8.
1301
        it must be revalidated on each new lock.
1759.2.2 by Jelmer Vernooij
Revert some of my spelling fixes and fix some typos after review by Aaron.
1302
        So for now we just don't memoise it.
1587.1.6 by Robert Collins
Update bound branch implementation to 0.8.
1303
        # RBC 20060304 review this decision.
1505.1.24 by John Arbash Meinel
Updated commit to handle bound branches. Included test to handle commit after merge
1304
        """
1305
        bound_loc = self.get_bound_location()
1306
        if not bound_loc:
1307
            return None
1587.1.6 by Robert Collins
Update bound branch implementation to 0.8.
1308
        try:
1309
            return Branch.open(bound_loc)
1310
        except (errors.NotBranchError, errors.ConnectionError), e:
1311
            raise errors.BoundBranchConnectionFailure(
1312
                    self, bound_loc, e)
1505.1.24 by John Arbash Meinel
Updated commit to handle bound branches. Included test to handle commit after merge
1313
1505.1.3 by John Arbash Meinel
(broken) Adding more tests, and some functionality
1314
    @needs_write_lock
1315
    def set_bound_location(self, location):
1505.1.27 by John Arbash Meinel
Adding tests against an sftp branch.
1316
        """Set the target where this branch is bound to.
1317
1318
        :param location: URL to the target branch
1319
        """
1505.1.25 by John Arbash Meinel
Updated pull. Now all paths which call set_revision_history maintain the branch invariant. All tests pass.
1320
        if location:
1587.1.6 by Robert Collins
Update bound branch implementation to 0.8.
1321
            self.control_files.put_utf8('bound', location+'\n')
1185.64.2 by Goffredo Baroncelli
- implemented some suggestion by Robert Collins
1322
        else:
1505.1.25 by John Arbash Meinel
Updated pull. Now all paths which call set_revision_history maintain the branch invariant. All tests pass.
1323
            try:
1587.1.6 by Robert Collins
Update bound branch implementation to 0.8.
1324
                self.control_files._transport.delete('bound')
1505.1.25 by John Arbash Meinel
Updated pull. Now all paths which call set_revision_history maintain the branch invariant. All tests pass.
1325
            except NoSuchFile:
1326
                return False
1327
            return True
1505.1.3 by John Arbash Meinel
(broken) Adding more tests, and some functionality
1328
1329
    @needs_write_lock
1330
    def bind(self, other):
1331
        """Bind the local branch the other branch.
1332
1333
        :param other: The branch to bind to
1334
        :type other: Branch
1185.64.2 by Goffredo Baroncelli
- implemented some suggestion by Robert Collins
1335
        """
1505.1.24 by John Arbash Meinel
Updated commit to handle bound branches. Included test to handle commit after merge
1336
        # TODO: jam 20051230 Consider checking if the target is bound
1337
        #       It is debatable whether you should be able to bind to
1338
        #       a branch which is itself bound.
1339
        #       Committing is obviously forbidden,
1340
        #       but binding itself may not be.
1341
        #       Since we *have* to check at commit time, we don't
1342
        #       *need* to check here
1587.1.6 by Robert Collins
Update bound branch implementation to 0.8.
1343
        self.pull(other)
1344
1345
        # we are now equal to or a suffix of other.
1505.1.3 by John Arbash Meinel
(broken) Adding more tests, and some functionality
1346
1347
        # Since we have 'pulled' from the remote location,
1348
        # now we should try to pull in the opposite direction
1349
        # in case the local tree has more revisions than the
1350
        # remote one.
1351
        # There may be a different check you could do here
1352
        # rather than actually trying to install revisions remotely.
1353
        # TODO: capture an exception which indicates the remote branch
1759.2.1 by Jelmer Vernooij
Fix some types (found using aspell).
1354
        #       is not writable. 
1505.1.3 by John Arbash Meinel
(broken) Adding more tests, and some functionality
1355
        #       If it is up-to-date, this probably should not be a failure
1587.1.6 by Robert Collins
Update bound branch implementation to 0.8.
1356
        
1357
        # lock other for write so the revision-history syncing cannot race
1358
        other.lock_write()
1359
        try:
1360
            other.pull(self)
1361
            # if this does not error, other now has the same last rev we do
1362
            # it can only error if the pull from other was concurrent with
1363
            # a commit to other from someone else.
1364
1365
            # until we ditch revision-history, we need to sync them up:
1366
            self.set_revision_history(other.revision_history())
1367
            # now other and self are up to date with each other and have the
1368
            # same revision-history.
1369
        finally:
1370
            other.unlock()
1371
1505.1.3 by John Arbash Meinel
(broken) Adding more tests, and some functionality
1372
        self.set_bound_location(other.base)
1505.1.2 by John Arbash Meinel
(broken) working on implementing bound branches.
1373
1505.1.5 by John Arbash Meinel
Added a test for the unbind command.
1374
    @needs_write_lock
1375
    def unbind(self):
1376
        """If bound, unbind"""
1505.1.25 by John Arbash Meinel
Updated pull. Now all paths which call set_revision_history maintain the branch invariant. All tests pass.
1377
        return self.set_bound_location(None)
1185.66.8 by Aaron Bentley
Applied Jelmer's patch to make clone a branch operation
1378
1587.1.10 by Robert Collins
update updates working tree and branch together.
1379
    @needs_write_lock
1380
    def update(self):
1381
        """Synchronise this branch with the master branch if any. 
1382
1383
        :return: None or the last_revision that was pivoted out during the
1384
                 update.
1385
        """
1386
        master = self.get_master_branch()
1387
        if master is not None:
1388
            old_tip = self.last_revision()
1389
            self.pull(master, overwrite=True)
1587.1.11 by Robert Collins
Local commits appear to be working properly.
1390
            if old_tip in self.repository.get_ancestry(self.last_revision()):
1587.1.10 by Robert Collins
update updates working tree and branch together.
1391
                return None
1392
            return old_tip
1393
        return None
1394
1534.4.1 by Robert Collins
Allow parameterisation of the branch initialisation for bzrlib.
1395
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
1396
class BranchTestProviderAdapter(object):
1397
    """A tool to generate a suite testing multiple branch formats at once.
1398
1399
    This is done by copying the test once for each transport and injecting
1400
    the transport_server, transport_readonly_server, and branch_format
1401
    classes into each copy. Each copy is also given a new id() to make it
1402
    easy to identify.
1403
    """
1404
1405
    def __init__(self, transport_server, transport_readonly_server, formats):
1406
        self._transport_server = transport_server
1407
        self._transport_readonly_server = transport_readonly_server
1408
        self._formats = formats
1409
    
1410
    def adapt(self, test):
1411
        result = TestSuite()
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
1412
        for branch_format, bzrdir_format in self._formats:
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
1413
            new_test = deepcopy(test)
1414
            new_test.transport_server = self._transport_server
1415
            new_test.transport_readonly_server = self._transport_readonly_server
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
1416
            new_test.bzrdir_format = bzrdir_format
1417
            new_test.branch_format = branch_format
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
1418
            def make_new_test_id():
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
1419
                new_id = "%s(%s)" % (new_test.id(), branch_format.__class__.__name__)
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
1420
                return lambda: new_id
1421
            new_test.id = make_new_test_id()
1422
            result.addTest(new_test)
1423
        return result
1424
1425
1732.2.4 by Martin Pool
Split check into Branch.check and Repository.check
1426
class BranchCheckResult(object):
1427
    """Results of checking branch consistency.
1428
1429
    :see: Branch.check
1430
    """
1431
1432
    def __init__(self, branch):
1433
        self.branch = branch
1434
1435
    def report_results(self, verbose):
1436
        """Report the check results via trace.note.
1437
        
1438
        :param verbose: Requests more detailed display of what was checked,
1439
            if any.
1440
        """
1441
        note('checked branch %s format %s',
1442
             self.branch.base,
1443
             self.branch._format)
1444
1445
1 by mbp at sourcefrog
import from baz patch-364
1446
######################################################################
1447
# predicates
1448
1449
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
1450
@deprecated_function(zero_eight)
1451
def is_control_file(*args, **kwargs):
1452
    """See bzrlib.workingtree.is_control_file."""
1453
    return bzrlib.workingtree.is_control_file(*args, **kwargs)