18
18
from copy import deepcopy
19
19
from cStringIO import StringIO
20
24
from unittest import TestSuite
21
25
from warnings import warn
24
from bzrlib import bzrdir, errors, lockdir, osutils, revision, \
28
import bzrlib.bzrdir as bzrdir
28
29
from bzrlib.config import TreeConfig
29
30
from bzrlib.decorators import needs_read_lock, needs_write_lock
30
31
import bzrlib.errors as errors
35
36
NotBranchError, UninitializableFormat,
36
37
UnlistableStore, UnlistableBranch,
39
import bzrlib.inventory as inventory
40
from bzrlib.inventory import Inventory
38
41
from bzrlib.lockable_files import LockableFiles, TransportLock
39
from bzrlib.symbol_versioning import (deprecated_function,
42
from bzrlib.lockdir import LockDir
43
from bzrlib.osutils import (isdir, quotefn,
44
rename, splitpath, sha_file,
45
file_kind, abspath, normpath, pathjoin,
49
from bzrlib.repository import Repository
50
from bzrlib.revision import (
55
from bzrlib.store import copy_all
56
from bzrlib.symbol_versioning import *
57
from bzrlib.textui import show_status
45
58
from bzrlib.trace import mutter, note
59
import bzrlib.transactions as transactions
60
from bzrlib.transport import Transport, get_transport
62
import bzrlib.urlutils as urlutils
48
66
BZR_BRANCH_FORMAT_4 = "Bazaar-NG branch, format 0.0.4\n"
213
231
last_revision = from_history[-1]
215
233
# no history in the source branch
216
last_revision = revision.NULL_REVISION
234
last_revision = NULL_REVISION
217
235
return self.repository.fetch(from_branch.repository,
218
236
revision_id=last_revision,
313
331
If self and other have not diverged, return a list of the revisions
314
332
present in other, but missing from self.
334
>>> from bzrlib.workingtree import WorkingTree
335
>>> bzrlib.trace.silent = True
336
>>> d1 = bzrdir.ScratchDir()
337
>>> br1 = d1.open_branch()
338
>>> wt1 = d1.open_workingtree()
339
>>> d2 = bzrdir.ScratchDir()
340
>>> br2 = d2.open_branch()
341
>>> wt2 = d2.open_workingtree()
342
>>> br1.missing_revisions(br2)
344
>>> wt2.commit("lala!", rev_id="REVISION-ID-1")
346
>>> br1.missing_revisions(br2)
348
>>> br2.missing_revisions(br1)
350
>>> wt1.commit("lala!", rev_id="REVISION-ID-1")
352
>>> br1.missing_revisions(br2)
354
>>> wt2.commit("lala!", rev_id="REVISION-ID-2A")
356
>>> br1.missing_revisions(br2)
358
>>> wt1.commit("lala!", rev_id="REVISION-ID-2B")
360
>>> br1.missing_revisions(br2)
361
Traceback (most recent call last):
362
DivergedBranches: These branches have diverged. Try merge.
316
364
self_history = self.revision_history()
317
365
self_len = len(self_history)
328
376
assert isinstance(stop_revision, int)
329
377
if stop_revision > other_len:
330
raise errors.NoSuchRevision(self, stop_revision)
378
raise bzrlib.errors.NoSuchRevision(self, stop_revision)
331
379
return other_history[self_len:stop_revision]
333
381
def update_revisions(self, other, stop_revision=None):
530
578
In particular this checks that revisions given in the revision-history
531
579
do actually match up in the revision graph, and that they're all
532
580
present in the repository.
534
Callers will typically also want to check the repository.
536
582
:return: A BranchCheckResult.
541
587
revision = self.repository.get_revision(revision_id)
542
588
except errors.NoSuchRevision, e:
543
raise errors.BzrCheckError("mainline revision {%s} not in repository"
589
raise BzrCheckError("mainline revision {%s} not in repository"
545
591
# In general the first entry on the revision history has no parents.
546
592
# But it's not illegal for it to have parents listed; this can happen
547
593
# in imports from Arch when the parents weren't reachable.
548
594
if mainline_parent_id is not None:
549
595
if mainline_parent_id not in revision.parent_ids:
550
raise errors.BzrCheckError("previous revision {%s} not listed among "
596
raise BzrCheckError("previous revision {%s} not listed among "
551
597
"parents of {%s}"
552
598
% (mainline_parent_id, revision_id))
553
599
mainline_parent_id = revision_id
721
767
utf8_files = [('revision-history', ''),
722
768
('branch-name', ''),
724
control_files = LockableFiles(branch_transport, 'lock', lockdir.LockDir)
770
control_files = LockableFiles(branch_transport, 'lock', LockDir)
725
771
control_files.create_lock()
726
772
control_files.lock_write()
727
773
control_files.put_utf8('format', self.get_format_string())
746
792
format = BranchFormat.find_format(a_bzrdir)
747
793
assert format.__class__ == self.__class__
748
794
transport = a_bzrdir.get_branch_transport(None)
749
control_files = LockableFiles(transport, 'lock', lockdir.LockDir)
795
control_files = LockableFiles(transport, 'lock', LockDir)
750
796
return BzrBranch5(_format=self,
751
797
_control_files=control_files,
752
798
a_bzrdir=a_bzrdir,
867
913
self._base = self._transport.base
868
914
self._format = _format
869
915
if _control_files is None:
870
raise ValueError('BzrBranch _control_files is None')
916
raise BzrBadParameterMissing('_control_files')
871
917
self.control_files = _control_files
872
918
if deprecated_passed(init):
873
919
warn("BzrBranch.__init__(..., init=XXX): The init parameter is "
889
935
if (not relax_version_check
890
936
and not self._format.is_supported()):
891
raise errors.UnsupportedFormatError(format=fmt)
937
raise errors.UnsupportedFormatError(
938
'sorry, branch format %r not supported' % fmt,
939
['use a different bzr version',
940
'or remove the .bzr directory'
941
' and "bzr init" again'])
892
942
if deprecated_passed(transport):
893
943
warn("BzrBranch.__init__(transport=XXX...): The transport "
894
944
"parameter is deprecated as of bzr 0.8. "
961
1011
FIXME: DELETE THIS METHOD when pre 0.8 support is removed.
963
1013
if format is None:
964
format = BranchFormat.find_format(self.bzrdir)
1014
format = BzrBranchFormat.find_format(self.bzrdir)
965
1015
self._format = format
966
1016
mutter("got branch format %s", self._format)
1077
1127
# make a new revision history from the graph
1078
1128
current_rev_id = stop_revision
1079
1129
new_history = []
1080
while current_rev_id not in (None, revision.NULL_REVISION):
1130
while current_rev_id not in (None, NULL_REVISION):
1081
1131
new_history.append(current_rev_id)
1082
1132
current_rev_id_parents = stop_graph[current_rev_id]
1096
1146
@deprecated_method(zero_eight)
1097
1147
def working_tree(self):
1098
1148
"""Create a Working tree object for this branch."""
1149
from bzrlib.workingtree import WorkingTree
1100
1150
from bzrlib.transport.local import LocalTransport
1101
1151
if (self.base.find('://') != -1 or
1102
1152
not isinstance(self._transport, LocalTransport)):
1368
1418
@deprecated_function(zero_eight)
1419
def ScratchBranch(*args, **kwargs):
1420
"""See bzrlib.bzrdir.ScratchDir."""
1421
d = ScratchDir(*args, **kwargs)
1422
return d.open_branch()
1425
@deprecated_function(zero_eight)
1369
1426
def is_control_file(*args, **kwargs):
1370
1427
"""See bzrlib.workingtree.is_control_file."""
1371
1428
return bzrlib.workingtree.is_control_file(*args, **kwargs)