jtkorhonen@30: /**************************************************************************** jtkorhonen@30: ** Copyright (C) Jari Korhonen, 2010 (under lgpl) jtkorhonen@30: ****************************************************************************/ jtkorhonen@0: jtkorhonen@0: #include "hgrunner.h" jtkorhonen@0: #include jtkorhonen@0: #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())); jtkorhonen@0: connect(proc, SIGNAL(error(QProcess::ProcessError)), this, SLOT(error(QProcess::ProcessError))); jtkorhonen@0: connect(proc, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(finished(int, QProcess::ExitStatus))); jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: HgRunner::~HgRunner() jtkorhonen@0: { jtkorhonen@0: delete proc; jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: void HgRunner::started() jtkorhonen@0: { jtkorhonen@0: proc -> closeWriteChannel(); jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: void HgRunner::setProcExitInfo(int procExitCode, QProcess::ExitStatus procExitStatus) jtkorhonen@0: { jtkorhonen@0: exitCode = procExitCode; jtkorhonen@0: exitStatus = procExitStatus; cannam@45: stdOut = QString::fromUtf8(proc -> readAllStandardOutput()); cannam@45: stdErr = QString::fromUtf8(proc -> readAllStandardError()); Chris@43: std::cerr << "stdout was " << stdOut.toStdString() << std::endl; jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: void HgRunner::presentErrorToUser() jtkorhonen@0: { jtkorhonen@0: QPushButton *okButton; jtkorhonen@0: QListWidget *stdoL; jtkorhonen@0: QListWidget *stdeL; jtkorhonen@0: QString tmp; jtkorhonen@0: jtkorhonen@0: QDialog *dlg = new QDialog(this); jtkorhonen@0: dlg -> setMinimumWidth(800); jtkorhonen@0: QVBoxLayout layout; jtkorhonen@0: jtkorhonen@0: dlg -> setWindowTitle(tr("Mercurial error / warning")); jtkorhonen@0: jtkorhonen@0: tmp.sprintf("%s: %d, %s: %d", "Exitcode", exitCode, "Exit status", exitStatus); jtkorhonen@0: layout.addWidget(new QLabel(getLastCommandLine())); jtkorhonen@0: layout.addWidget(new QLabel(tmp)); jtkorhonen@0: layout.addWidget(new QLabel(tr("Standard out:"))); jtkorhonen@0: stdoL = new QListWidget(); jtkorhonen@0: stdoL -> addItems(stdOut.split("\n")); jtkorhonen@0: layout.addWidget(stdoL); jtkorhonen@0: jtkorhonen@0: layout.addWidget(new QLabel(tr("Standard error:"))); jtkorhonen@0: stdeL = new QListWidget(); jtkorhonen@0: stdeL -> addItems(stdErr.split("\n")); jtkorhonen@0: layout.addWidget(stdeL); jtkorhonen@0: jtkorhonen@0: okButton = new QPushButton("Ok"); jtkorhonen@0: layout.addWidget(okButton); jtkorhonen@0: jtkorhonen@0: connect(okButton, SIGNAL(clicked()), dlg, SLOT(accept())); jtkorhonen@0: dlg -> setLayout(&layout); jtkorhonen@0: jtkorhonen@0: dlg -> setModal(true); jtkorhonen@0: dlg -> exec(); jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: jtkorhonen@0: jtkorhonen@0: void HgRunner::error(QProcess::ProcessError) jtkorhonen@0: { jtkorhonen@0: setProcExitInfo(proc -> exitCode(), proc -> exitStatus()); jtkorhonen@0: jtkorhonen@11: if (reportErrors) jtkorhonen@11: { jtkorhonen@11: presentErrorToUser(); jtkorhonen@11: } jtkorhonen@0: jtkorhonen@0: isRunning = false; 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); jtkorhonen@0: jtkorhonen@0: if (reportErrors) jtkorhonen@0: { jtkorhonen@0: if ((exitCode == 0) && (exitStatus == QProcess::NormalExit)) jtkorhonen@0: { jtkorhonen@0: //All ok jtkorhonen@0: } jtkorhonen@0: else jtkorhonen@0: { jtkorhonen@0: presentErrorToUser(); jtkorhonen@0: } jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: isRunning = false; jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: bool HgRunner::isProcRunning() jtkorhonen@0: { jtkorhonen@0: return isRunning; jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: void HgRunner::killProc() jtkorhonen@0: { jtkorhonen@0: if (isProcRunning()) jtkorhonen@0: { jtkorhonen@0: proc -> kill(); jtkorhonen@0: } jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: jtkorhonen@0: void HgRunner::startProc(QString hgExePathAndName, QString workingDir, QStringList params, bool reportErrors) jtkorhonen@0: { jtkorhonen@0: this -> reportErrors = reportErrors; 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: jtkorhonen@0: lastHgCommand = hgExePathAndName; jtkorhonen@0: lastParams = params.join(" "); jtkorhonen@0: Chris@44: std::cerr << "HgRunner: starting: " << hgExePathAndName.toStdString() << " "; Chris@43: foreach (QString param, params) std::cerr << param.toStdString() << " "; Chris@43: std::cerr << std::endl; Chris@43: jtkorhonen@0: proc -> start(hgExePathAndName, params); jtkorhonen@0: 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: