summaryrefslogtreecommitdiff
diff options
authorJelmer Vernooij <jelmer@jelmer.uk>2020-01-02 12:51:21 +0000
committerBreezy landing bot <breezy.the.bot@gmail.com>2020-01-02 12:51:21 +0000
commitf86a86fdffd72b3ede2c6290ff3edf76a13f17c1 (patch)
tree76fa2df6f084175dada388b4cc8f8723a4a37c6f
parent71de96f2c2336db69421746fe3d6e1cfadea6c08 (diff)
parent7993bafa7c6b27f4fc88f89375752644eee492b5 (diff)
Ignore ghost tags when interacting with remote Git repositories.HEADmaster
Merged from https://code.launchpad.net/~jelmer/brz/git-present-only/+merge/377144
-rw-r--r--breezy/git/branch.py66
-rw-r--r--doc/en/release-notes/brz-3.1.txt3
2 files changed, 33 insertions, 36 deletions
diff --git a/breezy/git/branch.py b/breezy/git/branch.py
index 3605937135..6420242251 100644
--- a/breezy/git/branch.py
+++ b/breezy/git/branch.py
@@ -30,6 +30,7 @@ from dulwich.repo import check_ref_format
from .. import (
branch,
+ cleanup,
config,
controldir,
errors,
@@ -235,9 +236,9 @@ class GitTags(tag.BasicTags):
master = None
else:
master = to_tags.branch.get_master_branch()
- if master is not None:
- master.lock_write()
- try:
+ with cleanup.ExitStack() as es:
+ if master is not None:
+ es.enter_context(master.lock_write())
updates, conflicts = self._merge_to_non_git(
to_tags, source_tag_refs, overwrite=overwrite)
if master is not None:
@@ -248,9 +249,6 @@ class GitTags(tag.BasicTags):
updates.update(extra_updates)
conflicts += extra_conflicts
return updates, conflicts
- finally:
- if master is not None:
- master.unlock()
def get_tag_dict(self):
ret = {}
@@ -1038,37 +1036,30 @@ class InterFromGitBranch(branch.GenericInterBranch):
bound_location = self.target.get_bound_location()
if local and not bound_location:
raise errors.LocalRequiresBoundBranch()
- master_branch = None
source_is_master = False
- self.source.lock_read()
- if bound_location:
- # bound_location comes from a config file, some care has to be
- # taken to relate it to source.user_url
- normalized = urlutils.normalize_url(bound_location)
- try:
- relpath = self.source.user_transport.relpath(normalized)
- source_is_master = (relpath == '')
- except (errors.PathNotChild, urlutils.InvalidURL):
- source_is_master = False
- if not local and bound_location and not source_is_master:
- # not pulling from master, so we need to update master.
- master_branch = self.target.get_master_branch(possible_transports)
- master_branch.lock_write()
- try:
- try:
- if master_branch:
- # pull from source into master.
- master_branch.pull(self.source, overwrite, stop_revision,
- run_hooks=False)
- result = self._basic_pull(stop_revision, overwrite, run_hooks,
- _override_hook_target,
- _hook_master=master_branch)
- finally:
- self.source.unlock()
- finally:
- if master_branch:
- master_branch.unlock()
- return result
+ with cleanup.ExitStack() as es:
+ es.enter_context(self.source.lock_read())
+ if bound_location:
+ # bound_location comes from a config file, some care has to be
+ # taken to relate it to source.user_url
+ normalized = urlutils.normalize_url(bound_location)
+ try:
+ relpath = self.source.user_transport.relpath(normalized)
+ source_is_master = (relpath == '')
+ except (errors.PathNotChild, urlutils.InvalidURL):
+ source_is_master = False
+ if not local and bound_location and not source_is_master:
+ # not pulling from master, so we need to update master.
+ master_branch = self.target.get_master_branch(possible_transports)
+ es.enter_context(master_branch.lock_write())
+ # pull from source into master.
+ master_branch.pull(self.source, overwrite, stop_revision,
+ run_hooks=False)
+ else:
+ master_branch = None
+ return self._basic_pull(stop_revision, overwrite, run_hooks,
+ _override_hook_target,
+ _hook_master=master_branch)
def _basic_push(self, overwrite, stop_revision):
if overwrite is True:
@@ -1135,6 +1126,9 @@ class InterLocalGitRemoteGitBranch(InterGitBranch):
result.new_revid = stop_revision
for name, sha in viewitems(
self.source.repository._git.refs.as_dict(b"refs/tags")):
+ if sha not in self.source.repository._git:
+ trace.mutter('Ignoring missing SHA: %s', sha)
+ continue
refs[tag_name_to_ref(name)] = sha
return refs
self.target.repository.send_pack(
diff --git a/doc/en/release-notes/brz-3.1.txt b/doc/en/release-notes/brz-3.1.txt
index 462c1c772f..bc2573f4f5 100644
--- a/doc/en/release-notes/brz-3.1.txt
+++ b/doc/en/release-notes/brz-3.1.txt
@@ -120,6 +120,9 @@ Bug Fixes
* Fix ``brz diff --using`` when {old_path} and {new_path} are not
specified in the template. (#1847915, Jelmer Vernooij)
+* Ignore ghost tags when interacting with remote Git repositories.
+ (Jelmer Vernooij)
+
Documentation
*************