##// END OF EJS Templates
subrepo: Add exception for subrepo merge errors.
Martin Bornhold -
r1107:6bc055e1 default
parent child Browse files
Show More
@@ -1,196 +1,205 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2014-2016 RhodeCode GmbH
3 # Copyright (C) 2014-2016 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU Affero General Public License, version 3
6 # it under the terms of the GNU Affero General Public License, version 3
7 # (only), as published by the Free Software Foundation.
7 # (only), as published by the Free Software Foundation.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU Affero General Public License
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #
16 #
17 # This program is dual-licensed. If you wish to learn more about the
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
20
21 """
21 """
22 Custom vcs exceptions module.
22 Custom vcs exceptions module.
23 """
23 """
24
24
25 import functools
25 import functools
26 import urllib2
26 import urllib2
27
27
28
28
29 class VCSCommunicationError(Exception):
29 class VCSCommunicationError(Exception):
30 pass
30 pass
31
31
32
32
33 class PyroVCSCommunicationError(VCSCommunicationError):
33 class PyroVCSCommunicationError(VCSCommunicationError):
34 pass
34 pass
35
35
36
36
37 class HttpVCSCommunicationError(VCSCommunicationError):
37 class HttpVCSCommunicationError(VCSCommunicationError):
38 pass
38 pass
39
39
40
40
41 class VCSError(Exception):
41 class VCSError(Exception):
42 pass
42 pass
43
43
44
44
45 class RepositoryError(VCSError):
45 class RepositoryError(VCSError):
46 pass
46 pass
47
47
48
48
49 class RepositoryRequirementError(RepositoryError):
49 class RepositoryRequirementError(RepositoryError):
50 pass
50 pass
51
51
52
52
53 class VCSBackendNotSupportedError(VCSError):
53 class VCSBackendNotSupportedError(VCSError):
54 """
54 """
55 Exception raised when VCSServer does not support requested backend
55 Exception raised when VCSServer does not support requested backend
56 """
56 """
57
57
58
58
59 class EmptyRepositoryError(RepositoryError):
59 class EmptyRepositoryError(RepositoryError):
60 pass
60 pass
61
61
62
62
63 class TagAlreadyExistError(RepositoryError):
63 class TagAlreadyExistError(RepositoryError):
64 pass
64 pass
65
65
66
66
67 class TagDoesNotExistError(RepositoryError):
67 class TagDoesNotExistError(RepositoryError):
68 pass
68 pass
69
69
70
70
71 class BranchAlreadyExistError(RepositoryError):
71 class BranchAlreadyExistError(RepositoryError):
72 pass
72 pass
73
73
74
74
75 class BranchDoesNotExistError(RepositoryError):
75 class BranchDoesNotExistError(RepositoryError):
76 pass
76 pass
77
77
78
78
79 class CommitError(RepositoryError):
79 class CommitError(RepositoryError):
80 """
80 """
81 Exceptions related to an existing commit
81 Exceptions related to an existing commit
82 """
82 """
83
83
84
84
85 class CommitDoesNotExistError(CommitError):
85 class CommitDoesNotExistError(CommitError):
86 pass
86 pass
87
87
88
88
89 class CommittingError(RepositoryError):
89 class CommittingError(RepositoryError):
90 """
90 """
91 Exceptions happening while creating a new commit
91 Exceptions happening while creating a new commit
92 """
92 """
93
93
94
94
95 class NothingChangedError(CommittingError):
95 class NothingChangedError(CommittingError):
96 pass
96 pass
97
97
98
98
99 class NodeError(VCSError):
99 class NodeError(VCSError):
100 pass
100 pass
101
101
102
102
103 class RemovedFileNodeError(NodeError):
103 class RemovedFileNodeError(NodeError):
104 pass
104 pass
105
105
106
106
107 class NodeAlreadyExistsError(CommittingError):
107 class NodeAlreadyExistsError(CommittingError):
108 pass
108 pass
109
109
110
110
111 class NodeAlreadyChangedError(CommittingError):
111 class NodeAlreadyChangedError(CommittingError):
112 pass
112 pass
113
113
114
114
115 class NodeDoesNotExistError(CommittingError):
115 class NodeDoesNotExistError(CommittingError):
116 pass
116 pass
117
117
118
118
119 class NodeNotChangedError(CommittingError):
119 class NodeNotChangedError(CommittingError):
120 pass
120 pass
121
121
122
122
123 class NodeAlreadyAddedError(CommittingError):
123 class NodeAlreadyAddedError(CommittingError):
124 pass
124 pass
125
125
126
126
127 class NodeAlreadyRemovedError(CommittingError):
127 class NodeAlreadyRemovedError(CommittingError):
128 pass
128 pass
129
129
130
130
131 class SubrepoMergeError(RepositoryError):
132 """
133 This happens if we try to merge a repository which contains subrepos and
134 the subrepos cannot be merged. The subrepos are not merged itself but
135 their references in the root repo are merged.
136 """
137
138
131 class ImproperArchiveTypeError(VCSError):
139 class ImproperArchiveTypeError(VCSError):
132 pass
140 pass
133
141
134
142
135 class CommandError(VCSError):
143 class CommandError(VCSError):
136 pass
144 pass
137
145
138
146
139 class UnhandledException(VCSError):
147 class UnhandledException(VCSError):
140 """
148 """
141 Signals that something unexpected went wrong.
149 Signals that something unexpected went wrong.
142
150
143 This usually means we have a programming error on the side of the VCSServer
151 This usually means we have a programming error on the side of the VCSServer
144 and should inspect the logfile of the VCSServer to find more details.
152 and should inspect the logfile of the VCSServer to find more details.
145 """
153 """
146
154
147
155
148 _EXCEPTION_MAP = {
156 _EXCEPTION_MAP = {
149 'abort': RepositoryError,
157 'abort': RepositoryError,
150 'archive': ImproperArchiveTypeError,
158 'archive': ImproperArchiveTypeError,
151 'error': RepositoryError,
159 'error': RepositoryError,
152 'lookup': CommitDoesNotExistError,
160 'lookup': CommitDoesNotExistError,
153 'repo_locked': RepositoryError,
161 'repo_locked': RepositoryError,
154 'requirement': RepositoryRequirementError,
162 'requirement': RepositoryRequirementError,
155 'unhandled': UnhandledException,
163 'unhandled': UnhandledException,
156 # TODO: johbo: Define our own exception for this and stop abusing
164 # TODO: johbo: Define our own exception for this and stop abusing
157 # urllib's exception class.
165 # urllib's exception class.
158 'url_error': urllib2.URLError,
166 'url_error': urllib2.URLError,
167 'subrepo_merge_error': SubrepoMergeError,
159 }
168 }
160
169
161
170
162 def map_vcs_exceptions(func):
171 def map_vcs_exceptions(func):
163 """
172 """
164 Utility to decorate functions so that plain exceptions are translated.
173 Utility to decorate functions so that plain exceptions are translated.
165
174
166 The translation is based on `exc_map` which maps a `str` indicating
175 The translation is based on `exc_map` which maps a `str` indicating
167 the error type into an exception class representing this error inside
176 the error type into an exception class representing this error inside
168 of the vcs layer.
177 of the vcs layer.
169 """
178 """
170
179
171 @functools.wraps(func)
180 @functools.wraps(func)
172 def wrapper(*args, **kwargs):
181 def wrapper(*args, **kwargs):
173 try:
182 try:
174 return func(*args, **kwargs)
183 return func(*args, **kwargs)
175 except Exception as e:
184 except Exception as e:
176 # The error middleware adds information if it finds
185 # The error middleware adds information if it finds
177 # __traceback_info__ in a frame object. This way the remote
186 # __traceback_info__ in a frame object. This way the remote
178 # traceback information is made available in error reports.
187 # traceback information is made available in error reports.
179 remote_tb = getattr(e, '_pyroTraceback', None)
188 remote_tb = getattr(e, '_pyroTraceback', None)
180 if remote_tb:
189 if remote_tb:
181 __traceback_info__ = (
190 __traceback_info__ = (
182 'Found Pyro4 remote traceback information:\n\n' +
191 'Found Pyro4 remote traceback information:\n\n' +
183 '\n'.join(remote_tb))
192 '\n'.join(remote_tb))
184
193
185 # Avoid that remote_tb also appears in the frame
194 # Avoid that remote_tb also appears in the frame
186 del remote_tb
195 del remote_tb
187
196
188 # Special vcs errors had an attribute "_vcs_kind" which is used
197 # Special vcs errors had an attribute "_vcs_kind" which is used
189 # to translate them to the proper exception class in the vcs
198 # to translate them to the proper exception class in the vcs
190 # client layer.
199 # client layer.
191 kind = getattr(e, '_vcs_kind', None)
200 kind = getattr(e, '_vcs_kind', None)
192 if kind:
201 if kind:
193 raise _EXCEPTION_MAP[kind](*e.args)
202 raise _EXCEPTION_MAP[kind](*e.args)
194 else:
203 else:
195 raise
204 raise
196 return wrapper
205 return wrapper
General Comments 0
You need to be logged in to leave comments. Login now