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@74: * contact TMate Software at support@svnkit.com tikhomirov@74: */ tikhomirov@74: package org.tmatesoft.hg.console; tikhomirov@74: tikhomirov@74: import java.util.ArrayList; tikhomirov@74: import java.util.Arrays; tikhomirov@74: import java.util.Collections; tikhomirov@74: import java.util.Iterator; tikhomirov@74: import java.util.LinkedHashSet; tikhomirov@74: import java.util.LinkedList; tikhomirov@74: import java.util.List; tikhomirov@74: import java.util.Set; tikhomirov@74: tikhomirov@74: import org.tmatesoft.hg.repo.HgRepository; tikhomirov@95: import org.tmatesoft.hg.repo.HgLookup; tikhomirov@74: tikhomirov@74: /** tikhomirov@74: * Parse command-line options tikhomirov@74: * tikhomirov@74: * @author Artem Tikhomirov tikhomirov@74: * @author TMate Software Ltd. tikhomirov@74: */ tikhomirov@74: class Options { tikhomirov@74: tikhomirov@74: public String repoLocation; tikhomirov@74: public List files; tikhomirov@74: public int limit = -1; tikhomirov@74: public Set users; tikhomirov@74: public Set branches; tikhomirov@74: tikhomirov@74: public HgRepository findRepository() throws Exception { 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@74: public static Options parse(String[] commandLineArgs) { tikhomirov@74: Options rv = new Options(); tikhomirov@74: List args = Arrays.asList(commandLineArgs); tikhomirov@74: LinkedList files = new LinkedList(); tikhomirov@74: for (Iterator it = args.iterator(); it.hasNext(); ) { tikhomirov@74: String arg = it.next(); 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@74: switch ((int) arg.charAt(1)) { tikhomirov@74: case (int) 'R' : { tikhomirov@74: if (! it.hasNext()) { tikhomirov@74: throw new IllegalArgumentException("Need repo location"); tikhomirov@74: } tikhomirov@74: rv.repoLocation = it.next(); tikhomirov@74: break; tikhomirov@74: } tikhomirov@74: case (int) 'l' : { tikhomirov@74: if (!it.hasNext()) { tikhomirov@74: throw new IllegalArgumentException(); tikhomirov@74: } tikhomirov@74: rv.limit = Integer.parseInt(it.next()); tikhomirov@74: break; tikhomirov@74: } tikhomirov@74: case (int) 'u' : { tikhomirov@74: if (rv.users == null) { tikhomirov@74: rv.users = new LinkedHashSet(); tikhomirov@74: } tikhomirov@74: rv.users.add(it.next()); tikhomirov@74: break; tikhomirov@74: } tikhomirov@74: case (int) 'b' : { tikhomirov@74: if (rv.branches == null) { tikhomirov@74: rv.branches = new LinkedHashSet(); tikhomirov@74: } tikhomirov@74: rv.branches.add(it.next()); tikhomirov@74: break; tikhomirov@74: } tikhomirov@74: } tikhomirov@74: } else { tikhomirov@74: // filename tikhomirov@74: files.add(arg); tikhomirov@74: } tikhomirov@74: } tikhomirov@74: if (!files.isEmpty()) { tikhomirov@74: rv.files = new ArrayList(files); tikhomirov@74: } else { tikhomirov@74: rv.files = Collections.emptyList(); tikhomirov@74: } tikhomirov@74: return rv; tikhomirov@74: } tikhomirov@74: }