diff options
author | Friedemann Kleint <[email protected]> | 2010-05-25 11:48:53 +0200 |
---|---|---|
committer | Friedemann Kleint <[email protected]> | 2010-05-25 11:48:53 +0200 |
commit | 1c69b97ca6d1bbe5419308049848c11abc80d5d5 (patch) | |
tree | 7ae899981e40af78ec20a307fdb73560c9d756b3 /src/plugins/git/gitclient.cpp | |
parent | 385ea8c9e0f9a4d2ea08f2d40c8e198630dac746 (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.cpp | 125 |
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) { |