Skip to content

Commit

Permalink
リポジトリの更新時刻を取得する機能
Browse files Browse the repository at this point in the history
  • Loading branch information
soramimi committed Jan 29, 2025
1 parent 39f33b2 commit 40a242b
Show file tree
Hide file tree
Showing 9 changed files with 177 additions and 104 deletions.
54 changes: 54 additions & 0 deletions src/Git.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -866,6 +866,60 @@ Git::CommitItemList Git::log_all(CommitID const &id, int maxcount)
return items;
}

QDateTime Git::repositoryLastModifiedTime()
{
#if 0
QString cmd = "log --pretty=format:\"%ci\" --all -1";
git_nolog(cmd, nullptr);
if (getProcessExitCode() == 0) {
QString text = resultQString().trimmed();
QStringList lines = misc::splitLines(text);
for (QString const &line : lines) {
auto ParseDateTime = [](char const *s){
int year, month, day, hour, minute, second;
if (sscanf(s, "%d-%d-%d %d:%d:%d"
, &year
, &month
, &day
, &hour
, &minute
, &second
) == 6) {
return QDateTime(QDate(year, month, day), QTime(hour, minute, second));
}
return QDateTime();
};
return ParseDateTime(line.toStdString().c_str());
}
}
#else
if (isValidWorkingCopy()) {
git("rev-parse HEAD");
QString id = resultQString().trimmed();
auto file = cat_file(CommitID(id));
if (file) {
time_t time = 0;
QByteArray ba = file.value();
std::vector<std::string_view> lines = misc::splitLinesV(ba, false);
for (int i = 0; i < lines.size(); i++) {
if (lines[i].empty()) break;
std::vector<std::string_view> words = misc::splitWords(lines[i]);
if (words.size() >= 4) {
if (words[0] == "author" || words[0] == "committer") {
time_t t = misc::toi<unsigned int>(words[3]);
time = std::max(time, t);
}
}
}
if (time != 0) {
return QDateTime::fromSecsSinceEpoch(time);
}
}
}
#endif
return {};
}

/**
* @brief Git::log_signature
* @param id コミットID
Expand Down
1 change: 1 addition & 0 deletions src/Git.h
Original file line number Diff line number Diff line change
Expand Up @@ -657,6 +657,7 @@ class Git : QObject {
QString getDefaultBranch();
void setDefaultBranch(QString const &branchname);
void unsetDefaultBranch();
QDateTime repositoryLastModifiedTime();
};

struct NamedCommitItem {
Expand Down
32 changes: 0 additions & 32 deletions src/GitObjectManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -339,38 +339,6 @@ Git::Object GitObjectCache::catFile(GitPtr g, Git::CommitID const &id)
return Git::Object();
}

Git::CommitID GitObjectCache::getCommitIdFromTag(GitPtr g, QString const &tag)
{
Git::CommitID commit_id;
if (g && g->isValidWorkingCopy()) {
Git::CommitID id(g->rev_parse(tag));
Git::Object obj = catFile(g, id);
switch (obj.type) {
case Git::Object::Type::COMMIT:
commit_id = id;
break;
case Git::Object::Type::TAG:
if (!obj.content.isEmpty()) {
misc::splitLines(obj.content, [&](char const *ptr, size_t len){
if (!commit_id.isValid()) {
if (len >= 7 + GIT_ID_LENGTH && strncmp(ptr, "object ", 7) == 0) {
Git::CommitID id2(QString::fromUtf8(ptr + 7, int(len - 7)).trimmed());
if (Git::isValidID(id2)) {
commit_id = id2;
}
}
}
return QString();
});
}
break;
}
} else {
qDebug() << Q_FUNC_INFO << "invalid working copy";
}
return commit_id;
}

bool GitCommit::parseCommit(GitPtr g, GitObjectCache *objcache, Git::CommitID const &id, GitCommit *out)
{
*out = {};
Expand Down
1 change: 0 additions & 1 deletion src/GitObjectManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,6 @@ class GitObjectCache {
void setup(GitPtr g);
Git::CommitID revParse(GitPtr g, QString const &name);
Git::Object catFile(GitPtr g, const Git::CommitID &id);
Git::CommitID getCommitIdFromTag(GitPtr g, const QString &tag);

Git::CommitID const &item_id(int i) const
{
Expand Down
57 changes: 24 additions & 33 deletions src/MainWindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,6 @@
#include "SetGlobalUserDialog.h"
#include "SetGpgSigningDialog.h"
#include "SettingsDialog.h"
#include "StatusLabel.h"
#include "SubmoduleAddDialog.h"
#include "SubmoduleUpdateDialog.h"
#include "SubmodulesDialog.h"
Expand All @@ -55,7 +54,6 @@
#include "ProgressWidget.h"
#include "gunzip.h"
#include "platform.h"
#include "webclient.h"
#include <QBuffer>
#include <QClipboard>
#include <QDesktopServices>
Expand All @@ -78,7 +76,6 @@
#include <variant>
#include <cctype>
#include "RepositoryModel.h"
#include "IncrementalSearch.h"
#include "Util.h"

#ifdef Q_OS_MAC
Expand Down Expand Up @@ -910,25 +907,29 @@ void MainWindow::buildRepoTree(QString const &group, QTreeWidgetItem *item, QLis
}
}

TagList const &MainWindow::findTag(Git::CommitID const &id) const
std::map<Git::CommitID, TagList> const &MainWindow::tagmap() const
{
auto const &map = tagmap();
auto it = map.find(id);
if (it != map.end()) {
return currentRepositoryModel()->tag_map;
}

TagList MainWindow::findTag(std::map<Git::CommitID, TagList> const &tagmap, Git::CommitID const &id)
{
auto it = tagmap.find(id);
if (it != tagmap.end()) {
return it->second;
}
return m->null_tag_list;
return {};
}

TagList const &MainWindow::queryCurrentCommitTagList() const
TagList MainWindow::findTag(Git::CommitID const &id) const
{
Git::CommitItem const &commit = selectedCommitItem();
return findTag(commit.commit_id);
return findTag(tagmap(), id);
}

std::map<Git::CommitID, TagList> const &MainWindow::tagmap() const
TagList const &MainWindow::queryCurrentCommitTagList() const
{
return currentRepositoryModel()->tag_map;
Git::CommitItem const &commit = selectedCommitItem();
return findTag(commit.commit_id);
}

std::map<Git::CommitID, TagList> MainWindow::queryTags(GitPtr g)
Expand Down Expand Up @@ -2799,18 +2800,6 @@ void MainWindow::deleteTempFiles()
}
}

/**
* @brief MainWindow::idFromTag
* @param tag
* @return
*
* タグ名からコミットIDを取得する
*/
Git::CommitID MainWindow::idFromTag(const QString &tag)
{
return getObjCache()->getCommitIdFromTag(git(), tag);
}

