tikhomirov@61: /* tikhomirov@66: * Copyright (c) 2011 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@61: import java.io.InputStreamReader; tikhomirov@61: import java.nio.CharBuffer; tikhomirov@110: import java.util.ArrayList; tikhomirov@110: import java.util.Arrays; tikhomirov@61: import java.util.LinkedList; tikhomirov@110: import java.util.StringTokenizer; tikhomirov@61: tikhomirov@61: /** tikhomirov@61: * tikhomirov@66: * @author Artem Tikhomirov tikhomirov@66: * @author TMate Software Ltd. tikhomirov@61: */ tikhomirov@61: public class ExecHelper { tikhomirov@61: tikhomirov@61: private final OutputParser parser; tikhomirov@203: private File dir; tikhomirov@201: private int exitValue; tikhomirov@61: tikhomirov@61: public ExecHelper(OutputParser outParser, File workingDir) { tikhomirov@61: parser = outParser; tikhomirov@61: dir = workingDir; tikhomirov@61: } tikhomirov@61: tikhomirov@61: public void run(String... cmd) throws IOException, InterruptedException { tikhomirov@110: ProcessBuilder pb = null; 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@110: if (new File(pe, cmd[0] + ".exe").exists()) { tikhomirov@110: break; tikhomirov@110: } tikhomirov@111: // PATHEXT controls precedence of .exe, .bat and .cmd files, ususlly .exe wins tikhomirov@110: if (new File(pe, cmd[0] + ".bat").exists() || new File(pe, cmd[0] + ".cmd").exists()) { tikhomirov@110: ArrayList command = new ArrayList(); tikhomirov@110: command.add("cmd.exe"); tikhomirov@110: command.add("/C"); tikhomirov@110: command.addAll(Arrays.asList(cmd)); tikhomirov@110: pb = new ProcessBuilder(command); tikhomirov@110: break; tikhomirov@110: } tikhomirov@110: } tikhomirov@110: } tikhomirov@110: if (pb == null) { tikhomirov@110: pb = new ProcessBuilder(cmd); tikhomirov@110: } tikhomirov@110: Process p = pb.directory(dir).redirectErrorStream(true).start(); tikhomirov@61: InputStreamReader stdOut = new InputStreamReader(p.getInputStream()); tikhomirov@61: LinkedList l = new LinkedList(); tikhomirov@61: int r = -1; tikhomirov@61: CharBuffer b = null; tikhomirov@61: do { tikhomirov@61: if (b == null || b.remaining() < b.capacity() / 3) { tikhomirov@61: b = CharBuffer.allocate(512); tikhomirov@61: l.add(b); tikhomirov@61: } tikhomirov@61: r = stdOut.read(b); tikhomirov@61: } while (r != -1); tikhomirov@61: int total = 0; tikhomirov@61: for (CharBuffer cb : l) { tikhomirov@61: total += cb.position(); tikhomirov@61: cb.flip(); tikhomirov@61: } tikhomirov@61: CharBuffer res = CharBuffer.allocate(total); tikhomirov@61: for (CharBuffer cb : l) { tikhomirov@61: res.put(cb); tikhomirov@61: } tikhomirov@61: res.flip(); tikhomirov@61: p.waitFor(); tikhomirov@201: exitValue = p.exitValue(); tikhomirov@61: parser.parse(res); tikhomirov@61: } tikhomirov@201: tikhomirov@201: public int getExitValue() { tikhomirov@201: return exitValue; tikhomirov@201: } tikhomirov@203: tikhomirov@203: public void cwd(File wd) { tikhomirov@203: dir = wd; tikhomirov@203: } tikhomirov@61: }