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@61: import java.util.LinkedList; 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@61: private final File dir; 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@61: Process p = new ProcessBuilder(cmd).directory(dir).redirectErrorStream(true).start(); tikhomirov@61: // Process p = Runtime.getRuntime().exec(cmd, null, dir); 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@61: parser.parse(res); tikhomirov@61: } tikhomirov@61: }