diff --git a/src/main/scala/app/CreateRepositoryController.scala b/src/main/scala/app/CreateRepositoryController.scala index a3c52d0..c596b8c 100644 --- a/src/main/scala/app/CreateRepositoryController.scala +++ b/src/main/scala/app/CreateRepositoryController.scala @@ -8,7 +8,8 @@ import org.eclipse.jgit.api.Git import org.apache.commons.io._ import jp.sf.amateras.scalatra.forms._ -import org.eclipse.jgit.lib.PersonIdent +import org.eclipse.jgit.lib.{FileMode, Constants, PersonIdent} +import org.eclipse.jgit.dircache.DirCache class CreateRepositoryController extends CreateRepositoryControllerBase with RepositoryService with AccountService with WikiService with LabelsService with ActivityService @@ -73,28 +74,26 @@ JGitUtil.initRepository(gitdir) if(form.createReadme){ - FileUtil.withTmpDir(getInitRepositoryDir(form.owner, form.name)){ tmpdir => - // Clone the repository - Git.cloneRepository.setURI(gitdir.toURI.toString).setDirectory(tmpdir).call + using(Git.open(gitdir)){ git => + val builder = DirCache.newInCore.builder() + val inserter = git.getRepository.newObjectInserter() + val headId = git.getRepository.resolve(Constants.HEAD + "^{commit}") + val content = if(form.description.nonEmpty){ + form.name + "\n" + + "===============\n" + + "\n" + + form.description.get + } else { + form.name + "\n" + + "===============\n" + } - // Create README.md - FileUtils.writeStringToFile(new File(tmpdir, "README.md"), - if(form.description.nonEmpty){ - form.name + "\n" + - "===============\n" + - "\n" + - form.description.get - } else { - form.name + "\n" + - "===============\n" - }, "UTF-8") + builder.add(JGitUtil.createDirCacheEntry("README.md", FileMode.REGULAR_FILE, + inserter.insert(Constants.OBJ_BLOB, content.getBytes("UTF-8")))) + builder.finish() - val git = Git.open(tmpdir) - git.add.addFilepattern("README.md").call - git.commit - .setCommitter(new PersonIdent(loginAccount.fullName, loginAccount.mailAddress)) - .setMessage("Initial commit").call - git.push.call + JGitUtil.createNewCommit(git, inserter, headId, builder.getDirCache.writeTree(inserter), + loginAccount.fullName, loginAccount.mailAddress, "Initial commit") } } diff --git a/src/main/scala/service/WikiService.scala b/src/main/scala/service/WikiService.scala index 3a89031..4b8a05c 100644 --- a/src/main/scala/service/WikiService.scala +++ b/src/main/scala/service/WikiService.scala @@ -176,18 +176,18 @@ val path = treeWalk.getPathString val tree = treeWalk.getTree(index, classOf[CanonicalTreeParser]) if(revertInfo.find(x => x.filePath == path).isEmpty){ - builder.add(createDirCacheEntry(path, tree.getEntryFileMode, tree.getEntryObjectId)) + builder.add(JGitUtil.createDirCacheEntry(path, tree.getEntryFileMode, tree.getEntryObjectId)) } } } } revertInfo.filter(_.operation == "ADD").foreach { x => - builder.add(createDirCacheEntry(x.filePath, FileMode.REGULAR_FILE, inserter.insert(Constants.OBJ_BLOB, x.source.getBytes("UTF-8")))) + builder.add(JGitUtil.createDirCacheEntry(x.filePath, FileMode.REGULAR_FILE, inserter.insert(Constants.OBJ_BLOB, x.source.getBytes("UTF-8")))) } builder.finish() - createNewCommit(git, inserter, headId, builder.getDirCache.writeTree(inserter), committer.fullName, committer.mailAddress, + JGitUtil.createNewCommit(git, inserter, headId, builder.getDirCache.writeTree(inserter), committer.fullName, committer.mailAddress, pageName match { case Some(x) => s"Revert ${from} ... ${to} on ${x}" case None => s"Revert ${from} ... ${to}" @@ -218,29 +218,31 @@ var updated = false var removed = false - using(new RevWalk(git.getRepository)){ revWalk => - using(new TreeWalk(git.getRepository)){ treeWalk => - val index = treeWalk.addTree(revWalk.parseTree(headId)) - treeWalk.setRecursive(true) - while(treeWalk.next){ - val path = treeWalk.getPathString - val tree = treeWalk.getTree(index, classOf[CanonicalTreeParser]) - if(path == currentPageName + ".md" && currentPageName != newPageName){ - removed = true - } else if(path != newPageName + ".md"){ - builder.add(createDirCacheEntry(path, tree.getEntryFileMode, tree.getEntryObjectId)) - } else { - created = false - updated = JGitUtil.getContent(git, tree.getEntryObjectId, true).map(new String(_, "UTF-8") != content).getOrElse(false) + if(headId != null){ + using(new RevWalk(git.getRepository)){ revWalk => + using(new TreeWalk(git.getRepository)){ treeWalk => + val index = treeWalk.addTree(revWalk.parseTree(headId)) + treeWalk.setRecursive(true) + while(treeWalk.next){ + val path = treeWalk.getPathString + val tree = treeWalk.getTree(index, classOf[CanonicalTreeParser]) + if(path == currentPageName + ".md" && currentPageName != newPageName){ + removed = true + } else if(path != newPageName + ".md"){ + builder.add(JGitUtil.createDirCacheEntry(path, tree.getEntryFileMode, tree.getEntryObjectId)) + } else { + created = false + updated = JGitUtil.getContent(git, tree.getEntryObjectId, true).map(new String(_, "UTF-8") != content).getOrElse(false) + } } } } } optionIf(created || updated || removed){ - builder.add(createDirCacheEntry(newPageName + ".md", FileMode.REGULAR_FILE, inserter.insert(Constants.OBJ_BLOB, content.getBytes("UTF-8")))) + builder.add(JGitUtil.createDirCacheEntry(newPageName + ".md", FileMode.REGULAR_FILE, inserter.insert(Constants.OBJ_BLOB, content.getBytes("UTF-8")))) builder.finish() - val newHeadId = createNewCommit(git, inserter, headId, builder.getDirCache.writeTree(inserter), committer.fullName, committer.mailAddress, + val newHeadId = JGitUtil.createNewCommit(git, inserter, headId, builder.getDirCache.writeTree(inserter), committer.fullName, committer.mailAddress, if(message.trim.length == 0) { if(removed){ s"Rename ${currentPageName} to ${newPageName}" @@ -279,7 +281,7 @@ val path = treeWalk.getPathString val tree = treeWalk.getTree(index, classOf[CanonicalTreeParser]) if(path != pageName + ".md"){ - builder.add(createDirCacheEntry(path, tree.getEntryFileMode, tree.getEntryObjectId)) + builder.add(JGitUtil.createDirCacheEntry(path, tree.getEntryFileMode, tree.getEntryObjectId)) } else { removed = true } @@ -288,39 +290,11 @@ if(removed){ builder.finish() - createNewCommit(git, inserter, headId, builder.getDirCache.writeTree(inserter), committer, mailAddress, message) + JGitUtil.createNewCommit(git, inserter, headId, builder.getDirCache.writeTree(inserter), committer, mailAddress, message) } } } } } - // This method should be moved to JGitUtil? - private def createDirCacheEntry(path: String, mode: FileMode, objectId: ObjectId): DirCacheEntry = { - val entry = new DirCacheEntry(path) - entry.setFileMode(mode) - entry.setObjectId(objectId) - entry - } - - // This method should be moved to JGitUtil? - private def createNewCommit(git: Git, inserter: ObjectInserter, headId: AnyObjectId, treeId: AnyObjectId, - fullName: String, mailAddress: String, message: String): String = { - val newCommit = new CommitBuilder() - newCommit.setCommitter(new PersonIdent(fullName, mailAddress)) - newCommit.setAuthor(new PersonIdent(fullName, mailAddress)) - newCommit.setMessage(message) - newCommit.setParentIds(List(headId).asJava) - newCommit.setTreeId(treeId) - - val newHeadId = inserter.insert(newCommit) - inserter.flush() - - val refUpdate = git.getRepository.updateRef(Constants.HEAD) - refUpdate.setNewObjectId(newHeadId) - refUpdate.update() - - newHeadId.getName - } - } diff --git a/src/main/scala/util/Directory.scala b/src/main/scala/util/Directory.scala index f7f064a..383a3be 100644 --- a/src/main/scala/util/Directory.scala +++ b/src/main/scala/util/Directory.scala @@ -57,15 +57,6 @@ new File(getTemporaryDir(owner, repository), s"download/${sessionId}") /** - * Temporary directory which is used in the repository creation. - * - * GitBucket generates initial repository contents in this directory and push them. - * This directory is removed after the repository creation. - */ - def getInitRepositoryDir(owner: String, repository: String): File = - new File(getTemporaryDir(owner, repository), "init") - - /** * Substance directory of the wiki repository. */ def getWikiRepositoryDir(owner: String, repository: String): File = diff --git a/src/main/scala/util/JGitUtil.scala b/src/main/scala/util/JGitUtil.scala index c282e9a..d54f4fe 100644 --- a/src/main/scala/util/JGitUtil.scala +++ b/src/main/scala/util/JGitUtil.scala @@ -15,6 +15,7 @@ import java.util.Date import org.eclipse.jgit.api.errors.NoHeadException import service.RepositoryService +import org.eclipse.jgit.dircache.DirCacheEntry /** * Provides complex JGit operations. @@ -464,4 +465,32 @@ }.find(_._1 != null) } + def createDirCacheEntry(path: String, mode: FileMode, objectId: ObjectId): DirCacheEntry = { + val entry = new DirCacheEntry(path) + entry.setFileMode(mode) + entry.setObjectId(objectId) + entry + } + + def createNewCommit(git: Git, inserter: ObjectInserter, headId: AnyObjectId, treeId: AnyObjectId, + fullName: String, mailAddress: String, message: String): String = { + val newCommit = new CommitBuilder() + newCommit.setCommitter(new PersonIdent(fullName, mailAddress)) + newCommit.setAuthor(new PersonIdent(fullName, mailAddress)) + newCommit.setMessage(message) + if(headId != null){ + newCommit.setParentIds(List(headId).asJava) + } + newCommit.setTreeId(treeId) + + val newHeadId = inserter.insert(newCommit) + inserter.flush() + + val refUpdate = git.getRepository.updateRef(Constants.HEAD) + refUpdate.setNewObjectId(newHeadId) + refUpdate.update() + + newHeadId.getName + } + }