From 2254045d3e284d836d3babc129a513eba8babdc0 Mon Sep 17 00:00:00 2001 From: soramimi Date: Tue, 11 Feb 2025 04:09:11 +0900 Subject: [PATCH] =?UTF-8?q?=E3=81=84=E3=82=8D=E3=81=84=E3=82=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/CommitViewWindow.cpp | 2 +- src/EditGitIgnoreDialog.cpp | 2 +- src/Git.cpp | 35 ++++++---- src/Git.h | 2 +- src/MainWindow.cpp | 125 ++++++++++++++++++------------------ src/MainWindow.h | 9 ++- src/UserEvent.cpp | 2 + src/UserEvent.h | 21 ++---- 8 files changed, 101 insertions(+), 97 deletions(-) diff --git a/src/CommitViewWindow.cpp b/src/CommitViewWindow.cpp index d665740e..a65e2c37 100644 --- a/src/CommitViewWindow.cpp +++ b/src/CommitViewWindow.cpp @@ -30,7 +30,7 @@ CommitViewWindow::CommitViewWindow(MainWindow *parent, Git::CommitItem const *co ui->lineEdit_message->setText(m->commit->message); ui->lineEdit_id->setText(m->commit->commit_id.toQString()); - mainwindow()->updateFileList2(m->commit->commit_id, &m->diff_list, ui->listWidget_files); + mainwindow()->makeDiffList(m->commit->commit_id, &m->diff_list, ui->listWidget_files); ui->listWidget_files->setCurrentRow(0); } diff --git a/src/EditGitIgnoreDialog.cpp b/src/EditGitIgnoreDialog.cpp index df47b700..9ea6d532 100644 --- a/src/EditGitIgnoreDialog.cpp +++ b/src/EditGitIgnoreDialog.cpp @@ -72,7 +72,7 @@ QString EditGitIgnoreDialog::text() const void EditGitIgnoreDialog::on_pushButton_edit_file_clicked() { if (TextEditDialog::editFile(this, gitignore_path, ".gitignore", text() + '\n')) { - mainwindow()->updateCurrentFilesList(); + mainwindow()->updateCurrentFileList(); done(QDialog::Rejected); } } diff --git a/src/Git.cpp b/src/Git.cpp index c05dc0f7..42d18d7e 100644 --- a/src/Git.cpp +++ b/src/Git.cpp @@ -299,7 +299,7 @@ bool Git::git(QString const &arg, Option const &opt, bool debug_) if (m->command_cache) { auto const *a = m->command_cache.find(cmd); if (a) { - qDebug() << "found:" << cmd; + // qDebug() << "--- found:" << cmd; m->result = *a; return true; } @@ -322,7 +322,7 @@ bool Git::git(QString const &arg, Option const &opt, bool debug_) if (m->exit_status.exit_code == 0) { if (m->command_cache) { m->command_cache.insert(cmd, m->result); - qDebug() << "insert:" << cmd; + // qDebug() << "--- insert:" << cmd; } } } @@ -1010,9 +1010,8 @@ Git::CommitItemList Git::log(int maxcount) return log_all({}, maxcount); } -Git::CommitItem Git::parseCommit(QByteArray const &ba) +std::optional Git::parseCommit(QByteArray const &ba) { - CommitItem out; QStringList lines = misc::splitLines(ba, [](char const *p, size_t n){ return QString::fromUtf8(p, (int)n); }); @@ -1020,6 +1019,8 @@ Git::CommitItem Git::parseCommit(QByteArray const &ba) lines.pop_back(); } + CommitItem out; + bool ok = false; bool gpgsig = false; bool message = false; @@ -1057,7 +1058,9 @@ Git::CommitItem Git::parseCommit(QByteArray const &ba) } out.message += line; } - if (line.startsWith("parent ")) { + if (line.startsWith("tree ")) { + ok = true; + } else if (line.startsWith("parent ")) { out.parent_ids.push_back(Git::CommitID(line.mid(7))); } else if (line.startsWith("author ")) { QStringList arr = misc::splitWords(line); @@ -1085,20 +1088,24 @@ Git::CommitItem Git::parseCommit(QByteArray const &ba) gpgsig = true; } } - return out; + + if (ok) return out; + return std::nullopt; } std::optional Git::queryCommitItem(CommitID const &id) { - Git::CommitItem ret; - if (objectType(id) != "commit") return std::nullopt; - - ret.commit_id = id; - auto ba = cat_file(id); - if (ba) { - ret = parseCommit(*ba); + if (objectType(id) == "commit") { + auto ba = cat_file(id); + if (ba) { + auto ret = parseCommit(*ba); + if (ret) { + ret->commit_id = id; + return ret; + } + } } - return ret; + return std::nullopt; } Git::CloneData Git::preclone(QString const &url, QString const &path) diff --git a/src/Git.h b/src/Git.h index 2f6fd338..ee43cea8 100644 --- a/src/Git.h +++ b/src/Git.h @@ -692,7 +692,7 @@ class Git : QObject { QList submodules(); bool submodule_add(const CloneData &data, bool force, AbstractPtyProcess *pty); bool submodule_update(const SubmoduleUpdateData &data, AbstractPtyProcess *pty); - static CommitItem parseCommit(const QByteArray &ba); + static std::optional parseCommit(QByteArray const &ba); QString queryEntireCommitMessage(const CommitID &id); QString getDefaultBranch(); diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index 2aaf4a6e..0afa824c 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -193,6 +193,7 @@ struct MainWindow::Private { const Git::CommitItem null_commit_item; const TagList null_tag_list; + QTimer update_file_list_timer; Git::CommandCache git_command_cache; }; @@ -289,6 +290,8 @@ MainWindow::MainWindow(QWidget *parent) connect(ui->tableWidget_log, &CommitLogTableWidget::currentRowChanged, this, &MainWindow::on_tableWidget_log_currentRowChanged); + initUpdateFileListTimer(); + // QString path = getBookmarksFilePath(); @@ -511,11 +514,6 @@ void MainWindow::setupExternalPrograms() setSshCommand(appsettings()->ssh_command, false); } -void UserEventHandler::operator () (StartEventData const &) -{ - mainwindow->onStartEvent(); -} - void MainWindow::onStartEvent() { if (isUninitialized()) { // gitコマンドの有効性チェック @@ -539,6 +537,11 @@ void MainWindow::onStartEvent() } } +void UserEventHandler::operator () (StartEventData const &) +{ + mainwindow->onStartEvent(); +} + bool MainWindow::setCurrentLogRow(int row) { if (row >= 0 && row < ui->tableWidget_log->rowCount()) { @@ -1228,10 +1231,10 @@ void MainWindow::saveRepositoryBookmark(RepositoryData item) updateRepositoryList(); } -void UserEventHandler::operator () (AddRepositoryEventData const &e) +void UserEventHandler::operator () (CloneRepositoryEventData const &e) { AddRepositoryDialog dlg(mainwindow); - if (dlg.execClone(e.dir) == QDialog::Accepted) { + if (dlg.execClone(e.remote_url) == QDialog::Accepted) { mainwindow->addRepositoryAccepted(dlg); } } @@ -1278,7 +1281,7 @@ bool MainWindow::addExistingLocalRepository(QString dir, QString name, QString s }; if (isBareRepository(dir)) { - postUserEvent(AddRepositoryEventData(dir), 1); + postUserEvent(CloneRepositoryEventData(dir), 0); return true; } @@ -1888,7 +1891,7 @@ void MainWindow::runPtyGit(QString const &progress_message, GitPtr g, GitCommand setProgress(-1.0f); showProgress(progress_message, false); - qDebug() << "--- Start:" << progress_message; + // qDebug() << "--- Start:" << progress_message; GitCommandRunner runner; runner.d.process_name = progress_message; @@ -1899,7 +1902,7 @@ void MainWindow::runPtyGit(QString const &progress_message, GitPtr g, GitCommand showProgress({}, false); GitCommandRunner const &req = d.value(); { - qDebug() << "--- Elapsed A:" << req.d.process_name << req.d.elapsed.elapsed() << "ms"; + // qDebug() << "--- Elapsed A:" << req.d.process_name << req.d.elapsed.elapsed() << "ms"; } PtyProcessCompleted data; data.process_name = req.d.process_name; @@ -1941,7 +1944,7 @@ void MainWindow::onPtyProcessCompleted(bool ok, PtyProcessCompleted const &data) m->git_command_cache.clear(); - qDebug() << "--- Elapsed B:" << data.process_name << data.elapsed.elapsed() << "ms"; + // qDebug() << "--- Elapsed B:" << data.process_name << data.elapsed.elapsed() << "ms"; } void MainWindow::connectPtyProcessCompleted() @@ -3736,6 +3739,15 @@ void MainWindow::showFileList(FilesListType files_list_type) emit sigShowFileList(files_list_type); } +Git::CommitItem const *MainWindow::currentCommitItem() +{ + int row = ui->tableWidget_log->actualLogIndex(); + auto const &logs = commitlog(); + if (row >= 0 && row < (int)logs.size()) { + return &logs[row]; + } + return nullptr; +} void MainWindow::updateFileList(Git::CommitID const &id) { @@ -3858,13 +3870,38 @@ void MainWindow::updateFileList(Git::CommitID const &id) } } -/** - * @brief ファイルリストを更新 - * @param id - * @param diff_list - * @param listwidget - */ -void MainWindow::updateFileList2(Git::CommitID const &id, QList *diff_list, QListWidget *listwidget) +void MainWindow::updateFileList(Git::CommitItem const *commit) +{ + Git::CommitID id; + if (!commit) { + // nullptr for uncommited changes + } else if (Git::isUncommited(*commit)) { + // empty id for uncommited changes + } else { + id = commit->commit_id; + } + updateFileList(id); +} + +void MainWindow::updateCurrentFileList() +{ + ASSERT_MAIN_THREAD(); + + updateFileList(currentCommitItem()); +} + +void MainWindow::updateFileListLater(int delay_ms) +{ + m->update_file_list_timer.start(delay_ms); +} + +void MainWindow::initUpdateFileListTimer() +{ + m->update_file_list_timer.setSingleShot(true); + connect(&m->update_file_list_timer, &QTimer::timeout, this, &MainWindow::updateCurrentFileList); +} + +void MainWindow::makeDiffList(Git::CommitID const &id, QList *diff_list, QListWidget *listwidget) { GitPtr g = git(); if (!isValidWorkingCopy(g)) return; @@ -3888,37 +3925,6 @@ void MainWindow::execCommitViewWindow(const Git::CommitItem *commit) win.exec(); } -void MainWindow::updateFileList(Git::CommitItem const *commit) -{ - Git::CommitID id; - if (!commit) { - // nullptr for uncommited changes - } else if (Git::isUncommited(*commit)) { - // empty id for uncommited changes - } else { - id = commit->commit_id; - } - updateFileList(id); -} - -Git::CommitItem const *MainWindow::currentCommitItem() -{ - int row = ui->tableWidget_log->actualLogIndex(); - auto const &logs = commitlog(); - // &commit = logs[row]; - if (row >= 0 && row < (int)logs.size()) { - return &logs[row]; - } - return nullptr; -} - -void MainWindow::updateCurrentFilesList() -{ - ASSERT_MAIN_THREAD(); - - updateFileList(currentCommitItem()); -} - Git::Object MainWindow::internalCatFile(GitPtr g, const QString &id) //@TODO: { if (isValidWorkingCopy(g)) { @@ -5030,7 +5036,7 @@ void MainWindow::on_listWidget_unstaged_customContextMenuRequested(const QPoint for_each_selected_files([&](QString const &path){ g->stage(path); }); - updateCurrentFilesList(); + updateCurrentFileList(); return; } if (a == a_reset_file) { @@ -5074,7 +5080,7 @@ void MainWindow::on_listWidget_unstaged_customContextMenuRequested(const QPoint file.write(text.toUtf8()); } } - updateCurrentFilesList(); + updateCurrentFileList(); return; } } else { @@ -5091,7 +5097,7 @@ void MainWindow::on_listWidget_unstaged_customContextMenuRequested(const QPoint } }); if (TextEditDialog::editFile(this, gitignore_path, ".gitignore", append)) { - updateCurrentFilesList(); + updateCurrentFileList(); } return; } @@ -5587,7 +5593,7 @@ TextEditorThemePtr MainWindow::themeForTextEditor() return global->theme->text_editor_theme; } -bool MainWindow::isValidWorkingCopy(GitPtr g) const +bool MainWindow::isValidWorkingCopy(GitPtr g) { return g && g->isValidWorkingCopy(); } @@ -5677,11 +5683,6 @@ QString MainWindow::abbrevCommitID(const Git::CommitItem &commit) return commit.commit_id.toQString(7); } -void UserEventHandler::operator () (UpdateFileListEventData const &e) -{ - mainwindow->updateCurrentFilesList(); -} - /** * @brief コミットログの選択が変化した */ @@ -5694,7 +5695,7 @@ void MainWindow::onLogCurrentItemChanged() updateStatusBarText(); // 少し待ってファイルリストを更新する - postUserEvent(UpdateFileListEventData(), 300); // 300ms後(キーボードのオートリピート想定) + updateFileListLater(300); updateAncestorCommitMap(); ui->tableWidget_log->viewport()->update(); @@ -5833,7 +5834,7 @@ void MainWindow::on_toolButton_stage_clicked() } stage(g, list); } - updateCurrentFilesList(); + updateCurrentFileList(); } } @@ -5849,7 +5850,7 @@ void MainWindow::on_toolButton_unstage_clicked() } else { g->unstage(selectedFiles()); } - updateCurrentFilesList(); + updateCurrentFileList(); } } @@ -5888,7 +5889,7 @@ void MainWindow::on_action_edit_gitignore_triggered() QString dir = currentWorkingCopyDir(); QString path = dir / ".gitignore"; if (editFile(path, ".gitignore")) { - updateCurrentFilesList(); + updateCurrentFileList(); } } diff --git a/src/MainWindow.h b/src/MainWindow.h index 6bac5cc4..f897c0ad 100644 --- a/src/MainWindow.h +++ b/src/MainWindow.h @@ -177,6 +177,9 @@ class MainWindow : public QMainWindow { void updateFileList(const Git::CommitID &id); void updateFileList(const Git::CommitItem *commit); + void updateFileListLater(int delay_ms); +public: + void updateCurrentFileList(); public: RepositoryTreeWidget::RepositoryListStyle repositoriesListStyle() const; void updateRepositoryList(RepositoryTreeWidget::RepositoryListStyle style = RepositoryTreeWidget::RepositoryListStyle::_Keep, int select_row = -1); @@ -453,7 +456,6 @@ class MainWindow : public QMainWindow { bool shown(); void deleteTags(QStringList const &tagnames); void addTag(QString const &name); - void updateCurrentFilesList(); int selectedLogIndex() const; void updateAncestorCommitMap(); bool isAncestorCommit(const QString &id); @@ -464,7 +466,7 @@ class MainWindow : public QMainWindow { bool isLabelsVisible() const; bool isGraphVisible() const; bool isAvatarsVisible() const; - void updateFileList2(const Git::CommitID &id, QList *diff_list, QListWidget *listwidget); + void makeDiffList(const Git::CommitID &id, QList *diff_list, QListWidget *listwidget); void execCommitViewWindow(const Git::CommitItem *commit); void execCommitPropertyDialog(QWidget *parent, const Git::CommitItem &commit); void execCommitExploreWindow(QWidget *parent, const Git::CommitItem *commit); @@ -501,7 +503,7 @@ class MainWindow : public QMainWindow { QString determinFileType(const QString &path) const; TextEditorThemePtr themeForTextEditor(); - bool isValidWorkingCopy(GitPtr g) const; + static bool isValidWorkingCopy(GitPtr g); void emitWriteLog(LogData const &logdata); QString findFileID(const QString &commit_id, const QString &file); const Git::CommitItem &commitItem(int row) const; @@ -681,6 +683,7 @@ protected slots: void retry(); bool isRetryQueued() const; static std::string parseDetectedDubiousOwnershipInRepositoryAt(const std::vector &lines); + void initUpdateFileListTimer(); private slots: void onPtyProcessCompleted(bool ok, PtyProcessCompleted const &data); diff --git a/src/UserEvent.cpp b/src/UserEvent.cpp index b0611a0a..c700d644 100644 --- a/src/UserEvent.cpp +++ b/src/UserEvent.cpp @@ -1,3 +1,5 @@ #include "UserEvent.h" +#include + diff --git a/src/UserEvent.h b/src/UserEvent.h index 6f473f7e..d7411d23 100644 --- a/src/UserEvent.h +++ b/src/UserEvent.h @@ -19,18 +19,11 @@ class StartEventData { } }; -class AddRepositoryEventData { +class CloneRepositoryEventData { public: - QString dir; - AddRepositoryEventData(QString dir) - : dir(dir) - { - } -}; - -class UpdateFileListEventData { -public: - UpdateFileListEventData() + QString remote_url; + CloneRepositoryEventData(QString const &remote_url) + : remote_url(remote_url) { } }; @@ -39,8 +32,7 @@ class UserEventHandler { public: typedef std::variant< StartEventData, - AddRepositoryEventData, - UpdateFileListEventData + CloneRepositoryEventData > variant_t; MainWindow *mainwindow; @@ -51,8 +43,7 @@ class UserEventHandler { } void operator () (StartEventData const &e); - void operator () (AddRepositoryEventData const &e); - void operator () (UpdateFileListEventData const &e); + void operator () (CloneRepositoryEventData const &e); void go(UserEvent *e); };