James Moger
2011-09-12 831469ba89ea8bca3bfbd1d662dbdd2c9f233798
src/com/gitblit/utils/JGitUtils.java
@@ -62,6 +62,7 @@
import org.eclipse.jgit.revwalk.RevWalk;
import org.eclipse.jgit.revwalk.filter.RevFilter;
import org.eclipse.jgit.storage.file.FileRepository;
import org.eclipse.jgit.transport.CredentialsProvider;
import org.eclipse.jgit.transport.FetchResult;
import org.eclipse.jgit.transport.RefSpec;
import org.eclipse.jgit.treewalk.TreeWalk;
@@ -134,6 +135,14 @@
   }
   /**
    * Encapsulates the result of cloning or pulling from a repository.
    */
   public static class CloneResult {
      public FetchResult fetchResult;
      public boolean createdRepository;
   }
   /**
    * Clone or Fetch a repository. If the local repository does not exist,
    * clone is called. If the repository does exist, fetch is called. By
    * default the clone/fetch retrieves the remote heads, tags, and notes.
@@ -141,12 +150,29 @@
    * @param repositoriesFolder
    * @param name
    * @param fromUrl
    * @return FetchResult
    * @return CloneResult
    * @throws Exception
    */
   public static FetchResult cloneRepository(File repositoriesFolder, String name, String fromUrl)
   public static CloneResult cloneRepository(File repositoriesFolder, String name, String fromUrl)
         throws Exception {
      FetchResult result = null;
      return cloneRepository(repositoriesFolder, name, fromUrl, null);
   }
   /**
    * Clone or Fetch a repository. If the local repository does not exist,
    * clone is called. If the repository does exist, fetch is called. By
    * default the clone/fetch retrieves the remote heads, tags, and notes.
    *
    * @param repositoriesFolder
    * @param name
    * @param fromUrl
    * @param credentialsProvider
    * @return CloneResult
    * @throws Exception
    */
   public static CloneResult cloneRepository(File repositoriesFolder, String name, String fromUrl,
         CredentialsProvider credentialsProvider) throws Exception {
      CloneResult result = new CloneResult();
      if (!name.toLowerCase().endsWith(Constants.DOT_GIT_EXT)) {
         name += Constants.DOT_GIT_EXT;
      }
@@ -154,7 +180,7 @@
      if (folder.exists()) {
         File gitDir = FileKey.resolve(new File(repositoriesFolder, name), FS.DETECTED);
         FileRepository repository = new FileRepository(gitDir);
         result = fetchRepository(repository);
         result.fetchResult = fetchRepository(credentialsProvider, repository);
         repository.close();
      } else {
         CloneCommand clone = new CloneCommand();
@@ -162,12 +188,16 @@
         clone.setCloneAllBranches(true);
         clone.setURI(fromUrl);
         clone.setDirectory(folder);
         if (credentialsProvider != null) {
            clone.setCredentialsProvider(credentialsProvider);
         }
         clone.call();
         // Now we have to fetch because CloneCommand doesn't fetch
         // refs/notes nor does it allow manual RefSpec.
         File gitDir = FileKey.resolve(new File(repositoriesFolder, name), FS.DETECTED);
         FileRepository repository = new FileRepository(gitDir);
         result = fetchRepository(repository);
         result.createdRepository = true;
         result.fetchResult = fetchRepository(credentialsProvider, repository);
         repository.close();
      }
      return result;
@@ -177,13 +207,14 @@
    * Fetch updates from the remote repository. If refSpecs is unspecifed,
    * remote heads, tags, and notes are retrieved.
    * 
    * @param credentialsProvider
    * @param repository
    * @param refSpecs
    * @return FetchResult
    * @throws Exception
    */
   public static FetchResult fetchRepository(Repository repository, RefSpec... refSpecs)
         throws Exception {
   public static FetchResult fetchRepository(CredentialsProvider credentialsProvider,
         Repository repository, RefSpec... refSpecs) throws Exception {
      Git git = new Git(repository);
      FetchCommand fetch = git.fetch();
      List<RefSpec> specs = new ArrayList<RefSpec>();
@@ -194,6 +225,9 @@
      } else {
         specs.addAll(Arrays.asList(refSpecs));
      }
      if (credentialsProvider != null) {
         fetch.setCredentialsProvider(credentialsProvider);
      }
      fetch.setRefSpecs(specs);
      FetchResult result = fetch.call();
      return result;