Merge lp:~jelmer/brz/git-stderr-lines into lp:brz

Proposed by Jelmer Vernooij
Status: Merged
Approved by: Jelmer Vernooij
Approved revision: no longer in the source branch.
Merge reported by: The Breezy Bot
Merged at revision: not available
Proposed branch: lp:~jelmer/brz/git-stderr-lines
Merge into: lp:brz
Diff against target: 135 lines (+68/-0)
3 files modified
breezy/git/remote.py (+24/-0)
breezy/git/tests/test_remote.py (+41/-0)
doc/en/release-notes/brz-3.1.txt (+3/-0)
To merge this branch: bzr merge lp:~jelmer/brz/git-stderr-lines
Reviewer Review Type Date Requested Status
Jelmer Vernooij Approve
Review via email: mp+384935@code.launchpad.net

Commit message

Parse stderr from remote git servers when they hang up.

Description of the change

Parse stderr from remote git servers when they hang up.

To post a comment you must log in.
Revision history for this message
Jelmer Vernooij (jelmer) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'breezy/git/remote.py'
--- breezy/git/remote.py 2020-05-06 02:13:25 +0000
+++ breezy/git/remote.py 2020-06-01 23:00:29 +0000
@@ -211,6 +211,24 @@
211 return RemoteGitError(message)211 return RemoteGitError(message)
212212
213213
214def parse_git_hangup(url, e):
215 """Parse the error lines from a git servers stderr on hangup.
216
217 :param url: URL of the remote repository
218 :param e: A HangupException
219 """
220 stderr_lines = getattr(e, 'stderr_lines', None)
221 if not stderr_lines:
222 return e
223 interesting_lines = [
224 line for line in stderr_lines
225 if line and line.replace('=', '')]
226 if len(interesting_lines) == 1:
227 interesting_line = interesting_lines[0]
228 return parse_git_error(url, interesting_line)
229 return RemoteGitError('\n'.join(stderr_lines))
230
231
214class GitSmartTransport(Transport):232class GitSmartTransport(Transport):
215233
216 def __init__(self, url, _client=None):234 def __init__(self, url, _client=None):
@@ -410,6 +428,8 @@
410 prefix=(prefix.encode('utf-8') if prefix else None))428 prefix=(prefix.encode('utf-8') if prefix else None))
411 except GitProtocolError as e:429 except GitProtocolError as e:
412 raise parse_git_error(self.transport.external_url(), e)430 raise parse_git_error(self.transport.external_url(), e)
431 except HangupException as e:
432 raise parse_git_hangup(self.transport.external_url(), e)
413 finally:433 finally:
414 if pb is not None:434 if pb is not None:
415 pb.finished()435 pb.finished()
@@ -432,6 +452,8 @@
432 return result452 return result
433 except GitProtocolError as e:453 except GitProtocolError as e:
434 raise parse_git_error(self.transport.external_url(), e)454 raise parse_git_error(self.transport.external_url(), e)
455 except HangupException as e:
456 raise parse_git_hangup(self.transport.external_url(), e)
435 finally:457 finally:
436 if pb is not None:458 if pb is not None:
437 pb.finished()459 pb.finished()
@@ -453,6 +475,8 @@
453 generate_pack_data, progress)475 generate_pack_data, progress)
454 except GitProtocolError as e:476 except GitProtocolError as e:
455 raise parse_git_error(self.transport.external_url(), e)477 raise parse_git_error(self.transport.external_url(), e)
478 except HangupException as e:
479 raise parse_git_hangup(self.transport.external_url(), e)
456 finally:480 finally:
457 if pb is not None:481 if pb is not None:
458 pb.finished()482 pb.finished()
459483
=== modified file 'breezy/git/tests/test_remote.py'
--- breezy/git/tests/test_remote.py 2020-05-06 02:13:25 +0000
+++ breezy/git/tests/test_remote.py 2020-06-01 23:00:29 +0000
@@ -39,6 +39,7 @@
39from ..remote import (39from ..remote import (
40 split_git_url,40 split_git_url,
41 parse_git_error,41 parse_git_error,
42 parse_git_hangup,
42 HeadUpdateFailed,43 HeadUpdateFailed,
43 RemoteGitError,44 RemoteGitError,
44 RemoteGitBranchFormat,45 RemoteGitBranchFormat,
@@ -46,6 +47,7 @@
46 )47 )
4748
48from dulwich import porcelain49from dulwich import porcelain
50from dulwich.errors import HangupException
49from dulwich.repo import Repo as GitRepo51from dulwich.repo import Repo as GitRepo
5052
5153
@@ -142,6 +144,45 @@
142 self.assertIsInstance(e, NotBranchError)144 self.assertIsInstance(e, NotBranchError)
143145
144146
147class ParseHangupTests(TestCase):
148
149 def setUp(self):
150 super(ParseHangupTests, self).setUp()
151 try:
152 HangupException(['foo'])
153 except TypeError:
154 self.skipTest('dulwich version too old')
155
156 def test_not_set(self):
157 self.assertIsInstance(
158 parse_git_hangup('http://', HangupException()), HangupException)
159
160 def test_single_line(self):
161 self.assertEqual(
162 RemoteGitError('foo bar'),
163 parse_git_hangup('http://', HangupException(['foo bar'])))
164
165 def test_multi_lines(self):
166 self.assertEqual(
167 RemoteGitError('foo bar\nbla bla'),
168 parse_git_hangup(
169 'http://', HangupException(['foo bar', 'bla bla'])))
170
171 def test_filter_boring(self):
172 self.assertEqual(
173 RemoteGitError('foo bar'), parse_git_hangup('http://', HangupException(
174 ['=======', 'foo bar', '======'])))
175
176 def test_permission_denied(self):
177 self.assertEqual(
178 PermissionDenied('http://', 'You are not allowed to push code to this project.'),
179 parse_git_hangup(
180 'http://',
181 HangupException(
182 ['=======',
183 'You are not allowed to push code to this project.', '', '======'])))
184
185
145class TestRemoteGitBranchFormat(TestCase):186class TestRemoteGitBranchFormat(TestCase):
146187
147 def setUp(self):188 def setUp(self):
148189
=== modified file 'doc/en/release-notes/brz-3.1.txt'
--- doc/en/release-notes/brz-3.1.txt 2020-06-01 13:15:43 +0000
+++ doc/en/release-notes/brz-3.1.txt 2020-06-01 23:00:29 +0000
@@ -134,6 +134,9 @@
134* Ignore special files (fifos, block/character devices, sockets)134* Ignore special files (fifos, block/character devices, sockets)
135 when finding changes in Git working trees. (Jelmer Vernooij, #1857244)135 when finding changes in Git working trees. (Jelmer Vernooij, #1857244)
136136
137* Parse error messages from stderr when a remote Git server
138 hangs up. (Jelmer Vernooij)
139
137140
138Bug Fixes141Bug Fixes
139*********142*********

Subscribers

People subscribed via source and target branches