diff --git a/FileActionDialog.cpp b/FileActionDialog.cpp index bdbabfd..66890d4 100644 --- a/FileActionDialog.cpp +++ b/FileActionDialog.cpp @@ -22,8 +22,13 @@ FileActionDialog::FileActionDialog(QWidget *parent, const QString &title, const ui->verticalLayout->insertWidget(2, checkBox); } - foreach(const QString &s, listData) - itemModel.appendRow(new QStandardItem(s)); + if(listData.empty()) + ui->listView->setVisible(false); + else + { + foreach(const QString &s, listData) + itemModel.appendRow(new QStandardItem(s)); + } } FileActionDialog::~FileActionDialog() diff --git a/MainWindow.cpp b/MainWindow.cpp index 51c73da..45c3760 100644 --- a/MainWindow.cpp +++ b/MainWindow.cpp @@ -445,6 +445,22 @@ bool MainWindow::runFossil(const QStringList &args, QStringList *output, bool si return exit_code == EXIT_SUCCESS; } + +//------------------------------------------------------------------------------ +static QString ParseFossilQuery(QString query) +{ + // Extract question + int qend = query.indexOf('('); + if(qend == -1) + qend = query.indexOf('['); + Q_ASSERT(qend!=-1); + query = query.left(qend); + query = query.trimmed(); + query += "?"; + query[0]=QString(query[0]).toUpper()[0]; + return query; +} + //------------------------------------------------------------------------------ // Run fossil. Returns true if execution was succesfull regardless if fossil // issued an error @@ -471,22 +487,100 @@ bool MainWindow::runFossilRaw(const QStringList &args, QStringList *output, int return false; } - process.waitForFinished(); - QString std_output = process.readAllStandardOutput(); +#ifdef Q_WS_WIN + const char *ans_yes = "y\r\n"; + const char *ans_no = "n\r\n"; + const char *ans_always = "a\r\n"; +#else + const char *ans_yes = "y\n"; + const char *ans_no = "n\n"; + const char *ans_always = "a\n"; +#endif - QStringList lines = std_output.split('\n'); - - for(QStringList::iterator it=lines.begin(); it!=lines.end(); ++it) + QStringList local_output; + while(process.state()==QProcess::Running || !process.atEnd()) { - QString line = it->trimmed(); - if(line.isEmpty()) - continue; - if(output) - output->append(line); - if(!silent) - log(line+"\n"); + bool has_line = process.canReadLine(); + qint64 bytes_available=process.bytesAvailable(); + + if(!process.waitForReadyRead(1*1000) && !has_line && bytes_available==0) + break; + + // If no line yet, but some bytes available, maybe fossil is waiting for + // user input + if(!has_line && bytes_available>0) + { + QString line = process.readAll(); + line = line.trimmed(); + QString query = line.toLower(); + + // Have we encountered a y/n query? + if(line[line.length()-1]=='?' && query.indexOf("y/n")!=-1) + { + log(line); + // Extract question + query = ParseFossilQuery(query); + + int res = QMessageBox::question(this, "Fossil", query, QMessageBox::Yes|QMessageBox::No, QMessageBox::No); + if(res==QMessageBox::Yes) + { + process.write(ans_yes, COUNTOF(ans_yes)); + log("Y\n"); + } + else + { + process.write(ans_no, COUNTOF(ans_no)); + log("N\n"); + } + } + // Have we encountered a y/n/always query? + else if(line[line.length()-1]=='?' && query.indexOf("a=always/y/n")!=-1) + { + log(line); + // Extract question + query = ParseFossilQuery(query); + + int res = QMessageBox::question(this, "Fossil", query, QMessageBox::Yes|QMessageBox::No|QMessageBox::YesToAll, QMessageBox::No); + if(res==QDialogButtonBox::Yes) + { + process.write(ans_yes, COUNTOF(ans_yes)); + log("Y\n"); + } + else if(res==QDialogButtonBox::YesToAll) + { + process.write(ans_always, COUNTOF(ans_always)); + log("A\n"); + } + else + { + process.write(ans_no, COUNTOF(ans_no)); + log("N\n"); + } + } + } + + while(process.canReadLine()) + { + QString line = process.readLine(); + line = line.trimmed(); + //QString line = it->trimmed(); + if(line.isEmpty()) + continue; + + local_output.append(line); + + if(output) + output->append(line); + + if(!silent) + log(line+"\n"); + } + } + // Must be finished by now + Q_ASSERT(process.state()==QProcess::NotRunning); + QProcess::ExitStatus es = process.exitStatus(); if(es!=QProcess::NormalExit) diff --git a/manifest b/manifest index 04fadb6..760be84 100644 --- a/manifest +++ b/manifest @@ -1,12 +1,12 @@ -C FileActionDialog\snow\ssupports\svariable\smodal\sbuttons\n -D 2011-08-06T15:34:40.595 +C Support\sfor\sFossil\squeries\nFileActionDialog\snow\sbecomes\sa\s(lame)\squestion\sdialog\sbox\swhen\sno\sdata\sis\sprovided\n +D 2011-08-06T16:15:50.633 F CommitDialog.cpp a1fcdc94933f4e1a144224c7c70f1e067d3ee31e F CommitDialog.h 0550b1b652924ae54b6f6c9274cad2d4c491808a F CommitDialog.ui 5067623f6af6f5a42c87df903278e383e945e154 -F FileActionDialog.cpp 629f29f676f3e547965f350fb9a4ee5797cc3e0b +F FileActionDialog.cpp fcaebf9986f789b3440d5390b3458ad5f86fe0c8 F FileActionDialog.h 15db1650b3a13d70bc338371e4c033c66e3b79ce F FileActionDialog.ui c63644428579741aeb5fa052e237ba799ced9ad7 -F MainWindow.cpp 96ce6b4bb5ee66f04a43e2171b20e8ee510a5ac7 +F MainWindow.cpp 10d04becd808da62ccf380d6c16f5bad8f3b06e9 F MainWindow.h 8a23caf1a70d41fe60a25894649a88b1efb851ba F MainWindow.ui 9f901c1f06b24df3cbd36d5349ffe0d82896c05b F RepoDialog.cpp 8f20e1511526973555c774350ec413dcecf51c9e @@ -173,7 +173,7 @@ F icons/fuel.icns 81e535004b62db801a02f3e15d0a33afc9d4070b F icons/fuel.ico eb529ab3332a17b9302ef3e851db5b9ebce2a038 F main.cpp aed85ed9766ddb8685e300e8ca4a0dc193ae2586 F resources.qrc e98383ed205f4e37100c60057e0129c3b86dea53 -P 665b2ad1b609530a9c2c2815e143213e5e691100 -R 1f233c6d016ce42191b217639282c217 +P d80b84c6b58b7daf71174d32a8c33cab0e2aabac +R dc4d20cff6babdcbf4a5e0cb3bc252f9 U kostas -Z f4122d426b89a67b7273148c8690abf1 +Z ac4a65db19b5eab4386101e1f0358467 diff --git a/manifest.uuid b/manifest.uuid index b1b89c2..c390921 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d80b84c6b58b7daf71174d32a8c33cab0e2aabac \ No newline at end of file +6a6a654b0db2537fc73774e7dc37d25cb2ae63d7 \ No newline at end of file