[git] GitMergeProvider: use Set instead of Map<..., Boolean>

Also solves a potential NPE in checking myReverseMap.get(root).
Relates to the fix for IDEA-78808
This commit is contained in:
Kirill Likhodedov
2013-04-30 18:43:49 +04:00
parent 654bc27406
commit f4e8b50080
@@ -47,6 +47,7 @@ import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* Merge-changes provider for Git, used by IDEA internal 3-way merge tool
@@ -63,28 +64,30 @@ public class GitMergeProvider implements MergeProvider2 {
* If true the merge provider has a reverse meaning, i. e. yours and theirs are swapped.
* It should be used when conflict is resolved after rebase or unstash.
*/
@NotNull private final Map<VirtualFile, Boolean> myReverseMap;
@NotNull private final Set<VirtualFile> myReverseRoots;
private GitMergeProvider(@NotNull Project project, @NotNull Map<VirtualFile, Boolean> reverseMap) {
private GitMergeProvider(@NotNull Project project, @NotNull Set<VirtualFile> reverseRoots) {
myProject = project;
myReverseMap = reverseMap;
myReverseRoots = reverseRoots;
}
public GitMergeProvider(@NotNull Project project, boolean reverse) {
this(project, buildReverseMap(project, reverse));
this(project, findReverseRoots(project, reverse));
}
@NotNull
public static MergeProvider detect(@NotNull Project project) {
return new GitMergeProvider(project, buildReverseMap(project, null));
return new GitMergeProvider(project, findReverseRoots(project, null));
}
@NotNull
private static Map<VirtualFile, Boolean> buildReverseMap(@NotNull Project project, @Nullable Boolean reverseOrDetect) {
Map<VirtualFile, Boolean> reverseMap = ContainerUtil.newHashMap();
private static Set<VirtualFile> findReverseRoots(@NotNull Project project, @Nullable Boolean reverseOrDetect) {
Set<VirtualFile> reverseMap = ContainerUtil.newHashSet();
for (GitRepository repository : GitUtil.getRepositoryManager(project).getRepositories()) {
boolean reverse = reverseOrDetect == null ? repository.getState().equals(GitRepository.State.REBASING) : reverseOrDetect;
reverseMap.put(repository.getRoot(), reverse);
if (reverse) {
reverseMap.add(repository.getRoot());
}
}
return reverseMap;
}
@@ -126,7 +129,7 @@ public class GitMergeProvider implements MergeProvider2 {
@Nullable
private VcsRevisionNumber findLastRevisionNumber(@NotNull VirtualFile root) {
if (myReverseMap.get(root)) {
if (myReverseRoots.contains(root)) {
return resolveHead(root);
}
else {
@@ -179,7 +182,7 @@ public class GitMergeProvider implements MergeProvider2 {
* @param root
*/
private int yoursRevision(@NotNull VirtualFile root) {
return myReverseMap.get(root) ? THEIRS_REVISION_NUM : YOURS_REVISION_NUM;
return myReverseRoots.contains(root) ? THEIRS_REVISION_NUM : YOURS_REVISION_NUM;
}
/**
@@ -187,7 +190,7 @@ public class GitMergeProvider implements MergeProvider2 {
* @param root
*/
private int theirsRevision(@NotNull VirtualFile root) {
return myReverseMap.get(root) ? YOURS_REVISION_NUM : THEIRS_REVISION_NUM;
return myReverseRoots.contains(root) ? YOURS_REVISION_NUM : THEIRS_REVISION_NUM;
}
public void conflictResolvedForFile(VirtualFile file) {