tikhomirov@74: /* tikhomirov@74: * Copyright (c) 2011 TMate Software Ltd tikhomirov@74: * tikhomirov@74: * This program is free software; you can redistribute it and/or modify tikhomirov@74: * it under the terms of the GNU General Public License as published by tikhomirov@74: * the Free Software Foundation; version 2 of the License. tikhomirov@74: * tikhomirov@74: * This program is distributed in the hope that it will be useful, tikhomirov@74: * but WITHOUT ANY WARRANTY; without even the implied warranty of tikhomirov@74: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the tikhomirov@74: * GNU General Public License for more details. tikhomirov@74: * tikhomirov@74: * For information on how to redistribute this software under tikhomirov@74: * the terms of a license other than GNU General Public License tikhomirov@102: * contact TMate Software at support@hg4j.com tikhomirov@74: */ tikhomirov@74: package org.tmatesoft.hg.console; tikhomirov@74: tikhomirov@299: import java.util.Collections; tikhomirov@143: import java.util.HashMap; tikhomirov@74: import java.util.LinkedList; tikhomirov@74: import java.util.List; tikhomirov@143: import java.util.Map; tikhomirov@299: import java.util.Set; tikhomirov@299: import java.util.TreeSet; tikhomirov@74: tikhomirov@143: import org.tmatesoft.hg.repo.HgLookup; tikhomirov@74: import org.tmatesoft.hg.repo.HgRepository; tikhomirov@74: tikhomirov@74: /** tikhomirov@143: * Parse command-line options. Primitive implementation that recognizes options with 0 or 1 argument. tikhomirov@74: * tikhomirov@74: * @author Artem Tikhomirov tikhomirov@74: * @author TMate Software Ltd. tikhomirov@74: */ tikhomirov@74: class Options { tikhomirov@74: tikhomirov@143: public final Map> opt2values = new HashMap>(); tikhomirov@143: tikhomirov@143: public boolean getBoolean(String... aliases) { tikhomirov@143: return getBoolean(false, aliases); tikhomirov@143: } tikhomirov@143: tikhomirov@143: public boolean getBoolean(boolean def, String... aliases) { tikhomirov@143: for (String s : aliases) { tikhomirov@143: if (opt2values.containsKey(s)) { tikhomirov@143: return true; tikhomirov@143: } tikhomirov@143: } tikhomirov@143: return def; tikhomirov@143: } tikhomirov@143: tikhomirov@143: public String getSingle(String... aliases) { tikhomirov@143: String rv = null; tikhomirov@143: for (String s : aliases) { tikhomirov@143: List values = opt2values.get(s); tikhomirov@143: if (values != null && values.size() > 0) { tikhomirov@143: rv = values.get(values.size() - 1); // take last one, most recent tikhomirov@143: } tikhomirov@143: } tikhomirov@143: return rv; tikhomirov@143: } tikhomirov@143: tikhomirov@143: public int getSingleInt(int def, String... aliases) { tikhomirov@143: String r = getSingle(aliases); tikhomirov@143: if (r == null) { tikhomirov@143: return def; tikhomirov@143: } tikhomirov@143: return Integer.parseInt(r); tikhomirov@143: } tikhomirov@143: tikhomirov@143: public List getList(String... aliases) { tikhomirov@143: LinkedList rv = new LinkedList(); tikhomirov@143: for (String s : aliases) { tikhomirov@143: List values = opt2values.get(s); tikhomirov@143: if (values != null) { tikhomirov@143: rv.addAll(values); tikhomirov@143: } tikhomirov@143: } tikhomirov@143: return rv; tikhomirov@143: } tikhomirov@74: tikhomirov@74: public HgRepository findRepository() throws Exception { tikhomirov@143: String repoLocation = getSingle("-R", "--repository"); tikhomirov@74: if (repoLocation != null) { tikhomirov@95: return new HgLookup().detect(repoLocation); tikhomirov@74: } tikhomirov@95: return new HgLookup().detectFromWorkingDir(); tikhomirov@74: } tikhomirov@74: tikhomirov@74: tikhomirov@299: public static Options parse(String[] commandLineArgs, Set flagOptions) { tikhomirov@74: Options rv = new Options(); tikhomirov@143: List values = new LinkedList(); tikhomirov@143: rv.opt2values.put("", values); // values with no options tikhomirov@143: for (String arg : commandLineArgs) { tikhomirov@74: if (arg.charAt(0) == '-') { tikhomirov@74: // option tikhomirov@74: if (arg.length() == 1) { tikhomirov@74: throw new IllegalArgumentException("Bad option: -"); tikhomirov@74: } tikhomirov@299: if (flagOptions.contains(arg)) { tikhomirov@299: rv.opt2values.put(arg, Collections.emptyList()); tikhomirov@299: values = rv.opt2values.get(""); tikhomirov@299: } else { tikhomirov@299: values = rv.opt2values.get(arg); tikhomirov@299: if (values == null) { tikhomirov@299: rv.opt2values.put(arg, values = new LinkedList()); tikhomirov@299: } tikhomirov@74: } tikhomirov@143: // next value, if any, gets into the values list for arg option. tikhomirov@74: } else { tikhomirov@143: values.add(arg); tikhomirov@143: values = rv.opt2values.get(""); tikhomirov@74: } tikhomirov@74: } tikhomirov@74: return rv; tikhomirov@74: } tikhomirov@299: tikhomirov@299: public static Set asSet(String... ss) { tikhomirov@299: TreeSet rv = new TreeSet(); tikhomirov@299: for (String s : ss) { tikhomirov@299: rv.add(s); tikhomirov@299: } tikhomirov@299: return rv; tikhomirov@299: } tikhomirov@74: }