[vcs] Disable "Revert" action in the RepositoryChangesBrowser for some cases. IDEA...
authorKirill Likhodedov <Kirill.Likhodedov@jetbrains.com>
Thu, 2 Aug 2012 14:13:50 +0000 (18:13 +0400)
committerKirill Likhodedov <Kirill.Likhodedov@jetbrains.com>
Thu, 2 Aug 2012 14:15:26 +0000 (18:15 +0400)
Let CommittedChangeList hold the flag "modifiable": if the flag is disabled, "revert" action is disabled (and theoretically, some other actions).
Set the flag to false for all Git changelists, except for the ones created from the file history and folder diff.

13 files changed:
platform/vcs-api/src/com/intellij/openapi/vcs/versionBrowser/CommittedChangeList.java
platform/vcs-api/src/com/intellij/openapi/vcs/versionBrowser/CommittedChangeListImpl.java
platform/vcs-impl/src/com/intellij/openapi/vcs/changes/actions/RevertSelectedChangesAction.java
plugins/cvs/cvs-plugin/src/com/intellij/cvsSupport2/changeBrowser/CvsChangeList.java
plugins/git4idea/src/git4idea/GitUtil.java
plugins/git4idea/src/git4idea/actions/GitShowAllSubmittedFilesAction.java
plugins/git4idea/src/git4idea/changes/GitChangeUtils.java
plugins/git4idea/src/git4idea/changes/GitCommittedChangeList.java
plugins/git4idea/src/git4idea/history/GitDiffFromHistoryHandler.java
plugins/git4idea/src/git4idea/rebase/GitRebaseEditor.java
plugins/git4idea/src/git4idea/ui/GitReferenceValidator.java
plugins/git4idea/src/git4idea/ui/GitUnstashDialog.java
plugins/svn4idea/src/org/jetbrains/idea/svn/history/SvnChangeList.java

index c906df023532c65f62d12812dd5aa5db7041cc9e..70c77fc07ea4f620de6fbd1cd0173549def18937 100644 (file)
@@ -40,4 +40,9 @@ public interface CommittedChangeList extends ChangeList {
   AbstractVcs getVcs();
 
   Collection<Change> getChangesWithMovedTrees();
+
+  /**
+   * @return true if this change list can be modified, for example, by reverting some of the changes.
+   */
+  boolean isModifiable();
 }
index eaef768df1ba2a08ca08806b83d783c186d7ce43..1dc210317bfae237b4e4122150eb96f1c5fff1b0 100644 (file)
@@ -68,6 +68,11 @@ public class CommittedChangeListImpl implements CommittedChangeList {
     return getChangesWithMovedTreesImpl(this);
   }
 
+  @Override
+  public boolean isModifiable() {
+    return true;
+  }
+
   public static Collection<Change> getChangesWithMovedTreesImpl(final CommittedChangeList list) {
     return list.getChanges();
   }
index 27df5e17ac9d622cb096f608ca02b72449dd82fc..72ce233427cd85aae5bfba22aaab05b421f2c1eb 100644 (file)
@@ -21,6 +21,8 @@ import com.intellij.openapi.actionSystem.Presentation;
 import com.intellij.openapi.vcs.VcsBundle;
 import com.intellij.openapi.vcs.VcsDataKeys;
 import com.intellij.openapi.vcs.changes.Change;
+import com.intellij.openapi.vcs.changes.ChangeList;
+import com.intellij.openapi.vcs.versionBrowser.CommittedChangeList;
 import com.intellij.util.containers.Convertor;
 
 import javax.swing.*;
@@ -36,6 +38,22 @@ public class RevertSelectedChangesAction extends RevertCommittedStuffAbstractAct
     presentation.setIcon(ourIcon);
     presentation.setText(ourText);
     super.update(e);
