view mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/HgVersion.java @ 582:23abd5aa1115

TW-27233 bundle quartz
author Dmitry Neverov <dmitry.neverov@jetbrains.com>
date Mon, 08 Apr 2013 13:06:17 +0400
parents 45f25ca68312
children 31a1aca3305c
line wrap: on
line source
package jetbrains.buildServer.buildTriggers.vcs.mercurial;

import jetbrains.buildServer.buildTriggers.vcs.mercurial.command.exception.ParseHgVersionException;
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;


  public HgVersion(int major, int minor, int third) {
    myMajor = major;
    myMinor = minor;
    myThird = third;
  }


  public static HgVersion parse(@NotNull final String version) throws ParseHgVersionException {
    Parser p = new Parser(version);
    if (!p.skipString(PREFIX))
      throw new ParseHgVersionException(version);
    int major = p.readInt();
    p.skipString(".");
    int minor = p.readInt();
    int third = p.skipString(".") ? p.readInt() : 0;
    return new HgVersion(major, minor, third);
  }


  public boolean isEqualsOrGreaterThan(HgVersion other) {
    return compareTo(other) >= 0;
  }


  @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;
    }
  }
}