Mercurial > hg > mercurial
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); + } + +}