Newer
Older
gitbucket_jkp / src / main / scala / app / GitRepositoryServlet.scala
@takezoe takezoe on 26 Apr 2013 1 KB Add debug log.
package app

import java.io._
import javax.servlet._
import javax.servlet.http._
import util.Directory
import org.eclipse.jgit.api.Git
import org.eclipse.jgit.lib.Ref
import org.eclipse.jgit.http.server.GitServlet
import org.slf4j.LoggerFactory

/**
 * Provides Git repository via HTTP.
 * 
 * This servlet provides only Git repository functionality.
 * Authentication is provided by [[app.BasicAuthenticationFilter]].
 */
class GitRepositoryServlet extends GitServlet {

  private val logger = LoggerFactory.getLogger(classOf[GitRepositoryServlet])
  
  // TODO are there any other ways...?
  override def init(config: ServletConfig): Unit = {
    super.init(new ServletConfig(){
      def getInitParameter(name: String): String = name match {
        case "base-path"  => Directory.RepositoryHome
        case "export-all" => "true"
        case name => config.getInitParameter(name)
      }
      def getInitParameterNames(): java.util.Enumeration[String] = {
        config.getInitParameterNames
      }
      
      def getServletContext(): ServletContext = config.getServletContext
      def getServletName(): String = config.getServletName
    });
  }
  
  /**
   * Override GitServlet#service() to pull pushed changes to cloned repositories for branch exploring.
   */
  override def service(request: HttpServletRequest, response: HttpServletResponse): Unit = {
    super.service(request, response)
    
    logger.debug(request.getMethod + ": " + request.getRequestURI)
    
    // update branches
    if(request.getMethod == "POST" && request.getRequestURI.endsWith("/git-receive-pack")){
      request.getRequestURI
          .replaceFirst("^" + request.getServletContext.getContextPath + "/git/", "")
          .replaceFirst("\\.git/git-receive-pack$", "").split("/") match {
        case Array(owner, repository) => Directory.updateAllBranches(owner, repository)
      }
    }
  }
  
}