Merge remote-tracking branch 'origin/master'
authorKonstantin Kolosovsky <konstantin.kolosovsky@jetbrains.com>
Tue, 23 Dec 2014 18:16:07 +0000 (21:16 +0300)
committerKonstantin Kolosovsky <konstantin.kolosovsky@jetbrains.com>
Tue, 23 Dec 2014 18:16:07 +0000 (21:16 +0300)
15 files changed:
platform/platform-api/src/com/intellij/ui/components/labels/LinkLabel.java
plugins/svn4idea/src/org/jetbrains/idea/svn/SvnUtil.java
plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchConfigurationDialog.java
plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/CreateBranchOrTagAction.java
plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/CreateBranchOrTagDialog.java
plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/NewRootBunch.java
plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/SvnBranchConfigurationNew.java
plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/CopiesPanel.java
plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/SelectLocationDialog.java
plugins/svn4idea/src/org/jetbrains/idea/svn/info/CmdInfoClient.java
plugins/svn4idea/src/org/jetbrains/idea/svn/info/SvnInfoHandler.java
plugins/svn4idea/src/org/jetbrains/idea/svn/update/SingleRootSwitcher.java
plugins/svn4idea/src/org/jetbrains/idea/svn/update/SvnIntegrateRootOptionsPanel.java
plugins/svn4idea/src/org/jetbrains/idea/svn/update/SvnUpdateRootOptionsPanel.java
plugins/svn4idea/src/org/jetbrains/idea/svn/update/UpdateRootInfo.java

