Git: InstantBlame: Add tooltip line diff

Change-Id: I711dc2c288c263621ab7dd9fc89489b3d56f935a
Reviewed-by: Orgad Shaneh <orgads@gmail.com>
This commit is contained in:
Andre Hartmann
2024-08-04 17:52:19 +02:00
committed by André Hartmann
parent a360d855ae
commit 44678d5502
2 changed files with 73 additions and 3 deletions

View File

@@ -50,7 +50,7 @@ BlameMark::BlameMark(const FilePath &fileName, int lineNumber, const CommitInfo
text += "" + info.subject;
setPriority(TextEditor::TextMark::LowPriority);
setToolTip(toolTipText(info));
setToolTipProvider([this] { return toolTipText(m_info); });
setLineAnnotation(text);
setSettingsPage(VcsBase::Constants::VCS_ID_GIT);
setActionsProvider([info] {
@@ -132,6 +132,29 @@ QString BlameMark::toolTipText(const CommitInfo &info) const
colors.date, info.authorDate.toString("yyyy-MM-dd hh:mm:ss"),
colors.subject, info.subject);
QString diff;
if (!info.oldLines.isEmpty()) {
const QString removed = GitClient::styleColorName(TextEditor::C_REMOVED_LINE);
QStringList oldLines = info.oldLines;
if (oldLines.size() > 5) {
oldLines = info.oldLines.first(2);
oldLines.append("- ...");
oldLines.append(info.oldLines.last(2));
}
for (const QString &oldLine : std::as_const(oldLines)) {
diff.append("<p style=\"margin: 0px; color: " + removed + " ;\">" + oldLine.toHtmlEscaped() + "</p>");
}
}
if (!info.newLine.isEmpty()) {
const QString added = GitClient::styleColorName(TextEditor::C_ADDED_LINE);
diff.append("<p style=\"margin-top: 0px; color: " + added + ";\">" + info.newLine.toHtmlEscaped() + "</p>");
}
if (!diff.isEmpty())
result.append("<pre>" + diff + "</pre>");
if (settings().instantBlameIgnoreSpaceChanges()
|| settings().instantBlameIgnoreLineMoves()) {
result.append(
@@ -146,6 +169,16 @@ QString BlameMark::toolTipText(const CommitInfo &info) const
return result;
}
void BlameMark::addOldLine(const QString &oldLine)
{
m_info.oldLines.append(oldLine);
}
void BlameMark::addNewLine(const QString &newLine)
{
m_info.newLine = newLine;
}
InstantBlame::InstantBlame()
{
m_codec = gitClient().defaultCommitEncoding();
@@ -337,7 +370,30 @@ void InstantBlame::perform()
const QFileInfo fi(filePath.toString());
const Utils::FilePath workingDirectory = Utils::FilePath::fromString(fi.path());
const QString lineString = QString("%1,%1").arg(line);
const auto commandHandler = [this, filePath, line](const CommandResult &result) {
const auto lineDiffHandler = [this](const CommandResult &result) {
const QString error = result.cleanedStdErr();
if (!error.isEmpty()) {
qCWarning(log) << error;
}
if (!m_blameMark) {
qCInfo(log) << "m_blameMark is invalid";
return;
}
static const QRegularExpression re("^[-+][^-+].*");
const QStringList lines = result.cleanedStdOut().split("\n").filter(re);
for (const QString &line : lines) {
if (line.startsWith("-")) {
m_blameMark->addOldLine(line);
qCDebug(log) << "Found removed line: " << line;
} else if (line.startsWith("+")) {
m_blameMark->addNewLine(line);
qCDebug(log) << "Found added line: " << line;
}
}
};
const auto commandHandler = [this, filePath, line, lineDiffHandler]
(const CommandResult &result) {
if (result.result() == ProcessResult::FinishedWithError &&
result.cleanedStdErr().contains("no such path")) {
stop();
@@ -350,6 +406,16 @@ void InstantBlame::perform()
}
const CommitInfo info = parseBlameOutput(output.split('\n'), filePath, line, m_author);
m_blameMark.reset(new BlameMark(filePath, line, info));
// Get line diff: `git log -n 1 -p -L47,47:README.md a5c4c34c9ab4`
const QString origLineString = QString("%1,%1").arg(info.originalLine);
const QString fileLineRange = "-L" + origLineString + ":" + info.originalFileName;
const QStringList lineDiffOptions = {"log", "-n 1", "-p", fileLineRange, info.hash};
const FilePath topLevel = currentState().topLevel();
qCDebug(log) << "Running git" << lineDiffOptions.join(' ');
gitClient().vcsExecWithHandler(topLevel, lineDiffOptions, this,
lineDiffHandler, RunFlags::NoOutput, m_codec);
};
QStringList options = {"blame", "-p"};
if (settings().instantBlameIgnoreSpaceChanges())

View File

@@ -25,6 +25,8 @@ public:
QString authorMail;
QDateTime authorDate;
QString subject;
QStringList oldLines; ///< the previous line contents
QString newLine; ///< the new line contents
Utils::FilePath filePath; ///< absolute file path for current file
QString originalFileName; ///< relative file path from project root for the original file
int line = -1; ///< current line number in current file
@@ -37,9 +39,11 @@ public:
BlameMark(const Utils::FilePath &fileName, int lineNumber, const CommitInfo &info);
bool addToolTipContent(QLayout *target) const;
QString toolTipText(const CommitInfo &info) const;
void addOldLine(const QString &oldLine);
void addNewLine(const QString &newLine);
private:
const CommitInfo m_info;
CommitInfo m_info;
};
class InstantBlame : public QObject