James Moger
2012-08-01 65f55eee1c41a9cdfec96dc4310efcc6e57df97f
src/com/gitblit/utils/JGitUtils.java
@@ -20,7 +20,6 @@
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.charset.Charset;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Arrays;
@@ -36,8 +35,7 @@
import org.eclipse.jgit.api.CloneCommand;
import org.eclipse.jgit.api.FetchCommand;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.ResetCommand;
import org.eclipse.jgit.api.ResetCommand.ResetType;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.diff.DiffEntry;
import org.eclipse.jgit.diff.DiffEntry.ChangeType;
import org.eclipse.jgit.diff.DiffFormatter;
@@ -253,27 +251,6 @@
   }
   /**
    * Reset HEAD to the latest remote tracking commit.
    *
    * @param repository
    * @param remoteRef
    *            the remote tracking reference (e.g. origin/master)
    * @return Ref
    * @throws Exception
    */
   public static Ref resetHEAD(Repository repository, String remoteRef) throws Exception {
      if (!remoteRef.startsWith(Constants.R_REMOTES)) {
         remoteRef = Constants.R_REMOTES + remoteRef;
      }
      Git git = new Git(repository);
      ResetCommand reset = git.reset();
      reset.setMode(ResetType.SOFT);
      reset.setRef(remoteRef);
      Ref result = reset.call();
      return result;
   }
   /**
    * Creates a bare repository.
    * 
    * @param repositoriesFolder
@@ -281,8 +258,12 @@
    * @return Repository
    */
   public static Repository createRepository(File repositoriesFolder, String name) {
      Git git = Git.init().setDirectory(new File(repositoriesFolder, name)).setBare(true).call();
      return git.getRepository();
      try {
         Git git = Git.init().setDirectory(new File(repositoriesFolder, name)).setBare(true).call();
         return git.getRepository();
      } catch (GitAPIException e) {
         throw new RuntimeException(e);
      }
   }
   /**
@@ -294,16 +275,18 @@
    *            false all repositories are included.
    * @param searchSubfolders
    *            recurse into subfolders to find grouped repositories
    * @param depth
    *            optional recursion depth, -1 = infinite recursion
    * @return list of repository names
    */
   public static List<String> getRepositoryList(File repositoriesFolder, boolean onlyBare,
         boolean searchSubfolders) {
         boolean searchSubfolders, int depth) {
      List<String> list = new ArrayList<String>();
      if (repositoriesFolder == null || !repositoriesFolder.exists()) {
         return list;
      }
      list.addAll(getRepositoryList(repositoriesFolder.getAbsolutePath(), repositoriesFolder,
            onlyBare, searchSubfolders));
            onlyBare, searchSubfolders, depth));
      StringUtils.sortRepositorynames(list);
      return list;
   }
@@ -320,11 +303,18 @@
    *            repositories are included.
    * @param searchSubfolders
    *            recurse into subfolders to find grouped repositories
    * @param depth
    *            recursion depth, -1 = infinite recursion
    * @return
    */
   private static List<String> getRepositoryList(String basePath, File searchFolder,
         boolean onlyBare, boolean searchSubfolders) {
         boolean onlyBare, boolean searchSubfolders, int depth) {
      File baseFile = new File(basePath);
      List<String> list = new ArrayList<String>();
      if (depth == 0) {
         return list;
      }
      int nextDepth = (depth == -1) ? -1 : depth - 1;
      for (File file : searchFolder.listFiles()) {
         if (file.isDirectory()) {
            File gitDir = FileKey.resolve(new File(searchFolder, file.getName()), FS.DETECTED);
@@ -332,13 +322,17 @@
               if (onlyBare && gitDir.getName().equals(".git")) {
                  continue;
               }
               // determine repository name relative to base path
               String repository = StringUtils.getRelativePath(basePath,
                     file.getAbsolutePath());
               list.add(repository);
               if (gitDir.equals(file) || gitDir.getParentFile().equals(file)) {
                  // determine repository name relative to base path
                  String repository = FileUtils.getRelativePath(baseFile, file);
                  list.add(repository);
               } else if (searchSubfolders && file.canRead()) {
                  // look for repositories in subfolders
                  list.addAll(getRepositoryList(basePath, file, onlyBare, searchSubfolders, nextDepth));
               }
            } else if (searchSubfolders && file.canRead()) {
               // look for repositories in subfolders
               list.addAll(getRepositoryList(basePath, file, onlyBare, searchSubfolders));
               list.addAll(getRepositoryList(basePath, file, onlyBare, searchSubfolders, nextDepth));
            }
         }
      }
