=== modified file 'breezy/git/branch.py' --- a/breezy/git/branch.py +++ b/breezy/git/branch.py @@ -137,6 +137,7 @@ class InterTagsFromGitToRemoteGit(InterT updates = {} conflicts = [] source_tag_refs = self.source.branch.get_tag_refs() + ref_to_tag_map = {} def get_changed_refs(old_refs): ret = dict(old_refs) @@ -150,6 +151,7 @@ class InterTagsFromGitToRemoteGit(InterT ret[ref_name] = unpeeled updates[tag_name] = self.target.branch.repository.lookup_foreign_revision_id( peeled) + ref_to_tag_map[ref_name] = tag_name self.target.branch._tag_refs = None else: conflicts.append( @@ -158,8 +160,14 @@ class InterTagsFromGitToRemoteGit(InterT self.target.branch.repository.lookup_foreign_revision_id( old_refs[ref_name]))) return ret - self.target.branch.repository.controldir.send_pack( + result = self.target.branch.repository.controldir.send_pack( get_changed_refs, lambda have, want: []) + if result is not None and not isinstance(result, dict): + for ref, error in result.ref_status.items(): + if error: + warning('unable to update ref %s: %s', + ref, error) + del updates[ref_to_tag_map[ref]] return updates, set(conflicts) @@ -1170,6 +1178,7 @@ class InterLocalGitRemoteGitBranch(Inter isinstance(target, RemoteGitBranch)) def _basic_push(self, overwrite, stop_revision, tag_selector=None): + from .remote import RemoteGitError result = GitBranchPushResult() result.source_branch = self.source result.target_branch = self.target @@ -1201,9 +1210,17 @@ class InterLocalGitRemoteGitBranch(Inter continue refs[tag_name_to_ref(name)] = sha return refs - self.target.repository.send_pack( + dw_result = self.target.repository.send_pack( get_changed_refs, self.source.repository._git.generate_pack_data) + if dw_result is not None and not isinstance(dw_result, dict): + error = dw_result.ref_status.get(self.target.ref) + if error: + raise RemoteGitError(error) + for ref, error in dw_result.ref_status.items(): + if error: + trace.warning('unable to open ref %s: %s', + ref, error) return result --- a/breezy/git/interrepo.py +++ b/breezy/git/interrepo.py @@ -90,6 +90,7 @@ from .repository import ( ) from .remote import ( RemoteGitRepository, + RemoteGitError, ) from .unpeel_map import ( UnpeelMap, @@ -377,8 +378,16 @@ class InterToRemoteGitRepository(InterTo return ret self._warn_slow() with self.source_store.lock_read(): - new_refs = self.target.send_pack( + result = self.target.send_pack( git_update_refs, self.source_store.generate_lossy_pack_data) + if result is not None and not isinstance(result, dict): + for ref, error in result.ref_status.items(): + if error: + raise RemoteGitError( + 'unable to update ref %r: %s' % (ref, error)) + new_refs = result.refs + else: # dulwich < 0.20.3 + new_refs = result # FIXME: revidmap? return revidmap, self.old_refs, new_refs --- a/breezy/git/remote.py +++ b/breezy/git/remote.py @@ -436,10 +436,10 @@ class RemoteGitDir(GitDir): format=(format.encode('ascii') if format else None), subdirs=subdirs, prefix=(prefix.encode('utf-8') if prefix else None)) - except GitProtocolError as e: - raise parse_git_error(self.transport.external_url(), e) except HangupException as e: raise parse_git_hangup(self.transport.external_url(), e) + except GitProtocolError as e: + raise parse_git_error(self.transport.external_url(), e) finally: if pb is not None: pb.finished() @@ -460,10 +460,10 @@ class RemoteGitDir(GitDir): self._refs = remote_refs_dict_to_container( result.refs, result.symrefs) return result - except GitProtocolError as e: - raise parse_git_error(self.transport.external_url(), e) except HangupException as e: raise parse_git_hangup(self.transport.external_url(), e) + except GitProtocolError as e: + raise parse_git_error(self.transport.external_url(), e) finally: if pb is not None: pb.finished() @@ -483,10 +483,10 @@ class RemoteGitDir(GitDir): return self._client.send_pack( self._client_path, get_changed_refs_wrapper, generate_pack_data, progress) - except GitProtocolError as e: - raise parse_git_error(self.transport.external_url(), e) except HangupException as e: raise parse_git_hangup(self.transport.external_url(), e) + except GitProtocolError as e: + raise parse_git_error(self.transport.external_url(), e) finally: if pb is not None: pb.finished() @@ -515,7 +515,11 @@ class RemoteGitDir(GitDir): def generate_pack_data(have, want, ofs_delta=False): return pack_objects_to_data([]) - self.send_pack(get_changed_refs, generate_pack_data) + result = self.send_pack(get_changed_refs, generate_pack_data) + if result is not None and not isinstance(result, dict): + error = result.ref_status.get(refname) + if error: + raise RemoteGitError(error) @property def user_url(self): @@ -658,7 +662,18 @@ class RemoteGitDir(GitDir): else: return source_store.generate_pack_data( have, want, progress=progress, ofs_delta=ofs_delta) - new_refs = self.send_pack(get_changed_refs, generate_pack_data) + dw_result = self.send_pack(get_changed_refs, generate_pack_data) + if not isinstance(dw_result, dict): + new_refs = dw_result.refs + error = dw_result.ref_status.get(actual_refname) + if error: + raise RemoteGitError(error) + for ref, error in dw_result.ref_status.items(): + if error: + trace.warning('unable to open ref %s: %s', + ref, error) + else: # dulwich < 0.20.4 + new_refs = dw_result push_result.new_revid = repo.lookup_foreign_revision_id( new_refs[actual_refname]) if old_sha is not None: @@ -977,7 +992,12 @@ class RemoteGitTagDict(GitTags): def generate_pack_data(have, want, ofs_delta=False): return pack_objects_to_data([]) - self.repository.send_pack(get_changed_refs, generate_pack_data) + result = self.repository.send_pack( + get_changed_refs, generate_pack_data) + if result and not isinstance(result, dict): + error = result.ref_status.get(ref) + if error: + raise RemoteGitError(error) class RemoteGitBranch(GitBranch): @@ -1061,7 +1081,12 @@ class RemoteGitBranch(GitBranch): return {self.ref: sha} def generate_pack_data(have, want, ofs_delta=False): return pack_objects_to_data([]) - self.repository.send_pack(get_changed_refs, generate_pack_data) + result = self.repository.send_pack( + get_changed_refs, generate_pack_data) + if result is not None and not isinstance(result, dict): + error = result.ref_status.get(self.ref) + if error: + raise RemoteGitError(error) self._sha = sha