28
28
import bzrlib.bzrdir as bzrdir
29
29
from bzrlib.config import TreeConfig
30
30
from bzrlib.decorators import needs_read_lock, needs_write_lock
31
from bzrlib.delta import compare_trees
32
31
import bzrlib.errors as errors
33
from bzrlib.errors import (BzrError, InvalidRevisionNumber, InvalidRevisionId,
34
NoSuchRevision, HistoryMissing, NotBranchError,
35
DivergedBranches, LockError,
36
UninitializableFormat,
38
UnlistableBranch, NoSuchFile, NotVersionedError,
32
from bzrlib.errors import (BzrError, BzrCheckError, DivergedBranches,
33
HistoryMissing, InvalidRevisionId,
34
InvalidRevisionNumber, LockError, NoSuchFile,
35
NoSuchRevision, NoWorkingTree, NotVersionedError,
36
NotBranchError, UninitializableFormat,
37
UnlistableStore, UnlistableBranch,
40
39
import bzrlib.inventory as inventory
41
40
from bzrlib.inventory import Inventory
42
41
from bzrlib.lockable_files import LockableFiles, TransportLock
59
58
from bzrlib.trace import mutter, note
60
59
import bzrlib.transactions as transactions
61
60
from bzrlib.transport import Transport, get_transport
62
from bzrlib.tree import EmptyTree, RevisionTree
64
62
import bzrlib.urlutils as urlutils
278
def get_revision_delta(self, revno):
279
"""Return the delta for one revision.
281
The delta is relative to its mainline predecessor, or the
282
empty tree for revision 1.
284
assert isinstance(revno, int)
285
rh = self.revision_history()
286
if not (1 <= revno <= len(rh)):
287
raise InvalidRevisionNumber(revno)
288
return self.repository.get_revision_delta(rh[revno-1])
280
290
def get_root_id(self):
281
291
"""Return the id of this branches root"""
282
292
raise NotImplementedError('get_root_id is abstract')
1073
1083
# not really an object yet, and the transaction is for objects.
1074
1084
# transaction.register_clean(history)
1076
def get_revision_delta(self, revno):
1077
"""Return the delta for one revision.
1079
The delta is relative to its mainline predecessor, or the
1080
empty tree for revision 1.
1082
assert isinstance(revno, int)
1083
rh = self.revision_history()
1084
if not (1 <= revno <= len(rh)):
1085
raise InvalidRevisionNumber(revno)
1087
# revno is 1-based; list is 0-based
1089
new_tree = self.repository.revision_tree(rh[revno-1])
1091
old_tree = EmptyTree()
1093
old_tree = self.repository.revision_tree(rh[revno-2])
1094
return compare_trees(old_tree, new_tree)
1096
1086
@needs_read_lock
1097
1087
def revision_history(self):
1098
1088
"""See Branch.revision_history."""
1188
1178
assert self.base[-1] == '/'
1189
1179
for l in _locs:
1191
return urlutils.join(self.base[:-1],
1192
self.control_files.get(l).read().strip('\n'))
1181
parent = self.control_files.get(l).read().strip('\n')
1193
1182
except NoSuchFile:
1184
# This is an old-format absolute path to a local branch
1185
# turn it into a url
1186
if parent.startswith('/'):
1187
parent = urlutils.local_path_to_url(parent.decode('utf8'))
1188
return urlutils.join(self.base[:-1], parent)
1197
1191
def get_push_location(self):