summaryrefslogtreecommitdiff
path: root/plugins/git4idea/src/git4idea/log
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/git4idea/src/git4idea/log')
-rw-r--r--plugins/git4idea/src/git4idea/log/GitBekParentFixer.java55
-rw-r--r--plugins/git4idea/src/git4idea/log/GitLogProvider.java15
2 files changed, 30 insertions, 40 deletions
diff --git a/plugins/git4idea/src/git4idea/log/GitBekParentFixer.java b/plugins/git4idea/src/git4idea/log/GitBekParentFixer.java
index e469e61ca315..054ed9f90b48 100644
--- a/plugins/git4idea/src/git4idea/log/GitBekParentFixer.java
+++ b/plugins/git4idea/src/git4idea/log/GitBekParentFixer.java
@@ -27,49 +27,34 @@ import org.jetbrains.annotations.Nullable;
import java.util.*;
class GitBekParentFixer {
- @NotNull
- private final static String MAGIC_TEXT = "Merge remote";
- @NotNull
- private final VcsLogFilterCollection MAGIC_FILTER = createVcsLogFilterCollection();
+ @NotNull private static final String MAGIC_TEXT = "Merge remote";
+ @NotNull private static final VcsLogFilterCollection MAGIC_FILTER = createVcsLogFilterCollection();
- @NotNull
- private final VirtualFile myRoot;
- @NotNull
- private final GitLogProvider myGitLogProvider;
- @NotNull
- private final List<TimedVcsCommit> myAllCommits;
+ @NotNull private final Set<Hash> myWrongCommits;
- GitBekParentFixer(@NotNull VirtualFile root, @NotNull GitLogProvider gitLogProvider, @NotNull List<TimedVcsCommit> allCommits) {
- myRoot = root;
- myGitLogProvider = gitLogProvider;
- myAllCommits = allCommits;
+ private GitBekParentFixer(@NotNull Set<Hash> wrongCommits) {
+ myWrongCommits = wrongCommits;
}
@NotNull
- List<TimedVcsCommit> getCorrectCommits() throws VcsException {
- if (!BekSorter.isBekEnabled())
- return myAllCommits;
-
- final Set<Hash> wrongCommits = getWrongCommits();
- return new AbstractList<TimedVcsCommit>() {
- @Override
- public TimedVcsCommit get(int index) {
- TimedVcsCommit commit = myAllCommits.get(index);
- if (!wrongCommits.contains(commit.getId()))
- return commit;
-
- return reverseParents(commit);
- }
+ static GitBekParentFixer prepare(@NotNull VirtualFile root, @NotNull GitLogProvider provider) throws VcsException {
+ if (!BekSorter.isBekEnabled()) {
+ return new GitBekParentFixer(Collections.<Hash>emptySet());
+ }
+ return new GitBekParentFixer(getWrongCommits(provider, root));
+ }
- @Override
- public int size() {
- return myAllCommits.size();
- }
- };
+ @NotNull
+ TimedVcsCommit fixCommit(@NotNull TimedVcsCommit commit) {
+ if (!myWrongCommits.contains(commit.getId())) {
+ return commit;
+ }
+ return reverseParents(commit);
}
- private Set<Hash> getWrongCommits() throws VcsException {
- List<TimedVcsCommit> commitsMatchingFilter = myGitLogProvider.getCommitsMatchingFilter(myRoot, MAGIC_FILTER, -1);
+ @NotNull
+ private static Set<Hash> getWrongCommits(@NotNull GitLogProvider provider, @NotNull VirtualFile root) throws VcsException {
+ List<TimedVcsCommit> commitsMatchingFilter = provider.getCommitsMatchingFilter(root, MAGIC_FILTER, -1);
return ContainerUtil.map2Set(commitsMatchingFilter, new Function<TimedVcsCommit, Hash>() {
@Override
public Hash fun(TimedVcsCommit timedVcsCommit) {
diff --git a/plugins/git4idea/src/git4idea/log/GitLogProvider.java b/plugins/git4idea/src/git4idea/log/GitLogProvider.java
index ecc4709be5d3..435313fa5c7d 100644
--- a/plugins/git4idea/src/git4idea/log/GitLogProvider.java
+++ b/plugins/git4idea/src/git4idea/log/GitLogProvider.java
@@ -154,18 +154,23 @@ public class GitLogProvider implements VcsLogProvider {
});
}
- @NotNull
@Override
- public List<TimedVcsCommit> readAllHashes(@NotNull VirtualFile root, @NotNull Consumer<VcsUser> userRegistry) throws VcsException {
+ public void readAllHashes(@NotNull VirtualFile root, @NotNull Consumer<VcsUser> userRegistry,
+ @NotNull final Consumer<TimedVcsCommit> commitConsumer) throws VcsException {
if (!isRepositoryReady(root)) {
- return Collections.emptyList();
+ return;
}
List<String> parameters = new ArrayList<String>(GitHistoryUtils.LOG_ALL);
parameters.add("--sparse");
- List<TimedVcsCommit> timedVcsCommits = GitHistoryUtils.readCommits(myProject, root, userRegistry, parameters);
- return new GitBekParentFixer(root, this, timedVcsCommits).getCorrectCommits();
+ final GitBekParentFixer parentFixer = GitBekParentFixer.prepare(root, this);
+ GitHistoryUtils.readCommits(myProject, root, userRegistry, parameters, new Consumer<TimedVcsCommit>() {
+ @Override
+ public void consume(TimedVcsCommit commit) {
+ commitConsumer.consume(parentFixer.fixCommit(commit));
+ }
+ });
}
@NotNull