From 831469ba89ea8bca3bfbd1d662dbdd2c9f233798 Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Mon, 12 Sep 2011 15:37:55 -0400
Subject: [PATCH] Largely completed, uber-cool federation feature.

---
 src/com/gitblit/utils/JGitUtils.java |   48 +++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 41 insertions(+), 7 deletions(-)

diff --git a/src/com/gitblit/utils/JGitUtils.java b/src/com/gitblit/utils/JGitUtils.java
index e62795b..b6b13ab 100644
--- a/src/com/gitblit/utils/JGitUtils.java
+++ b/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;

--
Gitblit v1.9.1