Chris@57: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ Chris@57: Chris@57: /* Chris@57: EasyMercurial Chris@57: Chris@57: Based on HgExplorer by Jari Korhonen Chris@57: Copyright (c) 2010 Jari Korhonen Chris@57: Copyright (c) 2010 Chris Cannam Chris@57: Copyright (c) 2010 Queen Mary, University of London Chris@57: Chris@57: This program is free software; you can redistribute it and/or Chris@57: modify it under the terms of the GNU General Public License as Chris@57: published by the Free Software Foundation; either version 2 of the Chris@57: License, or (at your option) any later version. See the file Chris@57: COPYING included with this distribution for more information. Chris@57: */ jtkorhonen@0: jtkorhonen@0: #include "hgrunner.h" Chris@62: #include "common.h" Chris@57: #include "debug.h" Chris@50: Chris@50: #include Chris@50: #include Chris@50: #include Chris@50: #include Chris@50: #include Chris@62: #include jtkorhonen@0: Chris@43: #include jtkorhonen@0: #include jtkorhonen@0: jtkorhonen@0: HgRunner::HgRunner(QWidget * parent): QProgressBar(parent) jtkorhonen@0: { jtkorhonen@0: proc = new QProcess(this); jtkorhonen@0: cannam@45: QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); cannam@45: env.insert("LANG", "en_US.utf8"); cannam@45: env.insert("LC_ALL", "en_US.utf8"); cannam@45: proc->setProcessEnvironment(env); cannam@45: jtkorhonen@0: setTextVisible(false); jtkorhonen@0: setVisible(false); jtkorhonen@0: isRunning = false; jtkorhonen@0: jtkorhonen@0: stdOut.clear(); jtkorhonen@0: stdErr.clear(); jtkorhonen@0: jtkorhonen@0: connect(proc, SIGNAL(started()), this, SLOT(started())); Chris@62: connect(proc, SIGNAL(finished(int, QProcess::ExitStatus)), Chris@62: this, SLOT(finished(int, QProcess::ExitStatus))); Chris@62: Chris@62: reportErrors = false; jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: HgRunner::~HgRunner() jtkorhonen@0: { jtkorhonen@0: delete proc; jtkorhonen@0: } jtkorhonen@0: Chris@62: QString HgRunner::getHgBinaryName() Chris@62: { Chris@62: QSettings settings; Chris@62: QString hg = settings.value("hgbinary", "hg").toString(); Chris@62: if (hg == "") hg = "hg"; Chris@62: hg = findExecutable(hg); Chris@62: settings.setValue("hgbinary", hg); Chris@62: return hg; Chris@62: } Chris@62: jtkorhonen@0: void HgRunner::started() jtkorhonen@0: { jtkorhonen@0: proc -> closeWriteChannel(); jtkorhonen@0: } jtkorhonen@0: Chris@62: void HgRunner::saveOutput() Chris@62: { Chris@62: stdOut = QString::fromUtf8(proc -> readAllStandardOutput()); Chris@62: stdErr = QString::fromUtf8(proc -> readAllStandardError()); Chris@62: } Chris@62: jtkorhonen@0: void HgRunner::setProcExitInfo(int procExitCode, QProcess::ExitStatus procExitStatus) jtkorhonen@0: { jtkorhonen@0: exitCode = procExitCode; jtkorhonen@0: exitStatus = procExitStatus; Chris@58: Chris@59: DEBUG << "setProcExitInfo: " << stdOut.split("\n").size() << " line(s) of stdout, " << stdErr.split("\n").size() << " line(s) of stderr"; Chris@58: Chris@58: // std::cerr << "stdout was " << stdOut.toStdString() << std::endl; jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: QString HgRunner::getLastCommandLine() jtkorhonen@0: { jtkorhonen@0: return QString("Command line: " + lastHgCommand + " " + lastParams); jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: void HgRunner::finished(int procExitCode, QProcess::ExitStatus procExitStatus) jtkorhonen@0: { jtkorhonen@0: setProcExitInfo(procExitCode, procExitStatus); Chris@62: isRunning = false; jtkorhonen@0: Chris@62: if (procExitCode == 0 || procExitStatus == QProcess::NormalExit) { Chris@62: emit commandCompleted(); Chris@62: } else { Chris@62: emit commandFailed(); jtkorhonen@0: } jtkorhonen@0: } jtkorhonen@0: Chris@62: bool HgRunner::isCommandRunning() jtkorhonen@0: { jtkorhonen@0: return isRunning; jtkorhonen@0: } jtkorhonen@0: Chris@62: void HgRunner::killCurrentCommand() jtkorhonen@0: { Chris@62: if (isCommandRunning()) { jtkorhonen@0: proc -> kill(); jtkorhonen@0: } jtkorhonen@0: } jtkorhonen@0: Chris@62: void HgRunner::startHgCommand(QString workingDir, QStringList params) Chris@62: { Chris@62: startCommand(getHgBinaryName(), workingDir, params); Chris@62: } jtkorhonen@0: Chris@62: void HgRunner::startCommand(QString command, QString workingDir, QStringList params) jtkorhonen@0: { jtkorhonen@0: isRunning = true; jtkorhonen@0: setRange(0, 0); jtkorhonen@0: setVisible(true); jtkorhonen@0: stdOut.clear(); jtkorhonen@0: stdErr.clear(); jtkorhonen@0: exitCode = 0; jtkorhonen@0: exitStatus = QProcess::NormalExit; jtkorhonen@0: jtkorhonen@0: if (!workingDir.isEmpty()) jtkorhonen@0: { jtkorhonen@0: proc -> setWorkingDirectory(workingDir); jtkorhonen@0: } jtkorhonen@0: Chris@62: lastHgCommand = command; jtkorhonen@0: lastParams = params.join(" "); jtkorhonen@0: Chris@62: QString cmdline = command; Chris@57: foreach (QString param, params) cmdline += " " + param; Chris@57: DEBUG << "HgRunner: starting: " << cmdline; Chris@43: Chris@62: proc -> start(command, params); jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: int HgRunner::getExitCode() jtkorhonen@0: { jtkorhonen@0: return exitCode; jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: QString HgRunner::getStdOut() jtkorhonen@0: { jtkorhonen@0: return stdOut; jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: void HgRunner::hideProgBar() jtkorhonen@0: { jtkorhonen@0: setVisible(false); jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: