diff --git a/src/main/scala/app/AccountController.scala b/src/main/scala/app/AccountController.scala index 84c246e..67f040d 100644 --- a/src/main/scala/app/AccountController.scala +++ b/src/main/scala/app/AccountController.scala @@ -22,26 +22,19 @@ */ get("/:userName") { val userName = params("userName") - getAccountByUserName(userName) match { - case Some(a) => account.html.userinfo(a, getVisibleRepositories(userName, baseUrl, context.loginAccount.map(_.userName))) - case None => NotFound() - } + getAccountByUserName(userName).map { + account.html.userinfo(_, getVisibleRepositories(userName, baseUrl, context.loginAccount.map(_.userName))) + } getOrElse NotFound() } get("/:userName/_edit")(ownerOnly { val userName = params("userName") - getAccountByUserName(userName) match { - case Some(a) => account.html.useredit(a) - case None => NotFound() - } + getAccountByUserName(userName).map(account.html.useredit(_)) getOrElse NotFound() }) post("/:userName/_edit", form)(ownerOnly { form => val userName = params("userName") - updateAccount(getAccountByUserName(userName).get.copy( - mailAddress = form.mailAddress, - url = form.url)) - + updateAccount(getAccountByUserName(userName).get.copy(mailAddress = form.mailAddress, url = form.url)) redirect("/%s".format(userName)) }) diff --git a/src/main/scala/app/LabelsController.scala b/src/main/scala/app/LabelsController.scala index 55b4942..2f9b2b7 100644 --- a/src/main/scala/app/LabelsController.scala +++ b/src/main/scala/app/LabelsController.scala @@ -36,10 +36,8 @@ val owner = params("owner") val repository = params("repository") - getRepository(owner, repository, baseUrl) match { - case None => NotFound() - case Some(r) => issues.html.labeleditlist(getLabels(owner, repository), r) - } + getRepository(owner, repository, baseUrl) + .map(issues.html.labeleditlist(getLabels(owner, repository), _)) getOrElse NotFound() }) get("/:owner/:repository/issues/label/:labelId/edit")(writableRepository { @@ -47,13 +45,9 @@ val repository = params("repository") val labelId = params("labelId").toInt - getRepository(owner, repository, baseUrl) match { - case None => NotFound() - case Some(r) => getLabel(owner, repository, labelId) match { - case None => NotFound() - case Some(l) => issues.html.labeledit(Some(l), r) - } - } + getRepository(owner, repository, baseUrl).map { repositoryInfo => + getLabel(owner, repository, labelId).map(label => issues.html.labeledit(Some(label), repositoryInfo)) getOrElse NotFound() + } getOrElse NotFound() }) post("/:owner/:repository/issues/label/:labelId/edit", editForm)(writableRepository { form => @@ -61,13 +55,10 @@ val repository = params("repository") val labelId = params("labelId").toInt - getRepository(owner, repository, baseUrl) match { - case None => NotFound() - case Some(r) => { - updateLabel(owner, repository, labelId, form.labelName, form.color.substring(1)) - issues.html.labeleditlist(getLabels(owner, repository), r) - } - } + getRepository(owner, repository, baseUrl).map{ repositoryInfo => + updateLabel(owner, repository, labelId, form.labelName, form.color.substring(1)) + issues.html.labeleditlist(getLabels(owner, repository), repositoryInfo) + } getOrElse NotFound() }) get("/:owner/:repository/issues/label/:labelId/delete")(writableRepository { @@ -75,13 +66,10 @@ val repository = params("repository") val labelId = params("labelId").toInt - getRepository(owner, repository, baseUrl) match { - case None => NotFound() - case Some(r) => { - deleteLabel(owner, repository, labelId) - issues.html.labeleditlist(getLabels(owner, repository), r) - } - } + getRepository(owner, repository, baseUrl).map { repositoryInfo => + deleteLabel(owner, repository, labelId) + issues.html.labeleditlist(getLabels(owner, repository), repositoryInfo) + } getOrElse NotFound() }) } \ No newline at end of file diff --git a/src/main/scala/app/MilestonesController.scala b/src/main/scala/app/MilestonesController.scala index d1a6837..7806850 100644 --- a/src/main/scala/app/MilestonesController.scala +++ b/src/main/scala/app/MilestonesController.scala @@ -26,21 +26,20 @@ val repository = params("repository") val state = params.getOrElse("state", "open") - getRepository(owner, repository, baseUrl) match { - case None => NotFound() - case Some(r) => issues.html.milestones(state, getMilestones(owner, repository), - getMilestoneIssueCounts(owner, repository), r, isWritable(owner, repository, context.loginAccount)) - } + getRepository(owner, repository, baseUrl).map { repositoryInfo => + issues.html.milestones(state, + getMilestones(owner, repository), + getMilestoneIssueCounts(owner, repository), + repositoryInfo, + isWritable(owner, repository, context.loginAccount)) + } getOrElse NotFound() }) get("/:owner/:repository/issues/milestones/new")(writableRepository { val owner = params("owner") val repository = params("repository") - getRepository(owner, repository, baseUrl) match { - case None => NotFound() - case Some(r) => issues.html.milestoneedit(None, r) - } + getRepository(owner, repository, baseUrl).map(issues.html.milestoneedit(None, _)) getOrElse NotFound() }) post("/:owner/:repository/issues/milestones/new", milestoneForm)(writableRepository { form => @@ -48,7 +47,6 @@ val repository = params("repository") createMilestone(owner, repository, form.title, form.description, form.dueDate) - redirect("/%s/%s/issues/milestones".format(owner, repository)) }) @@ -57,10 +55,8 @@ val repository = params("repository") val milestoneId = params("milestoneId").toInt - getRepository(owner, repository, baseUrl) match { - case None => NotFound() - case Some(r) => issues.html.milestoneedit(getMilestone(owner, repository, milestoneId), r) - } + getRepository(owner, repository, baseUrl).map( + issues.html.milestoneedit(getMilestone(owner, repository, milestoneId), _)) getOrElse NotFound() }) post("/:owner/:repository/issues/milestones/:milestoneId/edit", milestoneForm)(writableRepository { form => @@ -68,13 +64,10 @@ val repository = params("repository") val milestoneId = params("milestoneId").toInt - getMilestone(owner, repository, milestoneId) match { - case None => NotFound() - case Some(m) => { - updateMilestone(m.copy(title = form.title, description = form.description, dueDate = form.dueDate)) - redirect("/%s/%s/issues/milestones".format(owner, repository)) - } - } + getMilestone(owner, repository, milestoneId).map { milestone => + updateMilestone(milestone.copy(title = form.title, description = form.description, dueDate = form.dueDate)) + redirect("/%s/%s/issues/milestones".format(owner, repository)) + } getOrElse NotFound() }) get("/:owner/:repository/issues/milestones/:milestoneId/close")(writableRepository { @@ -82,13 +75,10 @@ val repository = params("repository") val milestoneId = params("milestoneId").toInt - getMilestone(owner, repository, milestoneId) match { - case None => NotFound() - case Some(m) => { - closeMilestone(m) - redirect("/%s/%s/issues/milestones".format(owner, repository)) - } - } + getMilestone(owner, repository, milestoneId).map { milestone => + closeMilestone(milestone) + redirect("/%s/%s/issues/milestones".format(owner, repository)) + } getOrElse NotFound() }) get("/:owner/:repository/issues/milestones/:milestoneId/open")(writableRepository { @@ -96,13 +86,10 @@ val repository = params("repository") val milestoneId = params("milestoneId").toInt - getMilestone(owner, repository, milestoneId) match { - case None => NotFound() - case Some(m) => { - openMilestone(m) - redirect("/%s/%s/issues/milestones".format(owner, repository)) - } - } + getMilestone(owner, repository, milestoneId).map { milestone => + openMilestone(milestone) + redirect("/%s/%s/issues/milestones".format(owner, repository)) + } getOrElse NotFound() }) get("/:owner/:repository/issues/milestones/:milestoneId/delete")(writableRepository { @@ -110,13 +97,10 @@ val repository = params("repository") val milestoneId = params("milestoneId").toInt - getMilestone(owner, repository, milestoneId) match { - case None => NotFound() - case Some(m) => { - deleteMilestone(owner, repository, milestoneId) - redirect("/%s/%s/issues/milestones".format(owner, repository)) - } - } + getMilestone(owner, repository, milestoneId).map { _ => + deleteMilestone(owner, repository, milestoneId) + redirect("/%s/%s/issues/milestones".format(owner, repository)) + } getOrElse NotFound() }) } diff --git a/src/main/scala/app/RepositoryViewerController.scala b/src/main/scala/app/RepositoryViewerController.scala index c74a4f0..c6f27fa 100644 --- a/src/main/scala/app/RepositoryViewerController.scala +++ b/src/main/scala/app/RepositoryViewerController.scala @@ -74,15 +74,16 @@ val repository = params("repository") val branchName = params("branch") val page = params.getOrElse("page", "1").toInt - - JGitUtil.withGit(getRepositoryDir(owner, repository)){ git => - val (logs, hasNext) = JGitUtil.getCommitLog(git, branchName, page, 30) - - repo.html.commits(Nil, branchName, getRepository(owner, repository, baseUrl).get, - logs.splitWith{ (commit1, commit2) => + + getRepository(owner, repository, baseUrl).map { repositoryInfo => + JGitUtil.withGit(getRepositoryDir(owner, repository)){ git => + val (logs, hasNext) = JGitUtil.getCommitLog(git, branchName, page, 30) + + repo.html.commits(Nil, branchName, repositoryInfo, logs.splitWith{ (commit1, commit2) => view.helpers.date(commit1.time) == view.helpers.date(commit2.time) }, page, hasNext) - } + } + } getOrElse NotFound() }) /** @@ -114,50 +115,51 @@ val id = params("id") // branch name or commit id val raw = params.get("raw").getOrElse("false").toBoolean val path = multiParams("splat").head //.replaceFirst("^tree/.+?/", "") - val repositoryInfo = getRepository(owner, repository, baseUrl).get - JGitUtil.withGit(getRepositoryDir(owner, repository)){ git => - val revCommit = JGitUtil.getRevCommitFromId(git, git.getRepository.resolve(id)) - - @scala.annotation.tailrec - def getPathObjectId(path: String, walk: TreeWalk): ObjectId = walk.next match { - case true if(walk.getPathString == path) => walk.getObjectId(0) - case true => getPathObjectId(path, walk) - } - - val treeWalk = new TreeWalk(git.getRepository) - val objectId = try { - treeWalk.addTree(revCommit.getTree) - treeWalk.setRecursive(true) - getPathObjectId(path, treeWalk) - } finally { - treeWalk.release - } - - if(raw){ - // Download - contentType = "application/octet-stream" - JGitUtil.getContent(git, objectId, false).get - } else { - // Viewer - val large = FileTypeUtil.isLarge(git.getRepository.getObjectDatabase.open(objectId).getSize) - val viewer = if(FileTypeUtil.isImage(path)) "image" else if(large) "large" else "other" - val bytes = if(viewer == "other") JGitUtil.getContent(git, objectId, false) else None + getRepository(owner, repository, baseUrl).map { repositoryInfo => + JGitUtil.withGit(getRepositoryDir(owner, repository)){ git => + val revCommit = JGitUtil.getRevCommitFromId(git, git.getRepository.resolve(id)) - val content = if(viewer == "other"){ - if(bytes.isDefined && FileTypeUtil.isText(bytes.get)){ - // text - JGitUtil.ContentInfo("text", bytes.map(new String(_, "UTF-8"))) - } else { - // binary - JGitUtil.ContentInfo("binary", None) - } - } else { - // image or large - JGitUtil.ContentInfo(viewer, None) + @scala.annotation.tailrec + def getPathObjectId(path: String, walk: TreeWalk): ObjectId = walk.next match { + case true if(walk.getPathString == path) => walk.getObjectId(0) + case true => getPathObjectId(path, walk) } - - repo.html.blob(id, repositoryInfo, path.split("/").toList, content, new JGitUtil.CommitInfo(revCommit)) + + val treeWalk = new TreeWalk(git.getRepository) + val objectId = try { + treeWalk.addTree(revCommit.getTree) + treeWalk.setRecursive(true) + getPathObjectId(path, treeWalk) + } finally { + treeWalk.release + } + + if(raw){ + // Download + contentType = "application/octet-stream" + JGitUtil.getContent(git, objectId, false).get + } else { + // Viewer + val large = FileTypeUtil.isLarge(git.getRepository.getObjectDatabase.open(objectId).getSize) + val viewer = if(FileTypeUtil.isImage(path)) "image" else if(large) "large" else "other" + val bytes = if(viewer == "other") JGitUtil.getContent(git, objectId, false) else None + + val content = if(viewer == "other"){ + if(bytes.isDefined && FileTypeUtil.isText(bytes.get)){ + // text + JGitUtil.ContentInfo("text", bytes.map(new String(_, "UTF-8"))) + } else { + // binary + JGitUtil.ContentInfo("binary", None) + } + } else { + // image or large + JGitUtil.ContentInfo(viewer, None) + } + + repo.html.blob(id, repositoryInfo, path.split("/").toList, content, new JGitUtil.CommitInfo(revCommit)) + } } } }) @@ -169,14 +171,15 @@ val owner = params("owner") val repository = params("repository") val id = params("id") - - JGitUtil.withGit(getRepositoryDir(owner, repository)){ git => - val revCommit = JGitUtil.getRevCommitFromId(git, git.getRepository.resolve(id)) - - repo.html.commit(id, new JGitUtil.CommitInfo(revCommit), - JGitUtil.getBranchesOfCommit(git, revCommit.getName), - JGitUtil.getTagsOfCommit(git, revCommit.getName), - getRepository(owner, repository, baseUrl).get, JGitUtil.getDiffs(git, id)) + + getRepository(owner, repository, baseUrl).map { repositoryInfo => + JGitUtil.withGit(getRepositoryDir(owner, repository)){ git => + val revCommit = JGitUtil.getRevCommitFromId(git, git.getRepository.resolve(id)) + + repo.html.commit(id, new JGitUtil.CommitInfo(revCommit), + JGitUtil.getBranchesOfCommit(git, revCommit.getName), JGitUtil.getTagsOfCommit(git, revCommit.getName), + repositoryInfo, JGitUtil.getDiffs(git, id)) + } } }) @@ -241,41 +244,38 @@ * @return HTML of the file list */ private def fileList(owner: String, repository: String, revstr: String = "", path: String = ".") = { - getRepository(owner, repository, baseUrl) match { - case None => NotFound() - case Some(repositoryInfo) => { - val revision = if(revstr.isEmpty){ - repositoryInfo.repository.defaultBranch - } else { - revstr + getRepository(owner, repository, baseUrl).map { repositoryInfo => + val revision = if(revstr.isEmpty){ + repositoryInfo.repository.defaultBranch + } else { + revstr + } + + JGitUtil.withGit(getRepositoryDir(owner, repository)){ git => + // get latest commit + val revCommit = JGitUtil.getRevCommitFromId(git, git.getRepository.resolve(revision)) + + val files = JGitUtil.getFileList(git, revision, path) + + // process README.md + val readme = files.find(_.name == "README.md").map { file => + new String(JGitUtil.getContent(Git.open(getRepositoryDir(owner, repository)), file.id, true).get, "UTF-8") } - JGitUtil.withGit(getRepositoryDir(owner, repository)){ git => - // get latest commit - val revCommit = JGitUtil.getRevCommitFromId(git, git.getRepository.resolve(revision)) - - val files = JGitUtil.getFileList(git, revision, path) - - // process README.md - val readme = files.find(_.name == "README.md").map { file => - new String(JGitUtil.getContent(Git.open(getRepositoryDir(owner, repository)), file.id, true).get, "UTF-8") - } - - repo.html.files( - // current branch - revision, - // repository - repositoryInfo, - // current path - if(path == ".") Nil else path.split("/").toList, - // latest commit - new JGitUtil.CommitInfo(revCommit), - // file list - files, - // readme - readme - ) - } + repo.html.files( + // current branch + revision, + // repository + repositoryInfo, + // current path + if(path == ".") Nil else path.split("/").toList, + // latest commit + new JGitUtil.CommitInfo(revCommit), + // file list + files, + // readme + readme + ) } } } diff --git a/src/main/scala/app/SettingsController.scala b/src/main/scala/app/SettingsController.scala index 88637fc..bd704e4 100644 --- a/src/main/scala/app/SettingsController.scala +++ b/src/main/scala/app/SettingsController.scala @@ -43,10 +43,7 @@ val owner = params("owner") val repository = params("repository") - getRepository(owner, repository, baseUrl) match { - case Some(r) => settings.html.options(r) - case None => NotFound() - } + getRepository(owner, repository, baseUrl).map(settings.html.options(_)) getOrElse NotFound() }) /** @@ -69,10 +66,8 @@ val owner = params("owner") val repository = params("repository") - getRepository(owner, repository, baseUrl) match { - case Some(r) => settings.html.collaborators(getCollaborators(owner, repository), r) - case None => NotFound() - } + getRepository(owner, repository, baseUrl).map( + settings.html.collaborators(getCollaborators(owner, repository), _)) getOrElse NotFound() }) /** @@ -105,10 +100,7 @@ val owner = params("owner") val repository = params("repository") - getRepository(owner, repository, baseUrl) match { - case Some(r) => settings.html.delete(r) - case None => NotFound() - } + getRepository(owner, repository, baseUrl).map(settings.html.delete(_)) getOrElse NotFound() }) /** diff --git a/src/main/scala/app/WikiController.scala b/src/main/scala/app/WikiController.scala index 69d278a..2f34d0d 100644 --- a/src/main/scala/app/WikiController.scala +++ b/src/main/scala/app/WikiController.scala @@ -31,24 +31,23 @@ val owner = params("owner") val repository = params("repository") - getRepository(owner, repository, baseUrl) match { - case Some(repoInfo) => getWikiPage(owner, repository, "Home") match { - case Some(page) => wiki.html.wiki("Home", page, repoInfo, isWritable(owner, repository, context.loginAccount)) - case None => redirect("/%s/%s/wiki/Home/_edit".format(owner, repository)) - } - case None => NotFound() - } + getRepository(owner, repository, baseUrl).map { repositoryInfo => + getWikiPage(owner, repository, "Home").map { page => + wiki.html.wiki("Home", page, repositoryInfo, isWritable(owner, repository, context.loginAccount)) + } getOrElse redirect("/%s/%s/wiki/Home/_edit".format(owner, repository)) + } getOrElse NotFound() }) get("/:owner/:repository/wiki/:page")(readableRepository { val owner = params("owner") val repository = params("repository") val pageName = params("page") - - getWikiPage(owner, repository, pageName) match { - case Some(page) => wiki.html.wiki(pageName, page, getRepository(owner, repository, baseUrl).get, isWritable(owner, repository, context.loginAccount)) - case None => redirect("/%s/%s/wiki/%s/_edit".format(owner, repository, pageName)) // TODO URLEncode - } + + getRepository(owner, repository, baseUrl).map { repositoryInfo => + getWikiPage(owner, repository, pageName).map { page => + wiki.html.wiki(pageName, page, repositoryInfo, isWritable(owner, repository, context.loginAccount)) + } getOrElse redirect("/%s/%s/wiki/%s/_edit".format(owner, repository, pageName)) // TODO URLEncode + } getOrElse NotFound() }) get("/:owner/:repository/wiki/:page/_history")(readableRepository { @@ -56,12 +55,11 @@ val repository = params("repository") val page = params("page") - getRepository(owner, repository, baseUrl) match { - case Some(repoInfo) => JGitUtil.withGit(getWikiRepositoryDir(owner, repository)){ git => - wiki.html.wikihistory(Some(page), JGitUtil.getCommitLog(git, "master", path = page + ".md")._1, repoInfo) + getRepository(owner, repository, baseUrl).map { repositoryInfo => + JGitUtil.withGit(getWikiRepositoryDir(owner, repository)){ git => + wiki.html.wikihistory(Some(page), JGitUtil.getCommitLog(git, "master", path = page + ".md")._1, repositoryInfo) } - case None => NotFound() - } + } getOrElse NotFound() }) get("/:owner/:repository/wiki/:page/_compare/:commitId")(readableRepository { @@ -69,11 +67,12 @@ val repository = params("repository") val page = params("page") val commitId = params("commitId").split("\\.\\.\\.") - - JGitUtil.withGit(getWikiRepositoryDir(owner, repository)){ git => - wiki.html.wikicompare(Some(page), - getWikiDiffs(git, commitId(0), commitId(1)), getRepository(owner, repository, baseUrl).get) - } + + getRepository(owner, repository, baseUrl).map { repositoryInfo => + JGitUtil.withGit(getWikiRepositoryDir(owner, repository)){ git => + wiki.html.wikicompare(Some(page), getWikiDiffs(git, commitId(0), commitId(1)), repositoryInfo) + } + } getOrElse NotFound() }) get("/:owner/:repository/wiki/_compare/:commitId")(readableRepository { @@ -81,12 +80,11 @@ val repository = params("repository") val commitId = params("commitId").split("\\.\\.\\.") - getRepository(owner, repository, baseUrl) match { - case Some(repoInfo) => JGitUtil.withGit(getWikiRepositoryDir(owner, repository)){ git => - wiki.html.wikicompare(None, getWikiDiffs(git, commitId(0), commitId(1)), repoInfo) + getRepository(owner, repository, baseUrl).map { repositoryInfo => + JGitUtil.withGit(getWikiRepositoryDir(owner, repository)){ git => + wiki.html.wikicompare(None, getWikiDiffs(git, commitId(0), commitId(1)), repositoryInfo) } - case None => NotFound() - } + } getOrElse NotFound() }) get("/:owner/:repository/wiki/:page/_edit")(writableRepository { @@ -94,10 +92,8 @@ val repository = params("repository") val page = params("page") - getRepository(owner, repository, baseUrl) match { - case Some(repoInfo) => wiki.html.wikiedit(page, getWikiPage(owner, repository, page), repoInfo) - case None => NotFound() - } + getRepository(owner, repository, baseUrl).map( + wiki.html.wikiedit(page, getWikiPage(owner, repository, page), _)) getOrElse NotFound() }) post("/:owner/:repository/wiki/_edit", editForm)(writableRepository { form => @@ -115,10 +111,7 @@ val owner = params("owner") val repository = params("repository") - getRepository(owner, repository, baseUrl) match { - case Some(repoInfo) => wiki.html.wikiedit("", None, repoInfo) - case None => NotFound() - } + getRepository(owner, repository, baseUrl).map(wiki.html.wikiedit("", None, _)) getOrElse NotFound() }) post("/:owner/:repository/wiki/_new", newForm)(writableRepository { form => @@ -146,22 +139,20 @@ val owner = params("owner") val repository = params("repository") - getRepository(owner, repository, baseUrl) match { - case Some(repoInfo) => wiki.html.wikipages(getWikiPageList(owner, repository), repoInfo, isWritable(owner, repository, context.loginAccount)) - case None => NotFound() - } + getRepository(owner, repository, baseUrl).map { + wiki.html.wikipages(getWikiPageList(owner, repository), _, isWritable(owner, repository, context.loginAccount)) + } getOrElse NotFound() }) get("/:owner/:repository/wiki/_history")(readableRepository { val owner = params("owner") val repository = params("repository") - getRepository(owner, repository, baseUrl) match { - case Some(repoInfo) => JGitUtil.withGit(getWikiRepositoryDir(owner, repository)){ git => - wiki.html.wikihistory(None, JGitUtil.getCommitLog(git, "master")._1, repoInfo) + getRepository(owner, repository, baseUrl).map { repositoryInfo => + JGitUtil.withGit(getWikiRepositoryDir(owner, repository)){ git => + wiki.html.wikihistory(None, JGitUtil.getCommitLog(git, "master")._1, repositoryInfo) } - case None => NotFound() - } + } getOrElse NotFound() }) get("/:owner/:repository/wiki/_blob/*")(readableRepository { @@ -169,13 +160,10 @@ val repository = params("repository") val path = multiParams("splat").head - getFileContent(owner, repository, path) match { - case Some(content) => { + getFileContent(owner, repository, path).map { content => contentType = "application/octet-stream" content - } - case None => NotFound() - } + } getOrElse NotFound() }) private def unique: Constraint = new Constraint(){