diff --git a/src/plugins/git/branchview.cpp b/src/plugins/git/branchview.cpp index 0751a46e7ca..83c6a8cd651 100644 --- a/src/plugins/git/branchview.cpp +++ b/src/plugins/git/branchview.cpp @@ -240,6 +240,7 @@ void BranchView::slotCustomContextMenu(const QPoint &point) GitPlugin::client()->diffBranch(m_repository, fullName); }); contextMenu.addAction(tr("&Log"), this, [this] { log(selectedIndex()); }); + contextMenu.addAction(tr("&Reflog"), this, [this] { reflog(selectedIndex()); }); contextMenu.addSeparator(); if (!currentSelected) { auto resetMenu = new QMenu(tr("Re&set"), &contextMenu); @@ -559,6 +560,13 @@ void BranchView::log(const QModelIndex &idx) GitPlugin::client()->log(m_repository, QString(), false, {branchName}); } +void BranchView::reflog(const QModelIndex &idx) +{ + const QString branchName = m_model->fullName(idx, true); + if (!branchName.isEmpty()) + GitPlugin::client()->reflog(m_repository, branchName); +} + void BranchView::push() { const QModelIndex selected = selectedIndex(); diff --git a/src/plugins/git/branchview.h b/src/plugins/git/branchview.h index 9e4dfc0fd75..faceea2ef57 100644 --- a/src/plugins/git/branchview.h +++ b/src/plugins/git/branchview.h @@ -83,6 +83,7 @@ private: void rebase(); bool cherryPick(); void log(const QModelIndex &idx); + void reflog(const QModelIndex &idx); void push(); QToolButton *m_addButton = nullptr; diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp index 531977e0cf8..39bb1b6ba8c 100644 --- a/src/plugins/git/gitclient.cpp +++ b/src/plugins/git/gitclient.cpp @@ -1062,20 +1062,24 @@ void GitClient::log(const QString &workingDirectory, const QString &fileName, vcsExec(workingDir, arguments, editor); } -void GitClient::reflog(const QString &workingDirectory) +void GitClient::reflog(const QString &workingDirectory, const QString &ref) { const QString title = tr("Git Reflog \"%1\"").arg(workingDirectory); const Id editorId = Git::Constants::GIT_LOG_EDITOR_ID; - VcsBaseEditorWidget *editor = createVcsEditor(editorId, title, workingDirectory, codecFor(CodecLogOutput), - "reflogRepository", workingDirectory); + // Creating document might change the referenced workingDirectory. Store a copy and use it. + const QString workingDir = workingDirectory; + VcsBaseEditorWidget *editor = createVcsEditor(editorId, title, workingDir, codecFor(CodecLogOutput), + "reflogRepository", workingDir); VcsBaseEditorConfig *argWidget = editor->editorConfig(); if (!argWidget) { argWidget = new GitRefLogArgumentsWidget(settings(), editor->toolBar()); + if (!ref.isEmpty()) + argWidget->setBaseArguments({ref}); connect(argWidget, &VcsBaseEditorConfig::commandExecutionRequested, this, - [=] { this->reflog(workingDirectory); }); + [=] { this->reflog(workingDir, ref); }); editor->setEditorConfig(argWidget); } - editor->setWorkingDirectory(workingDirectory); + editor->setWorkingDirectory(workingDir); QStringList arguments = {"reflog", noColorOption, decorateOption}; arguments << argWidget->arguments(); @@ -1083,7 +1087,7 @@ void GitClient::reflog(const QString &workingDirectory) if (logCount > 0) arguments << "-n" << QString::number(logCount); - vcsExec(workingDirectory, arguments, editor); + vcsExec(workingDir, arguments, editor); } // Do not show "0000" or "^32ae4" diff --git a/src/plugins/git/gitclient.h b/src/plugins/git/gitclient.h index f605bca767d..447238888aa 100644 --- a/src/plugins/git/gitclient.h +++ b/src/plugins/git/gitclient.h @@ -167,7 +167,7 @@ public: void status(const QString &workingDirectory); void log(const QString &workingDirectory, const QString &fileName = QString(), bool enableAnnotationContextMenu = false, const QStringList &args = QStringList()); - void reflog(const QString &workingDirectory); + void reflog(const QString &workingDirectory, const QString &branch = {}); VcsBase::VcsBaseEditorWidget *annotate( const QString &workingDir, const QString &file, const QString &revision = QString(), int lineNumber = -1, const QStringList &extraOptions = QStringList()) override; diff --git a/src/plugins/git/gitplugin.cpp b/src/plugins/git/gitplugin.cpp index b04db69e94f..dc6714399cc 100644 --- a/src/plugins/git/gitplugin.cpp +++ b/src/plugins/git/gitplugin.cpp @@ -278,6 +278,7 @@ public: void blameFile(); void logProject(); void logRepository(); + void reflogRepository(); void undoFileChanges(bool revertStaging); void resetRepository(); void recoverDeletedFiles(); @@ -707,7 +708,7 @@ GitPluginPrivate::GitPluginPrivate() context, true, std::bind(&GitPluginPrivate::logRepository, this)); createRepositoryAction(localRepositoryMenu, tr("Reflog"), "Git.ReflogRepository", - context, true, &GitClient::reflog); + context, true, std::bind(&GitPluginPrivate::reflogRepository, this)); createRepositoryAction(localRepositoryMenu, tr("Clean..."), "Git.CleanRepository", context, true, [this] { cleanRepository(); }); @@ -1057,6 +1058,13 @@ void GitPluginPrivate::logRepository() m_gitClient.log(state.topLevel()); } +void GitPluginPrivate::reflogRepository() +{ + const VcsBasePluginState state = currentState(); + QTC_ASSERT(state.hasTopLevel(), return); + m_gitClient.reflog(state.topLevel()); +} + void GitPluginPrivate::undoFileChanges(bool revertStaging) { if (IDocument *document = EditorManager::currentDocument()) {