diff --git a/src/main/scala/app/WikiController.scala b/src/main/scala/app/WikiController.scala index 20c1490..b237ac8 100644 --- a/src/main/scala/app/WikiController.scala +++ b/src/main/scala/app/WikiController.scala @@ -45,6 +45,32 @@ JGitUtil.getRepositoryInfo(owner, repository, servletContext)) } + get("/:owner/:repository/wiki/:page/_compare/:commitId"){ + val owner = params("owner") + val repository = params("repository") + val page = params("page") + val commitId = params("commitId").split("\\.\\.\\.") + + println(commitId(0)) + println(commitId(1)) + + html.wikicompare(Some(page), + WikiUtil.getDiffs(Git.open(WikiUtil.getWikiRepositoryDir(owner, repository)), commitId(0), commitId(1)), + JGitUtil.getRepositoryInfo(owner, repository, servletContext)) + } + + get("/:owner/:repository/wiki/_compare/:commitId"){ + val owner = params("owner") + val repository = params("repository") + val commitId = params("commitId").split("\\.\\.\\.") + + println(commitId(0)) + println(commitId(1)) + + html.wikicompare(None, + WikiUtil.getDiffs(Git.open(WikiUtil.getWikiRepositoryDir(owner, repository)), commitId(0), commitId(1)), + JGitUtil.getRepositoryInfo(owner, repository, servletContext)) + } get("/:owner/:repository/wiki/:page/_edit"){ val owner = params("owner") diff --git a/src/main/scala/util/WikiUtil.scala b/src/main/scala/util/WikiUtil.scala index bf6c0fe..40cf255 100644 --- a/src/main/scala/util/WikiUtil.scala +++ b/src/main/scala/util/WikiUtil.scala @@ -5,6 +5,12 @@ import org.eclipse.jgit.api.Git import org.apache.commons.io.FileUtils import org.eclipse.jgit.lib.RepositoryBuilder +import app.DiffInfo +import org.eclipse.jgit.treewalk.CanonicalTreeParser +import org.eclipse.jgit.revwalk.RevCommit +import org.eclipse.jgit.treewalk.TreeWalk +import org.eclipse.jgit.revwalk.RevWalk +import org.eclipse.jgit.diff.DiffEntry.ChangeType object WikiUtil { @@ -121,4 +127,53 @@ } } + def getDiffs(git: Git, commitId1: String, commitId2: String): List[DiffInfo] = { +// @scala.annotation.tailrec +// def getCommitLog(i: java.util.Iterator[RevCommit], logs: List[RevCommit]): List[RevCommit] = +// i.hasNext match { +// case true if(logs.size < 2) => getCommitLog(i, logs :+ i.next) +// case _ => logs +// } +// +// val revWalk = new RevWalk(git.getRepository) +// revWalk.markStart(revWalk.parseCommit(git.getRepository.resolve(commitId2))) +// +// val commits = getCommitLog(revWalk.iterator, Nil) +// revWalk.release +// +// val revCommit = commits(0) +// +//// if(commits.length >= 2){ +// // not initial commit +// val oldCommit = commits(1) + + // get diff between specified commit and its previous commit + val reader = git.getRepository.newObjectReader + + val oldTreeIter = new CanonicalTreeParser + oldTreeIter.reset(reader, git.getRepository.resolve(commitId1 + "^{tree}")) + + val newTreeIter = new CanonicalTreeParser + newTreeIter.reset(reader, git.getRepository.resolve(commitId2 + "^{tree}")) + + import scala.collection.JavaConverters._ + git.diff.setNewTree(newTreeIter).setOldTree(oldTreeIter).call.asScala.map { diff => + DiffInfo(diff.getChangeType, diff.getOldPath, diff.getNewPath, + JGitUtil.getContent(git, diff.getOldId.toObjectId, false).map(new String(_, "UTF-8")), + JGitUtil.getContent(git, diff.getNewId.toObjectId, false).map(new String(_, "UTF-8"))) + }.toList +// } else { +// // initial commit +// val walk = new TreeWalk(git.getRepository) +// walk.addTree(revCommit.getTree) +// val buffer = new scala.collection.mutable.ListBuffer[DiffInfo]() +// while(walk.next){ +// buffer.append(DiffInfo(ChangeType.ADD, null, walk.getPathString, None, +// JGitUtil.getContent(git, walk.getObjectId(0), false).map(new String(_, "UTF-8")))) +// } +// walk.release +// buffer.toList +// } + } + } \ No newline at end of file diff --git a/src/main/twirl/commit.scala.html b/src/main/twirl/commit.scala.html index 6feef66..b845598 100644 --- a/src/main/twirl/commit.scala.html +++ b/src/main/twirl/commit.scala.html @@ -21,95 +21,5 @@ - - @diffs.zipWithIndex.map { case (diff, i) => - - - - - - - - -
- @if(diff.changeType == ChangeType.COPY || diff.changeType == ChangeType.RENAME){ - @diff.oldPath -> @diff.newPath - } - @if(diff.changeType == ChangeType.ADD || diff.changeType == ChangeType.DELETE || diff.changeType == ChangeType.MODIFY){ - @diff.newPath - } - -
- @if(diff.newContent != None || diff.oldContent != None){ -
- - - } else { - Too big file not shown - } -
- } + @diff(diffs, repository, Some(commit.id)) } - - - - - \ No newline at end of file diff --git a/src/main/twirl/diff.scala.html b/src/main/twirl/diff.scala.html new file mode 100644 index 0000000..07b6d6d --- /dev/null +++ b/src/main/twirl/diff.scala.html @@ -0,0 +1,94 @@ +@(diffs: Seq[app.DiffInfo], repository: app.RepositoryInfo, commitId: Option[String])(implicit context: app.Context) +@import context._ +@import org.eclipse.jgit.diff.DiffEntry.ChangeType +@diffs.zipWithIndex.map { case (diff, i) => + + + + + + + +
+ @if(diff.changeType == ChangeType.COPY || diff.changeType == ChangeType.RENAME){ + @diff.oldPath -> @diff.newPath + } + @if(diff.changeType == ChangeType.ADD || diff.changeType == ChangeType.DELETE || diff.changeType == ChangeType.MODIFY){ + @diff.newPath + } + @if(commitId.isDefined){ + + } +
+ @if(diff.newContent != None || diff.oldContent != None){ +
+ + + } else { + Too big file not shown + } +
+} + + + + + \ No newline at end of file diff --git a/src/main/twirl/files.scala.html b/src/main/twirl/files.scala.html index d75d024..e6d661e 100644 --- a/src/main/twirl/files.scala.html +++ b/src/main/twirl/files.scala.html @@ -1,7 +1,7 @@ @(branch: String, repository: app.RepositoryInfo, pathList: List[String], latestCommit: app.CommitInfo, files: List[app.FileInfo], readme: Option[String])(implicit context: app.Context) @import context._ @import view.helpers -@main(repository.owner+"/"+repository.name) { +@main(repository.owner + "/" + repository.name) { @header("code", repository) @navtab(branch, repository, "files")
diff --git a/src/main/twirl/main.scala.html b/src/main/twirl/main.scala.html index 6b57be8..4faf436 100644 --- a/src/main/twirl/main.scala.html +++ b/src/main/twirl/main.scala.html @@ -4,7 +4,7 @@ - @title - GitBucket + @title diff --git a/src/main/twirl/wikicompare.scala.html b/src/main/twirl/wikicompare.scala.html new file mode 100644 index 0000000..ca5deea --- /dev/null +++ b/src/main/twirl/wikicompare.scala.html @@ -0,0 +1,24 @@ +@(pageName: Option[String], diffs: Seq[app.DiffInfo], repository: app.RepositoryInfo)(implicit context: app.Context) +@import view.helpers +@import context._ +@import org.eclipse.jgit.diff.DiffEntry.ChangeType +@main("Compare Revisions - " + repository.owner + "/" + repository.name){ + @header("wiki", repository) + @wikitab("history", repository) + + @diff(diffs, repository, None) +} diff --git a/src/main/twirl/wikihistory.scala.html b/src/main/twirl/wikihistory.scala.html index 816dee8..66bd80e 100644 --- a/src/main/twirl/wikihistory.scala.html +++ b/src/main/twirl/wikihistory.scala.html @@ -7,11 +7,10 @@