Classes in this File | Line Coverage | Branch Coverage | Complexity | ||||
GitHubPatchRepository |
|
| 2.3333333333333335;2,333 |
1 | package org.apache.maven.plugins.patchtracker.patching.github; | |
2 | ||
3 | /* | |
4 | * Licensed to the Apache Software Foundation (ASF) under one | |
5 | * or more contributor license agreements. See the NOTICE file | |
6 | * distributed with this work for additional information | |
7 | * regarding copyright ownership. The ASF licenses this file | |
8 | * to you under the Apache License, Version 2.0 (the | |
9 | * "License"); you may not use this file except in compliance | |
10 | * with the License. You may obtain a copy of the License at | |
11 | * | |
12 | * http://www.apache.org/licenses/LICENSE-2.0 | |
13 | * | |
14 | * Unless required by applicable law or agreed to in writing, | |
15 | * software distributed under the License is distributed on an | |
16 | * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |
17 | * KIND, either express or implied. See the License for the | |
18 | * specific language governing permissions and limitations | |
19 | * under the License. | |
20 | */ | |
21 | ||
22 | import org.apache.commons.io.IOUtils; | |
23 | import org.apache.commons.lang.StringUtils; | |
24 | import org.apache.http.HttpResponse; | |
25 | import org.apache.http.client.ClientProtocolException; | |
26 | import org.apache.http.client.methods.HttpGet; | |
27 | import org.apache.http.impl.client.DefaultHttpClient; | |
28 | import org.apache.maven.plugin.logging.Log; | |
29 | import org.apache.maven.plugins.patchtracker.patching.PatchRepository; | |
30 | import org.apache.maven.plugins.patchtracker.patching.PatchRepositoryException; | |
31 | import org.apache.maven.plugins.patchtracker.patching.PatchRepositoryRequest; | |
32 | import org.apache.maven.plugins.patchtracker.patching.PatchRepositoryResult; | |
33 | import org.codehaus.jackson.JsonProcessingException; | |
34 | import org.codehaus.jackson.map.DeserializationConfig; | |
35 | import org.codehaus.jackson.map.ObjectMapper; | |
36 | ||
37 | import java.io.IOException; | |
38 | ||
39 | /** | |
40 | * @author Olivier Lamy | |
41 | * @plexus.component role="org.apache.maven.plugins.patchtracker.patching.PatchRepository" role-hint="github" | |
42 | */ | |
43 | 0 | public class GitHubPatchRepository |
44 | implements PatchRepository | |
45 | { | |
46 | 0 | DefaultHttpClient defaultHttpClient = new DefaultHttpClient(); |
47 | ||
48 | public PatchRepositoryResult getPatch( PatchRepositoryRequest patchRepositoryRequest, Log log ) | |
49 | throws PatchRepositoryException | |
50 | { | |
51 | try | |
52 | { | |
53 | //curl -v https://api.github.com/repos/apache/directmemory/pulls/1 | |
54 | 0 | String baseUrl = patchRepositoryRequest.getUrl(); |
55 | 0 | if ( StringUtils.isEmpty( baseUrl ) ) |
56 | { | |
57 | 0 | baseUrl = "https://api.github.com"; |
58 | 0 | log.info( "github api url is empty use default:" + baseUrl ); |
59 | } | |
60 | 0 | String url = patchRepositoryRequest.getUrl() + "/repos/" + patchRepositoryRequest.getOrganization() + "/" |
61 | + patchRepositoryRequest.getRepository() + "/pulls/" + patchRepositoryRequest.getId(); | |
62 | 0 | log.debug( "url" + url ); |
63 | ||
64 | 0 | HttpGet httpGet = new HttpGet( url ); |
65 | ||
66 | 0 | HttpResponse httpResponse = defaultHttpClient.execute( httpGet ); |
67 | ||
68 | 0 | String response = IOUtils.toString( httpResponse.getEntity().getContent() ); |
69 | ||
70 | 0 | log.debug( "response:" + response ); |
71 | ||
72 | 0 | PatchRepositoryResult patchRepositoryResult = fromJson( response ); |
73 | ||
74 | 0 | log.debug( "patchRepositoryResult:" + patchRepositoryResult ); |
75 | ||
76 | 0 | patchRepositoryResult.setPatchContent( getPatchContent( patchRepositoryResult ) ); |
77 | ||
78 | 0 | log.debug( "pullRequest:" + patchRepositoryResult.toString() ); |
79 | 0 | return patchRepositoryResult; |
80 | } | |
81 | 0 | catch ( IOException e ) |
82 | { | |
83 | 0 | throw new PatchRepositoryException( e.getMessage(), e ); |
84 | } | |
85 | } | |
86 | ||
87 | protected String getPatchContent( PatchRepositoryResult pullRequest ) | |
88 | throws IOException, ClientProtocolException | |
89 | { | |
90 | 0 | HttpGet httpGet = new HttpGet( pullRequest.getPatchUrl() ); |
91 | ||
92 | 0 | HttpResponse httpResponse = defaultHttpClient.execute( httpGet ); |
93 | ||
94 | 0 | return IOUtils.toString( httpResponse.getEntity().getContent() ); |
95 | } | |
96 | ||
97 | /** | |
98 | * parse json from gitbut see http://developer.github.com/v3/pulls/ | |
99 | * | |
100 | * @param jsonContent | |
101 | * @return | |
102 | * @throws IOException | |
103 | * @throws JsonProcessingException | |
104 | */ | |
105 | protected PatchRepositoryResult fromJson( String jsonContent ) | |
106 | throws IOException, JsonProcessingException | |
107 | { | |
108 | 0 | ObjectMapper objectMapper = new ObjectMapper(); |
109 | ||
110 | // we don't parse all stuff | |
111 | // se json format below or documentation | |
112 | 0 | objectMapper.configure( DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false ); |
113 | ||
114 | //objectMapper. | |
115 | ||
116 | 0 | return objectMapper.reader( GithubPatchRepositoryResult.class ).readValue( jsonContent ); |
117 | } | |
118 | ||
119 | /** | |
120 | * json format | |
121 | * <p/> | |
122 | * curl -v https://api.github.com/repos/apache/directmemory/pulls/1 | |
123 | * <p/> | |
124 | * { | |
125 | * "merged_by": null, | |
126 | * "merged": false, | |
127 | * "title": "test wonderful patch ", | |
128 | * "head": { | |
129 | * "repo": { | |
130 | * "watchers": 1, | |
131 | * "forks": 0, | |
132 | * "pushed_at": "2011-11-26T15:17:32Z", | |
133 | * "svn_url": "https://svn.github.com/olamy/directmemory", | |
134 | * "description": "Mirror of Apache DirectMemory", | |
135 | * "created_at": "2011-11-26T09:39:35Z", | |
136 | * "url": "https://api.github.com/repos/olamy/directmemory", | |
137 | * "fork": true, | |
138 | * "language": "Java", | |
139 | * "git_url": "git://github.com/olamy/directmemory.git", | |
140 | * "clone_url": "https://github.com/olamy/directmemory.git", | |
141 | * "open_issues": 0, | |
142 | * "private": false, | |
143 | * "html_url": "https://github.com/olamy/directmemory", | |
144 | * "homepage": null, | |
145 | * "size": 112, | |
146 | * "master_branch": "trunk", | |
147 | * "updated_at": "2011-11-26T15:17:32Z", | |
148 | * "owner": { | |
149 | * "avatar_url": "https://secure.gravatar.com/avatar/bab29f762bea8e578505424443d8cd41?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-140.png", | |
150 | * "url": "https://api.github.com/users/olamy", | |
151 | * "login": "olamy", | |
152 | * "gravatar_id": "bab29f762bea8e578505424443d8cd41", | |
153 | * "id": 19728 | |
154 | * }, | |
155 | * "name": "directmemory", | |
156 | * "id": 2854963, | |
157 | * "ssh_url": "git@github.com:olamy/directmemory.git" | |
158 | * }, | |
159 | * "user": { | |
160 | * "avatar_url": "https://secure.gravatar.com/avatar/bab29f762bea8e578505424443d8cd41?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-140.png", | |
161 | * "url": "https://api.github.com/users/olamy", | |
162 | * "login": "olamy", | |
163 | * "gravatar_id": "bab29f762bea8e578505424443d8cd41", | |
164 | * "id": 19728 | |
165 | * }, | |
166 | * "ref": "trunk", | |
167 | * "label": "olamy:trunk", | |
168 | * "sha": "73d403199b415108a6f2a72c95b9ec684e6f1dc1" | |
169 | * }, | |
170 | * "_links": { | |
171 | * "html": { | |
172 | * "href": "https://github.com/apache/directmemory/pull/1" | |
173 | * }, | |
174 | * "review_comments": { | |
175 | * "href": "https://api.github.com/repos/apache/directmemory/pulls/1/comments" | |
176 | * }, | |
177 | * "self": { | |
178 | * "href": "https://api.github.com/repos/apache/directmemory/pulls/1" | |
179 | * }, | |
180 | * "comments": { | |
181 | * "href": "https://api.github.com/repos/apache/directmemory/issues/1/comments" | |
182 | * } | |
183 | * }, | |
184 | * "merged_at": null, | |
185 | * "created_at": "2011-11-26T14:59:52Z", | |
186 | * "state": "open", | |
187 | * "url": "https://api.github.com/repos/apache/directmemory/pulls/1", | |
188 | * "commits": 3, | |
189 | * "deletions": 0, | |
190 | * "changed_files": 2, | |
191 | * "review_comments": 0, | |
192 | * "closed_at": null, | |
193 | * "user": { | |
194 | * "avatar_url": "https://secure.gravatar.com/avatar/bab29f762bea8e578505424443d8cd41?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-140.png", | |
195 | * "url": "https://api.github.com/users/olamy", | |
196 | * "login": "olamy", | |
197 | * "gravatar_id": "bab29f762bea8e578505424443d8cd41", | |
198 | * "id": 19728 | |
199 | * }, | |
200 | * "base": { | |
201 | * "repo": { | |
202 | * "watchers": 3, | |
203 | * "forks": 2, | |
204 | * "pushed_at": "2011-11-03T00:02:25Z", | |
205 | * "svn_url": "https://svn.github.com/apache/directmemory", | |
206 | * "description": "Mirror of Apache DirectMemory", | |
207 | * "created_at": "2011-10-15T07:00:08Z", | |
208 | * "url": "https://api.github.com/repos/apache/directmemory", | |
209 | * "fork": false, | |
210 | * "language": "Java", | |
211 | * "git_url": "git://github.com/apache/directmemory.git", | |
212 | * "clone_url": "https://github.com/apache/directmemory.git", | |
213 | * "open_issues": 0, | |
214 | * "private": false, | |
215 | * "html_url": "https://github.com/apache/directmemory", | |
216 | * "homepage": null, | |
217 | * "size": 3076, | |
218 | * "master_branch": "trunk", | |
219 | * "updated_at": "2011-11-26T09:39:35Z", | |
220 | * "owner": { | |
221 | * "avatar_url": "https://secure.gravatar.com/avatar/a676c0bf448fcd49f588249ead719b4c?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-140.png", | |
222 | * "url": "https://api.github.com/users/apache", | |
223 | * "login": "apache", | |
224 | * "gravatar_id": "a676c0bf448fcd49f588249ead719b4c", | |
225 | * "id": 47359 | |
226 | * }, | |
227 | * "name": "directmemory", | |
228 | * "id": 2580771, | |
229 | * "ssh_url": "git@github.com:apache/directmemory.git" | |
230 | * }, | |
231 | * "user": { | |
232 | * "avatar_url": "https://secure.gravatar.com/avatar/a676c0bf448fcd49f588249ead719b4c?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-140.png", | |
233 | * "url": "https://api.github.com/users/apache", | |
234 | * "login": "apache", | |
235 | * "gravatar_id": "a676c0bf448fcd49f588249ead719b4c", | |
236 | * "id": 47359 | |
237 | * }, | |
238 | * "ref": "trunk", | |
239 | * "label": "apache:trunk", | |
240 | * "sha": "f9ddc283dbc4f391a0876b5bd36453ac7e563b79" | |
241 | * }, | |
242 | * "html_url": "https://github.com/apache/directmemory/pull/1", | |
243 | * "updated_at": "2011-11-26T15:17:33Z", | |
244 | * "number": 1, | |
245 | * "issue_url": "https://github.com/apache/directmemory/issues/1", | |
246 | * "mergeable": true, | |
247 | * "additions": 6, | |
248 | * "patch_url": "https://github.com/apache/directmemory/pull/1.patch", | |
249 | * "id": 530496, | |
250 | * "comments": 0, | |
251 | * "body": "test email works to directmemory ml .", | |
252 | * "diff_url": "https://github.com/apache/directmemory/pull/1.diff" | |
253 | * } | |
254 | */ | |
255 | ||
256 | } |