Git: Support reflog also for branches

Change-Id: I9321ba4964d086d90aaf540a2006f95b94de8375
Reviewed-by: André Hartmann <aha_1980@gmx.de>
This commit is contained in:
Orgad Shaneh
2020-02-18 23:27:33 +02:00
committed by Orgad Shaneh
parent c9f1d84db7
commit c728d04b52
5 changed files with 29 additions and 8 deletions

View File

@@ -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();

View File

@@ -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;

View File

@@ -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"

View File

@@ -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;

View File

@@ -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()) {