+    presentation.setEnabled(allSelectedChangeListsAreRevertable(e));
+  }
+
+  private static boolean allSelectedChangeListsAreRevertable(AnActionEvent e) {
+    ChangeList[] changeLists = e.getData(VcsDataKeys.CHANGE_LISTS);
+    if (changeLists == null) {
+      return true;
+    }
+    for (ChangeList list : changeLists) {
+      if (list instanceof CommittedChangeList) {
+        if (!((CommittedChangeList)list).isModifiable()) {
+          return false;
+        }
+      }
+    }
+    return true;
   }
 
   private static void initPresentation() {
index 2385591da6f6e23152f4dc87a8e0d0f4146b2758..3fba48f96e9094809e666cb8a1a280e4fdce003d 100644 (file)
@@ -120,6 +120,11 @@ public class CvsChangeList implements CommittedChangeList {
     return CommittedChangeListImpl.getChangesWithMovedTreesImpl(this);
   }
 
+  @Override
+  public boolean isModifiable() {
+    return true;
+  }
+
   @Nullable
   public String getBranch() {
     if (myRevisions.size() > 0) {
index 6b6cd840542029be062ac94723496fed458af878..bf17f84d4c274d08837ce26ba91594d01b9aa92b 100644 (file)
@@ -522,7 +522,7 @@ public class GitUtil {
       if ((!firstStep) && lineIsAStart) {
         final StringScanner innerScanner = new StringScanner(sb.toString());
         sb.setLength(0);
-        consumer.consume(GitChangeUtils.parseChangeList(project, root, innerScanner, skipDiffsForMerge, h, false));
+        consumer.consume(GitChangeUtils.parseChangeList(project, root, innerScanner, skipDiffsForMerge, h, false, false));
       }
       sb.append(lineIsAStart ? line.substring(2) : line).append('\n');
       firstStep = false;
@@ -530,7 +530,7 @@ public class GitUtil {
     if (sb.length() > 0) {
       final StringScanner innerScanner = new StringScanner(sb.toString());
       sb.setLength(0);
-      consumer.consume(GitChangeUtils.parseChangeList(project, root, innerScanner, skipDiffsForMerge, h, false));
+      consumer.consume(GitChangeUtils.parseChangeList(project, root, innerScanner, skipDiffsForMerge, h, false, false));
     }
     if (s.hasMoreData()) {
       throw new IllegalStateException("More input is avaialble: " + s.line());
index b0f760edd2c8705542bb5fe92cef01255c356b2d..31b0d0bef8c6c8675ec26bf71c71264fd693ca43 100644 (file)
@@ -86,7 +86,7 @@ public class GitShowAllSubmittedFilesAction extends AnAction implements DumbAwar
    * @param file     file affected by the revision
    */
   public static void showSubmittedFiles(final Project project, final VcsFileRevision revision, final VirtualFile file) {
-    showSubmittedFiles(project, revision.getRevisionNumber().asString(), file, false);
+    showSubmittedFiles(project, revision.getRevisionNumber().asString(), file, false, true);
   }
 
   /**
@@ -96,14 +96,16 @@ public class GitShowAllSubmittedFilesAction extends AnAction implements DumbAwar
    * @param revision a revision number
    * @param file     file affected by the revision
    * @param local
+   * @param revertable
    */
-  public static void showSubmittedFiles(final Project project, final String revision, final VirtualFile file, final boolean local) {
+  public static void showSubmittedFiles(final Project project, final String revision, final VirtualFile file,
+                                        final boolean local, final boolean revertable) {
     new Task.Backgroundable(project, GitBundle.message("changes.retrieving", revision)) {
       public void run(@NotNull ProgressIndicator indicator) {
         indicator.setIndeterminate(true);
         try {
           VirtualFile vcsRoot = GitUtil.getGitRoot(file);
-          final CommittedChangeList changeList = GitChangeUtils.getRevisionChanges(project, vcsRoot, revision, true, local);
+          final CommittedChangeList changeList = GitChangeUtils.getRevisionChanges(project, vcsRoot, revision, true, local, revertable);
           if (changeList != null) {
             UIUtil.invokeLaterIfNeeded(new Runnable() {
               public void run() {
index d6e9f92de9b2e3ed1bf23c1746439ca0d6e71be6..c90c26ff7eb1ede257f40921133116c68e009ca0 100644 (file)
@@ -231,11 +231,13 @@ public class GitChangeUtils {
    * listed on the the merge that has at least some changes.
    *
    *
+   *
    * @param project      the project file
    * @param root         the git root
    * @param revisionName the name of revision (might be tag)
    * @param skipDiffsForMerge
    * @param local
+   * @param revertable
    * @return change list for the respective revision
    * @throws VcsException in case of problem with running git
    */
@@ -243,7 +245,7 @@ public class GitChangeUtils {
                                                           VirtualFile root,
                                                           String revisionName,
                                                           boolean skipDiffsForMerge,
-                                                          boolean local) throws VcsException {
+                                                          boolean local, boolean revertable) throws VcsException {
     GitSimpleHandler h = new GitSimpleHandler(project, root, GitCommand.SHOW);
     h.setNoSSH(true);
     h.setSilent(true);
@@ -251,7 +253,7 @@ public class GitChangeUtils {
                     revisionName, "--");
     String output = h.run();
     StringScanner s = new StringScanner(output);
-    return parseChangeList(project, root, s, skipDiffsForMerge, h, local);
+    return parseChangeList(project, root, s, skipDiffsForMerge, h, local, revertable);
   }
 
   @Nullable
@@ -335,6 +337,7 @@ public class GitChangeUtils {
    * Parse changelist
    *
    *
+   *
    * @param project the project
    * @param root    the git root
    * @param s       the scanner for log or show command output
@@ -343,6 +346,7 @@ public class GitChangeUtils {
    * @param local   pass {@code true} to indicate that this revision should be an editable
    *                {@link com.intellij.openapi.vcs.changes.CurrentContentRevision}.
    *                Pass {@code false} for
+   * @param revertable
    * @return the parsed changelist
    * @throws VcsException if there is a problem with running git
    */
@@ -351,7 +355,7 @@ public class GitChangeUtils {
                                                        StringScanner s,
                                                        boolean skipDiffsForMerge,
                                                        GitHandler handler,
-                                                       boolean local) throws VcsException {
+                                                       boolean local, boolean revertable) throws VcsException {
     ArrayList<Change> changes = new ArrayList<Change>();
     // parse commit information
     final Date commitDate = GitUtil.parseTimestampWithNFEReport(s.line(), handler, s.getAllText());
@@ -403,8 +407,8 @@ public class GitChangeUtils {
         }
       }
     }
-    return new GitCommittedChangeList(commentSubject + "(" + revisionNumber + ")", fullComment, committerName, number, commitDate,
-                                       changes, revisionNumber);
+    String changeListName = String.format("%s(%s)", commentSubject, revisionNumber);
+    return new GitCommittedChangeList(changeListName, fullComment, committerName, number, commitDate, changes, revertable);
   }
 
   public static long longForSHAHash(String revisionNumber) {
index aad4974987aa643f49f3ee9b006caed9ac0ca2ca..4c53287d6819f6cf9a3f336e336ad5159c3feded 100644 (file)
@@ -27,18 +27,17 @@ import java.util.Date;
  *         Time: 4:03 PM
  */
 public class GitCommittedChangeList extends CommittedChangeListImpl {
-  private final String myFullHash;
 
-  public GitCommittedChangeList(String name,
-                                String comment,
-                                String committerName,
-                                long number,
-                                Date commitDate, Collection<Change> changes, String fullHash) {
+  private final boolean myModifiable;
+
+  public GitCommittedChangeList(String name, String comment, String committerName, long number, Date commitDate, Collection<Change> changes,
+                                boolean isModifiable) {
     super(name, comment, committerName, number, commitDate, changes);
-    myFullHash = fullHash;
+    myModifiable = isModifiable;
   }
 
-  public String getFullHash() {
-    return myFullHash;
+  @Override
+  public boolean isModifiable() {
+    return myModifiable;
   }
 }
index dcfdf1f4c63f17227158502e05d4b4d2027552bb..0f38874ced5cd9e1e0c9c2e52c937ab5f920b9e8 100644 (file)
@@ -159,7 +159,7 @@ public class GitDiffFromHistoryHandler implements DiffFromHistoryHandler {
           else {
             // show the initial commit
             myChanges = new ArrayList<Change>(GitChangeUtils.getRevisionChanges(repository.getProject(), repository.getRoot(), hash2, false,
-                                                                                true).getChanges());
+                                                                                true, true).getChanges());
           }
         }
         catch (VcsException e) {
index a0225ad98d98eacae476970227e5d02292b93d15..2ec97fc95d70b4adb48edfd61b8b19a35709475d 100644 (file)
@@ -133,7 +133,7 @@ public class GitRebaseEditor extends DialogWrapper {
           return;
         }
         GitRebaseEntry entry = myTableModel.myEntries.get(row);
-        GitShowAllSubmittedFilesAction.showSubmittedFiles(project, entry.getCommit(), gitRoot, false);
+        GitShowAllSubmittedFilesAction.showSubmittedFiles(project, entry.getCommit(), gitRoot, false, false);
       }
     });
 
index 125992f17c6eaa3edea46426256356b400c03818..eb1c76c671d8b08b37720982d4954ba7be302b2f 100644 (file)
@@ -94,7 +94,7 @@ public class GitReferenceValidator {
         myLastResult = false;
         try {
           GitRevisionNumber revision = GitRevisionNumber.resolve(myProject, gitRoot(), revisionExpression);
-          GitShowAllSubmittedFilesAction.showSubmittedFiles(myProject, revision.asString(), gitRoot(), false);
+          GitShowAllSubmittedFilesAction.showSubmittedFiles(myProject, revision.asString(), gitRoot(), false, false);
           myLastResult = true;
         }
         catch (VcsException ex) {
index df7051f224ded86bffd112c1f8007b588a9f9d62..5f1c8b1a5a2315ecf784d215db117d85371a83b4 100644 (file)
@@ -224,7 +224,7 @@ public class GitUnstashDialog extends DialogWrapper {
           GitUIUtil.showOperationError(myProject, ex, "resolving revision");
           return;
         }
-        GitShowAllSubmittedFilesAction.showSubmittedFiles(myProject, resolvedStash, root, true);
+        GitShowAllSubmittedFilesAction.showSubmittedFiles(myProject, resolvedStash, root, true, false);
       }
     });
     init();
index 8666df90b99fff9746d3b2d9de4ceaed1a93eaff..d7b96a141f8e7bc101f3a745fd825086a00dbb3f 100644 (file)
@@ -594,6 +594,11 @@ public class SvnChangeList implements CommittedChangeList {
     return myListsHolder.getDetailedList();
   }
 
+  @Override
+  public boolean isModifiable() {
+    return true;
+  }
+
   public boolean equals(final Object o) {
     if (this == o) return true;
     if (o == null || getClass() != o.getClass()) return false;