44 get("/%project", this::project) |
44 get("/%project", this::project) |
45 get("/%project/issues/%version/%component/", this::project) |
45 get("/%project/issues/%version/%component/", this::project) |
46 get("/%project/edit", this::projectForm) |
46 get("/%project/edit", this::projectForm) |
47 get("/-/create", this::projectForm) |
47 get("/-/create", this::projectForm) |
48 post("/-/commit", this::projectCommit) |
48 post("/-/commit", this::projectCommit) |
|
49 post("/%project/vcs/analyze", this::vcsAnalyze) |
49 |
50 |
50 get("/%project/versions/", this::versions) |
51 get("/%project/versions/", this::versions) |
51 get("/%project/versions/%version/edit", this::versionForm) |
52 get("/%project/versions/%version/edit", this::versionForm) |
52 get("/%project/versions/-/create", this::versionForm) |
53 get("/%project/versions/-/create", this::versionForm) |
53 post("/%project/versions/-/commit", this::versionCommit) |
54 post("/%project/versions/-/commit", this::versionCommit) |
241 name = http.param("name") ?: "" |
242 name = http.param("name") ?: "" |
242 node = http.param("node") ?: "" |
243 node = http.param("node") ?: "" |
243 description = http.param("description") ?: "" |
244 description = http.param("description") ?: "" |
244 ordinal = http.param("ordinal")?.toIntOrNull() ?: 0 |
245 ordinal = http.param("ordinal")?.toIntOrNull() ?: 0 |
245 repoUrl = http.param("repoUrl") ?: "" |
246 repoUrl = http.param("repoUrl") ?: "" |
|
247 vcs = VcsType.valueOf(http.param("vcs") ?: "None") |
246 owner = (http.param("owner")?.toIntOrNull() ?: -1).let { |
248 owner = (http.param("owner")?.toIntOrNull() ?: -1).let { |
247 if (it < 0) null else dao.findUser(it) |
249 if (it < 0) null else dao.findUser(it) |
248 } |
250 } |
249 // intentional defaults |
251 // intentional defaults |
250 if (node.isBlank()) node = name |
252 if (node.isBlank()) node = name |
257 } else { |
259 } else { |
258 dao.updateProject(project) |
260 dao.updateProject(project) |
259 } |
261 } |
260 |
262 |
261 http.renderCommit("projects/${project.node}") |
263 http.renderCommit("projects/${project.node}") |
|
264 } |
|
265 |
|
266 private fun vcsAnalyze(http: HttpRequest, dao: DataAccessObject) { |
|
267 val projectInfo = obtainProjectInfo(http, dao) |
|
268 if (projectInfo == null) { |
|
269 http.response.sendError(404) |
|
270 return |
|
271 } |
|
272 |
|
273 // if analysis is not configured, reject the request |
|
274 if (projectInfo.project.vcs == VcsType.None) { |
|
275 http.response.sendError(404) |
|
276 return |
|
277 } |
|
278 |
|
279 // obtain the list of issues for this project to filter cross-project references |
|
280 val knownIds = dao.listIssues(projectInfo.project, true).map { it.id } |
|
281 |
|
282 // read the provided commit log and merge only the refs that relate issues from the current project |
|
283 dao.mergeCommitRefs(parseCommitRefs(http.body).filter { knownIds.contains(it.issueId) }) |
262 } |
284 } |
263 |
285 |
264 private fun versions(http: HttpRequest, dao: DataAccessObject) { |
286 private fun versions(http: HttpRequest, dao: DataAccessObject) { |
265 val projectInfo = obtainProjectInfo(http, dao) |
287 val projectInfo = obtainProjectInfo(http, dao) |
266 if (projectInfo == null) { |
288 if (projectInfo == null) { |
473 project, |
495 project, |
474 version, |
496 version, |
475 component, |
497 component, |
476 dao.listIssues(project, true), |
498 dao.listIssues(project, true), |
477 dao.listIssueRelations(issue), |
499 dao.listIssueRelations(issue), |
478 relationError |
500 relationError, |
|
501 dao.listCommitRefs(issue) |
479 ) |
502 ) |
480 feedPath = feedPath(projectInfo.project) |
503 feedPath = feedPath(projectInfo.project) |
481 navigationMenu = activeProjectNavMenu( |
504 navigationMenu = activeProjectNavMenu( |
482 dao.listProjects(), |
505 dao.listProjects(), |
483 projectInfo, |
506 projectInfo, |