diff --git a/src/main/scala/app/RepositoryViewerController.scala b/src/main/scala/app/RepositoryViewerController.scala index 4ba43cb..1127d19 100644 --- a/src/main/scala/app/RepositoryViewerController.scala +++ b/src/main/scala/app/RepositoryViewerController.scala @@ -58,13 +58,14 @@ get("/:owner/:repository/commits/:branch")(referrersOnly { repository => val branchName = params("branch") val page = params.getOrElse("page", "1").toInt - JGitUtil.withGit(getRepositoryDir(repository.owner, repository.name)){ git => - val (logs, hasNext) = JGitUtil.getCommitLog(git, branchName, page, 30) - - repo.html.commits(Nil, branchName, repository, logs.splitWith{ (commit1, commit2) => - view.helpers.date(commit1.time) == view.helpers.date(commit2.time) - }, page, hasNext) + JGitUtil.getCommitLog(git, branchName, page, 30) match { + case Right((logs, hasNext)) => + repo.html.commits(Nil, branchName, repository, logs.splitWith{ (commit1, commit2) => + view.helpers.date(commit1.time) == view.helpers.date(commit2.time) + }, page, hasNext) + case Left(_) => NotFound + } } }) @@ -77,12 +78,14 @@ val page = params.getOrElse("page", "1").toInt JGitUtil.withGit(getRepositoryDir(repository.owner, repository.name)){ git => - val (logs, hasNext) = JGitUtil.getCommitLog(git, branchName, page, 30, path) - - repo.html.commits(path.split("/").toList, branchName, repository, - logs.splitWith{ (commit1, commit2) => - view.helpers.date(commit1.time) == view.helpers.date(commit2.time) - }, page, hasNext) + JGitUtil.getCommitLog(git, branchName, page, 30, path) match { + case Right((logs, hasNext)) => + repo.html.commits(path.split("/").toList, branchName, repository, + logs.splitWith{ (commit1, commit2) => + view.helpers.date(commit1.time) == view.helpers.date(commit2.time) + }, page, hasNext) + case Left(_) => NotFound + } } }) @@ -214,27 +217,25 @@ repo.html.guide(repository) } else { JGitUtil.withGit(getRepositoryDir(repository.owner, repository.name)){ git => - // get specified commit - val (revCommit, revision) = try { - val revision = if(revstr.isEmpty) repository.repository.defaultBranch else revstr - (JGitUtil.getRevCommitFromId(git, git.getRepository.resolve(revision)), revision) - } catch { - case e: NullPointerException => { - val revision = repository.branchList.head - (JGitUtil.getRevCommitFromId(git, git.getRepository.resolve(revision)), revision) - } - } - // get files - 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(repository.owner, repository.name)), file.id, true).get, "UTF-8") - } + val revisions = Seq(if(revstr.isEmpty) repository.repository.defaultBranch else revstr, repository.branchList.head) + //val objectId = git.getRepository.resolve(revstr2) - repo.html.files(revision, repository, - if(path == ".") Nil else path.split("/").toList, // current path - new JGitUtil.CommitInfo(revCommit), // latest commit - files, readme) + // get specified commit + revisions.map { rev => (git.getRepository.resolve(rev), rev)}.find(_._1 != null).map { case (objectId, revision) => + val revCommit = JGitUtil.getRevCommitFromId(git, objectId) + + // get files + 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(repository.owner, repository.name)), file.id, true).get, "UTF-8") + } + + repo.html.files(revision, repository, + if(path == ".") Nil else path.split("/").toList, // current path + new JGitUtil.CommitInfo(revCommit), // latest commit + files, readme) + } getOrElse NotFound } } } diff --git a/src/main/scala/app/WikiController.scala b/src/main/scala/app/WikiController.scala index 8a4a22f..d746367 100644 --- a/src/main/scala/app/WikiController.scala +++ b/src/main/scala/app/WikiController.scala @@ -47,7 +47,10 @@ val pageName = params("page") JGitUtil.withGit(getWikiRepositoryDir(repository.owner, repository.name)){ git => - wiki.html.history(Some(pageName), JGitUtil.getCommitLog(git, "master", path = pageName + ".md")._1, repository) + JGitUtil.getCommitLog(git, "master", path = pageName + ".md") match { + case Right((logs, hasNext)) => wiki.html.history(Some(pageName), logs, repository) + case Left(_) => NotFound + } } }) @@ -117,7 +120,10 @@ get("/:owner/:repository/wiki/_history")(referrersOnly { repository => JGitUtil.withGit(getWikiRepositoryDir(repository.owner, repository.name)){ git => - wiki.html.history(None, JGitUtil.getCommitLog(git, "master")._1, repository) + JGitUtil.getCommitLog(git, "master") match { + case Right((logs, hasNext)) => wiki.html.history(None, logs, repository) + case Left(_) => NotFound + } } }) diff --git a/src/main/scala/util/JGitUtil.scala b/src/main/scala/util/JGitUtil.scala index 7866799..8d9b6eb 100644 --- a/src/main/scala/util/JGitUtil.scala +++ b/src/main/scala/util/JGitUtil.scala @@ -253,7 +253,7 @@ * @param path filters by this path. default is no filter. * @return a tuple of the commit list and whether has next */ - def getCommitLog(git: Git, revision: String, page: Int = 1, limit: Int = 0, path: String = ""): (List[CommitInfo], Boolean) = { + def getCommitLog(git: Git, revision: String, page: Int = 1, limit: Int = 0, path: String = ""): Either[String, (List[CommitInfo], Boolean)] = { val fixedPage = if(page <= 0) 1 else page @scala.annotation.tailrec @@ -267,20 +267,25 @@ } val revWalk = new RevWalk(git.getRepository) - revWalk.markStart(revWalk.parseCommit(git.getRepository.resolve(revision))) - if(path.nonEmpty){ - revWalk.setRevFilter(new RevFilter(){ - def include(walk: RevWalk, commit: RevCommit): Boolean = { - getDiffs(git, commit.getName, false).find(_.newPath == path).nonEmpty - } - override def clone(): RevFilter = this - }) + val objectId = git.getRepository.resolve(revision) + if(objectId == null){ + Left(s"${revision} can't be resolved.") + } else { + revWalk.markStart(revWalk.parseCommit(objectId)) + if(path.nonEmpty){ + revWalk.setRevFilter(new RevFilter(){ + def include(walk: RevWalk, commit: RevCommit): Boolean = { + getDiffs(git, commit.getName, false).find(_.newPath == path).nonEmpty + } + override def clone(): RevFilter = this + }) + } + + val commits = getCommitLog(revWalk.iterator, 0, Nil) + revWalk.release + + Right(commits) } - - val commits = getCommitLog(revWalk.iterator, 0, Nil) - revWalk.release - - commits } /**