--- 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());