From 93eb7d7be07ca022caaea9cf5d38126ea29ca273 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint <Friedemann.Kleint@nokia.com> Date: Mon, 29 Mar 2010 16:24:48 +0200 Subject: [PATCH] VCS[git]: Refuse to show sha 000000 or ^xxxx. Task-number: QTCREATORBUG-978 --- src/plugins/git/gitclient.cpp | 93 +++++++++++++++++++++++------------ 1 file changed, 61 insertions(+), 32 deletions(-) diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp index 1a8c9e3b113..6102efcc866 100644 --- a/src/plugins/git/gitclient.cpp +++ b/src/plugins/git/gitclient.cpp @@ -104,6 +104,11 @@ static inline QStringList commandOutputLinesFromLocal8Bit(const QByteArray &a) return output.split(newLine); } +static inline VCSBase::VCSBaseOutputWindow *outputWindow() +{ + return VCSBase::VCSBaseOutputWindow::instance(); +} + namespace Git { namespace Internal { @@ -238,20 +243,20 @@ void GitClient::diff(const QString &workingDirectory, if (unstagedFileNames.empty() && stagedFileNames.empty()) { QStringList arguments(commonDiffArgs); arguments << diffArgs; - VCSBase::VCSBaseOutputWindow::instance()->appendCommand(formatCommand(binary, arguments)); + outputWindow()->appendCommand(formatCommand(binary, arguments)); command->addJob(arguments, m_settings.timeoutSeconds); } else { // Files diff. if (!unstagedFileNames.empty()) { QStringList arguments(commonDiffArgs); arguments << QLatin1String("--") << unstagedFileNames; - VCSBase::VCSBaseOutputWindow::instance()->appendCommand(formatCommand(binary, arguments)); + outputWindow()->appendCommand(formatCommand(binary, arguments)); command->addJob(arguments, m_settings.timeoutSeconds); } if (!stagedFileNames.empty()) { QStringList arguments(commonDiffArgs); arguments << QLatin1String("--cached") << diffArgs << QLatin1String("--") << stagedFileNames; - VCSBase::VCSBaseOutputWindow::instance()->appendCommand(formatCommand(binary, arguments)); + outputWindow()->appendCommand(formatCommand(binary, arguments)); command->addJob(arguments, m_settings.timeoutSeconds); } } @@ -299,7 +304,7 @@ void GitClient::status(const QString &workingDirectory) // @TODO: Use "--no-color" once it is supported QStringList statusArgs(QLatin1String("status")); statusArgs << QLatin1String("-u"); - VCSBase::VCSBaseOutputWindow *outwin = VCSBase::VCSBaseOutputWindow::instance(); + VCSBase::VCSBaseOutputWindow *outwin = outputWindow(); outwin->setRepository(workingDirectory); GitCommand *command = executeGit(workingDirectory, statusArgs, 0, true); connect(command, SIGNAL(finished(bool,int,QVariant)), outwin, SLOT(clearRepository()), @@ -353,10 +358,30 @@ void GitClient::log(const QString &workingDirectory, const QStringList &fileName executeGit(workingDirectory, arguments, editor); } +// Do not show "0000" or "^32ae4" +static inline bool canShow(const QString &sha) +{ + if (sha.startsWith(QLatin1Char('^'))) + return false; + if (sha.count(QLatin1Char('0')) == sha.size()) + return false; + return true; +} + +static inline QString msgCannotShow(const QString &sha) +{ + return GitClient::tr("Cannot describe '%1'.").arg(sha); +} + void GitClient::show(const QString &source, const QString &id) { if (Git::Constants::debug) qDebug() << "show" << source << id; + if (!canShow(id)) { + outputWindow()->append(msgCannotShow(id)); + return; + } + QStringList arguments; arguments << QLatin1String("show") << QLatin1String(noColorOption) << id; @@ -421,7 +446,7 @@ bool GitClient::synchronousCheckoutBranch(const QString &workingDirectory, arguments << QLatin1String("checkout") << branch; const bool rc = synchronousGit(workingDirectory, arguments, &outputText, &errorText); const QString output = commandOutputFromLocal8Bit(outputText); - VCSBase::VCSBaseOutputWindow::instance()->append(output); + outputWindow()->append(output); if (!rc) { const QString stdErr = commandOutputFromLocal8Bit(errorText); //: Meaning of the arguments: %1: Branch, %2: Repository, %3: Error message @@ -429,7 +454,7 @@ bool GitClient::synchronousCheckoutBranch(const QString &workingDirectory, if (errorMessage) { *errorMessage = msg; } else { - VCSBase::VCSBaseOutputWindow::instance()->appendError(msg); + outputWindow()->appendError(msg); } return false; } @@ -487,7 +512,7 @@ bool GitClient::synchronousAdd(const QString &workingDirectory, if (!rc) { const QString errorMessage = tr("Unable to add %n file(s) to %1: %2", 0, files.size()). arg(workingDirectory, commandOutputFromLocal8Bit(errorText)); - VCSBase::VCSBaseOutputWindow::instance()->appendError(errorMessage); + outputWindow()->appendError(errorMessage); } return rc; } @@ -509,7 +534,7 @@ bool GitClient::synchronousDelete(const QString &workingDirectory, if (!rc) { const QString errorMessage = tr("Unable to remove %n file(s) from %1: %2", 0, files.size()). arg(workingDirectory, commandOutputFromLocal8Bit(errorText)); - VCSBase::VCSBaseOutputWindow::instance()->appendError(errorMessage); + outputWindow()->appendError(errorMessage); } return rc; } @@ -531,7 +556,7 @@ bool GitClient::synchronousReset(const QString &workingDirectory, } const bool rc = synchronousGit(workingDirectory, arguments, &outputText, &errorText); const QString output = commandOutputFromLocal8Bit(outputText); - VCSBase::VCSBaseOutputWindow::instance()->append(output); + outputWindow()->append(output); // Note that git exits with 1 even if the operation is successful // Assume real failure if the output does not contain "foo.cpp modified" if (!rc && !output.contains(QLatin1String("modified"))) { @@ -542,7 +567,7 @@ bool GitClient::synchronousReset(const QString &workingDirectory, if (errorMessage) { *errorMessage = msg; } else { - VCSBase::VCSBaseOutputWindow::instance()->appendError(msg); + outputWindow()->appendError(msg); } return false; } @@ -559,9 +584,9 @@ bool GitClient::synchronousInit(const QString &workingDirectory) const QStringList arguments(QLatin1String("init")); const bool rc = synchronousGit(workingDirectory, arguments, &outputText, &errorText); // '[Re]Initialized...' - VCSBase::VCSBaseOutputWindow::instance()->append(commandOutputFromLocal8Bit(outputText)); + outputWindow()->append(commandOutputFromLocal8Bit(outputText)); if (!rc) - VCSBase::VCSBaseOutputWindow::instance()->appendError(commandOutputFromLocal8Bit(errorText)); + outputWindow()->appendError(commandOutputFromLocal8Bit(errorText)); return rc; } @@ -594,7 +619,7 @@ bool GitClient::synchronousCheckoutFiles(const QString &workingDirectory, if (errorMessage) { *errorMessage = msg; } else { - VCSBase::VCSBaseOutputWindow::instance()->appendError(msg); + outputWindow()->appendError(msg); } return false; } @@ -762,7 +787,7 @@ bool GitClient::synchronousTopRevision(const QString &workingDirectory, if (errorMessageIn) { *errorMessageIn = errorMessage; } else { - VCSBase::VCSBaseOutputWindow::instance()->appendError(errorMessage); + outputWindow()->appendError(errorMessage); } } return !failed; @@ -846,10 +871,10 @@ QString GitClient::synchronousStash(const QString &workingDirectory, if (unchanged) *unchanged = true; if (!(flags & StashIgnoreUnchanged)) - VCSBase::VCSBaseOutputWindow::instance()->append(msgNoChangedFiles()); + outputWindow()->append(msgNoChangedFiles()); break; case StatusFailed: - VCSBase::VCSBaseOutputWindow::instance()->append(errorMessage); + outputWindow()->append(errorMessage); break; } if (!success) @@ -877,7 +902,7 @@ bool GitClient::executeSynchronousStash(const QString &workingDirectory, if (errorMessage) { *errorMessage = msg; } else { - VCSBase::VCSBaseOutputWindow::instance()->append(msg); + outputWindow()->append(msg); } return false; } @@ -909,7 +934,7 @@ bool GitClient::stashNameFromMessage(const QString &workingDirectory, if (errorMessage) { *errorMessage = msg; } else { - VCSBase::VCSBaseOutputWindow::instance()->append(msg); + outputWindow()->append(msg); } return false; } @@ -936,6 +961,10 @@ bool GitClient::synchronousShow(const QString &workingDirectory, const QString & { if (Git::Constants::debug) qDebug() << Q_FUNC_INFO << workingDirectory << id; + if (!canShow(id)) { + *errorMessage = msgCannotShow(id); + return false; + } QStringList args(QLatin1String("show")); args << QLatin1String(noColorOption) << id; QByteArray outputText; @@ -1030,7 +1059,7 @@ GitCommand *GitClient::executeGit(const QString &workingDirectory, GitCommand::TerminationReportMode tm, int editorLineNumber) { - VCSBase::VCSBaseOutputWindow::instance()->appendCommand(formatCommand(QLatin1String(Constants::GIT_BINARY), arguments)); + outputWindow()->appendCommand(formatCommand(QLatin1String(Constants::GIT_BINARY), arguments)); GitCommand *command = createCommand(workingDirectory, editor, outputToWindow, editorLineNumber); command->addJob(arguments, m_settings.timeoutSeconds); command->setTerminationReportMode(tm); @@ -1070,7 +1099,7 @@ bool GitClient::synchronousGit(const QString &workingDirectory, qDebug() << "synchronousGit" << workingDirectory << gitArguments; if (logCommandToWindow) - VCSBase::VCSBaseOutputWindow::instance()->appendCommand(formatCommand(m_binaryPath, gitArguments)); + outputWindow()->appendCommand(formatCommand(m_binaryPath, gitArguments)); QProcess process; process.setWorkingDirectory(workingDirectory); @@ -1122,7 +1151,7 @@ GitClient::StashResult GitClient::ensureStash(const QString &workingDirectory) QString errorMessage; const StashResult sr = ensureStash(workingDirectory, &errorMessage); if (sr == StashFailed) - VCSBase::VCSBaseOutputWindow::instance()->appendError(errorMessage); + outputWindow()->appendError(errorMessage); return sr; } @@ -1345,9 +1374,9 @@ bool GitClient::addAndCommit(const QString &repositoryDirectory, QByteArray errorText; const bool rc = synchronousGit(repositoryDirectory, args, &outputText, &errorText); if (rc) { - VCSBase::VCSBaseOutputWindow::instance()->append(tr("Committed %n file(s).\n", 0, checkedFiles.size())); + outputWindow()->append(tr("Committed %n file(s).\n", 0, checkedFiles.size())); } else { - VCSBase::VCSBaseOutputWindow::instance()->appendError(tr("Unable to commit %n file(s): %1\n", 0, checkedFiles.size()).arg(commandOutputFromLocal8Bit(errorText))); + outputWindow()->appendError(tr("Unable to commit %n file(s): %1\n", 0, checkedFiles.size()).arg(commandOutputFromLocal8Bit(errorText))); } return rc; } @@ -1454,11 +1483,11 @@ void GitClient::revert(const QStringList &files) break; case RevertUnchanged: { const QString msg = (isDirectory || files.size() > 1) ? msgNoChangedFiles() : tr("The file is not modified."); - VCSBase::VCSBaseOutputWindow::instance()->append(msg); + outputWindow()->append(msg); } break; case RevertFailed: - VCSBase::VCSBaseOutputWindow::instance()->append(errorMessage); + outputWindow()->append(errorMessage); break; } } @@ -1568,13 +1597,13 @@ bool GitClient::synchronousStashRestore(const QString &workingDirectory, if (errorMessage) { *errorMessage = msg; } else { - VCSBase::VCSBaseOutputWindow::instance()->append(msg); + outputWindow()->append(msg); } return false; } QString output = commandOutputFromLocal8Bit(outputText); if (!output.isEmpty()) - VCSBase::VCSBaseOutputWindow::instance()->append(output); + outputWindow()->append(output); GitPlugin::instance()->gitVersionControl()->emitRepositoryChanged(workingDirectory); return true; } @@ -1600,13 +1629,13 @@ bool GitClient::synchronousStashRemove(const QString &workingDirectory, if (errorMessage) { *errorMessage = msg; } else { - VCSBase::VCSBaseOutputWindow::instance()->append(msg); + outputWindow()->append(msg); } return false; } QString output = commandOutputFromLocal8Bit(outputText); if (!output.isEmpty()) - VCSBase::VCSBaseOutputWindow::instance()->append(output); + outputWindow()->append(output); return true; } @@ -1639,7 +1668,7 @@ bool GitClient::synchronousStashList(const QString &workingDirectory, if (errorMessage) { *errorMessage = msg; } else { - VCSBase::VCSBaseOutputWindow::instance()->append(msg); + outputWindow()->append(msg); } return false; } @@ -1737,9 +1766,9 @@ unsigned GitClient::synchronousGitVersion(bool silent, QString *errorMessage /* *errorMessage = msg; } else { if (silent) { - VCSBase::VCSBaseOutputWindow::instance()->append(msg); + outputWindow()->append(msg); } else { - VCSBase::VCSBaseOutputWindow::instance()->appendError(msg); + outputWindow()->appendError(msg); } } return 0; -- GitLab