@Override
  protected VersionWithType doInfer(Git git, GitflowVersioningConfiguration conf)
      throws GitAPIException, IOException {
    NearestVersion nearestVersion = new NearestVersionLocator().locate(git);

    return new VersionWithTypeBuilder(nearestVersion)
        .branch(conf.preReleaseIds().getDetachedHead())
        .distanceFromRelease()
        .sha(git, conf)
        .dirty(git, conf)
        .type(VersionType.DETACHED_HEAD)
        .build(conf);
  }
  public static void main(String[] args) throws Exception {

    // create Options object
    Options options = new Options();

    options.addOption("b", "branch", true, "force branch name in case of a detached repo");
    options.addOption(
        "s", "snapshot", false, "Use Maven SNAPSHOT instead of semver build metadata");
    options.addOption("m", "maven", false, "Maven compatible semver versions");
    options.addOption("l", "logLevel", true, "Configures log level to TRACE|DEBUG|INFO|WARN|ERROR");

    CommandLineParser parser = new DefaultParser();
    CommandLine cmd = parser.parse(options, args);

    String logLevel = cmd.getOptionValue("l", "error"); // $NON-NLS-1$
    System.setProperty("org.slf4j.simpleLogger.log.com.quicksign", logLevel); // $NON-NLS-1$
    LOGGER = LoggerFactory.getLogger(JGitFlowSemver.class);

    final GitflowVersioningConfiguration conf = new GitflowVersioningConfiguration();
    try {
      // parse the command line arguments
      CommandLine line = parser.parse(options, args);
      if (line.hasOption('b')) {
        conf.setForceBranch(line.getOptionValue('b'));
        LOGGER.debug("Forcing branch name {}", conf.getForceBranch());
      }
      if (line.hasOption('s')) {
        conf.useMavenSnapshot();
        LOGGER.debug("Maven snapshots mode");
      }
      if (line.hasOption('m')) {
        conf.mavenCompatibility();
        LOGGER.debug("Maven compatibility mode");
      }
      args = line.getArgs();
    } catch (ParseException exp) {
      printUsage(options, System.err);
      System.exit(1);
    }

    if (args.length != 1) {
      printUsage(options, System.err);
      System.exit(1);
    }

    try {
      Version v = null;
      final File root = new File(args[0]).getAbsoluteFile();
      final File dir = new File(root, ".git");
      conf.setRepositoryRoot(dir.getPath());

      if (new File(root, "pom.xml").exists()) {
        LOGGER.debug("Detected Maven pom.xml so activating Maven compatibility");
        conf.mavenCompatibility();
      }

      v = new JGitFlowSemver(dir, conf).infer();
      String adjusted = v.toString();
      if (conf.isMavenCompatibility()) {
        adjusted = adjusted.replaceAll("\\+", ".");
      }
      System.out.println(adjusted);
    } catch (Exception e) {
      System.err.println("An error ocured: " + e);
      LOGGER.error("An error occured", e);
      System.exit(2);
    }
  }