index dab1a17473475b1d00246dc65ec6191c4285b3a7..52c15afe94c48fb284ea852782450c9851d4990b 100644 (file)
@@ -350,7 +350,8 @@ public class LinkLabel<T> extends JLabel {
     try {
       Field field = BasicLabelUI.class.getDeclaredField("paintTextR");
       field.setAccessible(true);
-      return (Rectangle)field.get(getUI());
+      Rectangle labelBounds = (Rectangle)field.get(getUI());
+      return labelBounds.isEmpty() ? null : labelBounds;
     }
     catch (Exception ignored) {
       return null;
index d78610467a0f02386aadfcae4a67595c8bf0af29..422d79c8df53ce48ceaf1bab66af754e60448fc7 100644 (file)
@@ -470,15 +470,32 @@ public class SvnUtil {
   }
 
   @Nullable
-  public static SVNURL getBranchForUrl(final SvnVcs vcs, final VirtualFile vcsRoot, final String urlPath) {
+  public static SVNURL getBranchForUrl(@NotNull SvnVcs vcs, @NotNull VirtualFile vcsRoot, @NotNull String urlValue) {
+    SVNURL url = null;
+
     try {
-      final SVNURL url = SVNURL.parseURIEncoded(urlPath);
-      SvnBranchConfigurationNew configuration = SvnBranchConfigurationManager.getInstance(vcs.getProject()).get(vcsRoot);
-      return configuration.getWorkingBranch(url);
+      url = createUrl(urlValue);
     }
-    catch (SVNException e) {
-      return null;
+    catch (SvnBindException e) {
+      LOG.debug(e);
+    }
+
+    return url != null ? getBranchForUrl(vcs, vcsRoot, url) : null;
+  }
+
+  @Nullable
+  public static SVNURL getBranchForUrl(@NotNull SvnVcs vcs, @NotNull VirtualFile vcsRoot, @NotNull SVNURL url) {
+    SVNURL result = null;
+    SvnBranchConfigurationNew configuration = SvnBranchConfigurationManager.getInstance(vcs.getProject()).get(vcsRoot);
+
+    try {
+      result = configuration.getWorkingBranch(url);
     }
+    catch (SvnBindException e) {
+      LOG.debug(e);
+    }
+
+    return result;
   }
 
   public static boolean checkRepositoryVersion15(@NotNull SvnVcs vcs, @NotNull String url) {
@@ -701,8 +718,13 @@ public class SvnUtil {
 
   @NotNull
   public static SVNURL createUrl(@NotNull String url) throws SvnBindException {
+    return createUrl(url, true);
+  }
+
+  @NotNull
+  public static SVNURL createUrl(@NotNull String url, boolean encoded) throws SvnBindException {
     try {
-      SVNURL result = SVNURL.parseURIEncoded(url);
+      SVNURL result = encoded ? SVNURL.parseURIEncoded(url) : SVNURL.parseURIDecoded(url);
 
       // explicitly check if port corresponds to default port and recreate url specifying default port indicator
       if (result.hasPort() && hasDefaultPort(result)) {
index 820c681daa8888d9f9dc235a011e147c745b466a..baaee884dc445c7bdda2f2780bd8cf0d18b8fcd2 100644 (file)
@@ -79,10 +79,10 @@ public class BranchConfigurationDialog extends DialogWrapper {
     myTrunkLocationTextField.setText(configuration.getTrunkUrl());
     myTrunkLocationTextField.addActionListener(new ActionListener() {
       public void actionPerformed(final ActionEvent e) {
-        Pair<String, SVNURL> selectionData = SelectLocationDialog.selectLocation(project, rootUrl);
+        Pair<SVNURL, SVNURL> selectionData = SelectLocationDialog.selectLocation(project, rootUrl);
 
         if (selectionData != null && selectionData.getFirst() != null) {
-          myTrunkLocationTextField.setText(selectionData.getFirst());
+          myTrunkLocationTextField.setText(selectionData.getFirst().toString());
         }
       }
     });
@@ -105,9 +105,9 @@ public class BranchConfigurationDialog extends DialogWrapper {
 
           @Override
           public void run(AnActionButton button) {
-            Pair<String, SVNURL> result = SelectLocationDialog.selectLocation(project, ObjectUtils.notNull(usedRootUrl, rootUrl));
+            Pair<SVNURL, SVNURL> result = SelectLocationDialog.selectLocation(project, ObjectUtils.notNull(usedRootUrl, rootUrl));
             if (result != null) {
-              String selectedUrl = result.getFirst();
+              String selectedUrl = result.getFirst().toString();
               usedRootUrl = result.getSecond();
               if (selectedUrl != null) {
                 if (!configuration.getBranchUrls().contains(selectedUrl)) {
index d9cc8eeeb288132bf75a27fdfbb1610b4ce5283a..888387d5eabf295203fa04d938c699613b0356af 100644 (file)
@@ -127,9 +127,7 @@ public class CreateBranchOrTagAction extends BasicAction {
       }
 
       if (dialog.isCopyFromWorkingCopy() && dialog.isSwitchOnCreate()) {
-        SingleRootSwitcher switcher =
-          new SingleRootSwitcher(project, VcsUtil.getFilePath(srcFile, srcFile.isDirectory()), dstSvnUrl.toDecodedString());
-
+        SingleRootSwitcher switcher = new SingleRootSwitcher(project, VcsUtil.getFilePath(srcFile, srcFile.isDirectory()), dstSvnUrl);
         AutoSvnUpdater.run(switcher, SvnBundle.message("action.name.switch"));
       }
       ;
index a0ec6cd9f3af38854f907e892d894af9be27edc4..0e98f475f2f04c879774a36341aa44d528d9ba9d 100644 (file)
@@ -38,6 +38,7 @@ import org.jetbrains.idea.svn.SvnVcs;
 import org.jetbrains.idea.svn.dialogs.SelectLocationDialog;
 import org.jetbrains.idea.svn.info.Info;
 import org.jetbrains.idea.svn.update.SvnRevisionPanel;
+import org.tmatesoft.svn.core.SVNURL;
 import org.tmatesoft.svn.core.internal.util.SVNEncodingUtil;
 import org.tmatesoft.svn.core.internal.util.SVNPathUtil;
 import org.tmatesoft.svn.core.wc.SVNRevision;
@@ -109,9 +110,9 @@ public class CreateBranchOrTagDialog extends DialogWrapper {
     });
     myRepositoryField.addActionListener(new ActionListener() {
       public void actionPerformed(final ActionEvent e) {
-        String url = SelectLocationDialog.selectLocation(project, mySrcURL);
+        SVNURL url = SelectLocationDialog.selectLocation(project, mySrcURL);
         if (url != null) {
-          myRepositoryField.setText(url);
+          myRepositoryField.setText(url.toString());
         }
       }
     });
index 6f7f4185a815c8397fbdaed0d3c692dc464eafa5..c0dc0fbd09cfe39bbd93e0b3e264e3a4ebdfc285 100644 (file)
@@ -25,6 +25,7 @@ import com.intellij.openapi.vfs.VirtualFile;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 import org.jetbrains.idea.svn.SvnVcs;
+import org.jetbrains.idea.svn.commandLine.SvnBindException;
 import org.tmatesoft.svn.core.SVNException;
 import org.tmatesoft.svn.core.SVNURL;
 
@@ -147,8 +148,9 @@ public class NewRootBunch {
       }
       result.set(myMap.get(root).getValue().getWorkingBranch(svnurl));
     }
-    catch (SVNException e) {
-      //
+    catch (SVNException ignore) {
+    }
+    catch (SvnBindException ignore) {
     }
     return result.get();
   }
index 3ce3c986c8aebda73262a1baf51af4fa73c7cd6d..d24375b2017dd442f8d7b41ac77d1ce06e519168 100644 (file)
@@ -20,9 +20,11 @@ import com.intellij.openapi.project.Project;
 import com.intellij.openapi.vcs.ObjectsConvertor;
 import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.util.containers.Convertor;
+import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 import org.jetbrains.idea.svn.SvnUtil;
 import org.jetbrains.idea.svn.SvnVcs;
+import org.jetbrains.idea.svn.commandLine.SvnBindException;
 import org.jetbrains.idea.svn.info.Info;
 import org.tmatesoft.svn.core.SVNException;
 import org.tmatesoft.svn.core.SVNURL;
@@ -156,9 +158,9 @@ public class SvnBranchConfigurationNew {
   }
 
   @Nullable
-  public SVNURL getWorkingBranch(final SVNURL someUrl) throws SVNException {
+  public SVNURL getWorkingBranch(@NotNull SVNURL someUrl) throws SvnBindException {
     String baseUrl = getBaseUrl(someUrl.toString());
-    return baseUrl == null ? null : SVNURL.parseURIEncoded(baseUrl);
+    return baseUrl == null ? null : SvnUtil.createUrl(baseUrl);
   }
 
   // todo not checked
index 72ef67f6308ffbe4f8bfbd051fa3d853f20fe4fa..0e51c8c226d4167aaecb4b1ab8f62cb48572f37b 100644 (file)
@@ -290,7 +290,7 @@ public class CopiesPanel {
         .append(info.getErrorMessage()).append("</td></tr>");
     }
     else {
-      sb.append("<tr valign=\"top\"><td>URL:</td><td colspan=\"2\">").append(info.getRootUrl()).append("</td></tr>");
+      sb.append("<tr valign=\"top\"><td>URL:</td><td colspan=\"2\">").append(info.getUrl().toDecodedString()).append("</td></tr>");
     }
     if (upgradeFormats.size() > 1) {
       sb.append("<tr valign=\"top\"><td>Format:</td><td>").append(info.getFormat().getName()).append("</td><td><a href=\"").
index b426bb7cc8a4a3480c0e00db715eafb5e41bb0a7..01ff4112f280ea6fc232a26801bfdb8576e8d851 100644 (file)
@@ -63,14 +63,14 @@ public class SelectLocationDialog extends DialogWrapper {
 
   // todo check that works when authenticated
   @Nullable
-  public static String selectLocation(Project project, String url) {
+  public static SVNURL selectLocation(Project project, String url) {
     SelectLocationDialog dialog = openDialog(project, url, null, null, true, false, null);
 
     return dialog == null || !dialog.isOK() ? null : dialog.getSelectedURL();
   }
 
   @Nullable
-  public static Pair<String, SVNURL> selectLocation(Project project, @NotNull SVNURL url) {
+  public static Pair<SVNURL, SVNURL> selectLocation(Project project, @NotNull SVNURL url) {
     SelectLocationDialog dialog = new SelectLocationDialog(project, url, null, null, true, true);
     return dialog.showAndGet() ? create(dialog.getSelectedURL(), dialog.getRootUrl()) : null;
   }
@@ -80,7 +80,7 @@ public class SelectLocationDialog extends DialogWrapper {
     SelectLocationDialog dialog =
       openDialog(project, url, dstLabel, dstName, showFiles, false, SvnBundle.message("select.location.invalid.url.message", url));
 
-    return dialog == null || !dialog.isOK() ? null : SVNPathUtil.append(dialog.getSelectedURL(), dialog.getDestinationName());
+    return dialog == null || !dialog.isOK() ? null : SVNPathUtil.append(dialog.getSelectedURL().toString(), dialog.getDestinationName());
   }
 
   @Nullable
@@ -278,8 +278,9 @@ public class SelectLocationDialog extends DialogWrapper {
     return SVNEncodingUtil.uriEncode(myDstText.getText().trim());
   }
 
-  public String getSelectedURL() {
-    return myRepositoryBrowser.getSelectedURL();
+  @Nullable
+  public SVNURL getSelectedURL() {
+    return myRepositoryBrowser.getSelectedSVNURL();
   }
 
   @Nullable
index 91eb7ce42e3e7db874ab6d34c58ee3c585812084..0077bd3aba5aa2591c1b869c5aab0ffe4360869e 100644 (file)
@@ -172,7 +172,9 @@ public class CmdInfoClient extends BaseSvnClient implements InfoClient {
 
   @Override
   public Info doInfo(SVNURL url, SVNRevision pegRevision, SVNRevision revision) throws SvnBindException {
-    CommandExecutor command = execute(myVcs, SvnTarget.fromURL(url), SvnCommandName.info, buildParameters(url.toDecodedString(), pegRevision, revision, Depth.EMPTY), null);
+    CommandExecutor command =
+      execute(myVcs, SvnTarget.fromURL(url), SvnCommandName.info, buildParameters(url.toString(), pegRevision, revision, Depth.EMPTY),
+              null);
 
     return parseResult(null, command.getOutput());
   }
index 969225eb69e3b4211141306137e918af23650108..eac1c4393bea0b01fac1c03147dc0494b7786b7b 100644 (file)
@@ -872,7 +872,7 @@ public class SvnInfoHandler extends DefaultHandler {
     @Nullable private final File myBase;
 
     private Entry(@Nullable final File base) {
-      super(new String[]{"url", "relative-url", "lock", "repository","wc-info","commit","conflict","tree-conflict"}, new String[]{});
+      super(new String[]{"url", "relative-url", "lock", "repository","wc-info","commit","tree-conflict"}, new String[]{"conflict"});
       myBase = base;
     }
 
index 2a8423caae1dffe10402b41d7a25641a865cf212..bfad203c94e95f7fd5fff9ab4ac9943279576e85 100644 (file)
@@ -18,15 +18,16 @@ package org.jetbrains.idea.svn.update;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.vcs.FilePath;
 import org.jetbrains.annotations.NotNull;
+import org.tmatesoft.svn.core.SVNURL;
 
 /**
  * @author Konstantin Kolosovsky.
  */
 public class SingleRootSwitcher extends AutoSvnUpdater {
 
-  @NotNull private String myUrl;
+  @NotNull private final SVNURL myUrl;
 
-  public SingleRootSwitcher(Project project, @NotNull FilePath root, @NotNull String url) {
+  public SingleRootSwitcher(Project project, @NotNull FilePath root, @NotNull SVNURL url) {
     super(project, new FilePath[]{root});
 
     myUrl = url;
index 9df2c97164d453dd5495db5c4f98a4e0c4f50fe1..fc7b350de5bdff868dbf62475193bd4256000ce3 100644 (file)
@@ -22,6 +22,7 @@ import org.jetbrains.idea.svn.SvnBundle;
 import org.jetbrains.idea.svn.SvnConfiguration;
 import org.jetbrains.idea.svn.SvnVcs;
 import org.jetbrains.idea.svn.dialogs.SelectLocationDialog;
+import org.tmatesoft.svn.core.SVNURL;
 
 import javax.swing.*;
 import java.awt.event.ActionEvent;
@@ -86,9 +87,9 @@ public class SvnIntegrateRootOptionsPanel implements SvnPanel{
 
   private boolean chooseUrl(final TextFieldWithBrowseButton textField, final SvnVcs vcs) {
     String url = textField.getText();
-    final String selectedUrl = SelectLocationDialog.selectLocation(vcs.getProject(), url);
+    SVNURL selectedUrl = SelectLocationDialog.selectLocation(vcs.getProject(), url);
     if (selectedUrl != null) {
-      textField.setText(selectedUrl);
+      textField.setText(selectedUrl.toString());
       return true;
     } else {
       return false;
index 9103c845ae75a9d61082f28e5ea7c66f3515b91d..4a0ceb65b8799e88906a514d685681c3c1ca8b4c 100644 (file)
@@ -23,7 +23,9 @@ import com.intellij.openapi.vcs.FilePath;
 import org.jetbrains.annotations.Nullable;
 import org.jetbrains.idea.svn.*;
 import org.jetbrains.idea.svn.branchConfig.SelectBranchPopup;
+import org.jetbrains.idea.svn.branchConfig.SvnBranchConfigurationManager;
 import org.jetbrains.idea.svn.branchConfig.SvnBranchConfigurationNew;
+import org.jetbrains.idea.svn.commandLine.SvnBindException;
 import org.jetbrains.idea.svn.dialogs.SelectLocationDialog;
 import org.jetbrains.idea.svn.history.SvnChangeList;
 import org.jetbrains.idea.svn.history.SvnRepositoryLocation;
@@ -52,18 +54,13 @@ public class SvnUpdateRootOptionsPanel implements SvnPanel{
   private JLabel myBranchLabel;
   private JLabel myUrlLabel;
   private JLabel myCopyType;
-  private String mySourceUrl;
-  private SVNURL myBranchUrl;
-  private final boolean myIsNested;
+  @Nullable private SVNURL mySourceUrl;
 
   public SvnUpdateRootOptionsPanel(FilePath root, final SvnVcs vcs, Collection<FilePath> roots) {
     myRoot = root;
     myVcs = vcs;
-    myIsNested = FilePathUtil.isNested(roots, myRoot);
 
-    //myPanel.setMinimumSize(new Dimension(320, 70));
     myURLText.setEditable(true);
-
     myURLText.addActionListener(new ActionListener() {
       public void actionPerformed(ActionEvent e) {
         chooseUrl();
@@ -84,7 +81,6 @@ public class SvnUpdateRootOptionsPanel implements SvnPanel{
         if (myUpdateToSpecificUrl.isSelected()) {
           myURLText.setEnabled(true);
           myBranchField.setEnabled(mySourceUrl != null);
-          //chooseBranch();
         } else {
           myURLText.setEnabled(false);
           myBranchField.setEnabled(false);
@@ -97,7 +93,7 @@ public class SvnUpdateRootOptionsPanel implements SvnPanel{
         if (e.getSource() == myRevisionBox) {
           myRevisionText.setEnabled(myRevisionBox.isSelected());
           if (myRevisionBox.isSelected()) {
-            if ("".equals(myRevisionText.getText().trim())) {
+            if (myRevisionText.getText().trim().isEmpty()) {
               myRevisionText.setText("HEAD");
             }
             myRevisionText.getTextField().selectAll();
@@ -125,7 +121,7 @@ public class SvnUpdateRootOptionsPanel implements SvnPanel{
     myURLText.setEnabled(myUpdateToSpecificUrl.isSelected());
     myBranchField.setEnabled(myUpdateToSpecificUrl.isSelected() && (mySourceUrl != null));
 
-    final boolean revisionCanBeSpecifiedForRoot = (! myIsNested) || isRevisionCanBeSpecifiedForRoot();
+    final boolean revisionCanBeSpecifiedForRoot = !FilePathUtil.isNested(roots, myRoot) || isRevisionCanBeSpecifiedForRoot();
     myRevisionBox.setEnabled(revisionCanBeSpecifiedForRoot);
     myRevisionText.setEnabled(revisionCanBeSpecifiedForRoot);
     myCopyType.setVisible(! revisionCanBeSpecifiedForRoot);
@@ -136,11 +132,11 @@ public class SvnUpdateRootOptionsPanel implements SvnPanel{
   private boolean isRevisionCanBeSpecifiedForRoot() {
     final RootUrlInfo info = myVcs.getSvnFileUrlMapping().getWcRootForFilePath(myRoot.getIOFile());
     if (info != null) {
-      final boolean result = (!NestedCopyType.external.equals(info.getType())) && (!NestedCopyType.switched.equals(info.getType()));
-      if (! result) {
+      boolean isExternalOrSwitched = NestedCopyType.external.equals(info.getType()) || NestedCopyType.switched.equals(info.getType());
+      if (isExternalOrSwitched) {
         myCopyType.setText(info.getType().getName() + " copy");
       }
-      return result;
+      return !isExternalOrSwitched;
     }
     return true;
   }
@@ -152,33 +148,30 @@ public class SvnUpdateRootOptionsPanel implements SvnPanel{
     }
     SelectBranchPopup.show(myVcs.getProject(), myRoot.getVirtualFile(), new SelectBranchPopup.BranchSelectedCallback() {
       public void branchSelected(final Project project, final SvnBranchConfigurationNew configuration, final String url, final long revision) {
-        // try to re-init branch url
-        myBranchUrl = getBranchForUrl(mySourceUrl);
-        if (myBranchUrl == null) {
+        // TODO: It seems that we could reuse configuration passed as parameter to this callback
+        SvnBranchConfigurationNew branchConfiguration = getBranchConfiguration();
+        String branchRelativeUrl = branchConfiguration != null ? branchConfiguration.getRelativeUrl(mySourceUrl.toString()) : null;
+
+        if (mySourceUrl == null || branchRelativeUrl == null) {
           myBranchField.setText("");
-          return;
         }
-        recalculateUrl(url);
-        myBranchField.setText(SVNPathUtil.tail(url));
+        else {
+          try {
+            myURLText.setText(SVNURL.parseURIEncoded(url).appendPath(branchRelativeUrl, true).toDecodedString());
+          }
+          catch (SVNException e) {
+            LOG.error(e);
+          }
+          myBranchField.setText(SVNPathUtil.tail(url));
+        }
       }
     }, SvnBundle.message("select.branch.popup.general.title"), myPanel);
   }
 
-  private void recalculateUrl(final String url) {
-    // recalculate fields
-    try {
-      final String newText = SVNURL.parseURIEncoded(url).appendPath(mySourceUrl.substring(myBranchUrl.toString().length()), true).toString();
-      myURLText.setText(newText);
-    }
-    catch (SVNException e) {
-      LOG.error(e);
-    }
-  }
-
   private void chooseUrl() {
-    String selected = SelectLocationDialog.selectLocation(myVcs.getProject(), myURLText.getText());
+    SVNURL selected = SelectLocationDialog.selectLocation(myVcs.getProject(), myURLText.getText());
     if (selected != null) {
-      myURLText.setText(selected);
+      myURLText.setText(selected.toDecodedString());
     }
   }
 
@@ -187,25 +180,29 @@ public class SvnUpdateRootOptionsPanel implements SvnPanel{
   }
 
   @Nullable
-  private SVNURL getBranchForUrl(final String url) {
-    final SvnFileUrlMapping urlMapping = myVcs.getSvnFileUrlMapping();
-    final RootUrlInfo rootForFilePath = urlMapping.getWcRootForFilePath(myRoot.getIOFile());
-    if (rootForFilePath == null) {
-      return null;
-    }
-    return SvnUtil.getBranchForUrl(myVcs, rootForFilePath.getVirtualFile(), url);
+  private SVNURL getBranchForUrl(@Nullable SVNURL url) {
+    final RootUrlInfo rootInfo = myVcs.getSvnFileUrlMapping().getWcRootForFilePath(myRoot.getIOFile());
+
+    return rootInfo != null && url != null ? SvnUtil.getBranchForUrl(myVcs, rootInfo.getVirtualFile(), url) : null;
+  }
+
+  @Nullable
+  private SvnBranchConfigurationNew getBranchConfiguration() {
+    final RootUrlInfo rootInfo = myVcs.getSvnFileUrlMapping().getWcRootForFilePath(myRoot.getIOFile());
+
+    return rootInfo != null ? SvnBranchConfigurationManager.getInstance(myVcs.getProject()).get(rootInfo.getVirtualFile()) : null;
   }
 
   public void reset(final SvnConfiguration configuration) {
     final UpdateRootInfo rootInfo = configuration.getUpdateRootInfo(myRoot.getIOFile(), myVcs);
 
-    mySourceUrl = rootInfo.getUrlAsString();
-    myBranchUrl = getBranchForUrl(mySourceUrl);
-    if (myBranchUrl != null) {
-      myBranchField.setText(SVNPathUtil.tail(myBranchUrl.toString()));
+    mySourceUrl = rootInfo.getUrl();
+    SVNURL branchUrl = getBranchForUrl(mySourceUrl);
+    if (branchUrl != null) {
+      myBranchField.setText(SVNPathUtil.tail(branchUrl.toDecodedString()));
     }
 
-    myURLText.setText(mySourceUrl);
+    myURLText.setText(mySourceUrl != null ? mySourceUrl.toDecodedString() : "");
     myRevisionBox.setSelected(rootInfo.isUpdateToRevision());
     myRevisionText.setText(rootInfo.getRevision().toString());
     myUpdateToSpecificUrl.setSelected(false);
@@ -217,11 +214,17 @@ public class SvnUpdateRootOptionsPanel implements SvnPanel{
   public void apply(final SvnConfiguration configuration) throws ConfigurationException {
     final UpdateRootInfo rootInfo = configuration.getUpdateRootInfo(myRoot.getIOFile(), myVcs);
     if (myUpdateToSpecificUrl.isSelected()) {
-      rootInfo.setUrl(myURLText.getText());
+      try {
+        rootInfo.setUrl(SvnUtil.createUrl(myURLText.getText(), false));
+      }
+      catch (SvnBindException e) {
+        throw new ConfigurationException("Invalid url: " + myURLText.getText());
+      }
     }
+
     rootInfo.setUpdateToRevision(myRevisionBox.isSelected());
     final SVNRevision revision = SVNRevision.parse(myRevisionText.getText());
-    if (!revision.isValid()) {
+     if (!revision.isValid()) {
       throw new ConfigurationException(SvnBundle.message("invalid.svn.revision.error.message", myRevisionText.getText()));
     }
     rootInfo.setRevision(revision);
@@ -230,41 +233,4 @@ public class SvnUpdateRootOptionsPanel implements SvnPanel{
   public boolean canApply() {
     return true;
   }
-
-/*  private class MyBranchFieldFocusListener implements FocusListener {
-    private SvnBranchConfiguration mySvnBranchConfiguration;
-
-    private MyBranchFieldFocusListener() {
-      final VirtualFile root = ProjectLevelVcsManager.getInstance(myVcs.getProject()).getVcsRootFor(myRoot);
-      if (root != null) {
-        try {
-          mySvnBranchConfiguration = SvnBranchConfigurationManager.getInstance(myVcs.getProject()).get(root);
-        }
-        catch (VcsException e) {
-          LOG.error(e);
-        }
-      }
-    }
-
-    public void focusGained(final FocusEvent e) {
-    }
-
-    public void focusLost(final FocusEvent e) {
-      if (mySvnBranchConfiguration != null) {
-        String text = myBranchField.getText();
-        text = (text == null) ? "" : text.trim();
-        if ((myBranchUrl != null) && (mySourceUrl != null) && (text.length() > 0) && (! text.contains("/"))) {
-          try {
-            final String branch = mySvnBranchConfiguration.getBranchByName(myVcs.getProject(), text);
-            if (branch != null) {
-              recalculateUrl(branch);
-            }
-          }
-          catch (SVNException exc) {
-            LOG.error(exc);
-          }
-        }
-      }
-    }
-  }*/
 }
index c858f78890f4d3085c1f32e0c86aca1e1632352e..f6c5d63cd6eabb123263288cf69165e65a9ad40a 100644 (file)
  */
 package org.jetbrains.idea.svn.update;
 
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 import org.jetbrains.idea.svn.SvnVcs;
 import org.jetbrains.idea.svn.info.Info;
-import org.tmatesoft.svn.core.SVNException;
 import org.tmatesoft.svn.core.SVNURL;
 import org.tmatesoft.svn.core.wc.SVNRevision;
 
 import java.io.File;
 
 public class UpdateRootInfo {
-  private String myUrl;
+  @Nullable private SVNURL myUrl;
   private SVNRevision myRevision;
   private boolean myUpdateToSpecifiedRevision = false;
 
@@ -32,19 +33,11 @@ public class UpdateRootInfo {
     myRevision = SVNRevision.HEAD;
 
     Info info = vcs.getInfo(file);
-    myUrl = info != null && info.getURL() != null ? info.getURL().toString() : "";
+    myUrl = info != null ? info.getURL() : null;
   }
 
+  @Nullable
   public SVNURL getUrl() {
-    try {
-      return SVNURL.parseURIEncoded(myUrl);
-    }
-    catch (SVNException e) {
-      return null;
-    }
-  }
-
-  public String getUrlAsString() {
     return myUrl;
   }
 
@@ -56,8 +49,8 @@ public class UpdateRootInfo {
     return myUpdateToSpecifiedRevision;
   }
 
-  public void setUrl(final String text) {
-    myUrl = text;
+  public void setUrl(@NotNull SVNURL url) {
+    myUrl = url;
   }
 
   public void setUpdateToRevision(final boolean value) {