tikhomirov@61: /* tikhomirov@570: * Copyright (c) 2011-2013 TMate Software Ltd tikhomirov@66: * tikhomirov@66: * This program is free software; you can redistribute it and/or modify tikhomirov@66: * it under the terms of the GNU General Public License as published by tikhomirov@66: * the Free Software Foundation; version 2 of the License. tikhomirov@66: * tikhomirov@66: * This program is distributed in the hope that it will be useful, tikhomirov@66: * but WITHOUT ANY WARRANTY; without even the implied warranty of tikhomirov@66: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the tikhomirov@66: * GNU General Public License for more details. tikhomirov@66: * tikhomirov@66: * For information on how to redistribute this software under tikhomirov@66: * the terms of a license other than GNU General Public License tikhomirov@102: * contact TMate Software at support@hg4j.com tikhomirov@61: */ tikhomirov@66: package org.tmatesoft.hg.test; tikhomirov@61: tikhomirov@61: import java.io.File; tikhomirov@61: import java.io.IOException; tikhomirov@110: import java.util.ArrayList; tikhomirov@570: import java.util.Arrays; tikhomirov@413: import java.util.List; tikhomirov@110: import java.util.StringTokenizer; tikhomirov@61: tikhomirov@413: import org.tmatesoft.hg.internal.ProcessExecHelper; tikhomirov@413: tikhomirov@61: /** tikhomirov@570: * Utility to run a command line application and to parse its output tikhomirov@66: * @author Artem Tikhomirov tikhomirov@66: * @author TMate Software Ltd. tikhomirov@61: */ tikhomirov@413: public class ExecHelper extends ProcessExecHelper { tikhomirov@61: tikhomirov@61: private final OutputParser parser; tikhomirov@61: tikhomirov@61: public ExecHelper(OutputParser outParser, File workingDir) { tikhomirov@61: parser = outParser; tikhomirov@413: super.cwd(workingDir); tikhomirov@61: } tikhomirov@413: tikhomirov@413: @Override tikhomirov@413: protected List prepareCommand(List cmd) { tikhomirov@413: String commandName = cmd.get(0); tikhomirov@110: if (System.getProperty("os.name").startsWith("Windows")) { tikhomirov@110: StringTokenizer st = new StringTokenizer(System.getenv("PATH"), ";"); tikhomirov@110: while (st.hasMoreTokens()) { tikhomirov@110: File pe = new File(st.nextToken()); tikhomirov@413: if (new File(pe, commandName + ".exe").exists()) { tikhomirov@413: return cmd; tikhomirov@110: } tikhomirov@388: // PATHEXT controls precedence of .exe, .bat and .cmd files, usually .exe wins tikhomirov@413: if (new File(pe, commandName + ".bat").exists() || new File(pe, commandName + ".cmd").exists()) { tikhomirov@110: ArrayList command = new ArrayList(); tikhomirov@110: command.add("cmd.exe"); tikhomirov@110: command.add("/C"); tikhomirov@413: command.addAll(cmd); tikhomirov@413: return command; tikhomirov@110: } tikhomirov@110: } tikhomirov@110: } tikhomirov@413: return super.prepareCommand(cmd); tikhomirov@413: } tikhomirov@413: tikhomirov@570: public void run(List cmd) throws IOException, InterruptedException { tikhomirov@413: CharSequence res = super.exec(cmd); tikhomirov@61: parser.parse(res); tikhomirov@61: } tikhomirov@413: tikhomirov@570: public void run(String... cmd) throws IOException, InterruptedException { tikhomirov@570: run(Arrays.asList(cmd)); tikhomirov@570: } tikhomirov@570: tikhomirov@201: public int getExitValue() { tikhomirov@413: return super.exitValue(); tikhomirov@203: } tikhomirov@61: }