diff --git a/src/main/scala/app/RepositoryViewerController.scala b/src/main/scala/app/RepositoryViewerController.scala index f39871d..73c8ecf 100644 --- a/src/main/scala/app/RepositoryViewerController.scala +++ b/src/main/scala/app/RepositoryViewerController.scala @@ -116,13 +116,32 @@ val (logs, hasNext) = JGitUtil.getCommitLog(Git.open(getRepositoryDir(owner, repository)), branchName, page, 30) - html.commits(branchName, JGitUtil.getRepositoryInfo(owner, repository, servletContext), + html.commits(Nil, branchName, JGitUtil.getRepositoryInfo(owner, repository, servletContext), logs.splitWith{ (commit1, commit2) => view.helpers.date(commit1.time) == view.helpers.date(commit2.time) }, page, hasNext) } /** + * Displays the commit list of the specified resource. + */ + get("/:owner/:repository/commits/:branch/*"){ + val owner = params("owner") + val repository = params("repository") + val branchName = params("branch") + val path = multiParams("splat").head //.replaceFirst("^tree/.+?/", "") + val page = params.getOrElse("page", "1").toInt + + val (logs, hasNext) = JGitUtil.getCommitLog(Git.open(getRepositoryDir(owner, repository)), branchName, page, 30, path) + + html.commits(path.split("/").toList, branchName, JGitUtil.getRepositoryInfo(owner, repository, servletContext), + logs.splitWith{ (commit1, commit2) => + view.helpers.date(commit1.time) == view.helpers.date(commit2.time) + }, page, hasNext) + } + + + /** * Displays the file content of the specified branch or commit. */ get("/:owner/:repository/blob/:id/*"){ @@ -130,7 +149,7 @@ val repository = params("repository") 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 path = multiParams("splat").head //.replaceFirst("^tree/.+?/", "") val repositoryInfo = JGitUtil.getRepositoryInfo(owner, repository, servletContext) val git = Git.open(getRepositoryDir(owner, repository)) diff --git a/src/main/scala/app/WikiController.scala b/src/main/scala/app/WikiController.scala index 6e931c3..fb267c0 100644 --- a/src/main/scala/app/WikiController.scala +++ b/src/main/scala/app/WikiController.scala @@ -41,9 +41,7 @@ val git = Git.open(WikiUtil.getWikiRepositoryDir(owner, repository)) html.wikihistory(Some(page), - JGitUtil.getCommitLog(git, "master")._1.filter { commit => - JGitUtil.getDiffs(git, commit.id).find(_.newPath == page + ".md").isDefined - }, + JGitUtil.getCommitLog(git, "master", path = page + ".md")._1, JGitUtil.getRepositoryInfo(owner, repository, servletContext)) } diff --git a/src/main/scala/util/JGitUtil.scala b/src/main/scala/util/JGitUtil.scala index 76e5f85..683f366 100644 --- a/src/main/scala/util/JGitUtil.scala +++ b/src/main/scala/util/JGitUtil.scala @@ -20,6 +20,7 @@ import org.eclipse.jgit.lib.FileMode import org.eclipse.jgit.treewalk.filter.PathFilter import org.eclipse.jgit.treewalk.CanonicalTreeParser +import org.eclipse.jgit.revwalk.filter.RevFilter /** * Provides complex JGit operations. @@ -94,10 +95,11 @@ * @param git the Git object * @param revision the branch name or commit id * @param page the page number (1-) - * @param limit the number of commit info per page. 0 means unlimited. + * @param limit the number of commit info per page. 0 (default) means unlimited. + * @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): (List[CommitInfo], Boolean) = { + def getCommitLog(git: Git, revision: String, page: Int = 1, limit: Int = 0, path: String = ""): (List[CommitInfo], Boolean) = { val fixedPage = if(page <= 0) 1 else page @scala.annotation.tailrec @@ -110,6 +112,14 @@ 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).find(_.newPath == path).nonEmpty + } + override def clone(): RevFilter = this + }) + } val commits = getCommitLog(revWalk.iterator, 0, Nil) revWalk.release diff --git a/src/main/twirl/blob.scala.html b/src/main/twirl/blob.scala.html index 5bf9e06..e197112 100644 --- a/src/main/twirl/blob.scala.html +++ b/src/main/twirl/blob.scala.html @@ -25,7 +25,7 @@
Raw - History + History
diff --git a/src/main/twirl/commits.scala.html b/src/main/twirl/commits.scala.html index 5d2d032..9fe246f 100644 --- a/src/main/twirl/commits.scala.html +++ b/src/main/twirl/commits.scala.html @@ -1,11 +1,24 @@ -@(branch: String, repository: app.RepositoryInfo, commits: Seq[Seq[app.CommitInfo]], page: Int, hasNext: Boolean)(implicit context: app.Context) +@(pathList: List[String], branch: String, repository: app.RepositoryInfo, commits: Seq[Seq[app.CommitInfo]], page: Int, hasNext: Boolean)(implicit context: app.Context) @import context._ @import view.helpers @main(repository.owner+"/"+repository.name) { @header("code", repository) - @navtab(branch, repository, "commits") + @navtab(branch, repository, if(pathList.isEmpty) "commits" else "files")
- @repository.name / Commit History + @if(pathList.isEmpty){ + @repository.name / Commit History + } + @if(pathList.nonEmpty){ + History for + @repository.name / + @pathList.zipWithIndex.map { case (section, i) => + @if(i == pathList.length - 1){ + @section + } else { + @section / + } + } + }
@commits.map { date =>