--- a/libs.git/apichanges.xml Thu Sep 12 14:22:58 2013 +0200
+++ a/libs.git/apichanges.xml Thu Sep 12 15:49:58 2013 +0200
@@ -111,6 +111,28 @@
+ The log command returns also branches containing the commits from the result.
+
+
+
+
+
+
+ - Adding a new method GitClient.log (SearchCriteria, boolean, ProgressMonitor)
+ allowing an API client to specify if he wants to know what branches contain
+ the returned commits applying the search criteria. Such information can
+ be used to filter the resulted commits by branches without a need to restart
+ the command again.
+ - Adding a method GitRevisionInfo.getBranches() returning all branches
+ that are known to contain the commit.
+
+
+
+
+
+
+
+
Adding a command setting the upstream branch/tracking of local branches
--- a/libs.git/manifest.mf Thu Sep 12 14:22:58 2013 +0200
+++ a/libs.git/manifest.mf Thu Sep 12 15:49:58 2013 +0200
@@ -1,4 +1,4 @@
Manifest-Version: 1.0
OpenIDE-Module: org.netbeans.libs.git/1
OpenIDE-Module-Localizing-Bundle: org/netbeans/libs/git/Bundle.properties
-OpenIDE-Module-Specification-Version: 1.13
+OpenIDE-Module-Specification-Version: 1.14
--- a/libs.git/src/org/netbeans/libs/git/GitClassFactoryImpl.java Thu Sep 12 14:22:58 2013 +0200
+++ a/libs.git/src/org/netbeans/libs/git/GitClassFactoryImpl.java Thu Sep 12 15:49:58 2013 +0200
@@ -129,8 +129,8 @@
}
@Override
- public GitRevisionInfo createRevisionInfo (RevCommit commit, Repository repository) {
- return new GitRevisionInfo(commit, repository);
+ public GitRevisionInfo createRevisionInfo (RevCommit commit, Map affectedBranches, Repository repository) {
+ return new GitRevisionInfo(commit, affectedBranches, repository);
}
@Override
--- a/libs.git/src/org/netbeans/libs/git/GitClient.java Thu Sep 12 14:22:58 2013 +0200
+++ a/libs.git/src/org/netbeans/libs/git/GitClient.java Thu Sep 12 15:49:58 2013 +0200
@@ -792,6 +792,9 @@
/**
* Digs through the repository's history and returns revisions according to the given search criteria.
+ * No information about branches is returned, you
+ * should call {@link #log(org.netbeans.libs.git.SearchCriteria, boolean, org.netbeans.libs.git.progress.ProgressMonitor)}
+ * if you want to get such knowledge.
* @param searchCriteria criteria filtering the returned revisions
* @param monitor progress monitor
* @return revisions that follow the given search criteria
@@ -799,8 +802,29 @@
* @throws GitException an unexpected error occurs
*/
public GitRevisionInfo[] log (SearchCriteria searchCriteria, ProgressMonitor monitor) throws GitException.MissingObjectException, GitException {
+ return log(searchCriteria, false, monitor);
+ }
+
+ /**
+ * Digs through the repository's history and returns revisions according to
+ * the given search criteria.
+ *
+ * @param searchCriteria criteria filtering the returned revisions
+ * @param fetchBranchInfo if set to true
then the command will
+ * also fetch information ({@link GitRevisionInfo#getBranches()}) about what
+ * branches contain the individual commits returned by the command. You can
+ * use that information to filter returned commits by the branches they're
+ * part of. Also note that the command will take more time to finish.
+ * @param monitor progress monitor
+ * @return revisions that follow the given search criteria
+ * @throws GitException.MissingObjectException revision specified in search
+ * criteria (or head if no such revision is specified) does not exist
+ * @throws GitException an unexpected error occurs
+ */
+ public GitRevisionInfo[] log (SearchCriteria searchCriteria, boolean fetchBranchInfo, ProgressMonitor monitor) throws GitException.MissingObjectException, GitException {
Repository repository = gitRepository.getRepository();
- LogCommand cmd = new LogCommand(repository, getClassFactory(), searchCriteria, monitor, delegateListener);
+ LogCommand cmd = new LogCommand(repository, getClassFactory(), searchCriteria,
+ fetchBranchInfo, monitor, delegateListener);
cmd.execute();
return cmd.getRevisions();
}
--- a/libs.git/src/org/netbeans/libs/git/GitRevisionInfo.java Thu Sep 12 14:22:58 2013 +0200
+++ a/libs.git/src/org/netbeans/libs/git/GitRevisionInfo.java Thu Sep 12 15:49:58 2013 +0200
@@ -45,8 +45,10 @@
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
+import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;
@@ -70,14 +72,20 @@
*/
public final class GitRevisionInfo {
- private RevCommit revCommit;
- private Repository repository;
+ private final RevCommit revCommit;
+ private final Repository repository;
+ private final Map branches;
private GitFileInfo[] modifiedFiles;
private static final Logger LOG = Logger.getLogger(GitRevisionInfo.class.getName());
GitRevisionInfo (RevCommit commit, Repository repository) {
+ this(commit, Collections.emptyMap(), repository);
+ }
+
+ GitRevisionInfo (RevCommit commit, Map affectedBranches, Repository repository) {
this.revCommit = commit;
this.repository = repository;
+ this.branches = Collections.unmodifiableMap(affectedBranches);
}
/**
@@ -159,6 +167,13 @@
return parents;
}
+ /**
+ * @return all branches known to contain this commit.
+ */
+ public Map getBranches () {
+ return branches;
+ }
+
private void listFiles() throws GitException {
RevWalk revWalk = new RevWalk(repository);
TreeWalk walk = new TreeWalk(repository);
@@ -198,6 +213,12 @@
walk.release();
}
}
+
+ private static Map buildBranches (RevCommit commit, Map branches) {
+ Map retval = new LinkedHashMap<>(branches.size());
+
+ return retval;
+ }
/**
* Provides information about what happened to a file between two different commits.
--- a/libs.git/src/org/netbeans/libs/git/jgit/GitClassFactory.java Thu Sep 12 14:22:58 2013 +0200
+++ a/libs.git/src/org/netbeans/libs/git/jgit/GitClassFactory.java Thu Sep 12 15:49:58 2013 +0200
@@ -42,6 +42,7 @@
package org.netbeans.libs.git.jgit;
import java.io.File;
+import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.eclipse.jgit.api.MergeResult;
@@ -103,7 +104,11 @@
public abstract GitRevertResult createRevertResult (GitRevertResult.Status status, GitRevisionInfo createRevisionInfo, List conflicts, List failures);
- public abstract GitRevisionInfo createRevisionInfo (RevCommit commit, Repository repository);
+ public final GitRevisionInfo createRevisionInfo (RevCommit commit, Repository repository) {
+ return createRevisionInfo(commit, Collections.emptyMap(), repository);
+ }
+
+ public abstract GitRevisionInfo createRevisionInfo (RevCommit commit, Map affectedBranches, Repository repository);
public abstract GitStatus createStatus (boolean tracked, String path, String workTreePath, File file,
Status statusHeadIndex, Status statusIndexWC, Status statusHeadWC,
--- a/libs.git/src/org/netbeans/libs/git/jgit/Utils.java Thu Sep 12 14:22:58 2013 +0200
+++ a/libs.git/src/org/netbeans/libs/git/jgit/Utils.java Thu Sep 12 15:49:58 2013 +0200
@@ -83,6 +83,8 @@
import org.netbeans.libs.git.GitObjectType;
import org.netbeans.libs.git.GitRevisionInfo;
import org.netbeans.libs.git.GitRevisionInfo.GitFileInfo;
+import org.netbeans.libs.git.jgit.commands.ListBranchCommand;
+import org.netbeans.libs.git.progress.ProgressMonitor;
/**
*
@@ -422,4 +424,10 @@
return allBranches.get(remoteName + trackedBranchName);
}
}
+
+ public static Map getAllBranches (Repository repository, GitClassFactory fac, ProgressMonitor monitor) throws GitException {
+ ListBranchCommand cmd = new ListBranchCommand(repository, fac, true, monitor);
+ cmd.execute();
+ return cmd.getBranches();
+ }
}
--- a/libs.git/src/org/netbeans/libs/git/jgit/commands/LogCommand.java Thu Sep 12 14:22:58 2013 +0200
+++ a/libs.git/src/org/netbeans/libs/git/jgit/commands/LogCommand.java Thu Sep 12 15:49:58 2013 +0200
@@ -44,18 +44,24 @@
import java.io.File;
import java.io.IOException;
+import java.util.ArrayList;
import java.util.Collection;
+import java.util.Collections;
import java.util.Date;
import java.util.Iterator;
+import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
import org.eclipse.jgit.errors.MissingObjectException;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.PersonIdent;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.FollowFilter;
import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevFlag;
import org.eclipse.jgit.revwalk.RevSort;
import org.eclipse.jgit.revwalk.RevWalk;
import org.eclipse.jgit.revwalk.filter.AndRevFilter;
@@ -87,14 +93,18 @@
private final List revisions;
private final String revision;
private final SearchCriteria criteria;
+ private final boolean fetchBranchInfo;
+ private static final Logger LOG = Logger.getLogger(LogCommand.class.getName());
- public LogCommand (Repository repository, GitClassFactory gitFactory, SearchCriteria criteria, ProgressMonitor monitor, RevisionInfoListener listener) {
+ public LogCommand (Repository repository, GitClassFactory gitFactory, SearchCriteria criteria,
+ boolean fetchBranchInfo, ProgressMonitor monitor, RevisionInfoListener listener) {
super(repository, gitFactory, monitor);
this.monitor = monitor;
this.listener = listener;
this.criteria = criteria;
+ this.fetchBranchInfo = fetchBranchInfo;
this.revision = null;
- this.revisions = new LinkedList();
+ this.revisions = new LinkedList<>();
}
public LogCommand (Repository repository, GitClassFactory gitFactory, String revision, ProgressMonitor monitor, RevisionInfoListener listener) {
@@ -102,8 +112,9 @@
this.monitor = monitor;
this.listener = listener;
this.criteria = null;
+ this.fetchBranchInfo = false;
this.revision = revision;
- this.revisions = new LinkedList();
+ this.revisions = new LinkedList<>();
}
@Override
@@ -115,21 +126,50 @@
} else {
RevWalk walk = new RevWalk(repository);
RevWalk fullWalk = new RevWalk(repository);
+ Map allBranches;
+ Map branchCommits;
+ List branchFlags;
+ if (fetchBranchInfo) {
+ allBranches = Utils.getAllBranches(repository, getClassFactory(), new DelegatingGitProgressMonitor(monitor));
+ branchFlags = new ArrayList<>(allBranches.size());
+ branchCommits = new LinkedHashMap<>(allBranches.size());
+ for (Map.Entry e : allBranches.entrySet()) {
+ if (e.getKey() != GitBranch.NO_BRANCH) {
+ RevFlag flag = walk.newFlag(e.getKey());
+ branchFlags.add(flag);
+ try {
+ RevCommit branchHeadCommit = walk.parseCommit(repository.resolve(e.getValue().getId()));
+ branchHeadCommit.add(flag);
+ branchHeadCommit.carry(flag);
+ walk.markStart(branchHeadCommit);
+ } catch (IOException ex) {
+ LOG.log(Level.INFO, null, ex);
+ }
+ }
+ }
+ walk.carry(branchFlags);
+ } else {
+ allBranches = Collections.emptyMap();
+ branchCommits = Collections.emptyMap();
+ branchFlags = Collections.emptyList();
+ }
try {
+ RevFlag interestingFlag = walk.newFlag("RESULT_FLAG"); //NOI18N
+ walk.carry(interestingFlag);
String revisionFrom = criteria.getRevisionFrom();
String revisionTo = criteria.getRevisionTo();
if (revisionTo != null && revisionFrom != null) {
for (RevCommit uninteresting : Utils.findCommit(repository, revisionFrom).getParents()) {
walk.markUninteresting(walk.parseCommit(uninteresting));
}
- walk.markStart(walk.lookupCommit(Utils.findCommit(repository, revisionTo)));
+ walk.markStart(markStartCommit(walk.lookupCommit(Utils.findCommit(repository, revisionTo)), interestingFlag));
} else if (revisionTo != null) {
- walk.markStart(walk.lookupCommit(Utils.findCommit(repository, revisionTo)));
+ walk.markStart(markStartCommit(walk.lookupCommit(Utils.findCommit(repository, revisionTo)), interestingFlag));
} else if (revisionFrom != null) {
for (RevCommit uninteresting : Utils.findCommit(repository, revisionFrom).getParents()) {
walk.markUninteresting(walk.parseCommit(uninteresting));
}
- walk.markStart(walk.lookupCommit(Utils.findCommit(repository, Constants.HEAD)));
+ walk.markStart(markStartCommit(walk.lookupCommit(Utils.findCommit(repository, Constants.HEAD)), interestingFlag));
} else {
ListBranchCommand branchCommand = new ListBranchCommand(repository, getClassFactory(), false, new DelegatingGitProgressMonitor(monitor));
branchCommand.execute();
@@ -137,10 +177,10 @@
return;
}
for (Map.Entry e : branchCommand.getBranches().entrySet()) {
- walk.markStart(walk.lookupCommit(Utils.findCommit(repository, e.getValue().getId())));
+ walk.markStart(markStartCommit(walk.lookupCommit(Utils.findCommit(repository, e.getValue().getId())), interestingFlag));
}
}
- applyCriteria(walk, criteria);
+ applyCriteria(walk, criteria, interestingFlag);
walk.sort(RevSort.TOPO);
walk.sort(RevSort.COMMIT_TIME_DESC, true);
int remaining = criteria.getLimit();
@@ -149,7 +189,8 @@
if (!applyCriteriaAfter(criteria, commit)) {
continue;
}
- addRevision(getClassFactory().createRevisionInfo(fullWalk.parseCommit(commit), repository));
+ addRevision(getClassFactory().createRevisionInfo(fullWalk.parseCommit(commit),
+ getAffectedBranches(commit, allBranches, branchFlags), repository));
--remaining;
}
} catch (MissingObjectException ex) {
@@ -190,7 +231,7 @@
listener.notifyRevisionInfo(info);
}
- private void applyCriteria (RevWalk walk, SearchCriteria criteria) {
+ private void applyCriteria (RevWalk walk, SearchCriteria criteria, final RevFlag partOfResultFlag) {
File[] files = criteria.getFiles();
if (files.length > 0) {
Collection pathFilters = Utils.getPathFilters(getRepository().getWorkTree(), files);
@@ -208,6 +249,24 @@
} else {
filter = RevFilter.NO_MERGES;
}
+ filter = AndRevFilter.create(filter, new RevFilter() {
+
+ @Override
+ public boolean include (RevWalk walker, RevCommit cmit) {
+ return cmit.has(partOfResultFlag);
+ }
+
+ @Override
+ public RevFilter clone () {
+ return this;
+ }
+
+ @Override
+ public boolean requiresCommitBody () {
+ return false;
+ }
+
+ });
// String username = criteria.getUsername();
// if (username != null && !(username = username.trim()).isEmpty()) {
@@ -245,4 +304,21 @@
private boolean applyTo (PersonIdent ident, String pattern) {
return ident != null && new GitUser(ident.getName(), ident.getEmailAddress()).toString().contains(pattern);
}
+
+ private RevCommit markStartCommit (RevCommit commit, RevFlag interestingFlag) {
+ commit.add(interestingFlag);
+ return commit;
+ }
+
+ private Map getAffectedBranches (RevCommit commit, Map allBranches,
+ List branchFlags) {
+ Map affected = new LinkedHashMap<>(allBranches.size());
+ for (RevFlag flag : branchFlags) {
+ GitBranch b;
+ if (commit.has(flag) && (b = allBranches.get(flag.toString())) != null) {
+ affected.put(b.getName(), b);
+ }
+ }
+ return affected;
+ }
}
--- a/libs.git/test/unit/src/org/netbeans/libs/git/jgit/commands/LogTest.java Thu Sep 12 14:22:58 2013 +0200
+++ a/libs.git/test/unit/src/org/netbeans/libs/git/jgit/commands/LogTest.java Thu Sep 12 15:49:58 2013 +0200
@@ -47,7 +47,6 @@
import java.util.Date;
import java.util.Map;
import org.eclipse.jgit.api.Git;
-import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.PersonIdent;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
@@ -130,7 +129,7 @@
GitRevisionInfo revision4 = client.commit(files, "modification4", null, null, NULL_PROGRESS_MONITOR);
SearchCriteria crit = new SearchCriteria();
crit.setRevisionTo(revision4.getRevision());
- GitRevisionInfo[] revisions = client.log(crit, NULL_PROGRESS_MONITOR);
+ GitRevisionInfo[] revisions = client.log(crit, true, NULL_PROGRESS_MONITOR);
assertEquals(5, revisions.length);
assertRevisions(revision4, revisions[0]);
assertRevisions(revision3, revisions[1]);
@@ -163,7 +162,7 @@
SearchCriteria crit = new SearchCriteria();
crit.setRevisionFrom(revision2.getRevision());
crit.setRevisionTo(revision3.getRevision());
- GitRevisionInfo[] revisions = client.log(crit, NULL_PROGRESS_MONITOR);
+ GitRevisionInfo[] revisions = client.log(crit, true, NULL_PROGRESS_MONITOR);
assertEquals(2, revisions.length);
assertRevisions(revision3, revisions[0]);
assertRevisions(revision2, revisions[1]);
@@ -174,7 +173,7 @@
crit = new SearchCriteria();
crit.setRevisionFrom(revision2.getRevision());
crit.setRevisionTo(revision4.getRevision());
- revisions = client.log(crit, NULL_PROGRESS_MONITOR);
+ revisions = client.log(crit, true, NULL_PROGRESS_MONITOR);
assertEquals(3, revisions.length);
assertRevisions(revision4, revisions[0]);
assertRevisions(revision3, revisions[1]);
@@ -226,7 +225,7 @@
GitRevisionInfo revisionB2 = client.commit(files, "modificationOnB-2", null, null, NULL_PROGRESS_MONITOR);
SearchCriteria crit = new SearchCriteria();
crit.setRevisionTo("A");
- GitRevisionInfo[] revisions = client.log(crit, NULL_PROGRESS_MONITOR);
+ GitRevisionInfo[] revisions = client.log(crit, true, NULL_PROGRESS_MONITOR);
assertEquals(4, revisions.length);
assertRevisions(revisionA2, revisions[0]);
assertRevisions(revisionA1, revisions[1]);
@@ -235,7 +234,7 @@
crit = new SearchCriteria();
crit.setRevisionTo("B");
- revisions = client.log(crit, NULL_PROGRESS_MONITOR);
+ revisions = client.log(crit, true, NULL_PROGRESS_MONITOR);
assertEquals(4, revisions.length);
assertRevisions(revisionB2, revisions[0]);
assertRevisions(revisionB1, revisions[1]);
@@ -243,7 +242,7 @@
assertRevisions(revision0, revisions[3]);
// try both branches, how are the revisions sorted?
- revisions = client.log(new SearchCriteria(), NULL_PROGRESS_MONITOR);
+ revisions = client.log(new SearchCriteria(), true, NULL_PROGRESS_MONITOR);
assertEquals(6, revisions.length);
assertRevisions(revisionB2, revisions[0]);
assertRevisions(revisionA2, revisions[1]);
@@ -280,7 +279,7 @@
SearchCriteria crit = new SearchCriteria();
crit.setRevisionFrom(revision2.getRevision());
crit.setRevisionTo(revision4.getRevision());
- GitRevisionInfo[] revisions = client.log(crit, NULL_PROGRESS_MONITOR);
+ GitRevisionInfo[] revisions = client.log(crit, true, NULL_PROGRESS_MONITOR);
assertEquals(3, revisions.length);
assertRevisions(revision4, revisions[0]);
assertRevisions(revision3, revisions[1]);
@@ -290,7 +289,7 @@
crit.setRevisionFrom(revision2.getRevision());
crit.setRevisionTo(revision4.getRevision());
crit.setLimit(2);
- revisions = client.log(crit, NULL_PROGRESS_MONITOR);
+ revisions = client.log(crit, true, NULL_PROGRESS_MONITOR);
assertEquals(2, revisions.length);
assertRevisions(revision4, revisions[0]);
assertRevisions(revision3, revisions[1]);
@@ -328,7 +327,7 @@
SearchCriteria crit = new SearchCriteria();
crit.setFiles(new File[] { f1 });
crit.setRevisionFrom(revision1.getRevision());
- GitRevisionInfo[] revisions = client.log(crit, NULL_PROGRESS_MONITOR);
+ GitRevisionInfo[] revisions = client.log(crit, true, NULL_PROGRESS_MONITOR);
assertEquals(2, revisions.length);
assertRevisions(revision3, revisions[0]);
assertRevisions(revision1, revisions[1]);
@@ -336,7 +335,7 @@
crit = new SearchCriteria();
crit.setFiles(new File[] { f2 });
crit.setRevisionFrom(revision1.getRevision());
- revisions = client.log(crit, NULL_PROGRESS_MONITOR);
+ revisions = client.log(crit, true, NULL_PROGRESS_MONITOR);
assertEquals(2, revisions.length);
assertRevisions(revision3, revisions[0]);
assertRevisions(revision2, revisions[1]);
@@ -344,7 +343,7 @@
crit = new SearchCriteria();
crit.setFiles(files);
crit.setRevisionFrom(revision1.getRevision());
- revisions = client.log(crit, NULL_PROGRESS_MONITOR);
+ revisions = client.log(crit, true, NULL_PROGRESS_MONITOR);
assertEquals(3, revisions.length);
assertRevisions(revision3, revisions[0]);
assertRevisions(revision2, revisions[1]);
@@ -353,7 +352,7 @@
crit = new SearchCriteria();
crit.setFiles(new File[] { f1, f2, f3 });
crit.setRevisionFrom(revision1.getRevision());
- revisions = client.log(crit, NULL_PROGRESS_MONITOR);
+ revisions = client.log(crit, true, NULL_PROGRESS_MONITOR);
assertEquals(4, revisions.length);
assertRevisions(revision4, revisions[0]);
assertRevisions(revision3, revisions[1]);
@@ -363,7 +362,7 @@
crit = new SearchCriteria();
crit.setFiles(new File[] { workDir });
crit.setRevisionFrom(revision1.getRevision());
- revisions = client.log(crit, NULL_PROGRESS_MONITOR);
+ revisions = client.log(crit, true, NULL_PROGRESS_MONITOR);
assertEquals(4, revisions.length);
assertRevisions(revision4, revisions[0]);
assertRevisions(revision3, revisions[1]);
@@ -390,38 +389,38 @@
GitRevisionInfo revision2 = client.commit(files, "modification2", null, user1, NULL_PROGRESS_MONITOR);
SearchCriteria crit = new SearchCriteria();
- GitRevisionInfo[] revisions = client.log(crit, NULL_PROGRESS_MONITOR);
+ GitRevisionInfo[] revisions = client.log(crit, true, NULL_PROGRESS_MONITOR);
assertEquals(3, revisions.length);
crit = new SearchCriteria();
crit.setUsername("git-test-user");
- revisions = client.log(crit, NULL_PROGRESS_MONITOR);
+ revisions = client.log(crit, true, NULL_PROGRESS_MONITOR);
assertEquals(2, revisions.length);
assertRevisions(revision2, revisions[0]);
assertRevisions(revision1, revisions[1]);
crit = new SearchCriteria();
crit.setUsername("git-test-user@domain.com");
- revisions = client.log(crit, NULL_PROGRESS_MONITOR);
+ revisions = client.log(crit, true, NULL_PROGRESS_MONITOR);
assertEquals(2, revisions.length);
assertRevisions(revision2, revisions[0]);
assertRevisions(revision1, revisions[1]);
crit = new SearchCriteria();
crit.setUsername("test-user");
- revisions = client.log(crit, NULL_PROGRESS_MONITOR);
+ revisions = client.log(crit, true, NULL_PROGRESS_MONITOR);
assertEquals(2, revisions.length);
assertRevisions(revision2, revisions[0]);
assertRevisions(revision1, revisions[1]);
crit = new SearchCriteria();
crit.setUsername("git-test-user222@domain.com");
- revisions = client.log(crit, NULL_PROGRESS_MONITOR);
+ revisions = client.log(crit, true, NULL_PROGRESS_MONITOR);
assertEquals(0, revisions.length);
crit = new SearchCriteria();
crit.setUsername("git-test-user ");
- revisions = client.log(crit, NULL_PROGRESS_MONITOR);
+ revisions = client.log(crit, true, NULL_PROGRESS_MONITOR);
assertEquals(2, revisions.length);
assertRevisions(revision2, revisions[0]);
assertRevisions(revision1, revisions[1]);
@@ -441,30 +440,30 @@
GitRevisionInfo revision1 = client.commit(files, "modification1\non master", null, null, NULL_PROGRESS_MONITOR);
SearchCriteria crit = new SearchCriteria();
- GitRevisionInfo[] revisions = client.log(crit, NULL_PROGRESS_MONITOR);
+ GitRevisionInfo[] revisions = client.log(crit, true, NULL_PROGRESS_MONITOR);
assertEquals(2, revisions.length);
crit = new SearchCriteria();
crit.setMessage("blablabla");
- revisions = client.log(crit, NULL_PROGRESS_MONITOR);
+ revisions = client.log(crit, true, NULL_PROGRESS_MONITOR);
assertEquals(0, revisions.length);
crit = new SearchCriteria();
crit.setMessage("modification");
- revisions = client.log(crit, NULL_PROGRESS_MONITOR);
+ revisions = client.log(crit, true, NULL_PROGRESS_MONITOR);
assertEquals(1, revisions.length);
assertRevisions(revision1, revisions[0]);
crit = new SearchCriteria();
crit.setMessage("modification1\non master");
- revisions = client.log(crit, NULL_PROGRESS_MONITOR);
+ revisions = client.log(crit, true, NULL_PROGRESS_MONITOR);
assertEquals(1, revisions.length);
assertRevisions(revision1, revisions[0]);
// see bug #228905
crit = new SearchCriteria();
crit.setMessage("on master");
- revisions = client.log(crit, NULL_PROGRESS_MONITOR);
+ revisions = client.log(crit, true, NULL_PROGRESS_MONITOR);
assertEquals(1, revisions.length);
assertRevisions(revision1, revisions[0]);
}
@@ -537,19 +536,19 @@
SearchCriteria crit = new SearchCriteria();
crit.setRevisionTo("master");
- GitRevisionInfo[] revisions = client.log(crit, NULL_PROGRESS_MONITOR);
+ GitRevisionInfo[] revisions = client.log(crit, true, NULL_PROGRESS_MONITOR);
assertEquals(4, revisions.length);
assertRevisions(revisionMerge, revisions[0]);
crit = new SearchCriteria();
crit.setIncludeMerges(true);
- revisions = client.log(crit, NULL_PROGRESS_MONITOR);
+ revisions = client.log(crit, true, NULL_PROGRESS_MONITOR);
assertEquals(4, revisions.length);
assertRevisions(revisionMerge, revisions[0]);
crit = new SearchCriteria();
crit.setIncludeMerges(false);
- revisions = client.log(crit, NULL_PROGRESS_MONITOR);
+ revisions = client.log(crit, true, NULL_PROGRESS_MONITOR);
assertEquals(3, revisions.length);
assertRevisions(revisionMaster, revisions[0]);
assertRevisions(revisionBranch, revisions[1]);
@@ -582,7 +581,7 @@
SearchCriteria crit = new SearchCriteria();
crit.setFrom(new Date(revision2.getCommitTime()));
crit.setTo(new Date(revision3.getCommitTime()));
- GitRevisionInfo[] revisions = client.log(crit, NULL_PROGRESS_MONITOR);
+ GitRevisionInfo[] revisions = client.log(crit, true, NULL_PROGRESS_MONITOR);
assertEquals(2, revisions.length);
assertRevisions(revision3, revisions[0]);
assertRevisions(revision2, revisions[1]);
@@ -595,7 +594,7 @@
crit = new SearchCriteria();
crit.setFrom(new Date(revision2.getCommitTime()));
crit.setTo(new Date(revision3.getCommitTime()));
- revisions = client.log(crit, NULL_PROGRESS_MONITOR);
+ revisions = client.log(crit, true, NULL_PROGRESS_MONITOR);
assertEquals(2, revisions.length);
assertRevisions(revision3, revisions[0]);
assertRevisions(revision2, revisions[1]);
@@ -603,7 +602,7 @@
crit = new SearchCriteria();
crit.setFrom(new Date(revision2.getCommitTime()));
crit.setTo(new Date(revision4.getCommitTime()));
- revisions = client.log(crit, NULL_PROGRESS_MONITOR);
+ revisions = client.log(crit, true, NULL_PROGRESS_MONITOR);
assertEquals(3, revisions.length);
assertRevisions(revision4, revisions[0]);
assertRevisions(revision3, revisions[1]);
@@ -611,7 +610,7 @@
crit = new SearchCriteria();
crit.setFrom(new Date(revision2.getCommitTime()));
- revisions = client.log(crit, NULL_PROGRESS_MONITOR);
+ revisions = client.log(crit, true, NULL_PROGRESS_MONITOR);
assertEquals(3, revisions.length);
assertRevisions(revision4, revisions[0]);
assertRevisions(revision3, revisions[1]);
@@ -641,7 +640,7 @@
SearchCriteria crit = new SearchCriteria();
crit.setFiles(new File[] { to });
- GitRevisionInfo[] revisions = client.log(crit, NULL_PROGRESS_MONITOR);
+ GitRevisionInfo[] revisions = client.log(crit, true, NULL_PROGRESS_MONITOR);
assertEquals(2, revisions.length);
assertRevisions(revision3, revisions[0]);
assertRevisions(revision2, revisions[1]);
@@ -653,7 +652,7 @@
crit = new SearchCriteria();
crit.setFiles(new File[] { to });
crit.setFollowRenames(true);
- revisions = client.log(crit, NULL_PROGRESS_MONITOR);
+ revisions = client.log(crit, true, NULL_PROGRESS_MONITOR);
assertEquals(4, revisions.length);
assertRevisions(revision3, revisions[0]);
assertRevisions(revision2, revisions[1]);
@@ -688,6 +687,110 @@
assertEquals(GitFileInfo.Status.MODIFIED, modifiedFiles.get(f).getStatus());
assertEquals(GitFileInfo.Status.MODIFIED, modifiedFiles.get(f2).getStatus());
}
+
+ public void testLogWithBranchInfo () throws Exception {
+ File f = new File(workDir, "f");
+ File f2 = new File(workDir, "f2");
+ write(f, "init");
+ write(f2, "init");
+ File[] files = new File[] { f, f2 };
+ add(files);
+ commit(files);
+
+ write(f, "modification");
+ add(files);
+ commit(files);
+
+ GitClient client = getClient(workDir);
+ SearchCriteria crit = new SearchCriteria();
+ crit.setRevisionTo("master");
+ GitRevisionInfo[] log = client.log(crit, NULL_PROGRESS_MONITOR);
+ for (GitRevisionInfo info : log) {
+ // no branch info fetched by this version of the command
+ assertEquals(0, info.getBranches().size());
+ }
+
+ log = client.log(crit, true, NULL_PROGRESS_MONITOR);
+ for (GitRevisionInfo info : log) {
+ // all commits are from master
+ assertEquals(1, info.getBranches().size());
+ assertNotNull(info.getBranches().get("master"));
+ }
+ }
+
+ // commit in the middle of a named branch
+ public void testLogWithBranchInfoMiddleCommit () throws Exception {
+ File f = new File(workDir, "f");
+ File f2 = new File(workDir, "f2");
+ write(f, "init");
+ write(f2, "init");
+ File[] files = new File[] { f, f2 };
+ add(files);
+ GitClient client = getClient(workDir);
+ GitRevisionInfo firstCommit = client.commit(files, "initial commit", null, null, NULL_PROGRESS_MONITOR);
+
+ client.createBranch("newbranch", "master", NULL_PROGRESS_MONITOR);
+
+ write(f, "modification");
+ add(files);
+ commit(files);
+
+ write(f2, "modification");
+ add(files);
+ commit(files);
+
+ SearchCriteria crit = new SearchCriteria();
+ crit.setRevisionFrom(firstCommit.getRevision());
+ crit.setRevisionTo(firstCommit.getRevision());
+ crit.setFiles(new File[] { f });
+ GitRevisionInfo info = client.log(crit, true, NULL_PROGRESS_MONITOR)[0];
+ // the initial commit is from master and head of newbranch
+ assertNotNull(info.getBranches().get("newbranch"));
+ assertEquals(2, info.getBranches().size());
+ }
+
+ public void testLogWithBranchInfoMoreBranches () throws Exception {
+ File f = new File(workDir, "f");
+ File f2 = new File(workDir, "f2");
+ write(f, "init");
+ write(f2, "init");
+ File[] files = new File[] { f, f2 };
+ add(files);
+ commit(files);
+
+ write(f, "modification");
+ add(files);
+ commit(files);
+
+ GitClient client = getClient(workDir);
+ client.createBranch("newbranch", "master", NULL_PROGRESS_MONITOR);
+ write(f, "modification on trunk");
+ add(files);
+ commit(files);
+
+ client.checkoutRevision("newbranch", true, NULL_PROGRESS_MONITOR);
+ write(f, "modification on branch");
+ add(files);
+ commit(files);
+
+ SearchCriteria crit = new SearchCriteria();
+ // log across all branches
+ GitRevisionInfo[] log = client.log(crit, true, NULL_PROGRESS_MONITOR);
+ // branch commit
+ assertEquals(1, log[0].getBranches().size());
+ assertNotNull(log[0].getBranches().get("newbranch"));
+ // master commit
+ assertEquals(1, log[1].getBranches().size());
+ assertNotNull(log[1].getBranches().get("master"));
+ // common commit
+ assertEquals(2, log[2].getBranches().size());
+ assertNotNull(log[2].getBranches().get("master"));
+ assertNotNull(log[2].getBranches().get("newbranch"));
+ // initial commit
+ assertEquals(2, log[3].getBranches().size());
+ assertNotNull(log[3].getBranches().get("master"));
+ assertNotNull(log[3].getBranches().get("newbranch"));
+ }
private void assertRevisions (GitRevisionInfo expected, GitRevisionInfo info) throws GitException {
assertEquals(expected.getRevision(), info.getRevision());