253
252
raise NotImplementedError(self._get_config)
255
def store_uncommitted(self, creator):
256
"""Store uncommitted changes from a ShelfCreator.
258
:param creator: The ShelfCreator containing uncommitted changes, or
259
None to delete any stored changes.
260
:raises: ChangesAlreadyStored if the branch already has changes.
262
raise NotImplementedError(self.store_uncommitted)
264
def get_unshelver(self, tree):
265
"""Return a shelf.Unshelver for this branch and tree.
267
:param tree: The tree to use to construct the Unshelver.
268
:return: an Unshelver or None if no changes are stored.
270
raise NotImplementedError(self.get_unshelver)
272
254
def _get_fallback_repository(self, url, possible_transports):
273
255
"""Get the repository we fallback to at url."""
274
256
url = urlutils.join(self.base, url)
784
766
"""Print `file` to stdout."""
785
767
raise NotImplementedError(self.print_file)
769
@deprecated_method(deprecated_in((2, 4, 0)))
770
def set_revision_history(self, rev_history):
771
"""See Branch.set_revision_history."""
772
self._set_revision_history(rev_history)
775
def _set_revision_history(self, rev_history):
776
if len(rev_history) == 0:
777
revid = _mod_revision.NULL_REVISION
779
revid = rev_history[-1]
780
if rev_history != self._lefthand_history(revid):
781
raise errors.NotLefthandHistory(rev_history)
782
self.set_last_revision_info(len(rev_history), revid)
783
self._cache_revision_history(rev_history)
784
for hook in Branch.hooks['set_rh']:
785
hook(self, rev_history)
787
787
@needs_write_lock
788
788
def set_last_revision_info(self, revno, revision_id):
789
789
"""Set the last revision of this branch.
1052
1062
def _read_last_revision_info(self):
1053
1063
raise NotImplementedError(self._read_last_revision_info)
1065
@deprecated_method(deprecated_in((2, 4, 0)))
1066
def import_last_revision_info(self, source_repo, revno, revid):
1067
"""Set the last revision info, importing from another repo if necessary.
1069
:param source_repo: Source repository to optionally fetch from
1070
:param revno: Revision number of the new tip
1071
:param revid: Revision id of the new tip
1073
if not self.repository.has_same_location(source_repo):
1074
self.repository.fetch(source_repo, revision_id=revid)
1075
self.set_last_revision_info(revno, revid)
1055
1077
def import_last_revision_info_and_tags(self, source, revno, revid,
1057
1079
"""Set the last revision info, importing from another repo if necessary.
1595
1617
def __ne__(self, other):
1596
1618
return not (self == other)
1621
@deprecated_method(deprecated_in((2, 4, 0)))
1622
def get_default_format(klass):
1623
"""Return the current default format."""
1624
return format_registry.get_default()
1627
@deprecated_method(deprecated_in((2, 4, 0)))
1628
def get_formats(klass):
1629
"""Get all the known formats.
1631
Warning: This triggers a load of all lazy registered formats: do not
1632
use except when that is desireed.
1634
return format_registry._get_all()
1598
1636
def get_reference(self, controldir, name=None):
1599
1637
"""Get the target reference of the branch in controldir.
1689
1727
raise NotImplementedError(self.open)
1730
@deprecated_method(deprecated_in((2, 4, 0)))
1731
def register_format(klass, format):
1732
"""Register a metadir format.
1734
See MetaDirBranchFormatFactory for the ability to register a format
1735
without loading the code the format needs until it is actually used.
1737
format_registry.register(format)
1740
@deprecated_method(deprecated_in((2, 4, 0)))
1741
def set_default_format(klass, format):
1742
format_registry.set_default(format)
1691
1744
def supports_set_append_revisions_only(self):
1692
1745
"""True if this format supports set_append_revisions_only."""
2057
2121
recommend_upgrade=recommend_upgrade, basedir=basedir)
2124
class BzrBranchFormat5(BranchFormatMetadir):
2125
"""Bzr branch format 5.
2128
- a revision-history file.
2130
- a lock dir guarding the branch itself
2131
- all of this stored in a branch/ subdirectory
2132
- works with shared repositories.
2134
This format is new in bzr 0.8.
2137
def _branch_class(self):
2141
def get_format_string(cls):
2142
"""See BranchFormat.get_format_string()."""
2143
return "Bazaar-NG branch format 5\n"
2145
def get_format_description(self):
2146
"""See BranchFormat.get_format_description()."""
2147
return "Branch format 5"
2149
def initialize(self, a_bzrdir, name=None, repository=None,
2150
append_revisions_only=None):
2151
"""Create a branch of this format in a_bzrdir."""
2152
if append_revisions_only:
2153
raise errors.UpgradeRequired(a_bzrdir.user_url)
2154
utf8_files = [('revision-history', ''),
2155
('branch-name', ''),
2157
return self._initialize_helper(a_bzrdir, utf8_files, name, repository)
2159
def supports_tags(self):
2060
2163
class BzrBranchFormat6(BranchFormatMetadir):
2061
2164
"""Branch format with last-revision and tags.
2400
2502
return _mod_config.TransportConfig(self._transport, 'branch.conf')
2402
2504
def _get_config_store(self):
2403
if self.conf_store is None:
2404
self.conf_store = _mod_config.BranchStore(self)
2405
return self.conf_store
2407
def _uncommitted_branch(self):
2408
"""Return the branch that may contain uncommitted changes."""
2409
master = self.get_master_branch()
2410
if master is not None:
2415
def store_uncommitted(self, creator):
2416
"""Store uncommitted changes from a ShelfCreator.
2418
:param creator: The ShelfCreator containing uncommitted changes, or
2419
None to delete any stored changes.
2420
:raises: ChangesAlreadyStored if the branch already has changes.
2422
branch = self._uncommitted_branch()
2424
branch._transport.delete('stored-transform')
2426
if branch._transport.has('stored-transform'):
2427
raise errors.ChangesAlreadyStored
2428
transform = StringIO()
2429
creator.write_shelf(transform)
2431
branch._transport.put_file('stored-transform', transform)
2433
def get_unshelver(self, tree):
2434
"""Return a shelf.Unshelver for this branch and tree.
2436
:param tree: The tree to use to construct the Unshelver.
2437
:return: an Unshelver or None if no changes are stored.
2439
branch = self._uncommitted_branch()
2441
transform = branch._transport.get('stored-transform')
2442
except errors.NoSuchFile:
2444
return shelf.Unshelver.from_tree_and_shelf(tree, transform)
2505
return _mod_config.BranchStore(self)
2446
2507
def is_locked(self):
2447
2508
return self.control_files.is_locked()
2680
2749
self.control_transport.put_bytes('format', self._format.as_string())
2752
class FullHistoryBzrBranch(BzrBranch):
2753
"""Bzr branch which contains the full revision history."""
2756
def set_last_revision_info(self, revno, revision_id):
2757
if not revision_id or not isinstance(revision_id, basestring):
2758
raise errors.InvalidRevisionId(revision_id=revision_id, branch=self)
2759
revision_id = _mod_revision.ensure_null(revision_id)
2760
# this old format stores the full history, but this api doesn't
2761
# provide it, so we must generate, and might as well check it's
2763
history = self._lefthand_history(revision_id)
2764
if len(history) != revno:
2765
raise AssertionError('%d != %d' % (len(history), revno))
2766
self._set_revision_history(history)
2768
def _read_last_revision_info(self):
2769
rh = self._revision_history()
2772
return (revno, rh[-1])
2774
return (0, _mod_revision.NULL_REVISION)
2776
@deprecated_method(deprecated_in((2, 4, 0)))
2778
def set_revision_history(self, rev_history):
2779
"""See Branch.set_revision_history."""
2780
self._set_revision_history(rev_history)
2782
def _set_revision_history(self, rev_history):
2783
if 'evil' in debug.debug_flags:
2784
mutter_callsite(3, "set_revision_history scales with history.")
2785
check_not_reserved_id = _mod_revision.check_not_reserved_id
2786
for rev_id in rev_history:
2787
check_not_reserved_id(rev_id)
2788
if Branch.hooks['post_change_branch_tip']:
2789
# Don't calculate the last_revision_info() if there are no hooks
2791
old_revno, old_revid = self.last_revision_info()
2792
if len(rev_history) == 0:
2793
revid = _mod_revision.NULL_REVISION
2795
revid = rev_history[-1]
2796
self._run_pre_change_branch_tip_hooks(len(rev_history), revid)
2797
self._write_revision_history(rev_history)
2798
self._clear_cached_state()
2799
self._cache_revision_history(rev_history)
2800
for hook in Branch.hooks['set_rh']:
2801
hook(self, rev_history)
2802
if Branch.hooks['post_change_branch_tip']:
2803
self._run_post_change_branch_tip_hooks(old_revno, old_revid)
2805
def _write_revision_history(self, history):
2806
"""Factored out of set_revision_history.
2808
This performs the actual writing to disk.
2809
It is intended to be called by set_revision_history."""
2810
self._transport.put_bytes(
2811
'revision-history', '\n'.join(history),
2812
mode=self.bzrdir._get_file_mode())
2814
def _gen_revision_history(self):
2815
history = self._transport.get_bytes('revision-history').split('\n')
2816
if history[-1:] == ['']:
2817
# There shouldn't be a trailing newline, but just in case.
2821
def _synchronize_history(self, destination, revision_id):
2822
if not isinstance(destination, FullHistoryBzrBranch):
2823
super(BzrBranch, self)._synchronize_history(
2824
destination, revision_id)
2826
if revision_id == _mod_revision.NULL_REVISION:
2829
new_history = self._revision_history()
2830
if revision_id is not None and new_history != []:
2832
new_history = new_history[:new_history.index(revision_id) + 1]
2834
rev = self.repository.get_revision(revision_id)
2835
new_history = rev.get_history(self.repository)[1:]
2836
destination._set_revision_history(new_history)
2839
def generate_revision_history(self, revision_id, last_rev=None,
2841
"""Create a new revision history that will finish with revision_id.
2843
:param revision_id: the new tip to use.
2844
:param last_rev: The previous last_revision. If not None, then this
2845
must be a ancestory of revision_id, or DivergedBranches is raised.
2846
:param other_branch: The other branch that DivergedBranches should
2847
raise with respect to.
2849
self._set_revision_history(self._lefthand_history(revision_id,
2850
last_rev, other_branch))
2853
class BzrBranch5(FullHistoryBzrBranch):
2854
"""A format 5 branch. This supports new features over plain branches.
2856
It has support for a master_branch which is the data for bound branches.
2683
2860
class BzrBranch8(BzrBranch):
2684
2861
"""A branch that stores tree-reference locations."""
3340
3516
result.target_branch = self.target
3341
3517
result.old_revno, result.old_revid = self.target.last_revision_info()
3342
3518
self.source.update_references(self.target)
3343
overwrite = _fix_overwrite_type(overwrite)
3344
3519
if result.old_revid != stop_revision:
3345
3520
# We assume that during 'push' this repository is closer than
3347
3522
graph = self.source.repository.get_graph(self.target.repository)
3348
self._update_revisions(stop_revision,
3349
overwrite=("history" in overwrite),
3523
self._update_revisions(stop_revision, overwrite=overwrite,
3351
3525
if self.source._push_should_merge_tags():
3352
3526
result.tag_updates, result.tag_conflicts = (
3353
self.source.tags.merge_to(
3354
self.target.tags, "tags" in overwrite))
3527
self.source.tags.merge_to(self.target.tags, overwrite))
3355
3528
result.new_revno, result.new_revid = self.target.last_revision_info()
3435
3608
# -- JRV20090506
3436
3609
result.old_revno, result.old_revid = \
3437
3610
self.target.last_revision_info()
3438
overwrite = _fix_overwrite_type(overwrite)
3439
self._update_revisions(stop_revision,
3440
overwrite=("history" in overwrite),
3611
self._update_revisions(stop_revision, overwrite=overwrite,
3442
3613
# TODO: The old revid should be specified when merging tags,
3443
3614
# so a tags implementation that versions tags can only
3444
3615
# pull in the most recent changes. -- JRV20090506
3445
3616
result.tag_updates, result.tag_conflicts = (
3446
self.source.tags.merge_to(self.target.tags,
3447
"tags" in overwrite,
3617
self.source.tags.merge_to(self.target.tags, overwrite,
3448
3618
ignore_master=not merge_tags_to_master))
3449
3619
result.new_revno, result.new_revid = self.target.last_revision_info()
3450
3620
if _hook_master: