changeset 275:13f3e7d0c42c

Implement VersionCommand
author Dmitry Neverov <dmitry.neverov@jetbrains.com>
date Mon, 01 Aug 2011 16:38:05 +0400
parents 5cbb5ae712e9
children 8c10f5cec37d
files mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/HgVersion.java mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/BaseCommand.java mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/VersionCommand.java mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/HgVersionTest.java mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/VcsRootBuilder.java mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/VersionCommandTest.java
diffstat 6 files changed, 227 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/HgVersion.java	Mon Aug 01 16:38:05 2011 +0400
@@ -0,0 +1,99 @@
+package jetbrains.buildServer.buildTriggers.vcs.mercurial;
+
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * @author dmitry.neverov
+ */
+public class HgVersion implements Comparable<HgVersion> {
+
+  private static final String PREFIX = "Mercurial Distributed SCM (version ";
+
+  private final int myMajor;
+  private final int myMinor;
+  private final int myThird;
+
+
+  HgVersion(int major, int minor, int third) {
+    myMajor = major;
+    myMinor = minor;
+    myThird = third;
+  }
+
+
+  public static HgVersion parse(@NotNull final String version) {
+    Parser p = new Parser(version);
+    if (!p.skipString(PREFIX))
+      throw new IllegalArgumentException("Incorrect version format: " + version);
+    int major = p.readInt();
+    p.skipString(".");
+    int minor = p.readInt();
+    int third = p.skipString(".") ? p.readInt() : 0;
+    return new HgVersion(major, minor, third);
+  }
+
+
+  @Override
+  public String toString() {
+    return myMajor + "." + myMinor + "." + myThird;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    return (o instanceof HgVersion) && this.compareTo((HgVersion) o) == 0;
+  }
+
+  @Override
+  public int hashCode() {
+    int result = myMajor;
+    result = 31 * result + myMinor;
+    result = 31 * result + myThird;
+    return result;
+  }
+
+  public int compareTo(HgVersion other) {
+    int d = myMajor - other.myMajor;
+    if (d != 0)
+      return d;
+
+    d = myMinor - other.myMinor;
+    if (d != 0)
+      return d;
+
+    return myThird - other.myThird;
+  }
+
+
+  private static final class Parser {
+
+    private final String myString;
+    private int myIndex = 0;
+
+    Parser(@NotNull String string) {
+      myString = string;
+    }
+
+
+    boolean skipString(String str) {
+      if (myIndex == myString.length() || myIndex + str.length() > myString.length())
+        return false;
+      String substr = myString.substring(myIndex, myIndex + str.length());
+      if (substr.equals(str)) {
+        myIndex = myIndex + str.length();
+        return true;
+      } else {
+        return false;
+      }
+    }
+
+
+    int readInt() {
+      int result = 0;
+      while (myIndex < myString.length() && Character.isDigit(myString.codePointAt(myIndex))) {
+        result = result * 10 + Character.digit(myString.codePointAt(myIndex), 10);
+        myIndex++;
+      }
+      return result;
+    }
+  }
+}
--- a/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/BaseCommand.java	Thu Jul 28 16:40:11 2011 +0400
+++ b/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/BaseCommand.java	Mon Aug 01 16:38:05 2011 +0400
@@ -30,8 +30,8 @@
  * @author pavel
  */
 public class BaseCommand {
-  private Settings mySettings;
-  private String myWorkDirectory;
+  private final Settings mySettings;
+  private final String myWorkDirectory;
 
   public BaseCommand(@NotNull final Settings settings, @NotNull File workingDir) {
     mySettings = settings;
@@ -43,14 +43,6 @@
     return mySettings;
   }
 
-  /**
-   * Sets new working directory, by default working directory is taken from the Settings#getLocalRepositoryDir
-   * @param workDirectory work dir
-   */
-  public void setWorkDirectory(final String workDirectory) {
-    myWorkDirectory = workDirectory;
-  }
-
   public String getWorkDirectory() {
     return myWorkDirectory;
   }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/VersionCommand.java	Mon Aug 01 16:38:05 2011 +0400
@@ -0,0 +1,29 @@
+package jetbrains.buildServer.buildTriggers.vcs.mercurial.command;
+
+import com.intellij.execution.configurations.GeneralCommandLine;
+import jetbrains.buildServer.ExecResult;
+import jetbrains.buildServer.buildTriggers.vcs.mercurial.HgVersion;
+import jetbrains.buildServer.vcs.VcsException;
+import org.jetbrains.annotations.NotNull;
+
+import java.io.File;
+
+/**
+ * @author dmitry.neverov
+ */
+public class VersionCommand extends BaseCommand {
+
+  public VersionCommand(@NotNull final Settings settings, @NotNull File workingDir) {
+    super(settings, workingDir);
+  }
+
+
+  public HgVersion execute() throws VcsException {
+    GeneralCommandLine cli = createCommandLine();
+    cli.addParameter("version");
+    cli.addParameter("--quiet");
+    ExecResult result = runCommand(cli);
+    return HgVersion.parse(result.getStdout());
+  }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/HgVersionTest.java	Mon Aug 01 16:38:05 2011 +0400
@@ -0,0 +1,24 @@
+package jetbrains.buildServer.buildTriggers.vcs.mercurial;
+
+import junit.framework.TestCase;
+import org.jetbrains.annotations.NotNull;
+import org.testng.annotations.Test;
+
+/**
+ * @author dmitry.neverov
+ */
+@Test
+public class HgVersionTest extends TestCase {
+
+  public void test_parse() {
+    checkParseCorrectly("Mercurial Distributed SCM (version 1.7.1+11-cc4e13c92dfa)", "1.7.1");
+    checkParseCorrectly("Mercurial Distributed SCM (version 1.7)", "1.7.0");
+    checkParseCorrectly("Mercurial Distributed SCM (version 1.5.2)", "1.5.2");
+  }
+
+
+  private void checkParseCorrectly(@NotNull String versionToParse, @NotNull String expected) {
+    assertEquals(expected, HgVersion.parse(versionToParse).toString());
+  }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/VcsRootBuilder.java	Mon Aug 01 16:38:05 2011 +0400
@@ -0,0 +1,50 @@
+package jetbrains.buildServer.buildTriggers.vcs.mercurial;
+
+import jetbrains.buildServer.vcs.impl.VcsRootImpl;
+import org.jetbrains.annotations.NotNull;
+
+import java.io.IOException;
+
+/**
+ * @author dmitry.neverov
+ */
+public class VcsRootBuilder {
+
+  private String myRepository;
+  private String myUsername;
+  private String myPassword;
+  private long myRootId = 1L;
+
+  public VcsRootImpl build() throws IOException {
+    VcsRootImpl vcsRoot = new VcsRootImpl(1, Constants.VCS_NAME);
+    vcsRoot.addProperty(Constants.REPOSITORY_PROP, myRepository);
+    vcsRoot.addProperty(Constants.HG_COMMAND_PATH_PROP, Util.getHgPath());
+    vcsRoot.addProperty(Constants.USERNAME, myUsername);
+    vcsRoot.addProperty(Constants.PASSWORD, myPassword);
+    return vcsRoot;
+  }
+
+
+  public VcsRootBuilder repository(@NotNull String repository) {
+    myRepository = repository;
+    return this;
+  }
+
+
+  public VcsRootBuilder username(@NotNull String username) {
+    myUsername = username;
+    return this;
+  }
+
+
+  public VcsRootBuilder password(@NotNull String password) {
+    myPassword = password;
+    return this;
+  }
+
+
+  public VcsRootBuilder rootId(long rootId) {
+    myRootId = rootId;
+    return this;
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/VersionCommandTest.java	Mon Aug 01 16:38:05 2011 +0400
@@ -0,0 +1,23 @@
+package jetbrains.buildServer.buildTriggers.vcs.mercurial.command;
+
+import jetbrains.buildServer.buildTriggers.vcs.mercurial.HgVersion;
+import jetbrains.buildServer.buildTriggers.vcs.mercurial.VcsRootBuilder;
+import jetbrains.buildServer.vcs.impl.VcsRootImpl;
+import junit.framework.TestCase;
+
+import java.io.File;
+
+/**
+ * @author dmitry.neverov
+ */
+public class VersionCommandTest extends TestCase {
+
+  public void test() throws Exception {
+    VcsRootImpl root = new VcsRootBuilder().repository("some/repository").build();
+    Settings settings = new Settings(root);
+    VersionCommand versionCommand = new VersionCommand(settings, new File(".."));
+    HgVersion version = versionCommand.execute();
+    assertNotNull(version);
+  }
+
+}