diff --git a/src/main/scala/servlet/GitRepositoryServlet.scala b/src/main/scala/servlet/GitRepositoryServlet.scala index cd2faec..8f8d0c6 100644 --- a/src/main/scala/servlet/GitRepositoryServlet.scala +++ b/src/main/scala/servlet/GitRepositoryServlet.scala @@ -9,7 +9,7 @@ import javax.servlet.ServletConfig import javax.servlet.ServletContext import javax.servlet.http.HttpServletRequest -import util.Directory +import util.{JGitUtil, Directory} /** * Provides Git repository via HTTP. @@ -43,36 +43,41 @@ } class GitBucketRecievePackFactory extends ReceivePackFactory[HttpServletRequest] { + + private val logger = LoggerFactory.getLogger(classOf[GitBucketRecievePackFactory]) + override def create(req: HttpServletRequest, db: Repository): ReceivePack = { val receivePack = new ReceivePack(db) - - println("----") - println("contextPath: " + req.getContextPath) - println("requestURI: " + req.getRequestURI) - println("remoteUser:" + req.getRemoteUser) - val userName = req.getSession.getAttribute("USER_INFO") - println("userName: " + userName) - println("----") + logger.debug("requestURI: " + req.getRequestURI) + logger.debug("userName:" + userName) - receivePack.setPostReceiveHook(new CommitLogHook()) + val pathList = req.getRequestURI.split("/") + val owner = pathList(2) + val repository = pathList(3).replaceFirst("\\.git$", "") + + logger.debug("repository:" + owner + "/" + repository) + + receivePack.setPostReceiveHook(new CommitLogHook(owner, repository)) receivePack } } import scala.collection.JavaConverters._ -class CommitLogHook extends PostReceiveHook { +class CommitLogHook(owner: String, repository: String) extends PostReceiveHook { + + private val logger = LoggerFactory.getLogger(classOf[CommitLogHook]) + def onPostReceive(receivePack: ReceivePack, commands: java.util.Collection[ReceiveCommand]): Unit = { - println("**** hook ****") - commands.asScala.foreach { command => - println(command.getRefName) - println(command.getMessage) - println(command.getRef().getName()) - println("--") + JGitUtil.withGit(Directory.getRepositoryDir(owner, repository)) { git => + commands.asScala.foreach { command => + JGitUtil.getCommitLog(git, command.getOldId.name, command.getNewId.name).foreach { commit => + // TODO extract issue id and add comment to issue + logger.debug(commit.id + ":" + commit.message) + } + } } - - } } diff --git a/src/main/scala/util/JGitUtil.scala b/src/main/scala/util/JGitUtil.scala index 8dd2b63..e32ee40 100644 --- a/src/main/scala/util/JGitUtil.scala +++ b/src/main/scala/util/JGitUtil.scala @@ -155,6 +155,39 @@ } /** + * Returns the commit list between two revisions. + * + * @param git the Git object + * @param from the from revision + * @param to the to revision + * @return the commit list + */ + def getCommitLog(git: Git, from: String, to: String): List[CommitInfo] = { + @scala.annotation.tailrec + def getCommitLog(i: java.util.Iterator[RevCommit], logs: List[CommitInfo]): List[CommitInfo] = + i.hasNext match { + case true => { + val revCommit = i.next + if(revCommit.name == from){ + logs + } else { + getCommitLog(i, logs :+ new CommitInfo(revCommit)) + } + } + case false => logs + } + + val revWalk = new RevWalk(git.getRepository) + revWalk.markStart(revWalk.parseCommit(git.getRepository.resolve(to))) + + val commits = getCommitLog(revWalk.iterator, Nil) + revWalk.release + + commits.reverse + } + + + /** * Returns the latest RevCommit of the specified path. * * @param git the Git object