From 2a02f843771aaccea2cb497fdc40ae8ca384d498 Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Fri, 18 Nov 2011 17:39:37 -0500
Subject: [PATCH] Added some flare to the console log
---
src/com/gitblit/utils/JGitUtils.java | 156 ++++++++++++++++++++++++++++++++++++++++-----------
1 files changed, 122 insertions(+), 34 deletions(-)
diff --git a/src/com/gitblit/utils/JGitUtils.java b/src/com/gitblit/utils/JGitUtils.java
index e62795b..99c2d0a 100644
--- a/src/com/gitblit/utils/JGitUtils.java
+++ b/src/com/gitblit/utils/JGitUtils.java
@@ -37,6 +37,8 @@
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.diff.DiffEntry;
import org.eclipse.jgit.diff.DiffEntry.ChangeType;
import org.eclipse.jgit.diff.DiffFormatter;
@@ -60,8 +62,10 @@
import org.eclipse.jgit.revwalk.RevSort;
import org.eclipse.jgit.revwalk.RevTree;
import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.revwalk.filter.CommitTimeRevFilter;
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 +138,15 @@
}
/**
+ * Encapsulates the result of cloning or pulling from a repository.
+ */
+ public static class CloneResult {
+ public String name;
+ 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,33 +154,65 @@
* @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;
- if (!name.toLowerCase().endsWith(Constants.DOT_GIT_EXT)) {
- name += Constants.DOT_GIT_EXT;
+ return cloneRepository(repositoriesFolder, name, fromUrl, true, 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 bare
+ * @param credentialsProvider
+ * @return CloneResult
+ * @throws Exception
+ */
+ public static CloneResult cloneRepository(File repositoriesFolder, String name, String fromUrl,
+ boolean bare, CredentialsProvider credentialsProvider) throws Exception {
+ CloneResult result = new CloneResult();
+ if (bare) {
+ // bare repository, ensure .git suffix
+ if (!name.toLowerCase().endsWith(Constants.DOT_GIT_EXT)) {
+ name += Constants.DOT_GIT_EXT;
+ }
+ } else {
+ // normal repository, strip .git suffix
+ if (name.toLowerCase().endsWith(Constants.DOT_GIT_EXT)) {
+ name = name.substring(0, name.indexOf(Constants.DOT_GIT_EXT));
+ }
}
+ result.name = name;
+
File folder = new File(repositoriesFolder, name);
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();
- clone.setBare(true);
+ clone.setBare(bare);
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 +222,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,8 +240,32 @@
} else {
specs.addAll(Arrays.asList(refSpecs));
}
+ if (credentialsProvider != null) {
+ fetch.setCredentialsProvider(credentialsProvider);
+ }
fetch.setRefSpecs(specs);
- FetchResult result = fetch.call();
+ FetchResult fetchRes = fetch.call();
+ return fetchRes;
+ }
+
+ /**
+ * 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;
}
@@ -230,7 +300,7 @@
}
list.addAll(getRepositoryList(repositoriesFolder.getAbsolutePath(), repositoriesFolder,
exportAll, searchSubfolders));
- Collections.sort(list);
+ StringUtils.sortRepositorynames(list);
return list;
}
@@ -755,6 +825,45 @@
}
/**
+ * Returns a list of commits since the minimum date starting from the
+ * specified object id.
+ *
+ * @param repository
+ * @param objectId
+ * if unspecified, HEAD is assumed.
+ * @param minimumDate
+ * @return list of commits
+ */
+ public static List<RevCommit> getRevLog(Repository repository, String objectId, Date minimumDate) {
+ List<RevCommit> list = new ArrayList<RevCommit>();
+ if (!hasCommits(repository)) {
+ return list;
+ }
+ try {
+ // resolve branch
+ ObjectId branchObject;
+ if (StringUtils.isEmpty(objectId)) {
+ branchObject = getDefaultBranch(repository);
+ } else {
+ branchObject = repository.resolve(objectId);
+ }
+
+ RevWalk rw = new RevWalk(repository);
+ rw.markStart(rw.parseCommit(branchObject));
+ rw.setRevFilter(CommitTimeRevFilter.after(minimumDate));
+ Iterable<RevCommit> revlog = rw;
+ for (RevCommit rev : revlog) {
+ list.add(rev);
+ }
+ rw.dispose();
+ } catch (Throwable t) {
+ error(t, repository, "{0} failed to get {1} revlog for minimum date {2}", objectId,
+ minimumDate);
+ }
+ return list;
+ }
+
+ /**
* Returns a list of commits starting from HEAD and working backwards.
*
* @param repository
@@ -856,27 +965,6 @@
}
/**
- * Enumeration of the search types.
- */
- public static enum SearchType {
- AUTHOR, COMMITTER, COMMIT;
-
- public static SearchType forName(String name) {
- for (SearchType type : values()) {
- if (type.name().equalsIgnoreCase(name)) {
- return type;
- }
- }
- return COMMIT;
- }
-
- @Override
- public String toString() {
- return name().toLowerCase();
- }
- }
-
- /**
* Search the commit history for a case-insensitive match to the value.
* Search results require a specified SearchType of AUTHOR, COMMITTER, or
* COMMIT. Results may be paginated using offset and maxCount. If the
@@ -894,7 +982,7 @@
* @return matching list of commits
*/
public static List<RevCommit> searchRevlogs(Repository repository, String objectId,
- String value, final SearchType type, int offset, int maxCount) {
+ String value, final com.gitblit.Constants.SearchType type, int offset, int maxCount) {
final String lcValue = value.toLowerCase();
List<RevCommit> list = new ArrayList<RevCommit>();
if (maxCount == 0) {
--
Gitblit v1.9.1