Add JGitUtil#withGit() and use it to release repository resources

certainly.
This commit is contained in:
takezoe
2013-05-05 04:58:11 +09:00
parent 1e7f7404dc
commit e7d2455152
4 changed files with 175 additions and 149 deletions

View File

@@ -124,13 +124,15 @@ class RepositoryViewerController extends ControllerBase {
val branchName = params("branch")
val page = params.getOrElse("page", "1").toInt
val (logs, hasNext) = JGitUtil.getCommitLog(Git.open(getRepositoryDir(owner, repository)), branchName, page, 30)
JGitUtil.withGit(getRepositoryDir(owner, repository)){ git =>
val (logs, hasNext) = JGitUtil.getCommitLog(git, branchName, page, 30)
repo.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.
@@ -142,13 +144,15 @@ class RepositoryViewerController extends ControllerBase {
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)
JGitUtil.withGit(getRepositoryDir(owner, repository)){ git =>
val (logs, hasNext) = JGitUtil.getCommitLog(git, branchName, page, 30, path)
repo.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)
}
}
/**
@@ -162,7 +166,7 @@ class RepositoryViewerController extends ControllerBase {
val path = multiParams("splat").head //.replaceFirst("^tree/.+?/", "")
val repositoryInfo = JGitUtil.getRepositoryInfo(owner, repository, servletContext)
val git = Git.open(getRepositoryDir(owner, repository))
JGitUtil.withGit(getRepositoryDir(owner, repository)){ git =>
val revCommit = JGitUtil.getRevCommitFromId(git, git.getRepository.resolve(id))
@scala.annotation.tailrec
@@ -181,16 +185,17 @@ class RepositoryViewerController extends ControllerBase {
// Download
contentType = "application/octet-stream"
JGitUtil.getContent(git, objectId, false).get
} else {
// Viewer
val large = FileTypeUtil.isLarge(git.getRepository.getObjectDatabase.open(objectId).getSize)
val viewer = if(FileTypeUtil.isImage(path)) "image" else if(large) "large" else "text"
val content = ContentInfo(viewer, if(viewer == "text") JGitUtil.getContent(git, objectId, false).map(new String(_, "UTF-8")) else None)
val content = ContentInfo(viewer,
if(viewer == "text") JGitUtil.getContent(git, objectId, false).map(new String(_, "UTF-8")) else None)
repo.html.blob(id, repositoryInfo, path.split("/").toList, content, new CommitInfo(revCommit))
}
}
}
/**
* Displays details of the specified commit.
@@ -200,10 +205,11 @@ class RepositoryViewerController extends ControllerBase {
val repository = params("repository")
val id = params("id")
val git = Git.open(getRepositoryDir(owner, repository))
JGitUtil.withGit(getRepositoryDir(owner, repository)){ git =>
val revCommit = JGitUtil.getRevCommitFromId(git, git.getRepository.resolve(id))
repo.html.commit(id, new CommitInfo(revCommit), JGitUtil.getRepositoryInfo(owner, repository, servletContext), JGitUtil.getDiffs(git, id))
repo.html.commit(id, new CommitInfo(revCommit),
JGitUtil.getRepositoryInfo(owner, repository, servletContext), JGitUtil.getDiffs(git, id))
}
}
/**
@@ -234,14 +240,14 @@ class RepositoryViewerController extends ControllerBase {
// clone the repository
val cloneDir = new File(workDir, revision)
val git = Git.cloneRepository
JGitUtil.withGit(Git.cloneRepository
.setURI(getRepositoryDir(owner, repository).toURI.toString)
.setDirectory(cloneDir)
.call
.call){ git =>
// checkout the specified revision
git.checkout.setName(revision).call
git.getRepository.close
}
// remove .git
FileUtils.deleteDirectory(new File(cloneDir, ".git"))
@@ -273,8 +279,7 @@ class RepositoryViewerController extends ControllerBase {
revstr
}
val git = Git.open(getRepositoryDir(owner, repository))
JGitUtil.withGit(getRepositoryDir(owner, repository)){ git =>
// get latest commit
val revCommit = JGitUtil.getRevCommitFromId(git, git.getRepository.resolve(revision))
@@ -300,5 +305,6 @@ class RepositoryViewerController extends ControllerBase {
readme
)
}
}
}

View File

@@ -45,12 +45,13 @@ class WikiController extends ControllerBase {
val owner = params("owner")
val repository = params("repository")
val page = params("page")
val git = Git.open(WikiUtil.getWikiRepositoryDir(owner, repository))
JGitUtil.withGit(WikiUtil.getWikiRepositoryDir(owner, repository)){ git =>
wiki.html.wikihistory(Some(page),
JGitUtil.getCommitLog(git, "master", path = page + ".md")._1,
JGitUtil.getRepositoryInfo(owner, repository, servletContext))
}
}
get("/:owner/:repository/wiki/:page/_compare/:commitId"){
val owner = params("owner")
@@ -58,26 +59,24 @@ class WikiController extends ControllerBase {
val page = params("page")
val commitId = params("commitId").split("\\.\\.\\.")
println(commitId(0))
println(commitId(1))
JGitUtil.withGit(WikiUtil.getWikiRepositoryDir(owner, repository)){ git =>
wiki.html.wikicompare(Some(page),
WikiUtil.getDiffs(Git.open(WikiUtil.getWikiRepositoryDir(owner, repository)), commitId(0), commitId(1)),
WikiUtil.getDiffs(git, 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))
JGitUtil.withGit(WikiUtil.getWikiRepositoryDir(owner, repository)){ git =>
wiki.html.wikicompare(None,
WikiUtil.getDiffs(Git.open(WikiUtil.getWikiRepositoryDir(owner, repository)), commitId(0), commitId(1)),
WikiUtil.getDiffs(git, commitId(0), commitId(1)),
JGitUtil.getRepositoryInfo(owner, repository, servletContext))
}
}
get("/:owner/:repository/wiki/:page/_edit"){
val owner = params("owner")
@@ -139,10 +138,12 @@ class WikiController extends ControllerBase {
val owner = params("owner")
val repository = params("repository")
JGitUtil.withGit(WikiUtil.getWikiRepositoryDir(owner, repository)){ git =>
wiki.html.wikihistory(None,
JGitUtil.getCommitLog(Git.open(WikiUtil.getWikiRepositoryDir(owner, repository)), "master")._1,
JGitUtil.getCommitLog(git, "master")._1,
JGitUtil.getRepositoryInfo(owner, repository, servletContext))
}
}
post("/:owner/:repository/wiki/_preview"){
val content = params("content")

View File

@@ -5,28 +5,39 @@ import app.{RepositoryInfo, FileInfo, CommitInfo, DiffInfo, TagInfo}
import util.Directory._
import scala.collection.JavaConverters._
import javax.servlet.ServletContext
import org.eclipse.jgit.lib.Ref
import org.eclipse.jgit.lib.ObjectId
import org.eclipse.jgit.errors.MissingObjectException
import org.eclipse.jgit.revwalk.RevCommit
import org.eclipse.jgit.diff.DiffFormatter
import org.eclipse.jgit.treewalk.TreeWalk
import org.eclipse.jgit.revwalk.RevWalk
import org.eclipse.jgit.diff.RawTextComparator
import org.eclipse.jgit.util.io.DisabledOutputStream
import org.eclipse.jgit.lib.Repository
import org.eclipse.jgit.revwalk.RevSort
import org.eclipse.jgit.diff.DiffEntry.ChangeType
import org.eclipse.jgit.lib.FileMode
import org.eclipse.jgit.treewalk.filter.PathFilter
import org.eclipse.jgit.treewalk.CanonicalTreeParser
import org.eclipse.jgit.lib._
import org.eclipse.jgit.revwalk._
import org.eclipse.jgit.revwalk.filter.RevFilter
import org.eclipse.jgit.treewalk._
import org.eclipse.jgit.treewalk.filter.PathFilter
import org.eclipse.jgit.diff._
import org.eclipse.jgit.diff.DiffEntry.ChangeType
import org.eclipse.jgit.util.io.DisabledOutputStream
import org.eclipse.jgit.errors.MissingObjectException
/**
* Provides complex JGit operations.
*/
object JGitUtil {
/**
* Use this method to use the Git object.
* Repository resources are released certainly after processing.
*/
def withGit[T](dir: java.io.File)(f: Git => T): T = withGit(Git.open(dir))(f)
/**
* Use this method to use the Git object.
* Repository resources are released certainly after processing.
*/
def withGit[T](git: Git)(f: Git => T): T = {
try {
f(git)
} finally {
git.getRepository.close
}
}
/**
* Returns RevCommit from the commit id.
*
@@ -45,7 +56,7 @@ object JGitUtil {
* Returns the repository information. It contains branch names and tag names.
*/
def getRepositoryInfo(owner: String, repository: String, servletContext: ServletContext): RepositoryInfo = {
val git = Git.open(getRepositoryDir(owner, repository))
withGit(getRepositoryDir(owner, repository)){ git =>
RepositoryInfo(
owner, repository, "http://localhost:8080%s/git/%s/%s.git".format(servletContext.getContextPath, owner, repository),
// branches
@@ -59,6 +70,7 @@ object JGitUtil {
}.toList
)
}
}
/**
* Returns the file list of the specified path.

View File

@@ -51,8 +51,12 @@ object WikiUtil {
val dir = getWikiRepositoryDir(owner, repository)
if(!dir.exists){
val repo = new RepositoryBuilder().setGitDir(dir).setBare.build
try {
repo.create
savePage(owner, repository, "Home", "Home", "Welcome to the %s wiki!!".format(repository), owner, "Initial Commit")
} finally {
repo.close
}
}
}
@@ -63,7 +67,7 @@ object WikiUtil {
// TODO create wiki repository in the repository setting changing.
createWikiRepository(owner, repository)
val git = Git.open(getWikiRepositoryDir(owner, repository))
JGitUtil.withGit(getWikiRepositoryDir(owner, repository)){ git =>
try {
JGitUtil.getFileList(git, "master", ".").find(_.name == pageName + ".md").map { file =>
WikiPageInfo(file.name, new String(git.getRepository.open(file.id).getBytes, "UTF-8"), file.committer, file.time)
@@ -73,6 +77,7 @@ object WikiUtil {
case e: NullPointerException => None
}
}
}
def getPageList(owner: String, repository: String): List[String] = {
JGitUtil.getFileList(Git.open(getWikiRepositoryDir(owner, repository)), "master", ".")
@@ -99,11 +104,11 @@ object WikiUtil {
}
// write as file
val cloned = Git.open(workDir)
JGitUtil.withGit(workDir){ git =>
val file = new File(workDir, newPageName + ".md")
val added = if(!file.exists || FileUtils.readFileToString(file, "UTF-8") != content){
FileUtils.writeStringToFile(file, content, "UTF-8")
cloned.add.addFilepattern(file.getName).call
git.add.addFilepattern(file.getName).call
true
} else {
false
@@ -111,7 +116,7 @@ object WikiUtil {
// delete file
val deleted = if(currentPageName != "" && currentPageName != newPageName){
cloned.rm.addFilepattern(currentPageName + ".md").call
git.rm.addFilepattern(currentPageName + ".md").call
true
} else {
false
@@ -120,8 +125,9 @@ object WikiUtil {
// commit and push
if(added || deleted){
// TODO committer's mail address
cloned.commit.setAuthor(committer, committer + "@devnull").setMessage(message).call
cloned.push.call
git.commit.setAuthor(committer, committer + "@devnull").setMessage(message).call
git.push.call
}
}
}
@@ -142,13 +148,14 @@ object WikiUtil {
// delete file
new File(workDir, pageName + ".md").delete
val cloned = Git.open(workDir)
cloned.rm.addFilepattern(pageName + ".md").call
JGitUtil.withGit(workDir){ git =>
git.rm.addFilepattern(pageName + ".md").call
// commit and push
// TODO committer's mail address
cloned.commit.setAuthor(committer, committer + "@devnull").setMessage(message).call
cloned.push.call
git.commit.setAuthor(committer, committer + "@devnull").setMessage(message).call
git.push.call
}
}
def getDiffs(git: Git, commitId1: String, commitId2: String): List[DiffInfo] = {