From ec97f716023c0bbd6a9e11cbe7144973cf1c103d Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Sun, 29 May 2011 11:19:30 -0400
Subject: [PATCH] Unit testing.

---
 src/com/gitblit/utils/JGitUtils.java |  273 +++++++++++++++++++-----------------------------------
 1 files changed, 96 insertions(+), 177 deletions(-)

diff --git a/src/com/gitblit/utils/JGitUtils.java b/src/com/gitblit/utils/JGitUtils.java
index b153c0c..f99fbfd 100644
--- a/src/com/gitblit/utils/JGitUtils.java
+++ b/src/com/gitblit/utils/JGitUtils.java
@@ -1,3 +1,18 @@
+/*
+ * Copyright 2011 gitblit.com.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
 package com.gitblit.utils;
 
 import java.io.ByteArrayOutputStream;
@@ -16,6 +31,7 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.zip.ZipEntry;
@@ -57,30 +73,33 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.gitblit.wicket.models.Metric;
-import com.gitblit.wicket.models.PathModel;
-import com.gitblit.wicket.models.PathModel.PathChangeModel;
-import com.gitblit.wicket.models.RefModel;
-import com.gitblit.wicket.models.TicketModel;
-import com.gitblit.wicket.models.TicketModel.Comment;
+import com.gitblit.models.Metric;
+import com.gitblit.models.PathModel;
+import com.gitblit.models.RefModel;
+import com.gitblit.models.TicketModel;
+import com.gitblit.models.PathModel.PathChangeModel;
+import com.gitblit.models.TicketModel.Comment;
 
 public class JGitUtils {
 
-	private final static Logger LOGGER = LoggerFactory.getLogger(JGitUtils.class);
+	private static final Logger LOGGER = LoggerFactory.getLogger(JGitUtils.class);
 
 	public static Repository createRepository(File repositoriesFolder, String name, boolean bare) {
 		Git git = Git.init().setDirectory(new File(repositoriesFolder, name)).setBare(bare).call();
 		return git.getRepository();
 	}
 
-	public static List<String> getRepositoryList(File repositoriesFolder, boolean exportAll, boolean readNested) {
+	public static List<String> getRepositoryList(File repositoriesFolder, boolean exportAll,
+			boolean readNested) {
 		List<String> list = new ArrayList<String>();
-		list.addAll(getNestedRepositories(repositoriesFolder, repositoriesFolder, exportAll, readNested));
+		list.addAll(getNestedRepositories(repositoriesFolder, repositoriesFolder, exportAll,
+				readNested));
 		Collections.sort(list);
 		return list;
 	}
 
-	public static List<String> getNestedRepositories(File repositoriesFolder, File folder, boolean exportAll, boolean readNested) {
+	public static List<String> getNestedRepositories(File repositoriesFolder, File folder,
+			boolean exportAll, boolean readNested) {
 		String basefile = repositoriesFolder.getAbsolutePath();
 		List<String> list = new ArrayList<String>();
 		if (folder == null || !folder.exists()) {
@@ -97,12 +116,16 @@
 				// then look for folder.git/HEAD or folder/HEAD and
 				// folder/config
 				if (!isGitRepository) {
-					if ((file.getName().endsWith(Constants.DOT_GIT_EXT) && new File(file, Constants.HEAD).exists()) || (new File(file, "config").exists() && new File(file, Constants.HEAD).exists())) {
+					if ((file.getName().endsWith(Constants.DOT_GIT_EXT) && new File(file,
+							Constants.HEAD).exists())
+							|| (new File(file, "config").exists() && new File(file, Constants.HEAD)
+									.exists())) {
 						gitFolder = file;
 						isGitRepository = true;
 					}
 				}
-				boolean exportRepository = isGitRepository && (exportAll || new File(gitFolder, "git-daemon-export-ok").exists());
+				boolean exportRepository = isGitRepository
+						&& (exportAll || new File(gitFolder, "git-daemon-export-ok").exists());
 
 				if (exportRepository) {
 					// determine repository name relative to repositories folder
@@ -116,7 +139,8 @@
 
 				// look for nested repositories
 				if (readNested) {
-					list.addAll(getNestedRepositories(repositoriesFolder, file, exportAll, readNested));
+					list.addAll(getNestedRepositories(repositoriesFolder, file, exportAll,
+							readNested));
 				}
 			}
 		}
@@ -159,11 +183,18 @@
 	}
 
 	public static boolean hasCommits(Repository r) {
-		return new File(r.getDirectory(), Constants.R_HEADS).list().length > 0;
+		if (r != null && r.getDirectory().exists()) {
+			return new File(r.getDirectory(), Constants.R_HEADS).list().length > 0;
+		}
+		return false;		
 	}
 
 	public static Date getLastChange(Repository r) {
 		if (!hasCommits(r)) {
+			// null repository
+			if (r == null) {
+				return new Date(0);
+			}
 			// fresh repository
 			return new Date(r.getDirectory().lastModified());
 		}
@@ -194,13 +225,13 @@
 	public static Map<ObjectId, List<String>> getAllRefs(Repository r) {
 		Map<ObjectId, List<String>> refs = new HashMap<ObjectId, List<String>>();
 		Map<AnyObjectId, Set<Ref>> allRefs = r.getAllRefsByPeeledObjectId();
-		for (AnyObjectId id : allRefs.keySet()) {
+		for (Entry<AnyObjectId, Set<Ref>> setRefs : allRefs.entrySet()) {
 			List<String> list = new ArrayList<String>();
-			for (Ref setRef : allRefs.get(id)) {
+			for (Ref setRef : setRefs.getValue()) {
 				String name = setRef.getName();
 				list.add(name);
 			}
-			refs.put(id.toObjectId(), list);
+			refs.put(setRefs.getKey().toObjectId(), list);
 		}
 		return refs;
 	}
@@ -208,15 +239,15 @@
 	public static Map<ObjectId, List<String>> getRefs(Repository r, String baseRef) {
 		Map<ObjectId, List<String>> refs = new HashMap<ObjectId, List<String>>();
 		Map<AnyObjectId, Set<Ref>> allRefs = r.getAllRefsByPeeledObjectId();
-		for (AnyObjectId id : allRefs.keySet()) {
+		for (Entry<AnyObjectId, Set<Ref>> setRefs : allRefs.entrySet()) {
 			List<String> list = new ArrayList<String>();
-			for (Ref setRef : allRefs.get(id)) {
+			for (Ref setRef : setRefs.getValue()) {
 				String name = setRef.getName();
 				if (name.startsWith(baseRef)) {
 					list.add(name);
 				}
 			}
-			refs.put(id.toObjectId(), list);
+			refs.put(setRefs.getKey().toObjectId(), list);
 		}
 		return refs;
 	}
@@ -363,9 +394,11 @@
 			List<DiffEntry> diffs = df.scan(parentTree, commitTree);
 			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()));
+					list.add(new PathChangeModel(diff.getOldPath(), diff.getOldPath(), 0, diff
+							.getNewMode().getBits(), commit.getId().getName(), diff.getChangeType()));
 				} else {
-					list.add(new PathChangeModel(diff.getNewPath(), diff.getNewPath(), 0, diff.getNewMode().getBits(), commit.getId().getName(), diff.getChangeType()));
+					list.add(new PathChangeModel(diff.getNewPath(), diff.getNewPath(), 0, diff
+							.getNewMode().getBits(), commit.getId().getName(), diff.getChangeType()));
 				}
 			}
 		} catch (Throwable t) {
@@ -434,136 +467,6 @@
 		}
 	}
 
-	public static String getCommitDiff(Repository r, RevCommit commit, DiffOutputType outputType) {
-		return getCommitDiff(r, null, commit, null, outputType);
-	}
-
-	public static String getCommitDiff(Repository r, RevCommit commit, String path, DiffOutputType outputType) {
-		return getCommitDiff(r, null, commit, path, outputType);
-	}
-
-	public static String getCommitDiff(Repository r, RevCommit baseCommit, RevCommit commit, DiffOutputType outputType) {
-		return getCommitDiff(r, baseCommit, commit, null, outputType);
-	}
-
-	public static String getCommitDiff(Repository r, RevCommit baseCommit, RevCommit commit, String path, DiffOutputType outputType) {
-		try {
-			RevTree baseTree;
-			if (baseCommit == null) {
-				final RevWalk rw = new RevWalk(r);
-				RevCommit parent = rw.parseCommit(commit.getParent(0).getId());
-				rw.dispose();
-				baseTree = parent.getTree();
-			} else {
-				baseTree = baseCommit.getTree();
-			}
-
-			RevTree commitTree = commit.getTree();
-
-			final TreeWalk walk = new TreeWalk(r);
-			walk.reset();
-			walk.setRecursive(true);
-			walk.addTree(baseTree);
-			walk.addTree(commitTree);
-			walk.setFilter(TreeFilter.ANY_DIFF);
-
-			final ByteArrayOutputStream os = new ByteArrayOutputStream();
-			RawTextComparator cmp = RawTextComparator.DEFAULT;
-			DiffFormatter df;
-			switch (outputType) {
-			case GITWEB:
-				df = new GitWebDiffFormatter(os);
-				break;
-			case GITBLIT:
-				df = new GitBlitDiffFormatter(os);
-				break;
-			case PLAIN:
-			default:
-				df = new DiffFormatter(os);
-				break;
-			}
-			df.setRepository(r);
-			df.setDiffComparator(cmp);
-			df.setDetectRenames(true);
-			List<DiffEntry> diffs = df.scan(baseTree, commitTree);
-			if (path != null && path.length() > 0) {
-				for (DiffEntry diff : diffs) {
-					if (diff.getNewPath().equalsIgnoreCase(path)) {
-						df.format(diff);
-						break;
-					}
-				}
-			} else {
-				df.format(diffs);
-			}
-			String diff;
-			if (df instanceof GitWebDiffFormatter) {
-				// workaround for complex private methods in DiffFormatter
-				diff = ((GitWebDiffFormatter) df).getHtml();
-			} else {
-				diff = os.toString();
-			}
-			df.flush();
-			return diff;
-		} catch (Throwable t) {
-			LOGGER.error("failed to generate commit diff!", t);
-		}
-		return null;
-	}
-
-	public static String getCommitPatch(Repository r, RevCommit commit) {
-		return getCommitPatch(r, commit);
-	}
-
-	public static String getCommitPatch(Repository r, RevCommit commit, String path) {
-		return getCommitPatch(r, null, commit, path);
-	}
-
-	public static String getCommitPatch(Repository r, RevCommit baseCommit, RevCommit commit, String path) {
-		try {
-			RevTree baseTree;
-			if (baseCommit == null) {
-				final RevWalk rw = new RevWalk(r);
-				RevCommit parent = rw.parseCommit(commit.getParent(0).getId());
-				baseTree = parent.getTree();
-			} else {
-				baseTree = baseCommit.getTree();
-			}
-			RevTree commitTree = commit.getTree();
-
-			final TreeWalk walk = new TreeWalk(r);
-			walk.reset();
-			walk.setRecursive(true);
-			walk.addTree(baseTree);
-			walk.addTree(commitTree);
-			walk.setFilter(TreeFilter.ANY_DIFF);
-
-			final ByteArrayOutputStream os = new ByteArrayOutputStream();
-			RawTextComparator cmp = RawTextComparator.DEFAULT;
-			PatchFormatter df = new PatchFormatter(os);
-			df.setRepository(r);
-			df.setDiffComparator(cmp);
-			df.setDetectRenames(true);
-			List<DiffEntry> diffs = df.scan(baseTree, commitTree);
-			if (path != null && path.length() > 0) {
-				for (DiffEntry diff : diffs) {
-					if (diff.getNewPath().equalsIgnoreCase(path)) {
-						df.format(diff);
-						break;
-					}
-				}
-			} else {
-				df.format(diffs);
-			}
-			String diff = df.getPatch(commit);
-			df.flush();
-			return diff;
-		} catch (Throwable t) {
-			LOGGER.error("failed to generate commit diff!", t);
-		}
-		return null;
-	}
-
 	private static PathModel getPathModel(TreeWalk walk, String basePath, RevCommit commit) {
 		String name;
 		long size = 0;
@@ -578,12 +481,14 @@
 		}
 		try {
 			if (!walk.isSubtree()) {
-				size = walk.getObjectReader().getObjectSize(walk.getObjectId(0), Constants.OBJ_BLOB);
+				size = walk.getObjectReader()
+						.getObjectSize(walk.getObjectId(0), Constants.OBJ_BLOB);
 			}
 		} catch (Throwable t) {
 			LOGGER.error("Failed to retrieve blob size", t);
 		}
-		return new PathModel(name, walk.getPathString(), size, walk.getFileMode(0).getBits(), commit.getName());
+		return new PathModel(name, walk.getPathString(), size, walk.getFileMode(0).getBits(),
+				commit.getName());
 	}
 
 	public static String getPermissionsFromMode(int mode) {
@@ -618,7 +523,8 @@
 		return getRevLog(r, objectId, null, offset, maxCount);
 	}
 
-	public static List<RevCommit> getRevLog(Repository r, String objectId, String path, int offset, int maxCount) {
+	public static List<RevCommit> getRevLog(Repository r, String objectId, String path, int offset,
+			int maxCount) {
 		List<RevCommit> list = new ArrayList<RevCommit>();
 		if (!hasCommits(r)) {
 			return list;
@@ -631,7 +537,9 @@
 			ObjectId object = r.resolve(objectId);
 			walk.markStart(walk.parseCommit(object));
 			if (!StringUtils.isEmpty(path)) {
-				TreeFilter filter = AndTreeFilter.create(PathFilterGroup.createFromStrings(Collections.singleton(path)), TreeFilter.ANY_DIFF);
+				TreeFilter filter = AndTreeFilter.create(
+						PathFilterGroup.createFromStrings(Collections.singleton(path)),
+						TreeFilter.ANY_DIFF);
 				walk.setTreeFilter(filter);
 			}
 			Iterable<RevCommit> revlog = walk;
@@ -678,7 +586,8 @@
 		}
 	}
 
-	public static List<RevCommit> searchRevlogs(Repository r, String objectId, String value, final SearchType type, int offset, int maxCount) {
+	public static List<RevCommit> searchRevlogs(Repository r, String objectId, String value,
+			final SearchType type, int offset, int maxCount) {
 		final String lcValue = value.toLowerCase();
 		List<RevCommit> list = new ArrayList<RevCommit>();
 		if (!hasCommits(r)) {
@@ -697,12 +606,17 @@
 				}
 
 				@Override
-				public boolean include(RevWalk walker, RevCommit commit) throws StopWalkException, MissingObjectException, IncorrectObjectTypeException, IOException {
+				public boolean include(RevWalk walker, RevCommit commit) throws StopWalkException,
+						MissingObjectException, IncorrectObjectTypeException, IOException {
 					switch (type) {
 					case AUTHOR:
-						return (commit.getAuthorIdent().getName().toLowerCase().indexOf(lcValue) > -1) || (commit.getAuthorIdent().getEmailAddress().toLowerCase().indexOf(lcValue) > -1);
+						return (commit.getAuthorIdent().getName().toLowerCase().indexOf(lcValue) > -1)
+								|| (commit.getAuthorIdent().getEmailAddress().toLowerCase()
+										.indexOf(lcValue) > -1);
 					case COMMITTER:
-						return (commit.getCommitterIdent().getName().toLowerCase().indexOf(lcValue) > -1) || (commit.getCommitterIdent().getEmailAddress().toLowerCase().indexOf(lcValue) > -1);
+						return (commit.getCommitterIdent().getName().toLowerCase().indexOf(lcValue) > -1)
+								|| (commit.getCommitterIdent().getEmailAddress().toLowerCase()
+										.indexOf(lcValue) > -1);
 					case COMMIT:
 						return commit.getFullMessage().toLowerCase().indexOf(lcValue) > -1;
 					}
@@ -755,10 +669,10 @@
 		List<RefModel> list = new ArrayList<RefModel>();
 		try {
 			Map<String, Ref> map = r.getRefDatabase().getRefs(refs);
-			for (String name : map.keySet()) {
-				Ref ref = map.get(name);
+			for (Entry<String, Ref> entry : map.entrySet()) {
+				Ref ref = entry.getValue();
 				RevCommit commit = getCommit(r, ref.getObjectId().getName());
-				list.add(new RefModel(name, ref, commit));
+				list.add(new RefModel(entry.getKey(), ref, commit));
 			}
 			Collections.sort(list);
 			Collections.reverse(list);
@@ -772,10 +686,11 @@
 	}
 
 	public static Ref getRef(Repository r, String id) {
+		// FIXME
 		try {
 			Map<String, Ref> map = r.getRefDatabase().getRefs(id);
-			for (String name : map.keySet()) {
-				return map.get(name);
+			for (Entry<String, Ref> entry : map.entrySet()) {
+				return entry.getValue();
 			}
 		} catch (IOException e) {
 			LOGGER.error("Failed to retrieve ref " + id, e);
@@ -784,7 +699,7 @@
 	}
 
 	public static Date getCommitDate(RevCommit commit) {
-		return new Date(commit.getCommitTime() * 1000l);
+		return new Date(commit.getCommitTime() * 1000L);
 	}
 
 	public static String getDisplayName(PersonIdent person) {
@@ -792,7 +707,7 @@
 		r.append(person.getName());
 		r.append(" <");
 		r.append(person.getEmailAddress());
-		r.append(">");
+		r.append('>');
 		return r.toString();
 	}
 
@@ -811,7 +726,8 @@
 		return null;
 	}
 
-	public static boolean zip(Repository r, String basePath, String objectId, OutputStream os) throws Exception {
+	public static boolean zip(Repository r, String basePath, String objectId, OutputStream os)
+			throws Exception {
 		RevCommit commit = getCommit(r, objectId);
 		if (commit == null) {
 			return false;
@@ -829,7 +745,8 @@
 			walk.setRecursive(true);
 			while (walk.next()) {
 				ZipEntry entry = new ZipEntry(walk.getPathString());
-				entry.setSize(walk.getObjectReader().getObjectSize(walk.getObjectId(0), Constants.OBJ_BLOB));
+				entry.setSize(walk.getObjectReader().getObjectSize(walk.getObjectId(0),
+						Constants.OBJ_BLOB));
 				entry.setComment(commit.getName());
 				zos.putNextEntry(entry);
 
@@ -874,7 +791,8 @@
 
 				RevCommit firstCommit = getFirstCommit(r, Constants.HEAD);
 				RevCommit lastCommit = walk.parseCommit(object);
-				int diffDays = (lastCommit.getCommitTime() - firstCommit.getCommitTime()) / (60 * 60 * 24);
+				int diffDays = (lastCommit.getCommitTime() - firstCommit.getCommitTime())
+						/ (60 * 60 * 24);
 				total.duration = diffDays;
 				DateFormat df;
 				if (diffDays <= 90) {
@@ -893,8 +811,9 @@
 				for (RevCommit rev : revlog) {
 					Date d = getCommitDate(rev);
 					String p = df.format(d);
-					if (!metricMap.containsKey(p))
+					if (!metricMap.containsKey(p)) {
 						metricMap.put(p, new Metric(p));
+					}
 					Metric m = metricMap.get(p);
 					m.count++;
 					total.count++;
@@ -922,7 +841,7 @@
 		try {
 			// search for ticgit branch in local heads
 			for (RefModel ref : getLocalBranches(r, -1)) {
-				if (ref.getDisplayName().endsWith("ticgit")) {
+				if (ref.displayName.endsWith("ticgit")) {
 					ticgitBranch = ref;
 					break;
 				}
@@ -931,7 +850,7 @@
 			// search for ticgit branch in remote heads
 			if (ticgitBranch == null) {
 				for (RefModel ref : getRemoteBranches(r, -1)) {
-					if (ref.getDisplayName().endsWith("ticgit")) {
+					if (ref.displayName.endsWith("ticgit")) {
 						ticgitBranch = ref;
 						break;
 					}
@@ -945,7 +864,7 @@
 
 	public static List<TicketModel> getTickets(Repository r) {
 		RefModel ticgitBranch = getTicketsBranch(r);
-		List<PathModel> paths = getFilesInPath(r, null, ticgitBranch.getCommit());
+		List<PathModel> paths = getFilesInPath(r, null, ticgitBranch.commit);
 		List<TicketModel> tickets = new ArrayList<TicketModel>();
 		for (PathModel ticketFolder : paths) {
 			if (ticketFolder.isTree()) {
@@ -978,9 +897,9 @@
 	}
 
 	private static void readTicketContents(Repository r, RefModel ticketsBranch, TicketModel ticket) {
-		List<PathModel> ticketFiles = getFilesInPath(r, ticket.name, ticketsBranch.getCommit());
+		List<PathModel> ticketFiles = getFilesInPath(r, ticket.name, ticketsBranch.commit);
 		for (PathModel file : ticketFiles) {
-			String content = getRawContentAsString(r, ticketsBranch.getCommit(), file.path).trim();
+			String content = getRawContentAsString(r, ticketsBranch.commit, file.path).trim();
 			if (file.name.equals("TICKET_ID")) {
 				ticket.id = content;
 			} else if (file.name.equals("TITLE")) {
@@ -1013,7 +932,7 @@
 	public static String getTicketContent(Repository r, String filePath) {
 		RefModel ticketsBranch = getTicketsBranch(r);
 		if (ticketsBranch != null) {
-			return getRawContentAsString(r, ticketsBranch.getCommit(), filePath);
+			return getRawContentAsString(r, ticketsBranch.commit, filePath);
 		}
 		return "";
 	}

--
Gitblit v1.9.1