aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/git/gitclient.cpp
diff options
context:
space:
mode:
authorFriedemann Kleint <[email protected]>2010-05-25 11:48:53 +0200
committerFriedemann Kleint <[email protected]>2010-05-25 11:48:53 +0200
commit1c69b97ca6d1bbe5419308049848c11abc80d5d5 (patch)
tree7ae899981e40af78ec20a307fdb73560c9d756b3 /src/plugins/git/gitclient.cpp
parent385ea8c9e0f9a4d2ea08f2d40c8e198630dac746 (diff)
VCS[git]: Make push/pull synchronous commands.
..for timeout handling to take effect. Also, log window will update continuously. Task-number: QTCREATORBUG-777
Diffstat (limited to 'src/plugins/git/gitclient.cpp')
-rw-r--r--src/plugins/git/gitclient.cpp125
1 files changed, 73 insertions, 52 deletions
diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp
index 6bde23cb327..ae205f06a93 100644
--- a/src/plugins/git/gitclient.cpp
+++ b/src/plugins/git/gitclient.cpp
@@ -420,7 +420,7 @@ bool GitClient::synchronousCheckoutBranch(const QString &workingDirectory,
QByteArray errorText;
QStringList arguments;
arguments << QLatin1String("checkout") << branch;
- const bool rc = synchronousGit(workingDirectory, arguments, &outputText, &errorText);
+ const bool rc = fullySynchronousGit(workingDirectory, arguments, &outputText, &errorText);
const QString output = commandOutputFromLocal8Bit(outputText);
outputWindow()->append(output);
if (!rc) {
@@ -484,7 +484,7 @@ bool GitClient::synchronousAdd(const QString &workingDirectory,
if (intendToAdd)
arguments << QLatin1String("--intent-to-add");
arguments.append(files);
- const bool rc = synchronousGit(workingDirectory, arguments, &outputText, &errorText);
+ const bool rc = fullySynchronousGit(workingDirectory, arguments, &outputText, &errorText);
if (!rc) {
const QString errorMessage = tr("Unable to add %n file(s) to %1: %2", 0, files.size()).
arg(workingDirectory, commandOutputFromLocal8Bit(errorText));
@@ -506,7 +506,7 @@ bool GitClient::synchronousDelete(const QString &workingDirectory,
if (force)
arguments << QLatin1String("--force");
arguments.append(files);
- const bool rc = synchronousGit(workingDirectory, arguments, &outputText, &errorText);
+ const bool rc = fullySynchronousGit(workingDirectory, arguments, &outputText, &errorText);
if (!rc) {
const QString errorMessage = tr("Unable to remove %n file(s) from %1: %2", 0, files.size()).
arg(workingDirectory, commandOutputFromLocal8Bit(errorText));
@@ -527,7 +527,7 @@ bool GitClient::synchronousMove(const QString &workingDirectory,
arguments << QLatin1String("mv");
arguments << (from);
arguments << (to);
- const bool rc = synchronousGit(workingDirectory, arguments, &outputText, &errorText);
+ const bool rc = fullySynchronousGit(workingDirectory, arguments, &outputText, &errorText);
if (!rc) {
const QString errorMessage = tr("Unable to move from %1 to %2: %3").
arg(from, to, commandOutputFromLocal8Bit(errorText));
@@ -551,7 +551,7 @@ bool GitClient::synchronousReset(const QString &workingDirectory,
} else {
arguments << QLatin1String("HEAD") << QLatin1String("--") << files;
}
- const bool rc = synchronousGit(workingDirectory, arguments, &outputText, &errorText);
+ const bool rc = fullySynchronousGit(workingDirectory, arguments, &outputText, &errorText);
const QString output = commandOutputFromLocal8Bit(outputText);
outputWindow()->append(output);
// Note that git exits with 1 even if the operation is successful
@@ -579,7 +579,7 @@ bool GitClient::synchronousInit(const QString &workingDirectory)
QByteArray outputText;
QByteArray errorText;
const QStringList arguments(QLatin1String("init"));
- const bool rc = synchronousGit(workingDirectory, arguments, &outputText, &errorText);
+ const bool rc = fullySynchronousGit(workingDirectory, arguments, &outputText, &errorText);
// '[Re]Initialized...'
outputWindow()->append(commandOutputFromLocal8Bit(outputText));
if (!rc)
@@ -606,7 +606,7 @@ bool GitClient::synchronousCheckoutFiles(const QString &workingDirectory,
QByteArray errorText;
QStringList arguments;
arguments << QLatin1String("checkout") << revision << QLatin1String("--") << files;
- const bool rc = synchronousGit(workingDirectory, arguments, &outputText, &errorText);
+ const bool rc = fullySynchronousGit(workingDirectory, arguments, &outputText, &errorText);
if (!rc) {
const QString fileArg = files.join(QLatin1String(", "));
//: Meaning of the arguments: %1: revision, %2: files, %3: repository,
@@ -675,7 +675,7 @@ bool GitClient::synchronousParentRevisions(const QString &workingDirectory,
arguments.append(QLatin1String("--"));
arguments.append(files);
}
- const bool rc = synchronousGit(workingDirectory, arguments, &outputTextData, &errorText);
+ const bool rc = fullySynchronousGit(workingDirectory, arguments, &outputTextData, &errorText);
if (!rc) {
*errorMessage = msgParentRevisionFailed(workingDirectory, revision, commandOutputFromLocal8Bit(errorText));
return false;
@@ -744,7 +744,7 @@ bool GitClient::synchronousTopRevision(const QString &workingDirectory,
revision->clear();
arguments << QLatin1String("log") << QLatin1String(noColorOption)
<< QLatin1String("--max-count=1") << QLatin1String("--pretty=format:%H");
- if (!synchronousGit(workingDirectory, arguments, &outputTextData, &errorText)) {
+ if (!fullySynchronousGit(workingDirectory, arguments, &outputTextData, &errorText)) {
errorMessage = tr("Unable to retrieve top revision of %1: %2").arg(workingDirectory, commandOutputFromLocal8Bit(errorText));
break;
}
@@ -756,7 +756,7 @@ bool GitClient::synchronousTopRevision(const QString &workingDirectory,
branch->clear();
arguments.clear();
arguments << QLatin1String("branch") << QLatin1String(noColorOption);
- if (!synchronousGit(workingDirectory, arguments, &outputTextData, &errorText)) {
+ if (!fullySynchronousGit(workingDirectory, arguments, &outputTextData, &errorText)) {
errorMessage = msgCannotDetermineBranch(workingDirectory, commandOutputFromLocal8Bit(errorText));
break;
}
@@ -805,7 +805,7 @@ bool GitClient::synchronousShortDescription(const QString &workingDirectory,
arguments << QLatin1String("log") << QLatin1String(GitClient::noColorOption)
<< (QLatin1String("--pretty=format:") + format)
<< QLatin1String("--max-count=1") << revision;
- const bool rc = synchronousGit(workingDirectory, arguments, &outputTextData, &errorText);
+ const bool rc = fullySynchronousGit(workingDirectory, arguments, &outputTextData, &errorText);
if (!rc) {
*errorMessage = tr("Unable to describe revision %1 in %2: %3").arg(revision, workingDirectory, commandOutputFromLocal8Bit(errorText));
return false;
@@ -893,7 +893,7 @@ bool GitClient::executeSynchronousStash(const QString &workingDirectory,
arguments << QLatin1String("stash");
if (!message.isEmpty())
arguments << QLatin1String("save") << message;
- const bool rc = synchronousGit(workingDirectory, arguments, &outputText, &errorText);
+ const bool rc = fullySynchronousGit(workingDirectory, arguments, &outputText, &errorText);
if (!rc) {
const QString msg = tr("Unable stash in %1: %2").arg(workingDirectory, commandOutputFromLocal8Bit(errorText));
if (errorMessage) {
@@ -944,7 +944,7 @@ bool GitClient::synchronousBranchCmd(const QString &workingDirectory, QStringLis
branchArgs.push_front(QLatin1String("branch"));
QByteArray outputText;
QByteArray errorText;
- const bool rc = synchronousGit(workingDirectory, branchArgs, &outputText, &errorText);
+ const bool rc = fullySynchronousGit(workingDirectory, branchArgs, &outputText, &errorText);
if (!rc) {
*errorMessage = tr("Unable to run a 'git branch' command in %1: %2").arg(workingDirectory, commandOutputFromLocal8Bit(errorText));
return false;
@@ -966,7 +966,7 @@ bool GitClient::synchronousShow(const QString &workingDirectory, const QString &
args << QLatin1String(noColorOption) << id;
QByteArray outputText;
QByteArray errorText;
- const bool rc = synchronousGit(workingDirectory, args, &outputText, &errorText);
+ const bool rc = fullySynchronousGit(workingDirectory, args, &outputText, &errorText);
if (!rc) {
*errorMessage = tr("Unable to run 'git show' in %1: %2").arg(workingDirectory, commandOutputFromLocal8Bit(errorText));
return false;
@@ -986,7 +986,7 @@ bool GitClient::synchronousCleanList(const QString &workingDirectory,
args << QLatin1String("clean") << QLatin1String("--dry-run") << QLatin1String("-dxf");
QByteArray outputText;
QByteArray errorText;
- const bool rc = synchronousGit(workingDirectory, args, &outputText, &errorText);
+ const bool rc = fullySynchronousGit(workingDirectory, args, &outputText, &errorText);
if (!rc) {
*errorMessage = tr("Unable to run 'git clean' in %1: %2").arg(workingDirectory, commandOutputFromLocal8Bit(errorText));
return false;
@@ -1008,7 +1008,7 @@ bool GitClient::synchronousApplyPatch(const QString &workingDirectory,
args << QLatin1String("apply") << QLatin1String("--whitespace=fix") << file;
QByteArray outputText;
QByteArray errorText;
- const bool rc = synchronousGit(workingDirectory, args, &outputText, &errorText);
+ const bool rc = fullySynchronousGit(workingDirectory, args, &outputText, &errorText);
if (rc) {
if (!errorText.isEmpty())
*errorMessage = tr("There were warnings while applying %1 to %2:\n%3").arg(file, workingDirectory, commandOutputFromLocal8Bit(errorText));
@@ -1088,14 +1088,33 @@ QProcessEnvironment GitClient::processEnvironment() const
return environment;
}
-bool GitClient::synchronousGit(const QString &workingDirectory,
+// Synchronous git execution using Utils::SynchronousProcess, with
+// log windows updating.
+Utils::SynchronousProcessResponse
+ GitClient::synchronousGit(const QString &workingDirectory,
+ const QStringList &gitArguments,
+ unsigned flags,
+ QTextCodec *stdOutCodec)
+{
+ if (Git::Constants::debug)
+ qDebug() << "synchronousGit" << workingDirectory << gitArguments;
+ QStringList args = binary(); // "cmd /c git" on Windows
+ const QString executable = args.front();
+ args.pop_front();
+ args.append(gitArguments);
+ return VCSBase::VCSBasePlugin::runVCS(workingDirectory, executable, args,
+ m_settings.timeoutSeconds * 1000,
+ flags, stdOutCodec);
+}
+
+bool GitClient::fullySynchronousGit(const QString &workingDirectory,
const QStringList &gitArguments,
QByteArray* outputText,
QByteArray* errorText,
bool logCommandToWindow)
{
if (Git::Constants::debug)
- qDebug() << "synchronousGit" << workingDirectory << gitArguments;
+ qDebug() << "fullySynchronousGit" << workingDirectory << gitArguments;
if (logCommandToWindow)
outputWindow()->appendCommand(workingDirectory, m_binaryPath, gitArguments);
@@ -1212,7 +1231,7 @@ GitClient::StatusResult GitClient::gitStatus(const QString &workingDirectory,
QStringList statusArgs(QLatin1String("status"));
if (untracked)
statusArgs << QLatin1String("-u");
- const bool statusRc = synchronousGit(workingDirectory, statusArgs, &outputText, &errorText);
+ const bool statusRc = fullySynchronousGit(workingDirectory, statusArgs, &outputText, &errorText);
GitCommand::removeColorCodes(&outputText);
if (output)
*output = commandOutputFromLocal8Bit(outputText);
@@ -1371,7 +1390,7 @@ bool GitClient::addAndCommit(const QString &repositoryDirectory,
QByteArray outputText;
QByteArray errorText;
- const bool rc = synchronousGit(repositoryDirectory, args, &outputText, &errorText);
+ const bool rc = fullySynchronousGit(repositoryDirectory, args, &outputText, &errorText);
if (rc) {
outputWindow()->append(tr("Committed %n file(s).\n", 0, checkedFiles.size()));
} else {
@@ -1491,58 +1510,58 @@ void GitClient::revert(const QStringList &files)
}
}
-void GitClient::pull(const QString &workingDirectory)
+bool GitClient::synchronousPull(const QString &workingDirectory)
{
- pull(workingDirectory, m_settings.pullRebase);
+ return synchronousPull(workingDirectory, m_settings.pullRebase);
}
-void GitClient::pull(const QString &workingDirectory, bool rebase)
+bool GitClient::synchronousPull(const QString &workingDirectory, bool rebase)
{
QStringList arguments(QLatin1String("pull"));
if (rebase)
arguments << QLatin1String("--rebase");
// Disable UNIX terminals to suppress SSH prompting.
- GitCommand *cmd = executeGit(workingDirectory, arguments, 0, true,
- GitCommand::ReportStderr, -1,
- VCSBase::VCSBasePlugin::isSshPromptConfigured());
- connectRepositoryChanged(workingDirectory, cmd);
- // Need to clean up if something goes wrong
- if (rebase) {
- cmd->setCookie(QVariant(workingDirectory));
- connect(cmd, SIGNAL(finished(bool,int,QVariant)), this, SLOT(slotPullRebaseFinished(bool,int,QVariant)),
- Qt::QueuedConnection);
+ const unsigned flags = VCSBase::VCSBasePlugin::SshPasswordPrompt|VCSBase::VCSBasePlugin::ShowStdOutInLogWindow
+ |VCSBase::VCSBasePlugin::ShowSuccessMessage;
+ const Utils::SynchronousProcessResponse resp = synchronousGit(workingDirectory, arguments, flags);
+ // Notify about changed files or abort the rebase.
+ const bool ok = resp.result == Utils::SynchronousProcessResponse::Finished;
+ if (ok) {
+ GitPlugin::instance()->gitVersionControl()->emitRepositoryChanged(workingDirectory);
+ } else {
+ if (rebase)
+ syncAbortPullRebase(workingDirectory);
}
+ return ok;
}
-void GitClient::slotPullRebaseFinished(bool ok, int exitCode, const QVariant &cookie)
+void GitClient::syncAbortPullRebase(const QString &workingDir)
{
- if (ok && exitCode == 0)
- return;
// Abort rebase to clean if something goes wrong
VCSBase::VCSBaseOutputWindow *outwin = VCSBase::VCSBaseOutputWindow::instance();
outwin->appendError(tr("The command 'git pull --rebase' failed, aborting rebase."));
- const QString workingDir = cookie.toString();
QStringList arguments;
arguments << QLatin1String("rebase") << QLatin1String("--abort");
QByteArray stdOut;
QByteArray stdErr;
- const bool rc = synchronousGit(workingDir, arguments, &stdOut, &stdErr, true);
+ const bool rc = fullySynchronousGit(workingDir, arguments, &stdOut, &stdErr, true);
outwin->append(commandOutputFromLocal8Bit(stdOut));
if (!rc)
outwin->appendError(commandOutputFromLocal8Bit(stdErr));
}
// Subversion: git svn
-void GitClient::subversionFetch(const QString &workingDirectory)
+void GitClient::synchronousSubversionFetch(const QString &workingDirectory)
{
QStringList args;
args << QLatin1String("svn") << QLatin1String("fetch");
// Disable UNIX terminals to suppress SSH prompting.
- GitCommand *cmd = executeGit(workingDirectory, args, 0, true, GitCommand::ReportStderr,
- -1, true);
- // Enable SSH prompting
- cmd->setUnixTerminalDisabled(VCSBase::VCSBasePlugin::isSshPromptConfigured());
- connectRepositoryChanged(workingDirectory, cmd);
+ const unsigned flags = VCSBase::VCSBasePlugin::SshPasswordPrompt|VCSBase::VCSBasePlugin::ShowStdOutInLogWindow
+ |VCSBase::VCSBasePlugin::ShowSuccessMessage;
+ const Utils::SynchronousProcessResponse resp = synchronousGit(workingDirectory, args, flags);
+ // Notify about changes.
+ if (resp.result == Utils::SynchronousProcessResponse::Finished)
+ GitPlugin::instance()->gitVersionControl()->emitRepositoryChanged(workingDirectory);
}
void GitClient::subversionLog(const QString &workingDirectory)
@@ -1563,12 +1582,14 @@ void GitClient::subversionLog(const QString &workingDirectory)
executeGit(workingDirectory, arguments, editor);
}
-void GitClient::push(const QString &workingDirectory)
+bool GitClient::synchronousPush(const QString &workingDirectory)
{
// Disable UNIX terminals to suppress SSH prompting.
- executeGit(workingDirectory, QStringList(QLatin1String("push")), 0,
- true, GitCommand::ReportStderr,
- VCSBase::VCSBasePlugin::isSshPromptConfigured());
+ const unsigned flags = VCSBase::VCSBasePlugin::SshPasswordPrompt|VCSBase::VCSBasePlugin::ShowStdOutInLogWindow
+ |VCSBase::VCSBasePlugin::ShowSuccessMessage;
+ const Utils::SynchronousProcessResponse resp =
+ synchronousGit(workingDirectory, QStringList(QLatin1String("push")), flags);
+ return resp.result == Utils::SynchronousProcessResponse::Finished;
}
QString GitClient::msgNoChangedFiles()
@@ -1597,7 +1618,7 @@ bool GitClient::synchronousStashRestore(const QString &workingDirectory,
}
QByteArray outputText;
QByteArray errorText;
- const bool rc = synchronousGit(workingDirectory, arguments, &outputText, &errorText);
+ const bool rc = fullySynchronousGit(workingDirectory, arguments, &outputText, &errorText);
if (!rc) {
const QString stdErr = commandOutputFromLocal8Bit(errorText);
const QString msg = branch.isEmpty() ?
@@ -1629,7 +1650,7 @@ bool GitClient::synchronousStashRemove(const QString &workingDirectory,
}
QByteArray outputText;
QByteArray errorText;
- const bool rc = synchronousGit(workingDirectory, arguments, &outputText, &errorText);
+ const bool rc = fullySynchronousGit(workingDirectory, arguments, &outputText, &errorText);
if (!rc) {
const QString stdErr = commandOutputFromLocal8Bit(errorText);
const QString msg = stash.isEmpty() ?
@@ -1671,7 +1692,7 @@ bool GitClient::synchronousStashList(const QString &workingDirectory,
arguments << QLatin1String("list") << QLatin1String(noColorOption);
QByteArray outputText;
QByteArray errorText;
- const bool rc = synchronousGit(workingDirectory, arguments, &outputText, &errorText);
+ const bool rc = fullySynchronousGit(workingDirectory, arguments, &outputText, &errorText);
if (!rc) {
const QString msg = tr("Unable retrieve stash list of %1: %2").arg(workingDirectory, commandOutputFromLocal8Bit(errorText));
if (errorMessage) {
@@ -1697,7 +1718,7 @@ QString GitClient::readConfig(const QString &workingDirectory, const QStringList
QByteArray outputText;
QByteArray errorText;
- if (synchronousGit(workingDirectory, arguments, &outputText, &errorText, false))
+ if (fullySynchronousGit(workingDirectory, arguments, &outputText, &errorText, false))
return commandOutputFromLocal8Bit(outputText);
return QString();
}
@@ -1768,7 +1789,7 @@ unsigned GitClient::synchronousGitVersion(bool silent, QString *errorMessage /*
// run git --version
QByteArray outputText;
QByteArray errorText;
- const bool rc = synchronousGit(QString(), QStringList("--version"), &outputText, &errorText);
+ const bool rc = fullySynchronousGit(QString(), QStringList("--version"), &outputText, &errorText);
if (!rc) {
const QString msg = tr("Unable to determine git version: %1").arg(commandOutputFromLocal8Bit(errorText));
if (errorMessage) {