From edeab95cac16e5f17cfcd75a9969d8708bf360ab Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Mon, 12 May 2014 09:22:04 -0400
Subject: [PATCH] Documentation

---
 src/main/java/com/gitblit/utils/JGitUtils.java |   72 ++++++++++++++++++++++++++++++-----
 1 files changed, 61 insertions(+), 11 deletions(-)

diff --git a/src/main/java/com/gitblit/utils/JGitUtils.java b/src/main/java/com/gitblit/utils/JGitUtils.java
index 6f3b085..da51ea9 100644
--- a/src/main/java/com/gitblit/utils/JGitUtils.java
+++ b/src/main/java/com/gitblit/utils/JGitUtils.java
@@ -59,8 +59,8 @@
 import org.eclipse.jgit.lib.RepositoryCache.FileKey;
 import org.eclipse.jgit.lib.StoredConfig;
 import org.eclipse.jgit.lib.TreeFormatter;
-import org.eclipse.jgit.merge.MergeStrategy;
-import org.eclipse.jgit.merge.RecursiveMerger;
+import org.eclipse.jgit.merge.MergeStrategy;
+import org.eclipse.jgit.merge.RecursiveMerger;
 import org.eclipse.jgit.revwalk.RevBlob;
 import org.eclipse.jgit.revwalk.RevCommit;
 import org.eclipse.jgit.revwalk.RevObject;
@@ -84,7 +84,7 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.gitblit.GitBlitException;
+import com.gitblit.GitBlitException;
 import com.gitblit.models.GitNote;
 import com.gitblit.models.PathModel;
 import com.gitblit.models.PathModel.PathChangeModel;
@@ -711,7 +711,7 @@
 		try {
 			// resolve object id
 			ObjectId branchObject;
-			if (StringUtils.isEmpty(objectId)) {
+			if (StringUtils.isEmpty(objectId) || "HEAD".equalsIgnoreCase(objectId)) {
 				branchObject = getDefaultBranch(repository);
 			} else {
 				branchObject = repository.resolve(objectId);
@@ -1668,6 +1668,24 @@
 	}
 
 	/**
+	 * Returns the list of tags in the repository. If repository does not exist
+	 * or is empty, an empty list is returned.
+	 *
+	 * @param repository
+	 * @param fullName
+	 *            if true, /refs/tags/yadayadayada is returned. If false,
+	 *            yadayadayada is returned.
+	 * @param maxCount
+	 *            if < 0, all tags are returned
+	 * @param offset
+	 *            if maxCount provided sets the starting point of the records to return
+	 * @return list of tags
+	 */
+	public static List<RefModel> getTags(Repository repository, boolean fullName, int maxCount, int offset) {
+		return getRefs(repository, Constants.R_TAGS, fullName, maxCount, offset);
+	}
+
+	/**
 	 * Returns the list of local branches in the repository. If repository does
 	 * not exist or is empty, an empty list is returned.
 	 *
@@ -1748,6 +1766,27 @@
 	 */
 	private static List<RefModel> getRefs(Repository repository, String refs, boolean fullName,
 			int maxCount) {
+		return getRefs(repository, refs, fullName, maxCount, 0);
+	}
+
+	/**
+	 * Returns a list of references in the repository matching "refs". If the
+	 * repository is null or empty, an empty list is returned.
+	 *
+	 * @param repository
+	 * @param refs
+	 *            if unspecified, all refs are returned
+	 * @param fullName
+	 *            if true, /refs/something/yadayadayada is returned. If false,
+	 *            yadayadayada is returned.
+	 * @param maxCount
+	 *            if < 0, all references are returned
+	 * @param offset
+	 *            if maxCount provided sets the starting point of the records to return
+	 * @return list of references
+	 */
+	private static List<RefModel> getRefs(Repository repository, String refs, boolean fullName,
+			int maxCount, int offset) {
 		List<RefModel> list = new ArrayList<RefModel>();
 		if (maxCount == 0) {
 			return list;
@@ -1771,7 +1810,14 @@
 			Collections.sort(list);
 			Collections.reverse(list);
 			if (maxCount > 0 && list.size() > maxCount) {
-				list = new ArrayList<RefModel>(list.subList(0, maxCount));
+				if (offset < 0) {
+					offset = 0;
+				}
+				int endIndex = offset + maxCount;
+				if (endIndex > list.size()) {
+					endIndex = list.size();
+				}
+				list = new ArrayList<RefModel>(list.subList(offset, endIndex));
 			}
 		} catch (IOException e) {
 			error(e, repository, "{0} failed to retrieve {1}", refs);
@@ -2256,8 +2302,10 @@
 			}
 		} catch (IOException e) {
 			LOGGER.error("Failed to determine canMerge", e);
-		} finally {
-			revWalk.release();
+		} finally {
+			if (revWalk != null) {
+				revWalk.release();
+			}
 		}
 		return MergeStatus.NOT_MERGEABLE;
 	}
@@ -2329,11 +2377,11 @@
 					RefUpdate mergeRefUpdate = repository.updateRef(toBranch);
 					mergeRefUpdate.setNewObjectId(mergeCommitId);
 					mergeRefUpdate.setRefLogMessage("commit: " + mergeCommit.getShortMessage(), false);
-					RefUpdate.Result rc = mergeRefUpdate.forceUpdate();
+					RefUpdate.Result rc = mergeRefUpdate.update();
 					switch (rc) {
 					case FAST_FORWARD:
 						// successful, clean merge
-						break;
+						break;
 					default:
 						throw new GitBlitException(MessageFormat.format("Unexpected result \"{0}\" when merging commit {1} into {2} in {3}",
 								rc.name(), srcTip.getName(), branchTip.getName(), repository.getDirectory()));
@@ -2347,8 +2395,10 @@
 			}
 		} catch (IOException e) {
 			LOGGER.error("Failed to merge", e);
-		} finally {
-			revWalk.release();
+		} finally {
+			if (revWalk != null) {
+				revWalk.release();
+			}
 		}
 		return new MergeResult(MergeStatus.FAILED, null);
 	}

--
Gitblit v1.9.1