@@ -566,14 +560,15 @@
    * @param tree
    *            if null, the RevTree from HEAD is assumed.
    * @param blobPath
    * @param charsets optional
    * @return UTF-8 string content
    */
   public static String getStringContent(Repository repository, RevTree tree, String blobPath) {
   public static String getStringContent(Repository repository, RevTree tree, String blobPath, String... charsets) {
      byte[] content = getByteContent(repository, tree, blobPath);
      if (content == null) {
         return null;
      }
      return new String(content, Charset.forName(Constants.CHARACTER_ENCODING));
      return StringUtils.decodeString(content, charsets);
   }
   /**
@@ -612,14 +607,15 @@
    * 
    * @param repository
    * @param objectId
    * @param charsets optional
    * @return UTF-8 string content
    */
   public static String getStringContent(Repository repository, String objectId) {
   public static String getStringContent(Repository repository, String objectId, String... charsets) {
      byte[] content = getByteContent(repository, objectId);
      if (content == null) {
         return null;
      }
      return new String(content, Charset.forName(Constants.CHARACTER_ENCODING));
      return StringUtils.decodeString(content, charsets);
   }
   /**
@@ -719,6 +715,10 @@
            for (DiffEntry diff : diffs) {
               if (diff.getChangeType().equals(ChangeType.DELETE)) {
                  list.add(new PathChangeModel(diff.getOldPath(), diff.getOldPath(), 0, diff
                        .getNewMode().getBits(), commit.getId().getName(), diff
                        .getChangeType()));
               } else if (diff.getChangeType().equals(ChangeType.RENAME)) {
                  list.add(new PathChangeModel(diff.getOldPath(), diff.getNewPath(), 0, diff
                        .getNewMode().getBits(), commit.getId().getName(), diff
                        .getChangeType()));
               } else {
@@ -1242,6 +1242,74 @@
   }
   
   /**
    * Sets the local branch ref to point to the specified commit id.
    *
    * @param repository
    * @param branch
    * @param commitId
    * @return true if successful
    */
   public static boolean setBranchRef(Repository repository, String branch, String commitId) {
      String branchName = branch;
      if (!branchName.startsWith(Constants.R_HEADS)) {
         branchName = Constants.R_HEADS + branch;
      }
      try {
         RefUpdate refUpdate = repository.updateRef(branchName, false);
         refUpdate.setNewObjectId(ObjectId.fromString(commitId));
         RefUpdate.Result result = refUpdate.forceUpdate();
         switch (result) {
         case NEW:
         case FORCED:
         case NO_CHANGE:
         case FAST_FORWARD:
            return true;
         default:
            LOGGER.error(MessageFormat.format("{0} {1} update to {2} returned result {3}",
                  repository.getDirectory().getAbsolutePath(), branchName, commitId, result));
         }
      } catch (Throwable t) {
         error(t, repository, "{0} failed to set {1} to {2}", branchName, commitId);
      }
      return false;
   }
   /**
    * Deletes the specified branch ref.
    *
    * @param repository
    * @param branch
    * @return true if successful
    */
   public static boolean deleteBranchRef(Repository repository, String branch) {
      String branchName = branch;
      if (!branchName.startsWith(Constants.R_HEADS)) {
         branchName = Constants.R_HEADS + branch;
      }
      try {
         RefUpdate refUpdate = repository.updateRef(branchName, false);
         refUpdate.setForceUpdate(true);
         RefUpdate.Result result = refUpdate.delete();
         switch (result) {
         case NEW:
         case FORCED:
         case NO_CHANGE:
         case FAST_FORWARD:
            return true;
         default:
            LOGGER.error(MessageFormat.format("{0} failed to delete to {1} returned result {2}",
                  repository.getDirectory().getAbsolutePath(), branchName, result));
         }
      } catch (Throwable t) {
         error(t, repository, "{0} failed to delete {1}", branchName);
      }
      return false;
   }
   /**
    * Get the full branch and tag ref names for any potential HEAD targets.
    *
    * @param repository