1#include "CommitHistoryModel.h"
2
3#include <CommitHistoryColumns.h>
4#include <CommitInfo.h>
5#include <GitBase.h>
6#include <GitCache.h>
7#include <GitServerCache.h>
8
9#include <QDateTime>
10#include <QLocale>
11
12CommitHistoryModel::CommitHistoryModel(const QSharedPointer<GitCache> &cache, const QSharedPointer<GitBase> &git,
13 const QSharedPointer<GitServerCache> &gitServerCache, QObject *p)
14 : QAbstractItemModel(p)
15 , mCache(cache)
16 , mGit(git)
17 , mGitServerCache(gitServerCache)
18{
19 mColumns.insert(CommitHistoryColumns::TreeViewIcon, "");
20 mColumns.insert(CommitHistoryColumns::Graph, "");
21 mColumns.insert(CommitHistoryColumns::Sha, "Sha");
22 mColumns.insert(CommitHistoryColumns::Log, "History");
23 mColumns.insert(CommitHistoryColumns::Author, "Author");
24 mColumns.insert(CommitHistoryColumns::Date, "Date");
25}
26
27int CommitHistoryModel::rowCount(const QModelIndex &parent) const
28{
29 return !parent.isValid() ? mCache->commitCount() : 0;
30}
31
32bool CommitHistoryModel::hasChildren(const QModelIndex &parent) const
33{
34 return !parent.isValid();
35}
36
37QString CommitHistoryModel::sha(int row) const
38{
39 return index(row, static_cast<int>(CommitHistoryColumns::Sha)).data().toString();
40}
41
42void CommitHistoryModel::clear()
43{
44 beginResetModel();
45 endResetModel();
46 emit headerDataChanged(Qt::Horizontal, 0, 5);
47}
48
49void CommitHistoryModel::onNewRevisions(int totalCommits)
50{
51 beginResetModel();
52 endResetModel();
53
54 beginInsertRows(QModelIndex(), 0, totalCommits - 2);
55 endInsertRows();
56}
57
58QVariant CommitHistoryModel::headerData(int section, Qt::Orientation orientation, int role) const
59{
60 if (orientation == Qt::Horizontal && role == Qt::DisplayRole)
61 return mColumns.value(static_cast<CommitHistoryColumns>(section));
62
63 return QVariant();
64}
65
66QModelIndex CommitHistoryModel::index(int row, int column, const QModelIndex &) const
67{
68 return row >= 0 && row < mCache->commitCount() ? createIndex(row, column, nullptr) : QModelIndex();
69}
70
71QModelIndex CommitHistoryModel::parent(const QModelIndex &) const
72{
73 return QModelIndex();
74}
75
76QVariant CommitHistoryModel::getToolTipData(const CommitInfo &r) const
77{
78 QString auxMessage;
79 const auto sha = r.sha;
80
81 if (mGit->getCurrentBranch().isEmpty())
82 auxMessage.append(tr("<p>Status: <b>detached</b></p>"));
83
84 const auto localBranches = mCache->getReferences(sha, References::Type::LocalBranch);
85
86 if (!localBranches.isEmpty())
87 auxMessage.append(tr("<p><b>Local: </b>%1</p>").arg(localBranches.join(",")));
88
89 const auto remoteBranches = mCache->getReferences(sha, References::Type::RemoteBranches);
90
91 if (!remoteBranches.isEmpty())
92 auxMessage.append(tr("<p><b>Remote: </b>%1</p>").arg(remoteBranches.join(",")));
93
94 const auto tags = mCache->getReferences(sha, References::Type::LocalTag);
95
96 if (!tags.isEmpty())
97 auxMessage.append(tr("<p><b>Tags: </b>%1</p>").arg(tags.join(",")));
98
99 QDateTime d;
100 d.setSecsSinceEpoch(r.dateSinceEpoch.count());
101
102 QLocale locale;
103
104 auto tooltip = sha == CommitInfo::ZERO_SHA
105 ? QString()
106 : QString("<p>%1 - %2</p><p>%3</p>%4%5")
107 .arg(r.author.split("<").first(), d.toString(locale.dateTimeFormat(QLocale::ShortFormat)), sha,
108 !auxMessage.isEmpty() ? QString("<p>%1</p>").arg(auxMessage) : "",
109 r.isSigned()
110 ? tr("<p> GPG key (%1): %2</p>")
111 .arg(QString::fromUtf8(r.verifiedSignature() ? "verified" : "not verified"), r.gpgKey)
112 : "");
113
114 if (mGitServerCache)
115 {
116 if (const auto pr = mGitServerCache->getPullRequest(sha); pr.isValid())
117 tooltip.append(tr("<p><b>PR state: </b>%1.</p>").arg(pr.state.state));
118 }
119
120 return tooltip;
121}
122
123QVariant CommitHistoryModel::getDisplayData(const CommitInfo &rev, int column) const
124{
125 switch (static_cast<CommitHistoryColumns>(column))
126 {
127 case CommitHistoryColumns::Sha: {
128 const auto sha = rev.sha;
129 return sha;
130 }
131 case CommitHistoryColumns::Log:
132 return rev.shortLog;
133 case CommitHistoryColumns::Author: {
134 const auto author = rev.author.split("<").first();
135 return author;
136 }
137 case CommitHistoryColumns::Date: {
138 return QDateTime::fromSecsSinceEpoch(rev.dateSinceEpoch.count()).toString("dd MMM yyyy hh:mm");
139 }
140 default:
141 return QVariant();
142 }
143}
144
145QVariant CommitHistoryModel::data(const QModelIndex &index, int role) const
146{
147 if (!index.isValid() || (role != Qt::DisplayRole && role != Qt::ToolTipRole))
148 return QVariant();
149
150 const auto r = mCache->commitInfo(index.row());
151
152 if (role == Qt::ToolTipRole)
153 return getToolTipData(r);
154
155 if (role == Qt::DisplayRole)
156 return getDisplayData(r, index.column());
157
158 return QVariant();
159}
160