[vcs-log] show file names in diff preview for merged changes

This commit is contained in:
Julia Beliaeva
2018-07-20 18:52:53 +03:00
parent b431f6d81c
commit 1a03f681ca
3 changed files with 80 additions and 45 deletions
@@ -99,4 +99,5 @@ public interface DiffUserDataKeysEx extends DiffUserDataKeys {
Key<String> VCS_DIFF_LEFT_CONTENT_TITLE = Key.create("Diff.Left.Panel.Title");
Key<String> VCS_DIFF_RIGHT_CONTENT_TITLE = Key.create("Diff.Right.Panel.Title");
Key<String> VCS_DIFF_CENTER_CONTENT_TITLE = Key.create("Diff.Center.Panel.Title");
}
@@ -19,9 +19,11 @@ import com.intellij.diff.chains.DiffRequestProducerException;
import com.intellij.diff.requests.DiffRequest;
import com.intellij.diff.requests.SimpleDiffRequest;
import com.intellij.diff.util.DiffUserDataKeys;
import com.intellij.diff.util.DiffUserDataKeysEx;
import com.intellij.openapi.progress.ProcessCanceledException;
import com.intellij.openapi.progress.ProgressIndicator;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.UserDataHolder;
import com.intellij.openapi.vcs.FilePath;
import com.intellij.openapi.vcs.FileStatus;
@@ -35,10 +37,11 @@ import com.intellij.util.ThreeState;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import static com.intellij.openapi.vcs.changes.actions.diff.ChangeDiffRequestProducer.getRequestTitle;
import static com.intellij.openapi.vcs.changes.actions.diff.ChangeDiffRequestProducer.getRevisionTitle;
public class MergedChangeDiffRequestProvider implements ChangeDiffRequestProvider {
@NotNull
@@ -60,43 +63,6 @@ public class MergedChangeDiffRequestProvider implements ChangeDiffRequestProvide
return new MyProducer(presentable.getProject(), (MergedChange)presentable.getChange()).process(context, indicator);
}
@NotNull
private static SimpleDiffRequest createRequest(@Nullable Project project,
@NotNull Change leftChange,
@NotNull Change rightChange,
@NotNull UserDataHolder context,
@NotNull ProgressIndicator indicator)
throws DiffRequestProducerException {
String requestTitle = getRequestTitle(leftChange);
ContentRevision leftRevision = leftChange.getBeforeRevision();
ContentRevision centerRevision = leftChange.getAfterRevision();
ContentRevision rightRevision = rightChange.getBeforeRevision();
if (leftRevision == null) {
return createTwoSideRequest(project, centerRevision, rightRevision, requestTitle,
ChangeDiffRequestProducer.MERGED_VERSION, ChangeDiffRequestProducer.SERVER_VERSION,
context, indicator);
}
else if (rightRevision == null) {
return createTwoSideRequest(project, leftRevision, centerRevision, requestTitle,
ChangeDiffRequestProducer.YOUR_VERSION, ChangeDiffRequestProducer.MERGED_VERSION,
context, indicator);
}
else if (centerRevision == null) {
return createTwoSideRequest(project, leftRevision, rightRevision, requestTitle,
ChangeDiffRequestProducer.YOUR_VERSION, ChangeDiffRequestProducer.SERVER_VERSION,
context, indicator);
}
return new SimpleDiffRequest(requestTitle,
ChangeDiffRequestProducer.createContent(project, leftRevision, context, indicator),
ChangeDiffRequestProducer.createContent(project, centerRevision, context, indicator),
ChangeDiffRequestProducer.createContent(project, rightRevision, context, indicator),
getRevisionTitle(leftRevision, ChangeDiffRequestProducer.YOUR_VERSION),
getRevisionTitle(centerRevision, ChangeDiffRequestProducer.MERGED_VERSION),
getRevisionTitle(rightRevision, ChangeDiffRequestProducer.SERVER_VERSION));
}
@NotNull
private static SimpleDiffRequest createTwoSideRequest(@Nullable Project project,
@Nullable ContentRevision leftRevision,
@@ -110,20 +76,38 @@ public class MergedChangeDiffRequestProvider implements ChangeDiffRequestProvide
return new SimpleDiffRequest(requestTitle,
ChangeDiffRequestProducer.createContent(project, leftRevision, context, indicator),
ChangeDiffRequestProducer.createContent(project, rightRevision, context, indicator),
getRevisionTitle(leftRevision, leftTitle),
getRevisionTitle(rightRevision, rightTitle));
leftTitle, rightTitle);
}
@NotNull
private static String getRevisionTitle(@NotNull Map<Key, Object> context,
@NotNull Key<String> key,
@Nullable ContentRevision revision,
@NotNull String defaultTitle) {
String titleFromContext = (String)context.get(key);
if (titleFromContext != null) return titleFromContext;
return ChangeDiffRequestProducer.getRevisionTitle(revision, defaultTitle);
}
public static class MyProducer implements ChangeDiffRequestChain.Producer {
@Nullable private final Project myProject;
@NotNull private final MergedChange myMergedChange;
@NotNull private final Map<Key, Object> myContext;
public MyProducer(@Nullable Project project, @NotNull MergedChange mergedChange) {
public MyProducer(@Nullable Project project,
@NotNull MergedChange mergedChange,
@NotNull Map<Key, Object> context) {
myProject = project;
myContext = context;
assert mergedChange.getSourceChanges().size() == 2;
myMergedChange = mergedChange;
}
public MyProducer(@Nullable Project project,
@NotNull MergedChange mergedChange) {
this(project, mergedChange, Collections.emptyMap());
}
@NotNull
@Override
public DiffRequest process(@NotNull UserDataHolder context, @NotNull ProgressIndicator indicator)
@@ -134,6 +118,42 @@ public class MergedChangeDiffRequestProvider implements ChangeDiffRequestProvide
return request;
}
@NotNull
private SimpleDiffRequest createRequest(@Nullable Project project,
@NotNull Change leftChange,
@NotNull Change rightChange,
@NotNull UserDataHolder context,
@NotNull ProgressIndicator indicator)
throws DiffRequestProducerException {
String requestTitle = getRequestTitle(leftChange);
ContentRevision leftRevision = leftChange.getBeforeRevision();
ContentRevision centerRevision = leftChange.getAfterRevision();
ContentRevision rightRevision = rightChange.getBeforeRevision();
String leftTitle = getRevisionTitle(myContext, DiffUserDataKeysEx.VCS_DIFF_LEFT_CONTENT_TITLE, leftRevision,
ChangeDiffRequestProducer.YOUR_VERSION);
String centerTitle = getRevisionTitle(myContext, DiffUserDataKeysEx.VCS_DIFF_CENTER_CONTENT_TITLE, centerRevision,
ChangeDiffRequestProducer.MERGED_VERSION);
String rightTitle = getRevisionTitle(myContext, DiffUserDataKeysEx.VCS_DIFF_RIGHT_CONTENT_TITLE, rightRevision,
ChangeDiffRequestProducer.SERVER_VERSION);
if (leftRevision == null) {
return createTwoSideRequest(project, centerRevision, rightRevision, requestTitle, centerTitle, rightTitle, context, indicator);
}
else if (rightRevision == null) {
return createTwoSideRequest(project, leftRevision, centerRevision, requestTitle, leftTitle, centerTitle, context, indicator);
}
else if (centerRevision == null) {
return createTwoSideRequest(project, leftRevision, rightRevision, requestTitle, leftTitle, rightTitle, context, indicator);
}
return new SimpleDiffRequest(requestTitle,
ChangeDiffRequestProducer.createContent(project, leftRevision, context, indicator),
ChangeDiffRequestProducer.createContent(project, centerRevision, context, indicator),
ChangeDiffRequestProducer.createContent(project, rightRevision, context, indicator),
leftTitle, centerTitle, rightTitle);
}
@NotNull
@Override
public String getName() {
@@ -47,8 +47,7 @@ import javax.swing.*;
import javax.swing.tree.DefaultTreeModel;
import java.util.*;
import static com.intellij.diff.util.DiffUserDataKeysEx.VCS_DIFF_LEFT_CONTENT_TITLE;
import static com.intellij.diff.util.DiffUserDataKeysEx.VCS_DIFF_RIGHT_CONTENT_TITLE;
import static com.intellij.diff.util.DiffUserDataKeysEx.*;
import static com.intellij.util.ObjectUtils.notNull;
import static com.intellij.util.containers.ContainerUtil.getFirstItem;
import static com.intellij.vcs.log.impl.MainVcsLogUiProperties.SHOW_CHANGES_FROM_PARENTS;
@@ -261,16 +260,19 @@ class VcsLogChangesBrowser extends ChangesBrowserBase implements Disposable {
@Nullable
public ChangeDiffRequestChain.Producer getDiffRequestProducer(@NotNull Object userObject, boolean forDiffPreview) {
Map<Key, Object> context = ContainerUtil.newHashMap();
if (userObject instanceof MergedChange) {
MergedChange mergedChange = (MergedChange)userObject;
if (mergedChange.getSourceChanges().size() == 2) {
return new MergedChangeDiffRequestProvider.MyProducer(myProject, mergedChange);
if (forDiffPreview) {
putFilePathsIntoContext(mergedChange, context);
}
return new MergedChangeDiffRequestProvider.MyProducer(myProject, mergedChange, context);
}
}
if (userObject instanceof Change) {
Change change = (Change)userObject;
Map<Key, Object> context = ContainerUtil.newHashMap();
if (forDiffPreview) {
putFilePathsIntoContext(change, context);
}
@@ -293,6 +295,18 @@ class VcsLogChangesBrowser extends ChangesBrowserBase implements Disposable {
return null;
}
private static void putFilePathsIntoContext(@NotNull MergedChange change, @NotNull Map<Key, Object> context) {
ContentRevision centerRevision = change.getAfterRevision();
ContentRevision leftRevision = change.getSourceChanges().get(0).getBeforeRevision();
ContentRevision rightRevision = change.getSourceChanges().get(1).getBeforeRevision();
FilePath centerFile = centerRevision == null ? null : centerRevision.getFile();
FilePath leftFile = leftRevision == null ? null : leftRevision.getFile();
FilePath rightFile = rightRevision == null ? null : rightRevision.getFile();
context.put(VCS_DIFF_CENTER_CONTENT_TITLE, getRevisionTitle(centerRevision, centerFile, null));
context.put(VCS_DIFF_RIGHT_CONTENT_TITLE, getRevisionTitle(rightRevision, rightFile, centerFile));
context.put(VCS_DIFF_LEFT_CONTENT_TITLE, getRevisionTitle(leftRevision, leftFile, centerFile == null ? rightFile : centerFile));
}
private static void putFilePathsIntoContext(@NotNull Change change, @NotNull Map<Key, Object> context) {
ContentRevision afterRevision = change.getAfterRevision();
ContentRevision beforeRevision = change.getBeforeRevision();