# HG changeset patch
# User Chris Cannam
# Date 1328879287 0
# Node ID a4e699d32a9a5c39fabdd58b53a49931517b1b34
# Parent 5f04fa848f34dfff45d8d811f4ecdf0ba5b7e037
gah! hg 2.1 changes push and pull so as to return failure codes on success, if there was nothing to push or pull
diff -r 5f04fa848f34 -r a4e699d32a9a src/hgrunner.cpp
--- a/src/hgrunner.cpp Fri Nov 25 09:34:55 2011 +0000
+++ b/src/hgrunner.cpp Fri Feb 10 13:08:07 2012 +0000
@@ -357,7 +357,7 @@
<< procExitCode << ", exit status " << procExitStatus
<< ", stderr follows" << endl;
DEBUG << m_stderr << endl;
- emit commandFailed(completedAction, m_stderr);
+ emit commandFailed(completedAction, m_stderr, m_stdout);
}
}
@@ -495,7 +495,7 @@
if (action.workingDir.isEmpty()) {
// We require a working directory, never just operate in pwd
- emit commandFailed(action, "EasyMercurial: No working directory supplied, will not run Mercurial command without one");
+ emit commandFailed(action, "EasyMercurial: No working directory supplied, will not run Mercurial command without one", "");
return;
}
diff -r 5f04fa848f34 -r a4e699d32a9a src/hgrunner.h
--- a/src/hgrunner.h Fri Nov 25 09:34:55 2011 +0000
+++ b/src/hgrunner.h Fri Feb 10 13:08:07 2012 +0000
@@ -42,7 +42,7 @@
signals:
void commandStarting(HgAction action);
void commandCompleted(HgAction action, QString stdOut);
- void commandFailed(HgAction action, QString stdErr);
+ void commandFailed(HgAction action, QString stdErr, QString stdOut);
private slots:
void started();
diff -r 5f04fa848f34 -r a4e699d32a9a src/mainwindow.cpp
--- a/src/mainwindow.cpp Fri Nov 25 09:34:55 2011 +0000
+++ b/src/mainwindow.cpp Fri Feb 10 13:08:07 2012 +0000
@@ -81,8 +81,8 @@
this, SLOT(commandStarting(HgAction)));
connect(m_runner, SIGNAL(commandCompleted(HgAction, QString)),
this, SLOT(commandCompleted(HgAction, QString)));
- connect(m_runner, SIGNAL(commandFailed(HgAction, QString)),
- this, SLOT(commandFailed(HgAction, QString)));
+ connect(m_runner, SIGNAL(commandFailed(HgAction, QString, QString)),
+ this, SLOT(commandFailed(HgAction, QString, QString)));
statusBar()->addPermanentWidget(m_runner);
setWindowTitle(tr("EasyMercurial"));
@@ -2099,7 +2099,7 @@
}
}
-void MainWindow::commandFailed(HgAction action, QString output)
+void MainWindow::commandFailed(HgAction action, QString stderr, QString stdout)
{
DEBUG << "MainWindow::commandFailed" << endl;
restoreFileSystemWatcher();
@@ -2130,7 +2130,7 @@
tr("Failed to run Mercurial"),
tr("Failed to run Mercurial"),
tr("The Mercurial program either could not be found or failed to run.
Check that the Mercurial program path is correct in %1.").arg(setstr),
- output);
+ stderr);
settings(SettingsDialog::PathsTab);
return;
case ACT_TEST_HG_EXT:
@@ -2139,7 +2139,7 @@
tr("Failed to run Mercurial"),
tr("Failed to run Mercurial with extension enabled"),
tr("The Mercurial program failed to run with the EasyMercurial interaction extension enabled.
This may indicate an installation problem.
You may be able to continue working if you switch off “Use EasyHg Mercurial Extension” in %1. Note that remote repositories that require authentication might not work if you do this.").arg(setstr),
- output);
+ stderr);
settings(SettingsDialog::PathsTab);
return;
case ACT_CLONEFROMREMOTE:
@@ -2148,20 +2148,20 @@
enableDisableActions();
break; // go on to default report
case ACT_INCOMING:
- if (output.contains("authorization failed")) {
- reportAuthFailed(output);
+ if (stderr.contains("authorization failed")) {
+ reportAuthFailed(stderr);
return;
- } else if (output.contains("entry cancelled")) {
+ } else if (stderr.contains("entry cancelled")) {
// ignore this, user cancelled username or password dialog
return;
} else {
- // Incoming returns non-zero code and no output if the
+ // Incoming returns non-zero code and no stderr if the
// check was successful but there are no changes
// pending. This is the only case where we need to remove
// warning messages, because it's the only case where a
// non-zero code can be returned even though the command
// has for our purposes succeeded
- QString replaced = output;
+ QString replaced = stderr;
while (1) {
QString r1 = replaced;
r1.replace(QRegExp("warning: [^\\n]*"), "");
@@ -2175,24 +2175,32 @@
}
break; // go on to default report
case ACT_PULL:
- if (output.contains("authorization failed")) {
- reportAuthFailed(output);
+ if (stderr.contains("authorization failed")) {
+ reportAuthFailed(stderr);
return;
- } else if (output.contains("entry cancelled")) {
+ } else if (stderr.contains("entry cancelled")) {
// ignore this, user cancelled username or password dialog
return;
+ } else if (stderr.contains("no changes found") || stdout.contains("no changes found")) {
+ // success: hg 2.1 starts returning failure code for empty pull/push
+ commandCompleted(action, stdout);
+ return;
}
break; // go on to default report
case ACT_PUSH:
- if (output.contains("creates new remote head")) {
- reportNewRemoteHeads(output);
+ if (stderr.contains("creates new remote head")) {
+ reportNewRemoteHeads(stderr);
return;
- } else if (output.contains("authorization failed")) {
- reportAuthFailed(output);
+ } else if (stderr.contains("authorization failed")) {
+ reportAuthFailed(stderr);
return;
- } else if (output.contains("entry cancelled")) {
+ } else if (stderr.contains("entry cancelled")) {
// ignore this, user cancelled username or password dialog
return;
+ } else if (stderr.contains("no changes found") || stdout.contains("no changes found")) {
+ // success: hg 2.1 starts returning failure code for empty pull/push
+ commandCompleted(action, stdout);
+ return;
}
break; // go on to default report
case ACT_QUERY_HEADS_ACTIVE:
@@ -2210,13 +2218,13 @@
// as the user closing the window via the wm happens
return;
case ACT_MERGE:
- if (output.contains("working directory ancestor")) {
+ if (stderr.contains("working directory ancestor")) {
// arguably we should prevent this upfront, but that's
// trickier!
MoreInformationDialog::information
(this, tr("Merge"), tr("Merge has no effect"),
tr("You asked to merge a revision with one of its ancestors.
This has no effect, because the ancestor's changes already exist in both revisions."), - output); + stderr); return; } // else fall through @@ -2224,7 +2232,7 @@ MoreInformationDialog::information (this, tr("Merge"), tr("Merge failed"), tr("Some files were not merged successfully.
You can Merge again to repeat the interactive merge; use Revert to abandon the merge entirely; or edit the files that are in conflict in an editor and, when you are happy with them, choose Mark Resolved in each file's right-button menu."),
- output);
+ stderr);
m_mergeCommitComment = "";
return;
case ACT_STAT:
@@ -2243,10 +2251,10 @@
(this,
tr("Command failed"),
tr("Command failed"),
- (output == "" ?
+ (stderr == "" ?
tr("A Mercurial command failed to run correctly. This may indicate an installation problem or some other problem with EasyMercurial.") :
tr("A Mercurial command failed to run correctly. This may indicate an installation problem or some other problem with EasyMercurial.
See “More Details” for the command output.")),
- output);
+ stderr);
}
void MainWindow::commandCompleted(HgAction completedAction, QString output)
diff -r 5f04fa848f34 -r a4e699d32a9a src/mainwindow.h
--- a/src/mainwindow.h Fri Nov 25 09:34:55 2011 +0000
+++ b/src/mainwindow.h Fri Feb 10 13:08:07 2012 +0000
@@ -52,7 +52,7 @@
void hgRefresh();
void commandStarting(HgAction);
void commandCompleted(HgAction action, QString stdOut);
- void commandFailed(HgAction action, QString stdErr);
+ void commandFailed(HgAction action, QString stdErr, QString stdOut);
void enableDisableActions();
private slots: