Newer
Older
gitbucket_jkp / src / main / scala / util / Directory.scala
package util

import java.io.File
import org.eclipse.jgit.api.Git
import org.eclipse.jgit.lib.Ref

/**
 * Provides directories used by GitBucket.
 */
object Directory {

  val GitBucketHome = new File(System.getProperty("user.home"), "gitbucket").getAbsolutePath
  
  val RepositoryHome = "%s/repositories".format(GitBucketHome)
  
  /**
   * Repository names of the specified user.
   */
  def getRepositories(owner: String): List[String] = {
    val dir = new File("%s/%s".format(RepositoryHome, owner))
    if(dir.exists){
      dir.listFiles.filter(_.isDirectory).map(_.getName.replaceFirst("\\.git$", "")).toList
    } else {
      Nil
    }
  }
  
  /**
   * Substance directory of the repository.
   */
  def getRepositoryDir(owner: String, repository: String): File =
    new File("%s/%s/%s.git".format(RepositoryHome, owner, repository))
  
  /**
   * Temporary directory which is used in the repository viewer.
   */
  def getBranchDir(owner: String, repository: String, branch: String): File =
    new File("%s/tmp/%s/branches/%s/%s".format(GitBucketHome, owner, repository, branch))
  
  /**
   * Temporary directory which is used in the repository creation.
   * GiyBucket 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("%s/tmp/%s/init-%s".format(GitBucketHome, owner, repository))

  def updateAllBranches(owner: String, repository: String): Unit = {
    // TODO debug log
    println("[pull]" + owner + "/" + repository)
    
    val dir = Directory.getRepositoryDir(owner, repository)
    val git = Git.open(dir)
    
    val branchList = git.branchList.call.toArray.map { ref =>
      ref.asInstanceOf[Ref].getName
    }.toList
    
    branchList.foreach { branch =>
      val branchName = branch.replaceFirst("^refs/heads/", "")
      val branchdir = Directory.getBranchDir(owner, repository, branchName)
      if(!branchdir.exists){
        branchdir.mkdirs()
        Git.cloneRepository
          .setURI(dir.toURL.toString)
          .setBranch(branch)
          .setDirectory(branchdir)
          .call
        Git.open(branchdir).checkout.setName(branchName).call
      } else {
        Git.open(branchdir).pull.call
      }
    }
  }

  
}