diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp index 8bf8ae41bc168c3f5fb54e5199f9a42d7366fc47..ddd5f534bd9dbc8cd12b6f8704a074abad93ba94 100644 --- a/src/plugins/git/gitclient.cpp +++ b/src/plugins/git/gitclient.cpp @@ -1156,6 +1156,37 @@ QString GitClient::synchronousTopRevision(const QString &workingDirectory, QStri return revision; } +void GitClient::synchronousTagsForCommit(const QString &workingDirectory, const QString &revision, + QByteArray &precedes, QByteArray &follows) +{ + QStringList arguments; + QByteArray parents; + arguments << QLatin1String("describe") << QLatin1String("--contains") << revision; + fullySynchronousGit(workingDirectory, arguments, &precedes); + int tilde = precedes.indexOf('~'); + if (tilde != -1) + precedes.truncate(tilde); + else + precedes = precedes.trimmed(); + + arguments.clear(); + arguments << QLatin1String("log") << QLatin1String("-n1") << QLatin1String("--pretty=format:%P") << revision; + fullySynchronousGit(workingDirectory, arguments, &parents); + foreach (const QByteArray &p, parents.split(' ')) { + QByteArray pf; + arguments.clear(); + arguments << QLatin1String("describe") << QLatin1String("--tags") + << QLatin1String("--abbrev=0") << QLatin1String(p); + fullySynchronousGit(workingDirectory, arguments, &pf); + pf.truncate(pf.lastIndexOf('\n')); + if (!pf.isEmpty()) { + if (!follows.isEmpty()) + follows += ", "; + follows += pf; + } + } +} + // Format an entry in a one-liner for selection list using git log. QString GitClient::synchronousShortDescription(const QString &workingDirectory, const QString &revision, const QString &format) diff --git a/src/plugins/git/gitclient.h b/src/plugins/git/gitclient.h index 21179d8dd4cac0ccd1c362779a0e51586e421ac9..a52ee2040a2d0154cb0305eaa004fa6f8b6f644e 100644 --- a/src/plugins/git/gitclient.h +++ b/src/plugins/git/gitclient.h @@ -163,6 +163,8 @@ public: const QString &format); QString synchronousBranch(const QString &workingDirectory); QString synchronousTopRevision(const QString &workingDirectory, QString *errorMessage = 0); + void synchronousTagsForCommit(const QString &workingDirectory, const QString &revision, + QByteArray &precedes, QByteArray &follows); bool cloneRepository(const QString &directory, const QByteArray &url); QString vcsGetRepositoryURL(const QString &directory); diff --git a/src/plugins/git/giteditor.cpp b/src/plugins/git/giteditor.cpp index 5879d036b272a80586c6e062380809228457c287..874efafa036fee9c7e65b72acd11fc73abb59a7c 100644 --- a/src/plugins/git/giteditor.cpp +++ b/src/plugins/git/giteditor.cpp @@ -207,11 +207,32 @@ static QByteArray removeAnnotationDate(const QByteArray &b) void GitEditor::setPlainTextDataFiltered(const QByteArray &a) { QByteArray array = a; + GitPlugin *plugin = GitPlugin::instance(); // If desired, filter out the date from annotation - const bool omitAnnotationDate = contentType() == VcsBase::AnnotateOutput - && GitPlugin::instance()->settings().boolValue(GitSettings::omitAnnotationDateKey); - if (omitAnnotationDate) - array = removeAnnotationDate(a); + switch (contentType()) + { + case VcsBase::AnnotateOutput: { + const bool omitAnnotationDate = plugin->settings().boolValue(GitSettings::omitAnnotationDateKey); + if (omitAnnotationDate) + array = removeAnnotationDate(a); + break; + } + case VcsBase::DiffOutput: { + const QFileInfo fi(source()); + const QString workingDirectory = fi.absolutePath(); + QByteArray precedes, follows; + if (array.startsWith("commit ")) { // show + int lastHeaderLine = array.indexOf("\n\n") + 1; + plugin->gitClient()->synchronousTagsForCommit(workingDirectory, QLatin1String(array.mid(7, 8)), precedes, follows); + if (!precedes.isEmpty()) + array.insert(lastHeaderLine, "Precedes: " + precedes + '\n'); + if (!follows.isEmpty()) + array.insert(lastHeaderLine, "Follows: " + follows + '\n'); + } + break; + } + } + setPlainTextData(array); }