mirror of
https://github.com/gitbucket/gitbucket.git
synced 2025-11-02 19:45:57 +01:00
Clone Wiki working repository if it does not exist before reverting.
This commit is contained in:
@@ -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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user