Merge remote-tracking branch 'origin/master'
authorKonstantin Kolosovsky <konstantin.kolosovsky@jetbrains.com>
Fri, 29 May 2015 12:17:43 +0000 (15:17 +0300)
committerKonstantin Kolosovsky <konstantin.kolosovsky@jetbrains.com>
Fri, 29 May 2015 12:17:43 +0000 (15:17 +0300)
35 files changed:
platform/platform-resources/src/META-INF/VcsExtensions.xml
platform/util/resources/misc/registry.properties
platform/vcs-api/src/com/intellij/openapi/vcs/ChangeListColumn.java
platform/vcs-api/src/com/intellij/openapi/vcs/VcsActions.java [new file with mode: 0644]
platform/vcs-impl/src/com/intellij/openapi/vcs/changes/actions/RevertCommittedStuffAbstractAction.java
platform/vcs-impl/src/com/intellij/openapi/vcs/changes/actions/RevertSelectedChangesAction.java
platform/vcs-impl/src/com/intellij/openapi/vcs/changes/committed/ChangesCacheFile.java
platform/vcs-impl/src/com/intellij/openapi/vcs/changes/committed/CommittedChangeListByDateComparator.java [new file with mode: 0644]
platform/vcs-impl/src/com/intellij/openapi/vcs/changes/committed/CommittedChangeListRenderer.java
platform/vcs-impl/src/com/intellij/openapi/vcs/changes/committed/CommittedChangesTreeBrowser.java
platform/vcs-impl/src/com/intellij/openapi/vcs/changes/committed/DateChangeListGroupingStrategy.java
platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/ChangeListViewerDialog.java
platform/vcs-impl/src/com/intellij/openapi/vcs/history/CopyRevisionNumberAction.java
platform/vcs-impl/src/com/intellij/openapi/vcs/history/VcsRevisionNumberArrayRule.java [new file with mode: 0644]
plugins/git4idea/src/git4idea/history/GitHistoryProvider.java
plugins/hg4idea/resources/org/zmlx/hg4idea/HgVcsMessages.properties
plugins/hg4idea/src/org/zmlx/hg4idea/HgCopyHistoryRevisionNumberAction.java [deleted file]
plugins/hg4idea/src/org/zmlx/hg4idea/provider/HgHistoryProvider.java
plugins/svn4idea/src/org/jetbrains/idea/svn/SvnDiffProvider.java
plugins/svn4idea/src/org/jetbrains/idea/svn/SvnVcs.java
plugins/svn4idea/src/org/jetbrains/idea/svn/auth/SvnAuthenticationNotifier.java
plugins/svn4idea/src/org/jetbrains/idea/svn/browse/CmdBrowseClient.java
plugins/svn4idea/src/org/jetbrains/idea/svn/checkin/CmdCheckinClient.java
plugins/svn4idea/src/org/jetbrains/idea/svn/commandLine/Command.java
plugins/svn4idea/src/org/jetbrains/idea/svn/commandLine/CommandParametersResolutionModule.java
plugins/svn4idea/src/org/jetbrains/idea/svn/commandLine/CommandUtil.java
plugins/svn4idea/src/org/jetbrains/idea/svn/history/SvnChangeList.java
plugins/svn4idea/src/org/jetbrains/idea/svn/history/SvnHistoryProvider.java
plugins/svn4idea/src/org/jetbrains/idea/svn/info/CmdInfoClient.java
plugins/svn4idea/src/org/jetbrains/idea/svn/info/InfoClient.java
plugins/svn4idea/src/org/jetbrains/idea/svn/info/SvnKitInfoClient.java
plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/CmdMergeClient.java
plugins/svn4idea/src/org/jetbrains/idea/svn/status/CmdStatusClient.java
plugins/svn4idea/src/org/jetbrains/idea/svn/status/StatusClient.java
plugins/svn4idea/src/org/jetbrains/idea/svn/status/SvnKitStatusClient.java

index fe6228cadf71fd8f644ca3607f121ec9a17f9752..bff23f7828772b16cb1f788a2b22c91edfca3359 100644 (file)
@@ -63,6 +63,8 @@
     <actionPromoter implementation="com.intellij.openapi.vcs.actions.VcsActionPromoter"/>
     <projectSetProcessor implementation="com.intellij.openapi.vcs.VcsProjectSetProcessor"/>
     <projectSetProcessor implementation="com.intellij.openapi.vcs.OpenProjectSetProcessor"/>
+
+    <getDataRule key="VCS_REVISION_NUMBERS" implementationClass="com.intellij.openapi.vcs.history.VcsRevisionNumberArrayRule"/>
   </extensions>
 </idea-plugin>
 
index 9aa874adf40f8b93be50e3e9eb4ea62bd185a52a..dce52875ef91d63fdd9efc195c541a6403ba396b 100644 (file)
@@ -595,4 +595,6 @@ welcome.screen.project.grouping.enabled.description=Allows to group recent proje
 custom.folding.max.lookup.depth=50
 custom.folding.max.lookup.depth.description=Max lookup depth for custom folding comments in a PSI tree.
 
-tests_view_inline_statistics=true
\ No newline at end of file
+tests_view_inline_statistics=true
+
+tfs.set.connection.timeout=false
index 004227714b8b09e59363f1157babcd1453e4a735..48f45b1c1b3ede86b8e3dcc534d2388a3d0a738a 100644 (file)
@@ -51,6 +51,8 @@ public abstract class ChangeListColumn<T extends ChangeList> {
     }
 
     public Comparator<CommittedChangeList> getComparator() {
+      // TODO: CommittedChangeListByDateComparator could be utilized here. But currently it is placed in vcs-impl.
+      // TODO: Think of either moving these ChangeListColumn instances to vcs-impl or move comparator to vcs-api.
       return new Comparator<CommittedChangeList>() {
         public int compare(final CommittedChangeList o1, final CommittedChangeList o2) {
           return o1.getCommitDate().compareTo(o2.getCommitDate());
diff --git a/platform/vcs-api/src/com/intellij/openapi/vcs/VcsActions.java b/platform/vcs-api/src/com/intellij/openapi/vcs/VcsActions.java
new file mode 100644 (file)
index 0000000..22be4b8
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2000-2015 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.openapi.vcs;
+
+import org.jetbrains.annotations.NonNls;
+
+/**
+ * @author Konstantin Kolosovsky.
+ */
+public interface VcsActions {
+
+  @NonNls String ACTION_COPY_REVISION_NUMBER = "Vcs.CopyRevisionNumberAction";
+}
index 8166654faf8a2d57359890693088561ef79b2ef4..7a4120f0973b4ee88fd623d1b822430e34ea4ef8 100644 (file)
@@ -104,9 +104,14 @@ abstract class RevertCommittedStuffAbstractAction extends AnAction implements Du
     });
   }
 
-  public void update(final AnActionEvent e) {
-    final Project project = e.getData(CommonDataKeys.PROJECT);
-    final Change[] changes = myForUpdateConvertor.convert(e);
-    e.getPresentation().setEnabled(project != null && changes != null && changes.length > 0);
+  public void update(@NotNull AnActionEvent e) {
+    e.getPresentation().setEnabled(isEnabled(e));
+  }
+
+  protected boolean isEnabled(@NotNull AnActionEvent e) {
+    Project project = e.getData(CommonDataKeys.PROJECT);
+    Change[] changes = myForUpdateConvertor.convert(e);
+
+    return project != null && changes != null && changes.length > 0;
   }
 }
index 72ce233427cd85aae5bfba22aaab05b421f2c1eb..d1cce64655ef4b8c0ec7cb0b2d4c1bb3ba2b304f 100644 (file)
@@ -24,6 +24,7 @@ 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 org.jetbrains.annotations.NotNull;
 
 import javax.swing.*;
 
@@ -38,10 +39,14 @@ public class RevertSelectedChangesAction extends RevertCommittedStuffAbstractAct
     presentation.setIcon(ourIcon);
     presentation.setText(ourText);
     super.update(e);
-    presentation.setEnabled(allSelectedChangeListsAreRevertable(e));
   }
 
-  private static boolean allSelectedChangeListsAreRevertable(AnActionEvent e) {
+  @Override
+  protected boolean isEnabled(@NotNull AnActionEvent e) {
+    return super.isEnabled(e) && allSelectedChangeListsAreRevertable(e);
+  }
+
+  private static boolean allSelectedChangeListsAreRevertable(@NotNull AnActionEvent e) {
     ChangeList[] changeLists = e.getData(VcsDataKeys.CHANGE_LISTS);
     if (changeLists == null) {
       return true;
index 5891b340dc97f8be0347226bd9857d72837dd3a0..ed5c664561a193ffe4295a2e7bbe5b71892034eb 100644 (file)
@@ -17,7 +17,6 @@ package com.intellij.openapi.vcs.changes.committed;
 
 import com.intellij.openapi.diagnostic.Logger;
 import com.intellij.openapi.project.Project;
-import com.intellij.openapi.util.Comparing;
 import com.intellij.openapi.util.Condition;
 import com.intellij.openapi.util.Pair;
 import com.intellij.openapi.util.io.FileUtil;
@@ -140,11 +139,7 @@ public class ChangesCacheFile {
 
   public List<CommittedChangeList> writeChanges(final List<CommittedChangeList> changes) throws IOException {
     // the list and index are sorted in direct chronological order
-    Collections.sort(changes, new Comparator<CommittedChangeList>() {
-      public int compare(final CommittedChangeList o1, final CommittedChangeList o2) {
-        return Comparing.compare(o1.getCommitDate(), o2.getCommitDate());
-      }
-    });
+    Collections.sort(changes, CommittedChangeListByDateComparator.ASCENDING);
     return writeChanges(changes, null);
   }
 
diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/committed/CommittedChangeListByDateComparator.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/committed/CommittedChangeListByDateComparator.java
new file mode 100644 (file)
index 0000000..e0c416e
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2000-2015 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.openapi.vcs.changes.committed;
+
+import com.intellij.openapi.util.Comparing;
+import com.intellij.openapi.vcs.versionBrowser.CommittedChangeList;
+
+import java.util.Collections;
+import java.util.Comparator;
+
+/**
+ * @author Konstantin Kolosovsky.
+ */
+public class CommittedChangeListByDateComparator implements Comparator<CommittedChangeList> {
+
+  public static final Comparator<CommittedChangeList> ASCENDING = new CommittedChangeListByDateComparator();
+  public static final Comparator<CommittedChangeList> DESCENDING = Collections.reverseOrder(ASCENDING);
+
+  protected CommittedChangeListByDateComparator() {
+  }
+
+  @Override
+  public int compare(CommittedChangeList o1, CommittedChangeList o2) {
+    return Comparing.compare(o1.getCommitDate(), o2.getCommitDate());
+  }
+}
index eae634fe65a657c1a04d0aa5752ce6c897510246..42f1a41bc171e5ba581fc41fcfa3e924b0bb273c 100644 (file)
@@ -115,10 +115,12 @@ public class CommittedChangeListRenderer extends ColoredTreeCellRenderer {
     int descMaxWidth = availableWidth - dateCommitterSize - 8;
     boolean partial = (changeList instanceof ReceivedChangeList) && ((ReceivedChangeList)changeList).isPartial();
     int descWidth = 0;
+    int partialMarkerWidth = 0;
     if (partial) {
       final String partialMarker = VcsBundle.message("committed.changes.partial.list") + " ";
       append(partialMarker, SimpleTextAttributes.REGULAR_BOLD_ATTRIBUTES);
-      descWidth += boldMetrics.stringWidth(partialMarker);
+      partialMarkerWidth = boldMetrics.stringWidth(partialMarker);
+      descWidth += partialMarkerWidth;
     }
 
     descWidth += fontMetrics.stringWidth(description);
@@ -158,7 +160,7 @@ public class CommittedChangeListRenderer extends ColoredTreeCellRenderer {
     else {
       final String moreMarker = VcsBundle.message("changes.browser.details.marker");
       int moreWidth = fontMetrics.stringWidth(moreMarker);
-      int remainingWidth = descMaxWidth - moreWidth - numberWidth - branchWidth;
+      int remainingWidth = descMaxWidth - moreWidth - numberWidth - branchWidth - partialMarkerWidth;
       description = truncateDescription(description, fontMetrics, remainingWidth);
       myRenderer.appendTextWithLinks(description);
       if (!StringUtil.isEmpty(description)) {
index 76c353ef0541f5a4fc0768b9aa6cb6ec2ede9cd4..2d9f451e2fb286831be3749ac8f9a4db57f5a736 100644 (file)
@@ -17,6 +17,7 @@ import com.intellij.openapi.ui.Splitter;
 import com.intellij.openapi.ui.SplitterProportionsData;
 import com.intellij.openapi.util.Comparing;
 import com.intellij.openapi.util.Disposer;
+import com.intellij.openapi.vcs.VcsActions;
 import com.intellij.openapi.vcs.VcsDataKeys;
 import com.intellij.openapi.vcs.changes.Change;
 import com.intellij.openapi.vcs.changes.ChangesUtil;
@@ -257,11 +258,8 @@ public class CommittedChangesTreeBrowser extends JPanel implements TypeSafeDataP
   @NotNull
   public static List<Change> collectChanges(final List<? extends CommittedChangeList> selectedChangeLists, final boolean withMovedTrees) {
     List<Change> result = new ArrayList<Change>();
-    Collections.sort(selectedChangeLists, new Comparator<CommittedChangeList>() {
-      public int compare(final CommittedChangeList o1, final CommittedChangeList o2) {
-        return o1.getCommitDate().compareTo(o2.getCommitDate());
-      }
-    });
+    Collections.sort(selectedChangeLists, CommittedChangeListByDateComparator.ASCENDING);
+
     for(CommittedChangeList cl: selectedChangeLists) {
       final Collection<Change> changes = withMovedTrees ? cl.getChangesWithMovedTrees() : cl.getChanges();
       for(Change c: changes) {
@@ -315,7 +313,7 @@ public class CommittedChangesTreeBrowser extends JPanel implements TypeSafeDataP
     for (AnAction action : auxiliaryActions) {
       menuGroup.add(action);
     }
-    menuGroup.add(ActionManager.getInstance().getAction(IdeActions.ACTION_COPY));
+    menuGroup.add(ActionManager.getInstance().getAction(VcsActions.ACTION_COPY_REVISION_NUMBER));
     PopupHandler.installPopupHandler(myChangesTree, menuGroup, ActionPlaces.UNKNOWN, ActionManager.getInstance());
   }
 
@@ -361,7 +359,7 @@ public class CommittedChangesTreeBrowser extends JPanel implements TypeSafeDataP
       myChangesTree);
     toolbarGroup.add(expandAllAction);
     toolbarGroup.add(collapseAllAction);
-    toolbarGroup.add(ActionManager.getInstance().getAction(IdeActions.ACTION_COPY));
+    toolbarGroup.add(ActionManager.getInstance().getAction(VcsActions.ACTION_COPY_REVISION_NUMBER));
     toolbarGroup.add(new ContextHelpAction(myHelpId));
     if (tailGroup != null) {
       toolbarGroup.add(tailGroup);
index 91d3c4fb39838d1c666620f140a4ced810845744..0fd123ec644d4323d5b4d65a1e82ea1e6a88325c 100644 (file)
@@ -78,11 +78,7 @@ public class DateChangeListGroupingStrategy implements ChangeListGroupingStrateg
   }
 
   public Comparator<CommittedChangeList> getComparator() {
-    return new Comparator<CommittedChangeList>() {
-      public int compare(final CommittedChangeList o1, final CommittedChangeList o2) {
-        return -o1.getCommitDate().compareTo(o2.getCommitDate());
-      }
-    };
+    return CommittedChangeListByDateComparator.DESCENDING;
   }
 
   private static class MonthsCache {
index d4506d6ae95c9631dbb8d9408907515345ec8511..c727114a9ef6dad7d95deb9d08dc6a59d18c4295 100644 (file)
@@ -29,6 +29,7 @@ import com.intellij.openapi.actionSystem.DefaultActionGroup;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.ui.DialogWrapper;
 import com.intellij.openapi.ui.Splitter;
+import com.intellij.openapi.vcs.VcsActions;
 import com.intellij.openapi.vcs.VcsBundle;
 import com.intellij.openapi.vcs.VcsDataKeys;
 import com.intellij.openapi.vcs.changes.Change;
@@ -37,7 +38,6 @@ import com.intellij.openapi.vcs.changes.committed.RepositoryChangesBrowser;
 import com.intellij.openapi.vcs.changes.issueLinks.IssueLinkHtmlRenderer;
 import com.intellij.openapi.vcs.versionBrowser.CommittedChangeList;
 import com.intellij.openapi.vcs.versionBrowser.CommittedChangeListImpl;
-import com.intellij.openapi.vcs.versionBrowser.VcsRevisionNumberAware;
 import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.ui.BrowserHyperlinkListener;
 import com.intellij.ui.ScrollPaneFactory;
@@ -132,11 +132,7 @@ public class ChangeListViewerDialog extends DialogWrapper implements DataProvide
     if (VcsDataKeys.CHANGES.is(dataId)) {
       return myChanges;
     }
-    else if (VcsDataKeys.VCS_REVISION_NUMBER.is(dataId)) {
-      if (myChangeList instanceof VcsRevisionNumberAware) {
-        return ((VcsRevisionNumberAware)myChangeList).getRevisionNumber();
-      }
-    }
+
     return null;
   }
 
@@ -155,16 +151,7 @@ public class ChangeListViewerDialog extends DialogWrapper implements DataProvide
       @Override
       protected void buildToolBar(DefaultActionGroup toolBarGroup) {
         super.buildToolBar(toolBarGroup);
-        toolBarGroup.add(ActionManager.getInstance().getAction("Vcs.CopyRevisionNumberAction"));
-      }
-
-      @Override
-      public Object getData(@NonNls String dataId) {
-        Object data = super.getData(dataId);
-        if (data != null) {
-          return data;
-        }
-        return ChangeListViewerDialog.this.getData(dataId);
+        toolBarGroup.add(ActionManager.getInstance().getAction(VcsActions.ACTION_COPY_REVISION_NUMBER));
       }
 
       @Override
index 6f5b7c5478ddaa12fdec38f7ff932f5575090d38..177d52798cc9fe8ac4250261cf089f17d31ad336 100644 (file)
@@ -41,25 +41,8 @@ public class CopyRevisionNumberAction extends DumbAwareAction {
   @NotNull
   private static List<VcsRevisionNumber> getRevisionNumbersFromContext(@NotNull AnActionEvent e) {
     VcsRevisionNumber[] revisionNumbers = e.getData(VcsDataKeys.VCS_REVISION_NUMBERS);
-    if (revisionNumbers != null) {
-      return Arrays.asList(revisionNumbers);
-    }
 
-    VcsRevisionNumber revision = e.getData(VcsDataKeys.VCS_REVISION_NUMBER);
-    if (revision != null) {
-      return Collections.singletonList(revision);
-    }
-
-    VcsFileRevision[] fileRevisions = e.getData(VcsDataKeys.VCS_FILE_REVISIONS);
-    if (fileRevisions != null) {
-      return ContainerUtil.map(fileRevisions, new Function<VcsFileRevision, VcsRevisionNumber>() {
-        @Override
-        public VcsRevisionNumber fun(VcsFileRevision revision) {
-          return revision.getRevisionNumber();
-        }
-      });
-    }
-    return Collections.emptyList();
+    return revisionNumbers != null ? Arrays.asList(revisionNumbers) : Collections.<VcsRevisionNumber>emptyList();
   }
 
   @NotNull
diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/history/VcsRevisionNumberArrayRule.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/history/VcsRevisionNumberArrayRule.java
new file mode 100644 (file)
index 0000000..51ac351
--- /dev/null
@@ -0,0 +1,99 @@
+/*
+ * Copyright 2000-2015 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.openapi.vcs.history;
+
+import com.intellij.ide.impl.dataRules.GetDataRule;
+import com.intellij.openapi.actionSystem.DataProvider;
+import com.intellij.openapi.vcs.VcsDataKeys;
+import com.intellij.openapi.vcs.changes.ChangeList;
+import com.intellij.openapi.vcs.changes.committed.CommittedChangeListByDateComparator;
+import com.intellij.openapi.vcs.versionBrowser.CommittedChangeList;
+import com.intellij.openapi.vcs.versionBrowser.VcsRevisionNumberAware;
+import com.intellij.util.ArrayUtil;
+import com.intellij.util.Function;
+import com.intellij.util.containers.ContainerUtil;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * @author Konstantin Kolosovsky.
+ */
+public class VcsRevisionNumberArrayRule implements GetDataRule {
+
+  @Nullable
+  @Override
+  public Object getData(DataProvider dataProvider) {
+    List<VcsRevisionNumber> revisionNumbers = getRevisionNumbers(dataProvider);
+
+    return !ContainerUtil.isEmpty(revisionNumbers) ? ArrayUtil.toObjectArray(revisionNumbers, VcsRevisionNumber.class) : null;
+  }
+
+  @Nullable
+  public List<VcsRevisionNumber> getRevisionNumbers(@NotNull DataProvider dataProvider) {
+    VcsRevisionNumber revisionNumber = VcsDataKeys.VCS_REVISION_NUMBER.getData(dataProvider);
+    if (revisionNumber != null) {
+      return Collections.singletonList(revisionNumber);
+    }
+
+    ChangeList[] changeLists = VcsDataKeys.CHANGE_LISTS.getData(dataProvider);
+    if (changeLists != null && changeLists.length > 0) {
+      List<CommittedChangeList> committedChangeLists = ContainerUtil.findAll(changeLists, CommittedChangeList.class);
+
+      if (!committedChangeLists.isEmpty()) {
+        ContainerUtil.sort(committedChangeLists, CommittedChangeListByDateComparator.DESCENDING);
+
+        return ContainerUtil.mapNotNull(committedChangeLists, CommittedChangeListToRevisionNumberFunction.INSTANCE);
+      }
+    }
+
+    VcsFileRevision[] fileRevisions = VcsDataKeys.VCS_FILE_REVISIONS.getData(dataProvider);
+    if (fileRevisions != null && fileRevisions.length > 0) {
+      return ContainerUtil.mapNotNull(fileRevisions, FileRevisionToRevisionNumberFunction.INSTANCE);
+    }
+
+    return null;
+  }
+
+  private static class CommittedChangeListToRevisionNumberFunction implements Function<CommittedChangeList, VcsRevisionNumber> {
+
+    private static final CommittedChangeListToRevisionNumberFunction INSTANCE = new CommittedChangeListToRevisionNumberFunction();
+
+    /**
+     * TODO: Currently we do not return just "new VcsRevisionNumber.Long(changeList.getNumber())" for change lists which are not
+     * TODO: explicitly VcsRevisionNumberAware as a lot of unnecessary objects will be created because VCS_REVISION_NUMBERS value is
+     * TODO: obtained in CopyRevisionNumberAction.update().
+     * <p/>
+     * TODO: Decide if this is reasonable.
+     */
+    @Override
+    public VcsRevisionNumber fun(CommittedChangeList changeList) {
+      return changeList instanceof VcsRevisionNumberAware ? ((VcsRevisionNumberAware)changeList).getRevisionNumber() : null;
+    }
+  }
+
+  private static class FileRevisionToRevisionNumberFunction implements Function<VcsFileRevision, VcsRevisionNumber> {
+
+    private static final FileRevisionToRevisionNumberFunction INSTANCE = new FileRevisionToRevisionNumberFunction();
+
+    @Override
+    public VcsRevisionNumber fun(VcsFileRevision fileRevision) {
+      return fileRevision.getRevisionNumber();
+    }
+  }
+}
index 13db4a2bc8ab0f651d3c07a86651000653e012cf..27d22010dcd8bd07de94c9ab038f38c606b94dd4 100644 (file)
@@ -20,10 +20,7 @@ import com.intellij.openapi.actionSystem.AnAction;
 import com.intellij.openapi.diagnostic.Logger;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.util.text.StringUtil;
-import com.intellij.openapi.vcs.FilePath;
-import com.intellij.openapi.vcs.FilePathImpl;
-import com.intellij.openapi.vcs.VcsConfiguration;
-import com.intellij.openapi.vcs.VcsException;
+import com.intellij.openapi.vcs.*;
 import com.intellij.openapi.vcs.annotate.ShowAllAffectedGenericAction;
 import com.intellij.openapi.vcs.changes.ContentRevision;
 import com.intellij.openapi.vcs.history.*;
@@ -71,7 +68,7 @@ public class GitHistoryProvider implements VcsHistoryProviderEx, VcsCacheableHis
   public AnAction[] getAdditionalActions(Runnable refresher) {
     return new AnAction[] {
       ShowAllAffectedGenericAction.getInstance(),
-      ActionManager.getInstance().getAction("Vcs.CopyRevisionNumberAction"),
+      ActionManager.getInstance().getAction(VcsActions.ACTION_COPY_REVISION_NUMBER),
       new SelectRevisionInGitLogAction() };
   }
 
index ec653ae8ec02de7369ddf458f18a44ba6577dce2..f66926396fe2851dd5d06c7452379b29363aeecb 100644 (file)
@@ -132,8 +132,6 @@ hg4idea.dialog.login.password.required=Login and password required
 hg4idea.dialog.login.description=Login to {0}
 hg4idea.exception.file.not.under.hg=The file {0} is not under Mercurial.
 
-hg4idea.history.copy.revision.number=Copy Revision Number
-
 hg4idea.changelist.column.branch=Branch
 
 hg4idea.annotation.tool.tip=commit {0}\nAuthor: {1}\nDate: {2}\n\n{3}
diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/HgCopyHistoryRevisionNumberAction.java b/plugins/hg4idea/src/org/zmlx/hg4idea/HgCopyHistoryRevisionNumberAction.java
deleted file mode 100644 (file)
index 20943e9..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright 2000-2012 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.zmlx.hg4idea;
-
-import com.intellij.openapi.actionSystem.AnAction;
-import com.intellij.openapi.actionSystem.AnActionEvent;
-import com.intellij.openapi.ide.CopyPasteManager;
-import com.intellij.openapi.project.DumbAware;
-import com.intellij.openapi.vcs.VcsDataKeys;
-import com.intellij.openapi.vcs.history.VcsFileRevision;
-import com.intellij.util.PlatformIcons;
-
-import java.awt.datatransfer.StringSelection;
-
-/**
- * @author Nadya Zabrodina
- */
-public class HgCopyHistoryRevisionNumberAction extends AnAction implements DumbAware {
-
-  public HgCopyHistoryRevisionNumberAction() {
-    super(HgVcsMessages.message("hg4idea.history.copy.revision.number"),
-          HgVcsMessages.message("hg4idea.history.copy.revision.number"),
-          PlatformIcons.COPY_ICON);
-  }
-
-  @Override
-  public void actionPerformed(AnActionEvent e) {
-    VcsFileRevision revision = e.getData(VcsDataKeys.VCS_FILE_REVISION);
-    if (revision != null) {
-      CopyPasteManager.getInstance().setContents(new StringSelection(revision.getRevisionNumber().asString()));
-    }
-  }
-
-  @Override
-  public void update(AnActionEvent e) {
-    super.update(e);
-    e.getPresentation().setEnabled((e.getData(VcsDataKeys.VCS_FILE_REVISION) != null));
-  }
-}
-
-
index 95719546aa7e51164206f49fd277b27ca91c73f2..a2bde4eb8b2a6236d9960014a17e329b5a7c5b2b 100644 (file)
 // limitations under the License.
 package org.zmlx.hg4idea.provider;
 
+import com.intellij.openapi.actionSystem.ActionManager;
 import com.intellij.openapi.actionSystem.AnAction;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.vcs.FilePath;
+import com.intellij.openapi.vcs.VcsActions;
 import com.intellij.openapi.vcs.VcsConfiguration;
 import com.intellij.openapi.vcs.VcsException;
 import com.intellij.openapi.vcs.annotate.ShowAllAffectedGenericAction;
@@ -24,7 +26,6 @@ import com.intellij.util.ui.ColumnInfo;
 import com.intellij.vcsUtil.VcsUtil;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import org.zmlx.hg4idea.HgCopyHistoryRevisionNumberAction;
 import org.zmlx.hg4idea.HgFile;
 import org.zmlx.hg4idea.HgFileRevision;
 import org.zmlx.hg4idea.HgVcsMessages;
@@ -53,7 +54,8 @@ public class HgHistoryProvider implements VcsHistoryProvider {
   }
 
   public AnAction[] getAdditionalActions(Runnable runnable) {
-    return new AnAction[]{ShowAllAffectedGenericAction.getInstance(), new HgCopyHistoryRevisionNumberAction()};
+    return new AnAction[]{ShowAllAffectedGenericAction.getInstance(),
+      ActionManager.getInstance().getAction(VcsActions.ACTION_COPY_REVISION_NUMBER)};
   }
 
   public boolean isDateOmittable() {
index 5f5edd12eea703fcdabeaa08eb522b0d498910dd..3df9f90c77493d8c136cf24dc9c98f15c8307cb5 100644 (file)
@@ -152,9 +152,8 @@ public class SvnDiffProvider extends DiffProviderEx implements DiffProvider, Dif
     }
 
     try {
-      final String message = getCommitMessage(path);
       return new VcsRevisionDescriptionImpl(new SvnRevisionNumber(svnInfo.getCommittedRevision()), svnInfo.getCommittedDate(),
-                                            svnInfo.getAuthor(), message);
+                                            svnInfo.getAuthor(), getCommitMessage(path, svnInfo.getCommittedRevision()));
     }
     catch (VcsException e) {
       LOG.info(e);    // most likely the file is unversioned
@@ -163,9 +162,9 @@ public class SvnDiffProvider extends DiffProviderEx implements DiffProvider, Dif
   }
 
   @Nullable
-  private String getCommitMessage(File path) throws VcsException {
+  private String getCommitMessage(@NotNull File path, @Nullable SVNRevision revision) throws VcsException {
     PropertyValue property =
-      myVcs.getFactory(path).createPropertyClient().getProperty(SvnTarget.fromFile(path), COMMIT_MESSAGE, true, SVNRevision.BASE);
+      myVcs.getFactory(path).createPropertyClient().getProperty(SvnTarget.fromFile(path), COMMIT_MESSAGE, true, revision);
 
     return PropertyValue.toString(property);
   }
index fe95e91f1d99ef8e0b8d055c83f5f86103e520f6..3d3112d1ec5a74bb1e34c9f2689529a3b630f0c9 100644 (file)
@@ -618,10 +618,8 @@ public class SvnVcs extends AbstractVcs<CommittedChangeList> {
   }
 
   @Nullable
-  public Info getInfo(@NotNull SVNURL url,
-                         SVNRevision pegRevision,
-                         SVNRevision revision) throws SvnBindException {
-    return getFactory().createInfoClient().doInfo(url, pegRevision, revision);
+  public Info getInfo(@NotNull SVNURL url, SVNRevision pegRevision, SVNRevision revision) throws SvnBindException {
+    return getFactory().createInfoClient().doInfo(SvnTarget.fromURL(url, pegRevision), revision);
   }
 
   @Nullable
index 29f15423e581a22125cf128226d24265ef96692e..38a953d31010a40c9fe2bdc6f92708719f84c5cc 100644 (file)
@@ -56,6 +56,7 @@ import org.tmatesoft.svn.core.auth.ISVNAuthenticationManager;
 import org.tmatesoft.svn.core.auth.SVNAuthentication;
 import org.tmatesoft.svn.core.internal.util.SVNURLUtil;
 import org.tmatesoft.svn.core.wc.SVNRevision;
+import org.tmatesoft.svn.core.wc2.SvnTarget;
 
 import javax.swing.*;
 import java.awt.*;
@@ -251,7 +252,7 @@ public class SvnAuthenticationNotifier extends GenericNotifierImpl<SvnAuthentica
     Info info = null;
 
     try {
-      info = factory.create(InfoClient.class, false).doInfo(url, SVNRevision.UNDEFINED, SVNRevision.UNDEFINED);
+      info = factory.create(InfoClient.class, false).doInfo(SvnTarget.fromURL(url), SVNRevision.UNDEFINED);
     }
     catch (SvnBindException ignore) {
     }
index 239e7b6ab2252044ae802eac4f365dc10ccf35ac..9c9fbf93079fc7a70c80c435715f3b82b2cebbe5 100644 (file)
@@ -63,7 +63,7 @@ public class CmdBrowseClient extends BaseSvnClient implements BrowseClient {
     parameters.add("--xml");
 
     CommandExecutor command = execute(myVcs, target, SvnCommandName.list, parameters, null);
-    Info info = myFactory.createInfoClient().doInfo(target.getURL(), target.getPegRevision(), revision);
+    Info info = myFactory.createInfoClient().doInfo(target, revision);
 
     try {
       parseOutput(target.getURL(), command, handler, info != null ? info.getRepositoryRootURL() : null);
index 50bd222e98c309a2e0b634ff4790b7aeb4e0550b..631e8601c2b1cca4344cdf08585f5defce911a55 100644 (file)
@@ -79,7 +79,7 @@ public class CmdCheckinClient extends BaseSvnClient implements CheckinClient {
 
     IdeaCommitHandler handler = new IdeaCommitHandler(ProgressManager.getInstance().getProgressIndicator());
     CmdCheckinClient.CommandListener listener = new CommandListener(handler);
-    listener.setBaseDirectory(CommandUtil.correctUpToExistingParent(paths.get(0)));
+    listener.setBaseDirectory(CommandUtil.requireExistingParent(paths.get(0)));
     execute(myVcs, SvnTarget.fromFile(paths.get(0)), null, command, listener);
     listener.throwExceptionIfOccurred();
 
index e10cf073b3b651f6041074478602621c497ade44..52fc6007e05155665ef417e5bdcf4f6052f194dc 100644 (file)
@@ -119,7 +119,7 @@ public class Command {
     return ContainerUtil.isEmpty(myTargets) ? null : ContainerUtil.map(myTargets, new Function<File, String>() {
       @Override
       public String fun(File file) {
-        return file.getAbsolutePath();
+        return CommandUtil.format(file.getAbsolutePath(), null);
       }
     });
   }
index e86fdf388a7fa5c980798e6d01cd3c832951c195..91d7c04ccec4ecbb1573c955f1d5877c340aa94b 100644 (file)
@@ -65,7 +65,7 @@ public class CommandParametersResolutionModule extends BaseCommandRuntimeModule
     SvnTarget target = command.getTarget();
     File workingDirectory = target.isFile() ? target.getFile() : null;
     // TODO: Do we really need search existing parent - or just take parent directory if target is file???
-    workingDirectory = CommandUtil.correctUpToExistingParent(workingDirectory);
+    workingDirectory = CommandUtil.findExistingParent(workingDirectory);
 
     if (workingDirectory == null) {
       workingDirectory =
index 2635dfb7fa9e735771b735383c0a597caef6a851..e6379c65908253c404c0d6aadd6eae685e0105f1 100644 (file)
@@ -1,7 +1,9 @@
 package org.jetbrains.idea.svn.commandLine;
 
 import com.intellij.openapi.application.PathManager;
+import com.intellij.openapi.diagnostic.Logger;
 import com.intellij.openapi.util.text.StringUtil;
+import com.intellij.util.ObjectUtils;
 import com.intellij.util.text.DateFormatUtil;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
@@ -23,6 +25,8 @@ import java.util.List;
  */
 public class CommandUtil {
 
+  private static final Logger LOG = Logger.getInstance(CommandUtil.class);
+
   /**
    * Puts given value to parameters if condition is satisfied
    *
@@ -53,6 +57,11 @@ public class CommandUtil {
   }
 
   public static void put(@NotNull List<String> parameters, @NotNull String path, @Nullable SVNRevision pegRevision) {
+    parameters.add(format(path, pegRevision));
+  }
+
+  @NotNull
+  public static String format(@NotNull String path, @Nullable SVNRevision pegRevision) {
     StringBuilder builder = new StringBuilder(path);
 
     boolean hasAtSymbol = path.contains("@");
@@ -69,7 +78,7 @@ public class CommandUtil {
       builder.append(format(pegRevision));
     }
 
-    parameters.add(builder.toString());
+    return builder.toString();
   }
 
   public static void put(@NotNull List<String> parameters, @NotNull SvnTarget target) {
@@ -203,11 +212,23 @@ public class CommandUtil {
     return contentsStatus;
   }
 
-  public static File correctUpToExistingParent(File base) {
-    while (base != null) {
-      if (base.exists() && base.isDirectory()) return base;
-      base = base.getParentFile();
+  @Nullable
+  public static File findExistingParent(@Nullable File file) {
+    while (file != null) {
+      if (file.exists() && file.isDirectory()) return file;
+      file = file.getParentFile();
     }
     return null;
   }
+
+  @NotNull
+  public static File requireExistingParent(@NotNull File file) {
+    File result = findExistingParent(file);
+
+    if (result == null) {
+      LOG.error("Existing parent not found for " + file.getAbsolutePath());
+    }
+
+    return ObjectUtils.assertNotNull(result);
+  }
 }
index f98d4de249fa17d95bdadacc938a97f7b055860f..0be7f65cb1f5ae3c473b288b9dce6c131122920b 100644 (file)
@@ -29,7 +29,9 @@ import com.intellij.openapi.vcs.AbstractVcs;
 import com.intellij.openapi.vcs.FilePath;
 import com.intellij.openapi.vcs.VcsException;
 import com.intellij.openapi.vcs.changes.*;
+import com.intellij.openapi.vcs.history.VcsRevisionNumber;
 import com.intellij.openapi.vcs.versionBrowser.CommittedChangeList;
+import com.intellij.openapi.vcs.versionBrowser.VcsRevisionNumberAware;
 import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.util.ConstantFunction;
 import com.intellij.util.NotNullFunction;
@@ -56,13 +58,14 @@ import java.io.File;
 import java.io.IOException;
 import java.util.*;
 
-public class SvnChangeList implements CommittedChangeList {
+public class SvnChangeList implements CommittedChangeList, VcsRevisionNumberAware {
   private static final Logger LOG = Logger.getInstance("#org.jetbrains.idea.svn.history");
 
   private final SvnVcs myVcs;
   private final SvnRepositoryLocation myLocation;
   private String myRepositoryRoot;
   private long myRevision;
+  private VcsRevisionNumber myRevisionNumber;
   private String myAuthor;
   private Date myDate;
   private String myMessage;
@@ -88,7 +91,7 @@ public class SvnChangeList implements CommittedChangeList {
     final SvnChangeList sample = (SvnChangeList) lists.get(0);
     myVcs = sample.myVcs;
     myLocation = location;
-    myRevision = sample.myRevision;
+    setRevision(sample.myRevision);
     myAuthor = sample.myAuthor;
     myDate = sample.myDate;
     myMessage = sample.myMessage;
@@ -108,7 +111,7 @@ public class SvnChangeList implements CommittedChangeList {
   public SvnChangeList(SvnVcs vcs, @NotNull final SvnRepositoryLocation location, final LogEntry logEntry, String repositoryRoot) {
     myVcs = vcs;
     myLocation = location;
-    myRevision = logEntry.getRevision();
+    setRevision(logEntry.getRevision());
     myAuthor = StringUtil.notNullize(logEntry.getAuthor());
     myDate = logEntry.getDate();
     myMessage = StringUtil.notNullize(logEntry.getMessage());
@@ -171,6 +174,16 @@ public class SvnChangeList implements CommittedChangeList {
     return myDate;
   }
 
+  @Nullable
+  @Override
+  public VcsRevisionNumber getRevisionNumber() {
+    return myRevisionNumber;
+  }
+
+  private void setRevision(long revision) {
+    myRevision = revision;
+    myRevisionNumber = new SvnRevisionNumber(SVNRevision.create(revision));
+  }
 
   public Collection<Change> getChanges() {
     if (myListsHolder == null) {
@@ -658,7 +671,7 @@ public class SvnChangeList implements CommittedChangeList {
   private void readFromStream(@NotNull DataInput stream, final boolean supportsCopyFromInfo, final boolean supportsReplaced)
     throws IOException {
     myRepositoryRoot = stream.readUTF();
-    myRevision = stream.readLong();
+    setRevision(stream.readLong());
     myAuthor = stream.readUTF();
     myDate = new Date(stream.readLong());
     myMessage = stream.readUTF();
index c5bc11f485bdd3f499009825503c1098f4730b4f..5cedfbf4236917ee162449b904e9b5cab9919fb1 100644 (file)
@@ -15,6 +15,7 @@
  */
 package org.jetbrains.idea.svn.history;
 
+import com.intellij.openapi.actionSystem.ActionManager;
 import com.intellij.openapi.actionSystem.AnAction;
 import com.intellij.openapi.progress.ProgressIndicator;
 import com.intellij.openapi.progress.ProgressManager;
@@ -22,6 +23,7 @@ import com.intellij.openapi.util.Pair;
 import com.intellij.openapi.util.Ref;
 import com.intellij.openapi.util.text.StringUtil;
 import com.intellij.openapi.vcs.FilePath;
+import com.intellij.openapi.vcs.VcsActions;
 import com.intellij.openapi.vcs.VcsConfiguration;
 import com.intellij.openapi.vcs.VcsException;
 import com.intellij.openapi.vcs.annotate.ShowAllAffectedGenericAction;
@@ -469,7 +471,9 @@ public class SvnHistoryProvider
 
   @Override
   public AnAction[] getAdditionalActions(final Runnable refresher) {
-    return new AnAction[]{ ShowAllAffectedGenericAction.getInstance(), new MergeSourceDetailsAction(), new SvnEditCommitMessageFromFileHistoryAction()};
+    return new AnAction[]{ShowAllAffectedGenericAction.getInstance(),
+      ActionManager.getInstance().getAction(VcsActions.ACTION_COPY_REVISION_NUMBER), new MergeSourceDetailsAction(),
+      new SvnEditCommitMessageFromFileHistoryAction()};
   }
 
   @Override
index 0077bd3aba5aa2591c1b869c5aab0ffe4360869e..421393bbae297f0f1298f2d8ad0e7ca7ac191655 100644 (file)
@@ -29,7 +29,6 @@ import org.jetbrains.idea.svn.api.BaseSvnClient;
 import org.jetbrains.idea.svn.api.Depth;
 import org.jetbrains.idea.svn.commandLine.*;
 import org.tmatesoft.svn.core.SVNException;
-import org.tmatesoft.svn.core.SVNURL;
 import org.tmatesoft.svn.core.wc.SVNRevision;
 import org.tmatesoft.svn.core.wc2.SvnTarget;
 import org.xml.sax.SAXException;
@@ -144,37 +143,29 @@ public class CmdInfoClient extends BaseSvnClient implements InfoClient {
   }
 
   @NotNull
-  private static List<String> buildParameters(@NotNull String path,
-                                              @Nullable SVNRevision pegRevision,
-                                              @Nullable SVNRevision revision,
-                                              @Nullable Depth depth) {
+  private static List<String> buildParameters(@NotNull SvnTarget target, @Nullable SVNRevision revision, @Nullable Depth depth) {
     List<String> parameters = ContainerUtil.newArrayList();
 
     CommandUtil.put(parameters, depth);
     CommandUtil.put(parameters, revision);
-    CommandUtil.put(parameters, path, pegRevision);
+    CommandUtil.put(parameters, target);
     parameters.add("--xml");
 
     return parameters;
   }
 
   @Override
-  public Info doInfo(File path, SVNRevision revision) throws SvnBindException {
-    File base = path.isDirectory() ? path : path.getParentFile();
-    base = CommandUtil.correctUpToExistingParent(base);
-    if (base == null) {
-      // very unrealistic
-      throw new SvnBindException("Can not find existing parent file");
-    }
+  public Info doInfo(@NotNull File path, @Nullable SVNRevision revision) throws SvnBindException {
+    File base = CommandUtil.requireExistingParent(path);
 
-    return parseResult(base, execute(buildParameters(path.getAbsolutePath(), SVNRevision.UNDEFINED, revision, Depth.EMPTY), path));
+    return parseResult(base, execute(buildParameters(SvnTarget.fromFile(path), revision, Depth.EMPTY), path));
   }
 
   @Override
-  public Info doInfo(SVNURL url, SVNRevision pegRevision, SVNRevision revision) throws SvnBindException {
-    CommandExecutor command =
-      execute(myVcs, SvnTarget.fromURL(url), SvnCommandName.info, buildParameters(url.toString(), pegRevision, revision, Depth.EMPTY),
-              null);
+  public Info doInfo(@NotNull SvnTarget target, @Nullable SVNRevision revision) throws SvnBindException {
+    assertUrl(target);
+
+    CommandExecutor command = execute(myVcs, target, SvnCommandName.info, buildParameters(target, revision, Depth.EMPTY), null);
 
     return parseResult(null, command.getOutput());
   }
@@ -184,7 +175,7 @@ public class CmdInfoClient extends BaseSvnClient implements InfoClient {
     File base = ContainerUtil.getFirstItem(paths);
 
     if (base != null) {
-      base = CommandUtil.correctUpToExistingParent(base);
+      base = CommandUtil.requireExistingParent(base);
 
       List<String> parameters = ContainerUtil.newArrayList();
       for (File file : paths) {
index 56f87a040b17489239eafc8ced975dd09d008a74..353c83a21735fc706afa3914698b2bd7aa426d9a 100644 (file)
@@ -19,8 +19,8 @@ import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 import org.jetbrains.idea.svn.api.SvnClient;
 import org.jetbrains.idea.svn.commandLine.SvnBindException;
-import org.tmatesoft.svn.core.SVNURL;
 import org.tmatesoft.svn.core.wc.SVNRevision;
+import org.tmatesoft.svn.core.wc2.SvnTarget;
 
 import java.io.File;
 import java.util.Collection;
@@ -33,9 +33,9 @@ import java.util.Collection;
  */
 public interface InfoClient extends SvnClient {
 
-  Info doInfo(File path, SVNRevision revision) throws SvnBindException;
+  Info doInfo(@NotNull File path, @Nullable SVNRevision revision) throws SvnBindException;
 
-  Info doInfo(SVNURL url, SVNRevision pegRevision, SVNRevision revision) throws SvnBindException;
+  Info doInfo(@NotNull SvnTarget target, @Nullable SVNRevision revision) throws SvnBindException;
 
   void doInfo(@NotNull Collection<File> paths, @Nullable InfoConsumer handler) throws SvnBindException;
 }
index 3db2c647791a416774f7dfa4e61aad573821019a..32d6b0cb5062b45727e48d099849ffaef5cda9f2 100644 (file)
@@ -20,9 +20,9 @@ import org.jetbrains.annotations.Nullable;
 import org.jetbrains.idea.svn.api.BaseSvnClient;
 import org.jetbrains.idea.svn.commandLine.SvnBindException;
 import org.tmatesoft.svn.core.SVNException;
-import org.tmatesoft.svn.core.SVNURL;
 import org.tmatesoft.svn.core.wc.SVNRevision;
 import org.tmatesoft.svn.core.wc.SVNWCClient;
+import org.tmatesoft.svn.core.wc2.SvnTarget;
 
 import java.io.File;
 import java.util.Collection;
@@ -40,7 +40,7 @@ public class SvnKitInfoClient extends BaseSvnClient implements InfoClient {
   }
 
   @Override
-  public Info doInfo(File path, SVNRevision revision) throws SvnBindException {
+  public Info doInfo(@NotNull File path, @Nullable SVNRevision revision) throws SvnBindException {
     try {
       return Info.create(getClient().doInfo(path, revision));
     }
@@ -50,9 +50,11 @@ public class SvnKitInfoClient extends BaseSvnClient implements InfoClient {
   }
 
   @Override
-  public Info doInfo(SVNURL url, SVNRevision pegRevision, SVNRevision revision) throws SvnBindException {
+  public Info doInfo(@NotNull SvnTarget target, @Nullable SVNRevision revision) throws SvnBindException {
+    assertUrl(target);
+
     try {
-      return Info.create(getClient().doInfo(url, pegRevision, revision));
+      return Info.create(getClient().doInfo(target.getURL(), target.getPegRevision(), revision));
     }
     catch (SVNException e) {
       throw new SvnBindException(e);
index 4eaf8d09d794d14323957d1e1a6384735dc71cd9..4cc7d822a2fb142b59282009778f13043c5e0eae 100644 (file)
@@ -104,7 +104,7 @@ public class CmdMergeClient extends BaseSvnClient implements MergeClient {
   }
 
   private void run(File destination, ProgressTracker handler, List<String> parameters) throws VcsException {
-    BaseUpdateCommandListener listener = new BaseUpdateCommandListener(CommandUtil.correctUpToExistingParent(destination), handler);
+    BaseUpdateCommandListener listener = new BaseUpdateCommandListener(CommandUtil.requireExistingParent(destination), handler);
 
     execute(myVcs, SvnTarget.fromFile(destination), SvnCommandName.merge, parameters, listener);
 
index 8100d73da220abbbcd9b328e29fee2be2681ad06..d626d6f03e3a78e0d36ef946d3e385e3bda4859b 100644 (file)
@@ -31,7 +31,7 @@ import org.tmatesoft.svn.core.SVNErrorCode;
 import org.tmatesoft.svn.core.SVNException;
 import org.tmatesoft.svn.core.SVNURL;
 import org.tmatesoft.svn.core.internal.util.SVNPathUtil;
-import org.tmatesoft.svn.core.wc.*;
+import org.tmatesoft.svn.core.wc.SVNRevision;
 import org.tmatesoft.svn.core.wc2.SvnTarget;
 import org.xml.sax.SAXException;
 
@@ -52,18 +52,16 @@ import java.util.*;
 public class CmdStatusClient extends BaseSvnClient implements StatusClient {
 
   @Override
-  public long doStatus(final File path,
-                       final SVNRevision revision,
-                       final Depth depth,
+  public long doStatus(@NotNull final File path,
+                       @Nullable final SVNRevision revision,
+                       @NotNull final Depth depth,
                        boolean remote,
                        boolean reportAll,
                        boolean includeIgnored,
                        boolean collectParentExternals,
-                       final StatusConsumer handler,
-                       final Collection changeLists) throws SvnBindException {
-    File base = path.isDirectory() ? path : path.getParentFile();
-    base = CommandUtil.correctUpToExistingParent(base);
-
+                       @NotNull final StatusConsumer handler,
+                       @Nullable final Collection changeLists) throws SvnBindException {
+    File base = CommandUtil.requireExistingParent(path);
     final Info infoBase = myFactory.createInfoClient().doInfo(base, revision);
     List<String> parameters = new ArrayList<String>();
 
@@ -235,7 +233,7 @@ public class CmdStatusClient extends BaseSvnClient implements StatusClient {
   }
 
   @Override
-  public Status doStatus(File path, boolean remote) throws SvnBindException {
+  public Status doStatus(@NotNull File path, boolean remote) throws SvnBindException {
     final Status[] svnStatus = new Status[1];
     doStatus(path, SVNRevision.UNDEFINED, Depth.EMPTY, remote, false, false, false, new StatusConsumer() {
       @Override
index 9bbf74b62084b6f37db86128da611520e4f97c8d..98895caa98e98675ab88b0592a56d3b75c32f4d7 100644 (file)
@@ -15,6 +15,7 @@
  */
 package org.jetbrains.idea.svn.status;
 
+import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 import org.jetbrains.idea.svn.api.Depth;
 import org.jetbrains.idea.svn.api.SvnClient;
@@ -35,16 +36,16 @@ public interface StatusClient extends SvnClient {
   /**
    * TODO: Return value is never used by other code
    */
-  long doStatus(File path,
-                SVNRevision revision,
-                Depth depth,
+  long doStatus(@NotNull File path,
+                @Nullable SVNRevision revision,
+                @NotNull Depth depth,
                 boolean remote,
                 boolean reportAll,
                 boolean includeIgnored,
                 boolean collectParentExternals,
-                StatusConsumer handler,
-                Collection changeLists) throws SvnBindException;
+                @NotNull StatusConsumer handler,
+                @Nullable Collection changeLists) throws SvnBindException;
 
   @Nullable
-  Status doStatus(File path, boolean remote) throws SvnBindException;
+  Status doStatus(@NotNull File path, boolean remote) throws SvnBindException;
 }
index 3f33435c678d83777e754152f14a3b5496064f2f..955c1456722be193eef579a9a940ed5a56bf50f3 100644 (file)
@@ -49,15 +49,15 @@ public class SvnKitStatusClient extends BaseSvnClient implements StatusClient {
   }
 
   @Override
-  public long doStatus(File path,
-                       SVNRevision revision,
-                       Depth depth,
+  public long doStatus(@NotNull File path,
+                       @Nullable SVNRevision revision,
+                       @NotNull Depth depth,
                        boolean remote,
                        boolean reportAll,
                        boolean includeIgnored,
                        boolean collectParentExternals,
-                       final StatusConsumer handler,
-                       Collection changeLists) throws SvnBindException {
+                       @NotNull final StatusConsumer handler,
+                       @Nullable Collection changeLists) throws SvnBindException {
     try {
       return getStatusClient()
         .doStatus(path, revision, toDepth(depth), remote, reportAll, includeIgnored, collectParentExternals, new ISVNStatusHandler() {
@@ -74,7 +74,7 @@ public class SvnKitStatusClient extends BaseSvnClient implements StatusClient {
 
   @Override
   @Nullable
-  public Status doStatus(File path, boolean remote) throws SvnBindException {
+  public Status doStatus(@NotNull File path, boolean remote) throws SvnBindException {
     try {
       return Status.create(getStatusClient().doStatus(path, remote));
     }