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
1=== modified file 'breezy/git/remote.py'
2--- breezy/git/remote.py 2020-05-06 02:13:25 +0000
3+++ breezy/git/remote.py 2020-06-01 23:00:29 +0000
4@@ -211,6 +211,24 @@
5 return RemoteGitError(message)
6
7
8+def parse_git_hangup(url, e):
9+ """Parse the error lines from a git servers stderr on hangup.
10+
11+ :param url: URL of the remote repository
12+ :param e: A HangupException
13+ """
14+ stderr_lines = getattr(e, 'stderr_lines', None)
15+ if not stderr_lines:
16+ return e
17+ interesting_lines = [
18+ line for line in stderr_lines
19+ if line and line.replace('=', '')]
20+ if len(interesting_lines) == 1:
21+ interesting_line = interesting_lines[0]
22+ return parse_git_error(url, interesting_line)
23+ return RemoteGitError('\n'.join(stderr_lines))
24+
25+
26 class GitSmartTransport(Transport):
27
28 def __init__(self, url, _client=None):
29@@ -410,6 +428,8 @@
30 prefix=(prefix.encode('utf-8') if prefix else None))
31 except GitProtocolError as e:
32 raise parse_git_error(self.transport.external_url(), e)
33+ except HangupException as e:
34+ raise parse_git_hangup(self.transport.external_url(), e)
35 finally:
36 if pb is not None:
37 pb.finished()
38@@ -432,6 +452,8 @@
39 return result
40 except GitProtocolError as e:
41 raise parse_git_error(self.transport.external_url(), e)
42+ except HangupException as e:
43+ raise parse_git_hangup(self.transport.external_url(), e)
44 finally:
45 if pb is not None:
46 pb.finished()
47@@ -453,6 +475,8 @@
48 generate_pack_data, progress)
49 except GitProtocolError as e:
50 raise parse_git_error(self.transport.external_url(), e)
51+ except HangupException as e:
52+ raise parse_git_hangup(self.transport.external_url(), e)
53 finally:
54 if pb is not None:
55 pb.finished()
56
57=== modified file 'breezy/git/tests/test_remote.py'
58--- breezy/git/tests/test_remote.py 2020-05-06 02:13:25 +0000
59+++ breezy/git/tests/test_remote.py 2020-06-01 23:00:29 +0000
60@@ -39,6 +39,7 @@
61 from ..remote import (
62 split_git_url,
63 parse_git_error,
64+ parse_git_hangup,
65 HeadUpdateFailed,
66 RemoteGitError,
67 RemoteGitBranchFormat,
68@@ -46,6 +47,7 @@
69 )
70
71 from dulwich import porcelain
72+from dulwich.errors import HangupException
73 from dulwich.repo import Repo as GitRepo
74
75
76@@ -142,6 +144,45 @@
77 self.assertIsInstance(e, NotBranchError)
78
79
80+class ParseHangupTests(TestCase):
81+
82+ def setUp(self):
83+ super(ParseHangupTests, self).setUp()
84+ try:
85+ HangupException(['foo'])
86+ except TypeError:
87+ self.skipTest('dulwich version too old')
88+
89+ def test_not_set(self):
90+ self.assertIsInstance(
91+ parse_git_hangup('http://', HangupException()), HangupException)
92+
93+ def test_single_line(self):
94+ self.assertEqual(
95+ RemoteGitError('foo bar'),
96+ parse_git_hangup('http://', HangupException(['foo bar'])))
97+
98+ def test_multi_lines(self):
99+ self.assertEqual(
100+ RemoteGitError('foo bar\nbla bla'),
101+ parse_git_hangup(
102+ 'http://', HangupException(['foo bar', 'bla bla'])))
103+
104+ def test_filter_boring(self):
105+ self.assertEqual(
106+ RemoteGitError('foo bar'), parse_git_hangup('http://', HangupException(
107+ ['=======', 'foo bar', '======'])))
108+
109+ def test_permission_denied(self):
110+ self.assertEqual(
111+ PermissionDenied('http://', 'You are not allowed to push code to this project.'),
112+ parse_git_hangup(
113+ 'http://',
114+ HangupException(
115+ ['=======',
116+ 'You are not allowed to push code to this project.', '', '======'])))
117+
118+
119 class TestRemoteGitBranchFormat(TestCase):
120
121 def setUp(self):
122
123=== modified file 'doc/en/release-notes/brz-3.1.txt'
124--- doc/en/release-notes/brz-3.1.txt 2020-06-01 13:15:43 +0000
125+++ doc/en/release-notes/brz-3.1.txt 2020-06-01 23:00:29 +0000
126@@ -134,6 +134,9 @@
127 * Ignore special files (fifos, block/character devices, sockets)
128 when finding changes in Git working trees. (Jelmer Vernooij, #1857244)
129
130+* Parse error messages from stderr when a remote Git server
131+ hangs up. (Jelmer Vernooij)
132+
133
134 Bug Fixes
135 *********

Subscribers

People subscribed via source and target branches