845
845
raise errors.NoSuchRevision(self, revno)
846
846
return history[revno - 1]
848
849
def pull(self, source, overwrite=False, stop_revision=None,
849
possible_transports=None, _override_hook_target=None,
850
possible_transports=None, *args, **kwargs):
851
851
"""Mirror source into this branch.
853
853
This branch is considered to be 'local', having low latency.
855
855
:returns: PullResult instance
857
raise NotImplementedError(self.pull)
857
return InterBranch.get(source, self).pull(overwrite=overwrite,
858
stop_revision=stop_revision,
859
possible_transports=possible_transports, *args, **kwargs)
859
861
def push(self, target, overwrite=False, stop_revision=None, *args,
2178
2180
"""See Branch.basis_tree."""
2179
2181
return self.repository.revision_tree(self.last_revision())
2182
def pull(self, source, overwrite=False, stop_revision=None,
2183
_hook_master=None, run_hooks=True, possible_transports=None,
2184
_override_hook_target=None, local=False):
2187
:param _hook_master: Private parameter - set the branch to
2188
be supplied as the master to pull hooks.
2189
:param run_hooks: Private parameter - if false, this branch
2190
is being called because it's the master of the primary branch,
2191
so it should not run its hooks.
2192
:param _override_hook_target: Private parameter - set the branch to be
2193
supplied as the target_branch to pull hooks.
2194
:param local: Only update the local branch, and not the bound branch.
2196
# This type of branch can't be bound.
2198
raise errors.LocalRequiresBoundBranch()
2200
result = PullResult()
2201
result.source_branch = source
2202
if _override_hook_target is None:
2203
result.target_branch = self
2205
result.target_branch = _override_hook_target
2208
# We assume that during 'pull' the local repository is closer than
2210
source.update_references(self)
2211
graph = self.repository.get_graph(source.repository)
2212
result.old_revno, result.old_revid = self.last_revision_info()
2213
self.update_revisions(source, stop_revision, overwrite=overwrite,
2215
result.tag_conflicts = source.tags.merge_to(self.tags, overwrite)
2216
result.new_revno, result.new_revid = self.last_revision_info()
2218
result.master_branch = _hook_master
2219
result.local_branch = result.target_branch
2221
result.master_branch = result.target_branch
2222
result.local_branch = None
2224
for hook in Branch.hooks['post_pull']:
2230
2183
def _get_parent_location(self):
2231
2184
_locs = ['parent', 'pull', 'x-pull']
2232
2185
for l in _locs:
2281
2234
It has support for a master_branch which is the data for bound branches.
2285
def pull(self, source, overwrite=False, stop_revision=None,
2286
run_hooks=True, possible_transports=None,
2287
_override_hook_target=None, local=False):
2288
"""Pull from source into self, updating my master if any.
2290
:param run_hooks: Private parameter - if false, this branch
2291
is being called because it's the master of the primary branch,
2292
so it should not run its hooks.
2294
bound_location = self.get_bound_location()
2295
if local and not bound_location:
2296
raise errors.LocalRequiresBoundBranch()
2297
master_branch = None
2298
if not local and bound_location and source.base != bound_location:
2299
# not pulling from master, so we need to update master.
2300
master_branch = self.get_master_branch(possible_transports)
2301
master_branch.lock_write()
2304
# pull from source into master.
2305
master_branch.pull(source, overwrite, stop_revision,
2307
return super(BzrBranch5, self).pull(source, overwrite,
2308
stop_revision, _hook_master=master_branch,
2309
run_hooks=run_hooks,
2310
_override_hook_target=_override_hook_target)
2313
master_branch.unlock()
2315
2237
def get_bound_location(self):
2317
2239
return self._transport.get_bytes('bound')[:-1]
2949
2871
"""Return a tuple with the Branch formats to use when testing."""
2950
2872
raise NotImplementedError(self._get_branch_formats_to_test)
2874
def pull(self, overwrite=False, stop_revision=None,
2875
possible_transports=None, local=False):
2876
"""Mirror source into target branch.
2878
The target branch is considered to be 'local', having low latency.
2880
:returns: PullResult instance
2882
raise NotImplementedError(self.pull)
2952
2884
def update_revisions(self, stop_revision=None, overwrite=False,
2954
2886
"""Pull in new perfect-fit revisions.
3023
2955
self.source.unlock()
2957
def pull(self, overwrite=False, stop_revision=None,
2958
possible_transports=None, _hook_master=None, run_hooks=True,
2959
_override_hook_target=None, local=False):
2962
:param _hook_master: Private parameter - set the branch to
2963
be supplied as the master to pull hooks.
2964
:param run_hooks: Private parameter - if false, this branch
2965
is being called because it's the master of the primary branch,
2966
so it should not run its hooks.
2967
:param _override_hook_target: Private parameter - set the branch to be
2968
supplied as the target_branch to pull hooks.
2969
:param local: Only update the local branch, and not the bound branch.
2971
# This type of branch can't be bound.
2973
raise errors.LocalRequiresBoundBranch()
2974
result = PullResult()
2975
result.source_branch = self.source
2976
if _override_hook_target is None:
2977
result.target_branch = self.target
2979
result.target_branch = _override_hook_target
2980
self.source.lock_read()
2982
# We assume that during 'pull' the target repository is closer than
2984
self.source.update_references(self.target)
2985
graph = self.target.repository.get_graph(self.source.repository)
2986
# TODO: Branch formats should have a flag that indicates
2987
# that revno's are expensive, and pull() should honor that flag.
2989
result.old_revno, result.old_revid = \
2990
self.target.last_revision_info()
2991
self.target.update_revisions(self.source, stop_revision,
2992
overwrite=overwrite, graph=graph)
2993
# TODO: The old revid should be specified when merging tags,
2994
# so a tags implementation that versions tags can only
2995
# pull in the most recent changes. -- JRV20090506
2996
result.tag_conflicts = self.source.tags.merge_to(self.target.tags,
2998
result.new_revno, result.new_revid = self.target.last_revision_info()
3000
result.master_branch = _hook_master
3001
result.local_branch = result.target_branch
3003
result.master_branch = result.target_branch
3004
result.local_branch = None
3006
for hook in Branch.hooks['post_pull']:
3009
self.source.unlock()
3025
3012
def push(self, overwrite=False, stop_revision=None,
3026
3013
_override_hook_source_branch=None):
3027
3014
"""See InterBranch.push.
3085
class InterToBranch5(GenericInterBranch):
3088
def _get_branch_formats_to_test():
3089
return BranchFormat._default_format, BzrBranchFormat5()
3091
def pull(self, overwrite=False, stop_revision=None,
3092
possible_transports=None, run_hooks=True,
3093
_override_hook_target=None, local=False):
3094
"""Pull from source into self, updating my master if any.
3096
:param run_hooks: Private parameter - if false, this branch
3097
is being called because it's the master of the primary branch,
3098
so it should not run its hooks.
3100
bound_location = self.target.get_bound_location()
3101
if local and not bound_location:
3102
raise errors.LocalRequiresBoundBranch()
3103
master_branch = None
3104
if not local and bound_location and self.source.base != bound_location:
3105
# not pulling from master, so we need to update master.
3106
master_branch = self.target.get_master_branch(possible_transports)
3107
master_branch.lock_write()
3110
# pull from source into master.
3111
master_branch.pull(self.source, overwrite, stop_revision,
3113
return super(InterToBranch5, self).pull(overwrite,
3114
stop_revision, _hook_master=master_branch,
3115
run_hooks=run_hooks,
3116
_override_hook_target=_override_hook_target)
3119
master_branch.unlock()
3097
3122
InterBranch.register_optimiser(GenericInterBranch)
3123
InterBranch.register_optimiser(InterToBranch5)