QString MainWindow::newTempFilePath()
{
QString tmpdir = QStandardPaths::writableLocation(QStandardPaths::TempLocation);
Expand Down Expand Up @@ -3353,7 +3342,7 @@ void MainWindow::updateWindowTitle(GitPtr g)
updateWindowTitle(user);
}

std::tuple<QString, BranchLabelList> MainWindow::makeCommitLabels(std::map<Git::CommitID, BranchList> const &branch_map, Git::CommitItem const &commit)
std::tuple<QString, BranchLabelList> MainWindow::makeCommitLabels(Git::CommitItem const &commit, std::map<Git::CommitID, BranchList> const &branch_map, std::map<Git::CommitID, TagList> const &tag_map)
{
QString message_ex;
BranchLabelList label_list;
Expand Down Expand Up @@ -3390,7 +3379,7 @@ std::tuple<QString, BranchLabelList> MainWindow::makeCommitLabels(std::map<Git::
}

{ // tag
TagList list = findTag(commit.commit_id);
TagList list = findTag(tag_map, commit.commit_id);
for (Git::Tag const &t : list) {
BranchLabel label(BranchLabel::Tag);
label.text = t.name;
Expand All @@ -3406,7 +3395,7 @@ std::tuple<QString, BranchLabelList> MainWindow::makeCommitLabels(int row)
{
ASSERT_MAIN_THREAD();
Git::CommitItem commit = commitlog()[row];
return makeCommitLabels(RepositoryModel().branch_map, commit);
return makeCommitLabels(commit, RepositoryModel().branch_map, RepositoryModel().tag_map);
}

/**
Expand Down Expand Up @@ -4187,6 +4176,7 @@ void MainWindow::makeCommitLog(CommitLogExchangeData exdata, int scroll_pos, int
Q_ASSERT(commit_log);

std::map<Git::CommitID, BranchList> const &branch_map = exdata.p->branch_map.value();
std::map<Git::CommitID, TagList> const &tag_map = exdata.p->tag_map.value();

exdata.p->label_map = std::map<int, BranchLabelList>();
std::map<int, BranchLabelList> *label_map = &exdata.p->label_map.value();
Expand All @@ -4205,7 +4195,7 @@ void MainWindow::makeCommitLog(CommitLogExchangeData exdata, int scroll_pos, int
for (int row = 0; row < count; row++) {
Git::CommitItem const &commit = (*commit_log)[row];

auto [message_ex, labels] = makeCommitLabels(branch_map, commit); // コミットコメントのツールチップ用テキストとラベル
auto [message_ex, labels] = makeCommitLabels(commit, branch_map, tag_map); // コミットコメントのツールチップ用テキストとラベル
(*label_map)[row] = labels;

CommitRecord rec;
Expand Down Expand Up @@ -6362,10 +6352,6 @@ void MainWindow::jump(GitPtr g, QString const &text)
}
}

if (g->objectType(id) == "tag") {
id = getObjCache()->getCommitIdFromTag(g, text);
}

if (!jumpToCommit(id)) {
QMessageBox::warning(this, tr("Jump"), QString("%1\n(%2)\n\n").arg(text).arg(text) + tr("No such commit"));
}
Expand Down Expand Up @@ -7126,5 +7112,10 @@ void MainWindow::on_tableWidget_log_currentRowChanged(int row)

void MainWindow::test()
{
GitPtr g = git();
QElapsedTimer t;
t.start();
auto s = t.elapsed();
qDebug() << g->repositoryLastModifiedTime() << s;
}

8 changes: 4 additions & 4 deletions src/MainWindow.h
Original file line number Diff line number Diff line change
Expand Up @@ -311,7 +311,6 @@ class MainWindow : public QMainWindow {
BranchList findBranch(const Git::CommitID &id);
QString tempfileHeader() const;
void deleteTempFiles();
Git::CommitID idFromTag(const QString &tag);
QString newTempFilePath();
int limitLogCount() const;
Git::Object internalCatFile(GitPtr g, const QString &id);
Expand All @@ -323,8 +322,8 @@ class MainWindow : public QMainWindow {
void updateWindowTitle(const Git::User &user);
void updateWindowTitle(GitPtr g);

std::tuple<QString, BranchLabelList > makeCommitLabels(const std::map<Git::CommitID, BranchList> &branch_map, const Git::CommitItem &commit);
std::tuple<QString, BranchLabelList > makeCommitLabels(int row);
std::tuple<QString, BranchLabelList> makeCommitLabels(Git::CommitItem const &commit, std::map<Git::CommitID, BranchList> const &branch_map, std::map<Git::CommitID, TagList> const &tag_map);
std::tuple<QString, BranchLabelList> makeCommitLabels(int row);

void removeRepositoryFromBookmark(RepositoryTreeIndex const &index, bool ask);
void openTerminal(const RepositoryData *repo);
Expand Down Expand Up @@ -356,7 +355,8 @@ class MainWindow : public QMainWindow {
private:
const std::map<Git::CommitID, TagList> &tagmap() const;
std::map<Git::CommitID, TagList> queryTags(GitPtr g);
const TagList &findTag(const Git::CommitID &id) const;
static TagList findTag(std::map<Git::CommitID, TagList> const &tagmap, Git::CommitID const &id);
TagList findTag(const Git::CommitID &id) const;

void sshSetPassphrase(const std::string &user, const std::string &pass);
std::string sshPassphraseUser() const;
Expand Down
28 changes: 22 additions & 6 deletions src/RepositoryTreeWidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -297,6 +297,17 @@ bool match(RepositoryData const &repo, RepositoryTreeWidget::Filter const &filte
return repo.name.indexOf(filter.text, 0, Qt::CaseInsensitive) >= 0;
}

static QDateTime repositoryLastModifiedTime(QString const &path)
{
#if 0
QFileInfo info(path);
return info.lastModified();
#else
GitPtr g = global->mainwindow->git(path, {}, {});
return g->repositoryLastModifiedTime();
#endif
}

void RepositoryTreeWidget::updateList(RepositoryListStyle style, QList<RepositoryData> const &repos, QString const &filtertext, int select_row)
{
RepositoryTreeWidget *tree = this;
Expand Down Expand Up @@ -384,23 +395,28 @@ void RepositoryTreeWidget::updateList(RepositoryListStyle style, QList<Repositor
struct Item {
int index;
RepositoryData const *data;
QFileInfo info;
QDateTime lastModified;
// QFileInfo info;
};
std::vector<Item> items;
{
GlobalSetOverrideWaitCursor();
for (int i = 0; i < repos.size(); i++) {
RepositoryData const &item = repos.at(i);
QString gitpath = item.local_dir / ".git";
QFileInfo info(gitpath);
items.push_back({i, &item, info});
// QString gitpath = item.local_dir / ".git";
// QFileInfo info(gitpath);
// items.push_back({i, &item, info});
QDateTime lastmodified = repositoryLastModifiedTime(item.local_dir);
items.push_back({i, &item, lastmodified});
}
std::sort(items.begin(), items.end(), [](Item const &a, Item const &b){
return a.info.lastModified() > b.info.lastModified();
return a.lastModified > b.lastModified;
});
GlobalRestoreOverrideCursor();
}

for (Item const &item : items) {
QString s = misc::makeDateTimeString(item.info.lastModified());
QString s = misc::makeDateTimeString(item.lastModified);
s = QString("[%1] %2").arg(s).arg(item.data->name);
auto *child = newQTreeWidgetRepositoryItem(s, item.index);
tree->addTopLevelItem(child);
Expand Down
Loading

0 comments on commit 40a242b

Please sign in to comment.