diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp index eab02e8c0549110c679a0ce7f1164b48417ea8d1..f74f4d94f15c9709fafcadcfc135112582089abc 100644 --- a/src/plugins/git/gitclient.cpp +++ b/src/plugins/git/gitclient.cpp @@ -913,6 +913,25 @@ static inline QStringList statusArguments() << QLatin1String("status"); } +static inline void msgCannotRun(const QString &message, QString *errorMessage) +{ + if (errorMessage) + *errorMessage = message; + else + outputWindow()->appendError(message); +} + +static inline void msgCannotRun(const QStringList &args, const QString &workingDirectory, + const QByteArray &error, QString *errorMessage) +{ + const QString message = GitClient::tr("Cannot run \"%1 %2\" in \"%2\": %3") + .arg(QLatin1String("git ") + args.join(QLatin1String(" ")), + QDir::toNativeSeparators(workingDirectory), + commandOutputFromLocal8Bit(error)); + + msgCannotRun(message, errorMessage); +} + // ---------------- GitClient const char *GitClient::stashNamePrefix = "stash@{"; @@ -1535,13 +1554,7 @@ bool GitClient::synchronousCheckout(const QString &workingDirectory, const QString output = commandOutputFromLocal8Bit(outputText); outputWindow()->append(output); if (!rc) { - const QString stdErr = commandOutputFromLocal8Bit(errorText); - //: Meaning of the arguments: %1: Branch, %2: Repository, %3: Error message - const QString msg = tr("Cannot checkout \"%1\" of \"%2\": %3").arg(ref, workingDirectory, stdErr); - if (errorMessage) - *errorMessage = msg; - else - outputWindow()->appendError(msg); + msgCannotRun(arguments, workingDirectory, errorText, errorMessage); return false; } updateSubmodulesIfNeeded(workingDirectory, true); @@ -1585,13 +1598,9 @@ bool GitClient::synchronousLog(const QString &workingDirectory, const QStringLis else *output = commandOutputFromLocal8Bit(outputText); } else { - const QString errorMessage = tr("Cannot obtain log of \"%1\": %2"). - arg(QDir::toNativeSeparators(workingDirectory), - commandOutputFromLocal8Bit(errorText)); - if (errorMessageIn) - *errorMessageIn = errorMessage; - else - outputWindow()->appendError(errorMessage); + msgCannotRun(tr("Cannot obtain log of \"%1\": %2") + .arg(QDir::toNativeSeparators(workingDirectory), + commandOutputFromLocal8Bit(errorText)), errorMessageIn); } return rc; } @@ -1610,10 +1619,9 @@ bool GitClient::synchronousAdd(const QString &workingDirectory, arguments.append(files); const bool rc = fullySynchronousGit(workingDirectory, arguments, &outputText, &errorText); if (!rc) { - const QString errorMessage = tr("Cannot add %n file(s) to \"%1\": %2", 0, files.size()). - arg(QDir::toNativeSeparators(workingDirectory), - commandOutputFromLocal8Bit(errorText)); - outputWindow()->appendError(errorMessage); + msgCannotRun(tr("Cannot add %n file(s) to \"%1\": %2", 0, files.size()) + .arg(QDir::toNativeSeparators(workingDirectory), + commandOutputFromLocal8Bit(errorText)), 0); } return rc; } @@ -1631,9 +1639,9 @@ bool GitClient::synchronousDelete(const QString &workingDirectory, arguments.append(files); const bool rc = fullySynchronousGit(workingDirectory, arguments, &outputText, &errorText); if (!rc) { - const QString errorMessage = tr("Cannot remove %n file(s) from \"%1\": %2", 0, files.size()). - arg(QDir::toNativeSeparators(workingDirectory), commandOutputFromLocal8Bit(errorText)); - outputWindow()->appendError(errorMessage); + msgCannotRun(tr("Cannot remove %n file(s) from \"%1\": %2", 0, files.size()) + .arg(QDir::toNativeSeparators(workingDirectory), + commandOutputFromLocal8Bit(errorText)), 0); } return rc; } @@ -1650,9 +1658,8 @@ bool GitClient::synchronousMove(const QString &workingDirectory, arguments << (to); const bool rc = fullySynchronousGit(workingDirectory, arguments, &outputText, &errorText); if (!rc) { - const QString errorMessage = tr("Cannot move from \"%1\" to \"%2\": %3"). - arg(from, to, commandOutputFromLocal8Bit(errorText)); - outputWindow()->appendError(errorMessage); + msgCannotRun(tr("Cannot move from \"%1\" to \"%2\": %3") + .arg(from, to, commandOutputFromLocal8Bit(errorText)), 0); } return rc; } @@ -1676,16 +1683,15 @@ bool GitClient::synchronousReset(const QString &workingDirectory, // Assume real failure if the output does not contain "foo.cpp modified" // or "Unstaged changes after reset" (git 1.7.0). if (!rc && (!output.contains(QLatin1String("modified")) - && !output.contains(QLatin1String("Unstaged changes after reset")))) { - const QString stdErr = commandOutputFromLocal8Bit(errorText); - const QString msg = files.isEmpty() ? - tr("Cannot reset \"%1\": %2").arg(QDir::toNativeSeparators(workingDirectory), stdErr) : - tr("Cannot reset %n file(s) in \"%1\": %2", 0, files.size()). - arg(QDir::toNativeSeparators(workingDirectory), stdErr); - if (errorMessage) - *errorMessage = msg; - else - outputWindow()->appendError(msg); + && !output.contains(QLatin1String("Unstaged changes after reset")))) { + if (files.isEmpty()) { + msgCannotRun(arguments, workingDirectory, errorText, errorMessage); + } else { + msgCannotRun(tr("Cannot reset %n file(s) in \"%1\": %2", 0, files.size()) + .arg(QDir::toNativeSeparators(workingDirectory), + commandOutputFromLocal8Bit(errorText)), + errorMessage); + } return false; } return true; @@ -1736,12 +1742,10 @@ bool GitClient::synchronousCheckoutFiles(const QString &workingDirectory, const QString fileArg = files.join(QLatin1String(", ")); //: Meaning of the arguments: %1: revision, %2: files, %3: repository, //: %4: Error message - const QString msg = tr("Cannot checkout \"%1\" of %2 in \"%3\": %4"). - arg(revision, fileArg, workingDirectory, commandOutputFromLocal8Bit(errorText)); - if (errorMessage) - *errorMessage = msg; - else - outputWindow()->appendError(msg); + msgCannotRun(tr("Cannot checkout \"%1\" of %2 in \"%3\": %4") + .arg(revision, fileArg, workingDirectory, + commandOutputFromLocal8Bit(errorText)), + errorMessage); return false; } return true; @@ -1791,12 +1795,7 @@ bool GitClient::synchronousRevListCmd(const QString &workingDirectory, const QSt const bool rc = fullySynchronousGit(workingDirectory, args, &outputTextData, &errorText); if (!rc) { - if (errorMessage) - *errorMessage = commandOutputFromLocal8Bit(errorText); - else - outputWindow()->appendError(tr("Cannot execute \"git %1\" in \"%2\": %3").arg( - args.join(QLatin1String(" ")), workingDirectory, - commandOutputFromLocal8Bit(errorText))); + msgCannotRun(args, workingDirectory, errorText, errorMessage); return false; } *output = commandOutputFromLocal8Bit(outputTextData); @@ -1874,12 +1873,6 @@ QString GitClient::synchronousCurrentLocalBranch(const QString &workingDirectory return QString(); } -static inline QString msgCannotRun(const QString &command, const QString &workingDirectory, const QString &why) -{ - return GitClient::tr("Cannot run \"%1\" in \"%2\": %3") - .arg(command, QDir::toNativeSeparators(workingDirectory), why); -} - bool GitClient::synchronousHeadRefs(const QString &workingDirectory, QStringList *output, QString *errorMessage) { @@ -1890,12 +1883,7 @@ bool GitClient::synchronousHeadRefs(const QString &workingDirectory, QStringList QByteArray errorText; const bool rc = fullySynchronousGit(workingDirectory, args, &outputText, &errorText); if (!rc) { - QString message = msgCannotRun(QLatin1String("git show-ref --head"), workingDirectory, commandOutputFromLocal8Bit(errorText)); - - if (errorMessage) - *errorMessage = message; - else - outputWindow()->appendError(message); + msgCannotRun(args, workingDirectory, errorText, errorMessage); return false; } @@ -1982,12 +1970,9 @@ QString GitClient::synchronousTopRevision(const QString &workingDirectory, QStri } QString revision = commandOutputFromLocal8Bit(outputTextData); revision.remove(QLatin1Char('\n')); - if (revision.isEmpty() && !errorMessage.isEmpty()) { - if (errorMessageIn) - *errorMessageIn = errorMessage; - else - outputWindow()->appendError(errorMessage); - } + if (revision.isEmpty() && !errorMessage.isEmpty()) + msgCannotRun(errorMessage, errorMessageIn); + return revision; } @@ -2152,17 +2137,10 @@ bool GitClient::executeSynchronousStash(const QString &workingDirectory, arguments << QLatin1String("save") << message; const bool rc = fullySynchronousGit(workingDirectory, arguments, &outputText, &errorText, VcsBasePlugin::ExpectRepoChanges); - if (!rc) { - const QString msg = tr("Cannot stash in \"%1\": %2"). - arg(QDir::toNativeSeparators(workingDirectory), - commandOutputFromLocal8Bit(errorText)); - if (errorMessage) - *errorMessage = msg; - else - outputWindow()->appendError(msg); - return false; - } - return true; + if (!rc) + msgCannotRun(arguments, workingDirectory, errorText, errorMessage); + + return rc; } // Resolve a stash name from message @@ -2186,11 +2164,8 @@ bool GitClient::stashNameFromMessage(const QString &workingDirectory, } } //: Look-up of a stash via its descriptive message failed. - const QString msg = tr("Cannot resolve stash message \"%1\" in \"%2\".").arg(message, workingDirectory); - if (errorMessage) - *errorMessage = msg; - else - outputWindow()->appendError(msg); + msgCannotRun(tr("Cannot resolve stash message \"%1\" in \"%2\".") + .arg(message, workingDirectory), errorMessage); return false; } @@ -2202,26 +2177,24 @@ bool GitClient::synchronousBranchCmd(const QString &workingDirectory, QStringLis QByteArray errorText; const bool rc = fullySynchronousGit(workingDirectory, branchArgs, &outputText, &errorText); *output = commandOutputFromLocal8Bit(outputText); - if (!rc && errorMessage) { - *errorMessage = msgCannotRun(QLatin1String("git branch"), workingDirectory, - commandOutputFromLocal8Bit(errorText)); - } + if (!rc) + msgCannotRun(branchArgs, workingDirectory, errorText, errorMessage); + return rc; } -bool GitClient::synchronousTagCmd(const QString &workingDirectory, QStringList tagArgs, QString *output, QString *errorMessage) +bool GitClient::synchronousTagCmd(const QString &workingDirectory, QStringList tagArgs, + QString *output, QString *errorMessage) { tagArgs.push_front(QLatin1String("tag")); QByteArray outputText; QByteArray errorText; const bool rc = fullySynchronousGit(workingDirectory, tagArgs, &outputText, &errorText); *output = commandOutputFromLocal8Bit(outputText); - if (!rc) { - *errorMessage = msgCannotRun(QLatin1String("git tag"), workingDirectory, - commandOutputFromLocal8Bit(errorText)); - return false; - } - return true; + if (!rc) + msgCannotRun(tagArgs, workingDirectory, errorText, errorMessage); + + return rc; } bool GitClient::synchronousForEachRefCmd(const QString &workingDirectory, QStringList args, @@ -2232,17 +2205,10 @@ bool GitClient::synchronousForEachRefCmd(const QString &workingDirectory, QStrin QByteArray errorText; const bool rc = fullySynchronousGit(workingDirectory, args, &outputText, &errorText); *output = commandOutputFromLocal8Bit(outputText); - if (!rc) { - QString error = msgCannotRun(QLatin1String("git for-each-ref"), workingDirectory, - commandOutputFromLocal8Bit(errorText)); - if (errorMessage) - *errorMessage = error; - else - outputWindow()->appendError(error); + if (!rc) + msgCannotRun(args, workingDirectory, errorText, errorMessage); - return false; - } - return true; + return rc; } bool GitClient::synchronousRemoteCmd(const QString &workingDirectory, QStringList remoteArgs, @@ -2253,7 +2219,7 @@ bool GitClient::synchronousRemoteCmd(const QString &workingDirectory, QStringLis QByteArray errorText; const bool rc = fullySynchronousGit(workingDirectory, remoteArgs, &outputText, &errorText); if (!rc) { - *errorMessage = msgCannotRun(QLatin1String("git remote"), workingDirectory, commandOutputFromLocal8Bit(errorText)); + msgCannotRun(remoteArgs, workingDirectory, errorText, errorMessage); return false; } *output = commandOutputFromLocal8Bit(outputText); @@ -2268,10 +2234,7 @@ QMap<QString,QString> GitClient::synchronousRemotesList(const QString &workingDi QString error; QStringList args(QLatin1String("-v")); if (!synchronousRemoteCmd(workingDirectory, args, &output, &error)) { - if (errorMessage) - *errorMessage = error; - else - outputWindow()->appendError(error); + msgCannotRun(error, errorMessage); return result; } QStringList remotes = output.split(QLatin1String("\n")); @@ -2299,15 +2262,9 @@ QStringList GitClient::synchronousSubmoduleStatus(const QString &workingDirector // get submodule status arguments << QLatin1String("submodule") << QLatin1String("status"); if (!fullySynchronousGit(workingDirectory, arguments, &outputTextData, &errorText)) { - QString error = tr("Cannot retrieve submodule status of \"%1\": %2") - .arg(QDir::toNativeSeparators(workingDirectory), - commandOutputFromLocal8Bit(errorText)); - - if (errorMessage) - *errorMessage = error; - else - outputWindow()->appendError(error); - + msgCannotRun(tr("Cannot retrieve submodule status of \"%1\": %2") + .arg(QDir::toNativeSeparators(workingDirectory), + commandOutputFromLocal8Bit(errorText)), errorMessage); return QStringList(); } return commandOutputLinesFromLocal8Bit(outputTextData); @@ -2382,12 +2339,11 @@ bool GitClient::synchronousShow(const QString &workingDirectory, const QString & QByteArray outputText; QByteArray errorText; const bool rc = fullySynchronousGit(workingDirectory, args, &outputText, &errorText); - if (!rc) { - *errorMessage = msgCannotRun(QLatin1String("git show"), workingDirectory, commandOutputFromLocal8Bit(errorText)); - return false; - } - *output = commandOutputFromLocal8Bit(outputText); - return true; + if (rc) + *output = commandOutputFromLocal8Bit(outputText); + else + msgCannotRun(QStringList(QLatin1String("show")), workingDirectory, errorText, errorMessage); + return rc; } // Retrieve list of files to be cleaned @@ -2399,7 +2355,8 @@ bool GitClient::cleanList(const QString &workingDirectory, const QString &flag, QByteArray errorText; const bool rc = fullySynchronousGit(workingDirectory, args, &outputText, &errorText); if (!rc) { - *errorMessage = msgCannotRun(QLatin1String("git clean"), workingDirectory, commandOutputFromLocal8Bit(errorText)); + msgCannotRun(QStringList(QLatin1String("clean")), workingDirectory, + errorText, errorMessage); return false; } // Filter files that git would remove @@ -3376,9 +3333,8 @@ bool GitClient::synchronousSetTrackingBranch(const QString &workingDirectory, arguments << QLatin1String("--set-upstream") << branch << tracking; const bool rc = fullySynchronousGit(workingDirectory, arguments, &outputText, &errorText); if (!rc) { - const QString errorMessage = tr("Cannot set tracking branch: %1") - .arg(commandOutputFromLocal8Bit(errorText)); - outputWindow()->appendError(errorMessage); + msgCannotRun(tr("Cannot set tracking branch: %1") + .arg(commandOutputFromLocal8Bit(errorText)), 0); } return rc; } @@ -3585,24 +3541,14 @@ bool GitClient::synchronousStashRestore(const QString &workingDirectory, QByteArray errorText; const bool rc = fullySynchronousGit(workingDirectory, arguments, &outputText, &errorText, VcsBasePlugin::ExpectRepoChanges); - if (!rc) { - const QString stdErr = commandOutputFromLocal8Bit(errorText); - const QString nativeWorkingDir = QDir::toNativeSeparators(workingDirectory); - const QString msg = branch.isEmpty() ? - tr("Cannot restore stash \"%1\": %2"). - arg(nativeWorkingDir, stdErr) : - tr("Cannot restore stash \"%1\" to branch \"%2\": %3"). - arg(nativeWorkingDir, branch, stdErr); - if (errorMessage) - *errorMessage = msg; - else - outputWindow()->appendError(msg); - return false; + if (rc) { + const QString output = commandOutputFromLocal8Bit(outputText); + if (!output.isEmpty()) + outputWindow()->append(output); + } else { + msgCannotRun(arguments, workingDirectory, errorText, errorMessage); } - QString output = commandOutputFromLocal8Bit(outputText); - if (!output.isEmpty()) - outputWindow()->append(output); - return true; + return rc; } bool GitClient::synchronousStashRemove(const QString &workingDirectory, @@ -3617,24 +3563,14 @@ bool GitClient::synchronousStashRemove(const QString &workingDirectory, QByteArray outputText; QByteArray errorText; const bool rc = fullySynchronousGit(workingDirectory, arguments, &outputText, &errorText); - if (!rc) { - const QString stdErr = commandOutputFromLocal8Bit(errorText); - const QString nativeWorkingDir = QDir::toNativeSeparators(workingDirectory); - const QString msg = stash.isEmpty() ? - tr("Cannot remove stashes of \"%1\": %2"). - arg(nativeWorkingDir, stdErr) : - tr("Cannot remove stash \"%1\" of \"%2\": %3"). - arg(stash, nativeWorkingDir, stdErr); - if (errorMessage) - *errorMessage = msg; - else - outputWindow()->appendError(msg); - return false; + if (rc) { + const QString output = commandOutputFromLocal8Bit(outputText); + if (!output.isEmpty()) + outputWindow()->append(output); + } else { + msgCannotRun(arguments, workingDirectory, errorText, errorMessage); } - QString output = commandOutputFromLocal8Bit(outputText); - if (!output.isEmpty()) - outputWindow()->append(output); - return true; + return rc; } void GitClient::branchList(const QString &workingDirectory) @@ -3662,13 +3598,7 @@ bool GitClient::synchronousStashList(const QString &workingDirectory, QByteArray errorText; const bool rc = fullySynchronousGit(workingDirectory, arguments, &outputText, &errorText); if (!rc) { - const QString msg = tr("Cannot retrieve stash list of \"%1\": %2"). - arg(QDir::toNativeSeparators(workingDirectory), - commandOutputFromLocal8Bit(errorText)); - if (errorMessage) - *errorMessage = msg; - else - outputWindow()->appendError(msg); + msgCannotRun(arguments, workingDirectory, errorText, errorMessage); return false; } Stash stash; @@ -3794,11 +3724,9 @@ unsigned GitClient::synchronousGitVersion(QString *errorMessage) const &outputText, &errorText, VcsBasePlugin::SuppressCommandLogging); if (!rc) { - const QString msg = tr("Cannot determine git version: %1").arg(commandOutputFromLocal8Bit(errorText)); - if (errorMessage) - *errorMessage = msg; - else - outputWindow()->appendError(msg); + msgCannotRun(tr("Cannot determine Git version: %1") + .arg(commandOutputFromLocal8Bit(errorText)), + errorMessage); return 0; } // cut 'git version 1.6.5.1.sha'