svn: Remove "Compare Subversion Properties" action - common "Show Diff" could be used instead

This commit is contained in:
Konstantin Kolosovsky
2018-11-21 17:09:46 +03:00
parent a74599ebab
commit fc933fca01
6 changed files with 1 additions and 231 deletions
-1
View File
@@ -30,7 +30,6 @@ public final class SvnIcons {
public static final Icon MarkAsMerged = load("/icons/MarkAsMerged.png"); // 16x16
public static final Icon MarkAsNotMerged = load("/icons/MarkAsNotMerged.png"); // 16x16
public static final Icon Notintegrated = load("/icons/Notintegrated.png"); // 16x16
public static final Icon PropertiesDiff = load("/icons/PropertiesDiff.png"); // 16x16
public static final Icon ShowIntegratedFrom = load("/icons/ShowIntegratedFrom.png"); // 16x16
public static final Icon UndoIntegrateToBranch = load("/icons/UndoIntegrateToBranch.png"); // 16x16
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 674 B

-3
View File
@@ -35,9 +35,6 @@
<action id="Subversion.TogglePropertiesDiff" class="com.intellij.openapi.actionSystem.EmptyAction" popup="true"
icon="AllIcons.Actions.Preview"/>
<action id="PropertiesDiff" class="org.jetbrains.idea.svn.actions.ShowPropertiesDiffAction" popup="true" icon="SvnIcons.PropertiesDiff">
<add-to-group group-id="Vcs.RepositoryChangesBrowserToolbar" anchor="last"/>
</action>
<action id="EditCommitMessage" class="org.jetbrains.idea.svn.history.SvnEditCommitMessageAction" popup="true"
icon="AllIcons.Actions.Edit"
text="Edit Revision Comment" description="Edit revision comment. Previous message is rewritten.">
@@ -583,8 +583,6 @@ action.working.copies.map.correct.roots.button.text=Correct &Roots
action.working.copies.map.correct.warning.text=Some folders marked in 'Project Settings | Version Control' as under Subversion control,\n\
are unversioned (Versioned folders may be under them).\n\
You can use 'Correct Roots' button to perform auto correction.
action.Subversion.properties.difference.diff.title=Subversion properties difference: {0}
action.Subversion.properties.difference.diff.for.move.title=Subversion properties difference: {0} -> {1}
message.Subversion.files.can.not.be.added.to.subversion.are.not.under.working.copy.text=File(s) {0} can not be added to Subversion control since they are not under working copy.
action.Subversion.integrate.difference.option.use.ancestry.text=&Use ancestry
fatal.Subversion.javasvn.jar.library.version.test=javasvn.jar library is old;\nPlease make sure installation was made properly.
@@ -620,12 +618,10 @@ loading.default.branches.configuration.text=Loading default branches configurati
loading.data.for.root.text=Loading data for {0}
action.Subversion.TogglePropertiesDiff.text=Show properties
action.Subversion.TogglePropertiesDiff.description=Show differences in SVN properties
action.PropertiesDiff.text=Compare Subversion Properties
action.IntegrateChangeSetAction.text=Integrate to Branch
dialog.map.working.copies.button.refresh.text=Re&fresh
refreshing.working.copies.roots.progress.text=Refreshing working copies roots...
retrieving.subversion.status.text=Retrieving Subversion status...
fetching.properties.contents.progress.title=Fetching properties contents...
show.properties.diff.progress.text.revision.information=Revision {0}
show.properties.diff.progress.text2.property.information=Property {0}
svn.checkout.destination.directory.title=Destination Directory
@@ -1,208 +0,0 @@
// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package org.jetbrains.idea.svn.actions;
import com.intellij.diff.DiffManager;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.progress.PerformInBackgroundOption;
import com.intellij.openapi.progress.ProgressIndicator;
import com.intellij.openapi.progress.Task;
import com.intellij.openapi.project.DumbAware;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.vcs.FilePath;
import com.intellij.openapi.vcs.VcsDataKeys;
import com.intellij.openapi.vcs.changes.Change;
import com.intellij.openapi.vcs.changes.ChangesUtil;
import com.intellij.openapi.vcs.changes.ContentRevision;
import com.intellij.openapi.vcs.changes.CurrentContentRevision;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.idea.svn.SvnBaseContentRevision;
import org.jetbrains.idea.svn.SvnBundle;
import org.jetbrains.idea.svn.SvnRevisionNumber;
import org.jetbrains.idea.svn.SvnVcs;
import org.jetbrains.idea.svn.api.Revision;
import org.jetbrains.idea.svn.api.Target;
import org.jetbrains.idea.svn.commandLine.SvnBindException;
import org.jetbrains.idea.svn.difftool.properties.SvnPropertiesDiffRequest;
import org.jetbrains.idea.svn.difftool.properties.SvnPropertiesDiffRequest.PropertyContent;
import org.jetbrains.idea.svn.history.SvnLazyPropertyContentRevision;
import org.jetbrains.idea.svn.history.SvnRepositoryContentRevision;
import org.jetbrains.idea.svn.properties.PropertyData;
import java.io.File;
import java.util.Collections;
import java.util.List;
import static com.intellij.openapi.actionSystem.CommonDataKeys.PROJECT;
import static com.intellij.util.ObjectUtils.notNull;
import static com.intellij.util.containers.ContainerUtil.exists;
public class ShowPropertiesDiffAction extends AnAction implements DumbAware {
@Override
public void update(@NotNull AnActionEvent e) {
boolean isVisible = checkThatChangesAreUnderSvn(e.getData(VcsDataKeys.CHANGES));
e.getPresentation().setVisible(isVisible);
e.getPresentation().setEnabled(isVisible && e.getProject() != null);
}
private static boolean checkThatChangesAreUnderSvn(@Nullable Change[] changes) {
return changes != null && exists(changes, change -> isUnderSvn(change.getBeforeRevision()) || isUnderSvn(change.getAfterRevision()));
}
private static boolean isUnderSvn(@Nullable ContentRevision revision) {
return revision instanceof SvnBaseContentRevision;
}
@Override
public void actionPerformed(@NotNull AnActionEvent e) {
Change[] changes = e.getData(VcsDataKeys.CHANGE_LEAD_SELECTION);
if (checkThatChangesAreUnderSvn(changes)) {
new CalculateAndShow(e.getRequiredData(PROJECT), changes[0], e.getPresentation().getText()).queue();
}
}
private static class CalculateAndShow extends Task.Backgroundable {
private final Change myChange;
private List<PropertyData> myBeforeContent;
private List<PropertyData> myAfterContent;
private Revision myBeforeRevisionValue;
private Revision myAfterRevision;
private SvnBindException myException;
private final String myErrorTitle;
private CalculateAndShow(@NotNull Project project, Change change, String errorTitle) {
super(project, SvnBundle.message("fetching.properties.contents.progress.title"), true, PerformInBackgroundOption.DEAF);
myChange = change;
myErrorTitle = errorTitle;
}
@Override
public void run(@NotNull ProgressIndicator indicator) {
SvnVcs vcs = SvnVcs.getInstance(myProject);
try {
myBeforeRevisionValue = getBeforeRevisionValue(myChange);
myAfterRevision = getAfterRevisionValue(myChange);
myBeforeContent = getPropertyList(vcs, myChange.getBeforeRevision(), myBeforeRevisionValue);
indicator.checkCanceled();
// gets exactly WORKING revision property
myAfterContent = getPropertyList(vcs, myChange.getAfterRevision(), myAfterRevision);
}
catch (SvnBindException exc) {
myException = exc;
}
}
@Override
public void onSuccess() {
if (myException != null) {
Messages.showErrorDialog(myException.getMessage(), myErrorTitle);
return;
}
if (myBeforeContent != null && myAfterContent != null && myBeforeRevisionValue != null && myAfterRevision != null) {
SvnPropertiesDiffRequest diffRequest;
if (compareRevisions(myBeforeRevisionValue, myAfterRevision) > 0) {
diffRequest = new SvnPropertiesDiffRequest(getDiffWindowTitle(myChange),
new PropertyContent(myAfterContent), new PropertyContent(myBeforeContent),
revisionToString(myAfterRevision), revisionToString(myBeforeRevisionValue));
}
else {
diffRequest = new SvnPropertiesDiffRequest(getDiffWindowTitle(myChange),
new PropertyContent(myBeforeContent), new PropertyContent(myAfterContent),
revisionToString(myBeforeRevisionValue), revisionToString(myAfterRevision));
}
DiffManager.getInstance().showDiff(myProject, diffRequest);
}
}
}
@NotNull
private static Revision getBeforeRevisionValue(@NotNull Change change) {
ContentRevision beforeRevision = change.getBeforeRevision();
if (beforeRevision != null) {
return ((SvnRevisionNumber)beforeRevision.getRevisionNumber()).getRevision();
}
else {
return Revision.of(((SvnRevisionNumber)notNull(change.getAfterRevision()).getRevisionNumber()).getRevision().getNumber() - 1);
}
}
@NotNull
private static Revision getAfterRevisionValue(@NotNull Change change) {
ContentRevision afterRevision = change.getAfterRevision();
if (afterRevision != null) {
// CurrentContentRevision will be here, for instance, if invoked from changes dialog for "Compare with Branch" action
return afterRevision instanceof CurrentContentRevision
? Revision.WORKING
: ((SvnRevisionNumber)afterRevision.getRevisionNumber()).getRevision();
}
else {
return Revision.of(((SvnRevisionNumber)notNull(change.getBeforeRevision()).getRevisionNumber()).getRevision().getNumber() + 1);
}
}
@NotNull
private static String getDiffWindowTitle(@NotNull Change change) {
if (change.isMoved() || change.isRenamed()) {
FilePath beforeFilePath = ChangesUtil.getBeforePath(change);
FilePath afterFilePath = ChangesUtil.getAfterPath(change);
String beforePath = beforeFilePath == null ? "" : beforeFilePath.getPath();
String afterPath = afterFilePath == null ? "" : afterFilePath.getPath();
return SvnBundle.message("action.Subversion.properties.difference.diff.for.move.title", beforePath, afterPath);
} else {
return SvnBundle.message("action.Subversion.properties.difference.diff.title", ChangesUtil.getFilePath(change).getPath());
}
}
private static int compareRevisions(@NotNull Revision revision1, @NotNull Revision revision2) {
if (revision1.equals(revision2)) {
return 0;
}
// working(local) ahead of head
if (Revision.WORKING.equals(revision1)) {
return 1;
}
if (Revision.WORKING.equals(revision2)) {
return -1;
}
if (Revision.HEAD.equals(revision1)) {
return 1;
}
if (Revision.HEAD.equals(revision2)) {
return -1;
}
return revision1.getNumber() > revision2.getNumber() ? 1 : -1;
}
@NotNull
private static String revisionToString(@Nullable Revision revision) {
return revision == null ? "not exists" : revision.toString();
}
@NotNull
private static List<PropertyData> getPropertyList(@NotNull SvnVcs vcs,
@Nullable ContentRevision contentRevision,
@Nullable Revision revision) throws SvnBindException {
if (contentRevision == null) {
return Collections.emptyList();
}
Target target;
if (contentRevision instanceof SvnRepositoryContentRevision) {
SvnRepositoryContentRevision svnRevision = (SvnRepositoryContentRevision)contentRevision;
target = Target.on(svnRevision.getUrl(), revision);
} else {
File ioFile = contentRevision.getFile().getIOFile();
target = Target.on(ioFile, revision);
}
return SvnLazyPropertyContentRevision.getPropertyList(vcs, target, revision);
}
}
@@ -1,10 +1,10 @@
// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package org.jetbrains.idea.svn.difftool.properties;
import com.intellij.diff.contents.DiffContent;
import com.intellij.diff.contents.DiffContentBase;
import com.intellij.diff.contents.EmptyContent;
import com.intellij.diff.requests.ContentDiffRequest;
import com.intellij.openapi.fileEditor.OpenFileDescriptor;
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull;
@@ -18,20 +18,6 @@ public class SvnPropertiesDiffRequest extends ContentDiffRequest {
@NotNull private final List<String> myContentTitles;
@NotNull private final String myWindowTitle;
public SvnPropertiesDiffRequest(@NotNull String windowTitle,
@NotNull DiffContent content1,
@NotNull DiffContent content2,
@NotNull String title1,
@NotNull String title2) {
myWindowTitle = windowTitle;
myContents = ContainerUtil.list(content1, content2);
myContentTitles = ContainerUtil.list(title1, title2);
assert content1 instanceof PropertyContent || content1 instanceof EmptyContent;
assert content2 instanceof PropertyContent || content2 instanceof EmptyContent;
assert content1 instanceof PropertyContent || content2 instanceof PropertyContent;
}
public SvnPropertiesDiffRequest(@Nullable List<PropertyData> before, @Nullable List<PropertyData> after,
@Nullable String title1, @Nullable String title2) {
assert before != null || after != null;