Merge branch 'svn_18_3'
authorKonstantin Kolosovsky <konstantin.kolosovsky@jetbrains.com>
Thu, 13 Mar 2014 13:51:46 +0000 (17:51 +0400)
committerKonstantin Kolosovsky <konstantin.kolosovsky@jetbrains.com>
Thu, 13 Mar 2014 13:51:46 +0000 (17:51 +0400)
plugins/svn4idea/src/org/jetbrains/idea/svn/SvnChangeProviderContext.java
plugins/svn4idea/src/org/jetbrains/idea/svn/commandLine/Command.java
plugins/svn4idea/src/org/jetbrains/idea/svn/commandLine/CommandRuntime.java
plugins/svn4idea/src/org/jetbrains/idea/svn/portable/PortableStatus.java

index b3fa49bd17a218279573c48da4bbf3cc57e351bf..d99331dc4eeb00ea5ccb80e177a86fd884cd22ee 100644 (file)
@@ -370,6 +370,10 @@ class SvnChangeProviderContext implements StatusReceiver {
       final String afterList = SVNStatusType.STATUS_DELETED.equals(propertiesStatus) ? null :
                                AbstractShowPropertiesDiffAction.getPropertyList(myVcs, ioFile, SVNRevision.WORKING);
 
+      // TODO: There are cases when status output is like (on newly added file with some properties that is locally deleted)
+      // <entry path="some_path"> <wc-status item="missing" revision="-1" props="modified"> </wc-status> </entry>
+      // TODO: For such cases in current logic we'll have Change with before revision containing SVNRevision.UNDEFINED
+      // TODO: Analyze if this logic is OK or we should update flow somehow (for instance, to have null before revision)
       final String beforeRevisionNu = change.getBeforeRevision() == null ? null : change.getBeforeRevision().getRevisionNumber().asString();
       final String afterRevisionNu = change.getAfterRevision() == null ? null : change.getAfterRevision().getRevisionNumber().asString();
 
index 7b0ae47ee9db64939f7a81d715bfc0d7edac965f..4facdd367034281a70a05fa546695c95d903852c 100644 (file)
@@ -7,6 +7,7 @@ import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 import org.tmatesoft.svn.core.ISVNCanceller;
 import org.tmatesoft.svn.core.SVNURL;
+import org.tmatesoft.svn.core.wc.SVNRevision;
 import org.tmatesoft.svn.core.wc2.SvnTarget;
 
 import java.io.File;
@@ -132,4 +133,45 @@ public class Command {
 
     return StringUtil.join(data, " ");
   }
+
+  public boolean isLocalInfo() {
+    return is(SvnCommandName.info) && hasLocalTarget() && !myParameters.contains("--revision");
+  }
+
+  public boolean isLocalStatus() {
+    return is(SvnCommandName.st) && hasLocalTarget() && !myParameters.contains("-u");
+  }
+
+  public boolean isLocalProperty() {
+    boolean isPropertyCommand =
+      is(SvnCommandName.proplist) || is(SvnCommandName.propget) || is(SvnCommandName.propset) || is(SvnCommandName.propdel);
+
+    return isPropertyCommand && hasLocalTarget() && isLocal(getRevision());
+  }
+
+  public boolean isLocalCat() {
+    return is(SvnCommandName.cat) && hasLocalTarget() && isLocal(getRevision());
+  }
+
+  @Nullable
+  private SVNRevision getRevision() {
+    int index = myParameters.indexOf("--revision");
+
+    return index >= 0 && index + 1 < myParameters.size() ? SVNRevision.parse(myParameters.get(index + 1)) : null;
+  }
+
+  private boolean is(@NotNull SvnCommandName name) {
+    return name.equals(myName);
+  }
+
+  private boolean hasLocalTarget() {
+    return myTarget.isFile() && isLocal(myTarget.getPegRevision());
+  }
+
+  private static boolean isLocal(@Nullable SVNRevision revision) {
+    return revision == null ||
+           SVNRevision.UNDEFINED.equals(revision) ||
+           SVNRevision.BASE.equals(revision) ||
+           SVNRevision.WORKING.equals(revision);
+  }
 }
\ No newline at end of file
index e2742463cd16592e10bc713e9a5faa63623668d0..bd6c69c5e8d98f6671bd67c794081b9b75283152 100644 (file)
@@ -22,10 +22,7 @@ import com.intellij.openapi.util.text.StringUtil;
 import com.intellij.util.containers.ContainerUtil;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import org.jetbrains.idea.svn.SvnApplicationSettings;
-import org.jetbrains.idea.svn.SvnProgressCanceller;
-import org.jetbrains.idea.svn.SvnUtil;
-import org.jetbrains.idea.svn.SvnVcs;
+import org.jetbrains.idea.svn.*;
 import org.tmatesoft.svn.core.SVNURL;
 
 import java.io.File;
@@ -204,7 +201,7 @@ public class CommandRuntime {
   private CommandExecutor newExecutor(@NotNull Command command) {
     final CommandExecutor executor;
 
-    if (!Registry.is("svn.use.terminal")) {
+    if (!(Registry.is("svn.use.terminal") && isForSshRepository(command)) || isLocal(command)) {
       command.putIfNotPresent("--non-interactive");
       executor = new CommandExecutor(exePath, command);
     }
@@ -217,6 +214,29 @@ public class CommandRuntime {
     return executor;
   }
 
+  private static boolean isLocal(@NotNull Command command) {
+    return SvnCommandName.version.equals(command.getName()) ||
+           SvnCommandName.cleanup.equals(command.getName()) ||
+           SvnCommandName.add.equals(command.getName()) ||
+           // currently "svn delete" is only applied to local files
+           SvnCommandName.delete.equals(command.getName()) ||
+           SvnCommandName.revert.equals(command.getName()) ||
+           SvnCommandName.resolve.equals(command.getName()) ||
+           SvnCommandName.upgrade.equals(command.getName()) ||
+           SvnCommandName.changelist.equals(command.getName()) ||
+           // currently "svn lock" is only applied to local files
+           SvnCommandName.lock.equals(command.getName()) ||
+           // currently "svn unlock" is only applied to local files
+           SvnCommandName.unlock.equals(command.getName()) ||
+           command.isLocalInfo() || command.isLocalStatus() || command.isLocalProperty() || command.isLocalCat();
+  }
+
+  private static boolean isForSshRepository(@NotNull Command command) {
+    SVNURL url = command.getRepositoryUrl();
+
+    return url != null && StringUtil.equalsIgnoreCase(SvnAuthenticationManager.SVN_SSH, url.getProtocol());
+  }
+
   @NotNull
   public AuthenticationCallback getAuthCallback() {
     return myAuthCallback;
index f90df9edeb8625b521ee044af95b9c55940cc044..b00cb42e8afece310b258f72af9ec0041a6b9aad 100644 (file)
@@ -121,6 +121,7 @@ public class PortableStatus extends SVNStatus {
         return null;
       }
     };
+    setCommittedRevision(SVNRevision.UNDEFINED);
   }
 
   @Override