Fix branch context menu using wrong branch for Create Worktree
Capture the right-clicked branch in lambdas at menu-build time instead of relying on currentItem() at action execution time, which could shift due to auto-refresh or filter interactions.
This commit is contained in:
parent
cbbb06bd53
commit
7098d70b40
|
|
@ -1514,19 +1514,57 @@ void GitPlusPlusView::branchContextMenu(const QPoint &pos)
|
||||||
|
|
||||||
m_branchList->setCurrentItem(item);
|
m_branchList->setCurrentItem(item);
|
||||||
QString branch = selectedBranch();
|
QString branch = selectedBranch();
|
||||||
|
if (branch.isEmpty()) return;
|
||||||
|
|
||||||
QMenu menu;
|
QMenu menu;
|
||||||
menu.addAction(QStringLiteral("Copy branch name"), this, [this]() {
|
menu.addAction(QStringLiteral("Copy branch name"), this, [branch]() {
|
||||||
QString branch = selectedBranch();
|
QApplication::clipboard()->setText(branch);
|
||||||
if (!branch.isEmpty())
|
|
||||||
QApplication::clipboard()->setText(branch);
|
|
||||||
});
|
});
|
||||||
menu.addSeparator();
|
menu.addSeparator();
|
||||||
menu.addAction(QStringLiteral("Checkout"), this, &GitPlusPlusView::checkoutBranch);
|
menu.addAction(QStringLiteral("Checkout"), this, [this]() { checkoutBranch(); });
|
||||||
menu.addAction(QStringLiteral("Compare with %1").arg(m_currentBranch), this, &GitPlusPlusView::compareBranch);
|
menu.addAction(QStringLiteral("Compare with %1").arg(m_currentBranch), this, [this]() { compareBranch(); });
|
||||||
menu.addAction(QStringLiteral("Create worktree"), this, &GitPlusPlusView::createWorktree);
|
menu.addAction(QStringLiteral("Create worktree"), this, [this, branch]() {
|
||||||
|
// Use the captured branch directly — don't rely on currentItem()
|
||||||
|
if (branch.isEmpty()) return;
|
||||||
|
|
||||||
|
QDir repoDir(m_gitDir);
|
||||||
|
QString repoName = repoDir.dirName();
|
||||||
|
QDir parentDir(m_gitDir);
|
||||||
|
parentDir.cdUp();
|
||||||
|
|
||||||
|
QString branchDir = branch;
|
||||||
|
branchDir.replace(QLatin1Char('/'), QLatin1Char('-'));
|
||||||
|
QString worktreePath = parentDir.absoluteFilePath(repoName + QLatin1Char('.') + branchDir);
|
||||||
|
|
||||||
|
if (QFileInfo::exists(worktreePath)) {
|
||||||
|
setMessage(QStringLiteral("Directory already exists: ") + worktreePath, true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto *proc = gitProcess({QStringLiteral("worktree"), QStringLiteral("add"), worktreePath, branch});
|
||||||
|
if (!proc) return;
|
||||||
|
connect(proc, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),
|
||||||
|
this, [this, proc, worktreePath](int exitCode, QProcess::ExitStatus) {
|
||||||
|
if (exitCode == 0) {
|
||||||
|
QFile kateProject(worktreePath + QStringLiteral("/.kateproject"));
|
||||||
|
if (!QFileInfo::exists(kateProject.fileName())) {
|
||||||
|
if (kateProject.open(QIODevice::WriteOnly | QIODevice::Text)) {
|
||||||
|
kateProject.write("{\n \"name\": \"" + QFileInfo(worktreePath).fileName().toUtf8() + "\",\n \"files\": [ { \"git\": true } ]\n}\n");
|
||||||
|
kateProject.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
setMessage(QStringLiteral("Worktree created: ") + worktreePath);
|
||||||
|
} else {
|
||||||
|
QString err = QString::fromUtf8(proc->readAllStandardError()).trimmed();
|
||||||
|
setMessage(QStringLiteral("Worktree failed: ") + err, true);
|
||||||
|
}
|
||||||
|
proc->deleteLater();
|
||||||
|
refreshAll();
|
||||||
|
});
|
||||||
|
proc->start();
|
||||||
|
});
|
||||||
if (branch != m_currentBranch)
|
if (branch != m_currentBranch)
|
||||||
menu.addAction(QStringLiteral("Delete"), this, &GitPlusPlusView::deleteBranch);
|
menu.addAction(QStringLiteral("Delete"), this, [this]() { deleteBranch(); });
|
||||||
|
|
||||||
// "Soft Reset to Merge Base" — available when the selected branch is an ancestor of HEAD
|
// "Soft Reset to Merge Base" — available when the selected branch is an ancestor of HEAD
|
||||||
// (i.e., current branch was forked from the selected branch)
|
// (i.e., current branch was forked from the selected branch)
|
||||||
|
|
@ -1539,7 +1577,7 @@ void GitPlusPlusView::branchContextMenu(const QPoint &pos)
|
||||||
QString head = QString::fromUtf8(headHash).trimmed();
|
QString head = QString::fromUtf8(headHash).trimmed();
|
||||||
if (mergeBaseHash != head) {
|
if (mergeBaseHash != head) {
|
||||||
menu.addSeparator();
|
menu.addSeparator();
|
||||||
menu.addAction(QStringLiteral("Soft Reset to Merge Base"), this, [this, branch, mergeBaseHash]() {
|
menu.addAction(QStringLiteral("Soft Reset to Merge Base"), this, [this, mergeBaseHash]() {
|
||||||
auto *proc = gitProcess({QStringLiteral("reset"), QStringLiteral("--soft"), mergeBaseHash});
|
auto *proc = gitProcess({QStringLiteral("reset"), QStringLiteral("--soft"), mergeBaseHash});
|
||||||
if (!proc) return;
|
if (!proc) return;
|
||||||
connect(proc, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),
|
connect(proc, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue