[Mercurial] IDEA-56165 Throw a VcsException if the file is not under mercurial. Small...
authorKirill Likhodedov <kirill.likhodedov@jetbrains.com>
Tue, 6 Jul 2010 09:11:53 +0000 (13:11 +0400)
committerKirill Likhodedov <kirill.likhodedov@jetbrains.com>
Tue, 6 Jul 2010 09:11:53 +0000 (13:11 +0400)
plugins/hg4idea/resources/org/zmlx/hg4idea/HgVcsMessages.properties
plugins/hg4idea/src/org/zmlx/hg4idea/HgUtil.java
plugins/hg4idea/src/org/zmlx/hg4idea/provider/HgHistoryProvider.java

index 11a6555a05d3b6c9219e04098b8c60c257e8b96f..558b4078d9df850e068bc4e520eaa8d139be3767 100644 (file)
@@ -103,3 +103,5 @@ hg4idea.error.invalidExecutable=\"{0}\" is not a valid mercurial executable
 hg4idea.integrate.other.head=Other head: {0}
 
 hgidea.dialog.login.password.required=Login and password required
+
+hg4idea.exception.file.not.under.hg=The file {0} is not under Mercurial.
index 21ed4617406ede63a7039fdb0bec43c42bb7bd1f..27f6fb775a2c82734d58a6bfe1fd129c99d5ed0c 100644 (file)
@@ -16,6 +16,7 @@ import com.intellij.openapi.application.ApplicationManager;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.util.ShutDownTracker;
 import com.intellij.openapi.vcs.FilePath;
+import com.intellij.openapi.vcs.VcsException;
 import com.intellij.openapi.vcs.changes.VcsDirtyScopeManager;
 import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.ui.GuiUtils;
@@ -187,4 +188,29 @@ public abstract class HgUtil {
   public static boolean isHgRoot(VirtualFile dir) {
     return dir.findChild(".hg") != null;
   }
+
+  /**
+   * Gets the Mercurial root for the given file path or null if non exists:
+   * the root should not only be in directory mappings, but also the .hg repository folder should exist.
+   * @see #getHgRootOrThrow(com.intellij.openapi.project.Project, com.intellij.openapi.vcs.FilePath)
+   */
+  @Nullable
+  public static VirtualFile getHgRootOrNull(Project project, FilePath filePath) {
+    final VirtualFile vf = VcsUtil.getVcsRootFor(project, filePath);
+    return (vf == null || !isHgRoot(vf) ? null : vf);
+  }
+
+  /**
+   * Gets the Mercurial root for the given file path or throws a VcsException if non exists:
+   * the root should not only be in directory mappings, but also the .hg repository folder should exist.
+   * @see #getHgRootOrNull(com.intellij.openapi.project.Project, com.intellij.openapi.vcs.FilePath)
+   */
+  @NotNull
+  public static VirtualFile getHgRootOrThrow(Project project, FilePath filePath) throws VcsException {
+    final VirtualFile vf = getHgRootOrNull(project, filePath);
+    if (vf == null) {
+      throw new VcsException(HgVcsMessages.message("hg4idea.exception.file.not.under.hg", filePath.getPresentableUrl()));
+    }
+    return vf;
+  }
 }
index 1eb8b702a1e4507cae631901e3a4ef516565b39d..1dd00a596ea94b931d84ebc5fc4c3ba52c611549 100644 (file)
@@ -23,22 +23,23 @@ import com.intellij.vcsUtil.VcsUtil;
 import org.jetbrains.annotations.Nullable;
 import org.zmlx.hg4idea.HgFile;
 import org.zmlx.hg4idea.HgFileRevision;
+import org.zmlx.hg4idea.HgUtil;
+import org.zmlx.hg4idea.HgVcsMessages;
 import org.zmlx.hg4idea.command.HgLogCommand;
 import org.zmlx.hg4idea.command.HgWorkingCopyRevisionsCommand;
 
 import javax.swing.*;
 import java.util.Collections;
-import java.util.LinkedList;
 import java.util.List;
 
 public class HgHistoryProvider implements VcsHistoryProvider {
 
   private static final int DEFAULT_LIMIT = 500;
 
-  private final Project project;
+  private final Project myProject;
 
   public HgHistoryProvider(Project project) {
-    this.project = project;
+    myProject = project;
   }
 
   public VcsDependentHistoryComponents getUICustomization(VcsHistorySession session,
@@ -59,54 +60,32 @@ public class HgHistoryProvider implements VcsHistoryProvider {
   }
 
   public VcsHistorySession createSessionFor(FilePath filePath) throws VcsException {
-    final VirtualFile vcsRoot = VcsUtil.getVcsRootFor(project, filePath);
+    final VirtualFile vcsRoot = VcsUtil.getVcsRootFor(myProject, filePath);
     if (vcsRoot == null) {
       return null;
     }
-    HgFile hgFile = new HgFile(vcsRoot, filePath);
-    List<HgFileRevision> revisions = getHistory(filePath, vcsRoot, project, DEFAULT_LIMIT);
-    final List<VcsFileRevision> result = new LinkedList<VcsFileRevision>(revisions);
-    return new VcsHistorySession() {
-      public VcsRevisionNumber getCurrentRevisionNumber() {
-        return new HgWorkingCopyRevisionsCommand(project).firstParent(vcsRoot);
+    final List<HgFileRevision> revisions = getHistory(filePath, vcsRoot, myProject, DEFAULT_LIMIT);
+    return new VcsAbstractHistorySession(revisions) {
+      public VcsRevisionNumber calcCurrentRevisionNumber() {
+        return new HgWorkingCopyRevisionsCommand(myProject).firstParent(vcsRoot);
       }
 
       public HistoryAsTreeProvider getHistoryAsTreeProvider() {
         return null;
       }
-
-      public List<VcsFileRevision> getRevisionList() {
-        return result;
-      }
-
-      public boolean isCurrentRevision(VcsRevisionNumber vcsRevisionNumber) {
-        return vcsRevisionNumber.equals(getCurrentRevisionNumber());
-      }
-
-      public boolean shouldBeRefreshed() {
-        return false;
-      }
-
-      public boolean allowAsyncRefresh() {
-        return false;
-      }
-
-      public boolean isContentAvailable(VcsFileRevision vcsFileRevision) {
-        return false;
-      }
     };
   }
 
   public void reportAppendableHistory(FilePath filePath, final VcsAppendableHistorySessionPartner partner) throws VcsException {
-    final VirtualFile vcsRoot = VcsUtil.getVcsRootFor(project, filePath);
-    List<HgFileRevision> history = getHistory(filePath, vcsRoot, this.project, DEFAULT_LIMIT);
+    final VirtualFile vcsRoot = HgUtil.getHgRootOrThrow(myProject, filePath);
 
+    final List<HgFileRevision> history = getHistory(filePath, vcsRoot, myProject, DEFAULT_LIMIT);
     if (history.size() == 0) return;
-    
+
     final VcsAbstractHistorySession emptySession = new VcsAbstractHistorySession(Collections.<VcsFileRevision>emptyList()) {
       @Nullable
       protected VcsRevisionNumber calcCurrentRevisionNumber() {
-        return new HgWorkingCopyRevisionsCommand(project).firstParent(vcsRoot);
+        return new HgWorkingCopyRevisionsCommand(myProject).firstParent(vcsRoot);
       }
 
       public HistoryAsTreeProvider getHistoryAsTreeProvider() {
@@ -121,11 +100,10 @@ public class HgHistoryProvider implements VcsHistoryProvider {
     partner.finished();
   }
 
-  private List<HgFileRevision> getHistory(FilePath filePath, VirtualFile vcsRoot, Project project, int limit) {
-    HgLogCommand logCommand = new HgLogCommand(project);
+  private static List<HgFileRevision> getHistory(FilePath filePath, VirtualFile vcsRoot, Project project, int limit) {
+    final HgLogCommand logCommand = new HgLogCommand(project);
     logCommand.setFollowCopies(true);
     logCommand.setIncludeRemoved(true);
-
     return logCommand.execute(new HgFile(vcsRoot, filePath), limit, false);
   }