Clone Wiki working repository if it does not exist before reverting.

This commit is contained in:
takezoe
2013-10-03 13:48:31 +09:00
parent d95bd20cbe
commit 40a52d5ad5

View File

@@ -99,40 +99,45 @@ trait WikiService {
def revertWikiPage(owner: String, repository: String, from: String, to: String, def revertWikiPage(owner: String, repository: String, from: String, to: String,
committer: model.Account, pageName: Option[String]): Boolean = { committer: model.Account, pageName: Option[String]): Boolean = {
LockUtil.lock(s"${owner}/${repository}/wiki"){ LockUtil.lock(s"${owner}/${repository}/wiki"){
using(Git.open(Directory.getWikiWorkDir(owner, repository))){ git => defining(Directory.getWikiWorkDir(owner, repository)){ workDir =>
val reader = git.getRepository.newObjectReader // clone working copy
val oldTreeIter = new CanonicalTreeParser cloneOrPullWorkingCopy(workDir, owner, repository)
oldTreeIter.reset(reader, git.getRepository.resolve(from + "^{tree}"))
val newTreeIter = new CanonicalTreeParser using(Git.open(workDir)){ git =>
newTreeIter.reset(reader, git.getRepository.resolve(to + "^{tree}")) val reader = git.getRepository.newObjectReader
val oldTreeIter = new CanonicalTreeParser
oldTreeIter.reset(reader, git.getRepository.resolve(from + "^{tree}"))
import scala.collection.JavaConverters._ val newTreeIter = new CanonicalTreeParser
val diffs = git.diff.setNewTree(oldTreeIter).setOldTree(newTreeIter).call.asScala.filter { diff => newTreeIter.reset(reader, git.getRepository.resolve(to + "^{tree}"))
pageName match {
case Some(x) => diff.getNewPath == x + ".md" import scala.collection.JavaConverters._
case None => true val diffs = git.diff.setNewTree(oldTreeIter).setOldTree(newTreeIter).call.asScala.filter { diff =>
pageName match {
case Some(x) => diff.getNewPath == x + ".md"
case None => true
}
} }
}
val patch = using(new java.io.ByteArrayOutputStream()){ out => val patch = using(new java.io.ByteArrayOutputStream()){ out =>
val formatter = new DiffFormatter(out) val formatter = new DiffFormatter(out)
formatter.setRepository(git.getRepository) formatter.setRepository(git.getRepository)
formatter.format(diffs.asJava) formatter.format(diffs.asJava)
new String(out.toByteArray, "UTF-8") new String(out.toByteArray, "UTF-8")
} }
try { try {
git.apply.setPatch(new java.io.ByteArrayInputStream(patch.getBytes("UTF-8"))).call git.apply.setPatch(new java.io.ByteArrayInputStream(patch.getBytes("UTF-8"))).call
git.add.addFilepattern(".").call git.add.addFilepattern(".").call
git.commit.setCommitter(committer.userName, committer.mailAddress).setMessage(pageName match { git.commit.setCommitter(committer.userName, committer.mailAddress).setMessage(pageName match {
case Some(x) => s"Revert ${from} ... ${to} on ${x}" case Some(x) => s"Revert ${from} ... ${to} on ${x}"
case None => s"Revert ${from} ... ${to}" case None => s"Revert ${from} ... ${to}"
}).call }).call
git.push.call git.push.call
true true
} catch { } catch {
case ex: PatchApplyException => false case ex: PatchApplyException => false
}
} }
} }
} }