From: "Jens Lidestrom via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: "Paul Mackerras [ ]" <paulus@ozlabs.org>,
Johannes Sixt <j6t@kdbg.org>, Jens Lidestrom <jens@lidestrom.se>,
Jens Lidestrom <jens@lidestrom.se>
Subject: [PATCH v2 06/10] gitk: add keyboard bind for remove branch command
Date: Mon, 03 Jul 2023 18:45:54 +0000 [thread overview]
Message-ID: <ad6617a7badfe1d3ac252d9faabbe21b2b0f65f8.1688409958.git.gitgitgadget@gmail.com> (raw)
In-Reply-To: <pull.1551.v2.git.1688409958.gitgitgadget@gmail.com>
From: Jens Lidestrom <jens@lidestrom.se>
Signed-off-by: Jens Lidestrom <jens@lidestrom.se>
---
gitk-git/gitk | 104 ++++++++++++++++++++++++++++++++++++++++++--------
1 file changed, 89 insertions(+), 15 deletions(-)
diff --git a/gitk-git/gitk b/gitk-git/gitk
index 8364033ad58..65ca11becca 100755
--- a/gitk-git/gitk
+++ b/gitk-git/gitk
@@ -2692,6 +2692,8 @@ proc makewindow {} {
bind $ctext <<Selection>> rehighlight_search_results
bind . <$M1B-t> {resethead [selected_line_id]}
bind . <$M1B-o> {checkout [selected_line_heads] [selected_line_id]}
+ bind . <$M1B-m> {rmbranch [selected_line_heads] [selected_line_id] 1}
+ bind . <$M1B-b> {mkbranch [selected_line_id]}
for {set i 1} {$i < 10} {incr i} {
bind . <$M1B-Key-$i> [list go_to_parent $i]
}
@@ -2735,7 +2737,7 @@ proc makewindow {} {
makemenu $headctxmenu {
{mc "Check out this branch" command {checkout [list $headmenuhead] $headmenuid}}
{mc "Rename this branch" command mvbranch}
- {mc "Remove this branch" command rmbranch}
+ {mc "Remove this branch" command {rmbranch [list $headmenuhead] $headmenuid 0}}
{mc "Copy branch name" command {clipboard clear; clipboard append $headmenuhead}}
}
$headctxmenu configure -tearoff 0
@@ -3185,6 +3187,8 @@ proc keys {} {
[mc "<F5> Update"]
[mc "<%s-T> Reset current branch to selected commit" $M1T]
[mc "<%s-O> Check out selected commit" $M1T]
+[mc "<%s-B> Create branch on selected commit" $M1T]
+[mc "<%s-M> Remove selected branch" $M1T]
" \
-justify left -bg $bgcolor -border 2 -relief groove
pack $w.m -side top -fill both -padx 2 -pady 2
@@ -10121,32 +10125,102 @@ proc readcheckoutstat {fd head_to_checkout ref_to_checkout id_to_checkout} {
}
}
-proc rmbranch {} {
- global headmenuid headmenuhead mainhead
+proc rmbranch {heads_on_commit id shouldComfirm} {
+ global mainhead
global idheads
+ global confirm_ok sel_ix NS
- set head $headmenuhead
- set id $headmenuid
- # this check shouldn't be needed any more...
- if {$head eq $mainhead} {
+ if {[llength $heads_on_commit] == 0} {
+ error_popup [mc "Cannot delete a detached head"]
+ return
+ }
+
+ if {[llength $heads_on_commit] == 1 && [lindex $heads_on_commit 0] eq $mainhead} {
error_popup [mc "Cannot delete the currently checked-out branch"]
return
}
- set dheads [descheads $id]
- if {[llength $dheads] == 1 && $idheads($dheads) eq $head} {
- # the stuff on this branch isn't on any other branch
- if {![confirm_popup [mc "The commits on branch %s aren't on any other\
- branch.\nReally delete branch %s?" $head $head]]} return
+
+ # Filter out mainhead
+ set mainhead_ix [lsearch $heads_on_commit $mainhead]
+ if {$mainhead_ix != -1} {
+ set heads_on_commit [lreplace $heads_on_commit $mainhead_ix $mainhead_ix]
+ }
+
+ # Filter out remote branches
+ foreach head_ix [lsearch -all $heads_on_commit "remotes/*"] {
+ set heads_on_commit [lreplace $heads_on_commit $head_ix $head_ix]
+ }
+
+ if {[llength $heads_on_commit] == 0} {
+ # Probably only current branch and its remote branch on commit
+ error_popup [mc "Cannot delete branch"]
+ return
}
+
+ set nr_heads_on_commit [llength $heads_on_commit]
+ set first_head [lindex $heads_on_commit 0]
+
+ if {$nr_heads_on_commit == 1} {
+ # Only a single head, simple comfirm dialogs
+
+ set head_to_remove $first_head
+ set dheads [descheads $id]
+
+ if {[llength $dheads] == 1 && $idheads($dheads) eq $head_to_remove} {
+ # the stuff on this branch isn't on any other branch
+ if {![confirm_popup [mc "The commits on branch %s aren't on any other\
+ branch.\nReally delete branch %s?" $head_to_remove $head_to_remove]]} return
+ } elseif {$shouldComfirm} {
+ if {![confirm_popup [mc "Really delete branch %s?" $head_to_remove]]} return
+ }
+ } else {
+ # Select branch dialog
+
+ set confirm_ok 0
+
+ set w ".selectbranch"
+ ttk_toplevel $w
+ make_transient $w .
+ wm title $w [mc "Delete branch"]
+ ${NS}::label $w.m -text [mc "Which branch to delete?"]
+ pack $w.m -side top -fill x -padx 20 -pady 20
+ ${NS}::frame $w.f
+
+ set sel_ix 0
+ for {set i 0} {$i < $nr_heads_on_commit} {incr i} {
+ ${NS}::radiobutton $w.f.id_$i -value $i -variable sel_ix \
+ -text [lindex $heads_on_commit $i]
+ bind $w.f.id_$i <Key-Up> "set sel_ix [expr ($i - 1) % $nr_heads_on_commit]"
+ bind $w.f.id_$i <Key-Down> "set sel_ix [expr ($i + 1) % $nr_heads_on_commit]"
+ grid $w.f.id_$i -sticky w -padx 20
+ }
+
+ pack $w.f -side top -fill x -padx 4
+ ${NS}::button $w.ok -text [mc OK] -command "set confirm_ok 1; destroy $w"
+ bind $w <Key-Return> "set confirm_ok 1; destroy $w"
+ pack $w.ok -side left -fill x -padx 20 -pady 20
+ ${NS}::button $w.cancel -text [mc Cancel] -command "destroy $w"
+ bind $w <Key-Escape> [list destroy $w]
+ pack $w.cancel -side right -fill x -padx 20 -pady 20
+ bind $w <Visibility> "grab $w; focus $w.f.id_$sel_ix"
+
+ tkwait window $w
+ if {!$confirm_ok} return
+
+ set head_to_remove [lindex $heads_on_commit $sel_ix]
+ }
+
+ # Perform the command
+
nowbusy rmbranch
update
- if {[catch {exec git branch -D $head} err]} {
+ if {[catch {exec git branch -D $head_to_remove} err]} {
notbusy rmbranch
error_popup $err
return
}
- removehead $id $head
- removedhead $id $head
+ removehead $id $head_to_remove
+ removedhead $id $head_to_remove
redrawtags $id
notbusy rmbranch
dispneartags 0
--
gitgitgadget
next prev parent reply other threads:[~2023-07-03 18:46 UTC|newest]
Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-06-27 14:41 [PATCH 0/9] gitk: improve keyboard support Jens Lidestrom via GitGitGadget
2023-06-27 14:41 ` [PATCH 1/9] gitk: add procedures to get commit info from selected row Jens Lidestrom via GitGitGadget
2023-06-27 14:41 ` [PATCH 2/9] gitk: use term "current branch" in gui Jens Lidestrom via GitGitGadget
2023-06-27 14:41 ` [PATCH 3/9] gitk: add keyboard bind for reset Jens Lidestrom via GitGitGadget
2023-06-27 14:41 ` [PATCH 4/9] gitk: show branch name in reset dialog Jens Lidestrom via GitGitGadget
2023-06-27 14:41 ` [PATCH 5/9] gitk: add keyboard bind for checkout Jens Lidestrom via GitGitGadget
2023-07-02 12:10 ` Jens Lideström
2023-06-27 14:41 ` [PATCH 6/9] gitk: add keyboard bind for create and remove branch Jens Lidestrom via GitGitGadget
2023-06-28 5:59 ` Johannes Sixt
2023-06-28 7:12 ` Jens Lideström
2023-06-28 20:30 ` Johannes Sixt
2023-07-02 11:50 ` Jens Lideström
2023-06-27 14:41 ` [PATCH 7/9] gitk: add keyboard bind to cherry-pick Jens Lidestrom via GitGitGadget
2023-06-27 14:41 ` [PATCH 8/9] gitk: focus ok button in reset dialog Jens Lidestrom via GitGitGadget
2023-06-27 14:41 ` [PATCH 9/9] gitk: default select reset hard in dialog Jens Lidestrom via GitGitGadget
2023-06-28 5:46 ` Johannes Sixt
2023-06-28 7:16 ` Jens Lideström
2023-07-02 12:09 ` Jens Lideström
2023-06-28 6:09 ` [PATCH 0/9] gitk: improve keyboard support Johannes Sixt
2023-06-28 7:01 ` Jens Lideström
2023-06-28 17:32 ` Jens Lideström
2023-06-28 20:32 ` Johannes Sixt
2023-07-02 12:28 ` Jens Lideström
2023-07-03 18:45 ` [PATCH v2 00/10] " Jens Lidestrom via GitGitGadget
2023-07-03 18:45 ` [PATCH v2 01/10] gitk: add procedures to get commit info from selected row Jens Lidestrom via GitGitGadget
2023-07-03 18:45 ` [PATCH v2 02/10] gitk: use term "current branch" in gui Jens Lidestrom via GitGitGadget
2023-07-03 18:45 ` [PATCH v2 03/10] gitk: add keyboard bind for reset command Jens Lidestrom via GitGitGadget
2023-07-03 18:45 ` [PATCH v2 04/10] gitk: show branch name in reset dialog Jens Lidestrom via GitGitGadget
2023-07-03 18:45 ` [PATCH v2 05/10] gitk: add keyboard bind for checkout command Jens Lidestrom via GitGitGadget
2023-07-05 17:29 ` Johannes Sixt
2023-07-08 12:09 ` Jens Lideström
2023-07-03 18:45 ` Jens Lidestrom via GitGitGadget [this message]
2023-07-05 20:00 ` [PATCH v2 06/10] gitk: add keyboard bind for remove branch command Johannes Sixt
2023-07-08 12:09 ` Jens Lideström
2023-07-03 18:45 ` [PATCH v2 07/10] gitk: add keyboard bind for cherry-pick command Jens Lidestrom via GitGitGadget
2023-07-05 20:07 ` Johannes Sixt
2023-07-08 12:09 ` Jens Lideström
2023-07-03 18:45 ` [PATCH v2 08/10] gitk: add keyboard bind for create branch command Jens Lidestrom via GitGitGadget
2023-07-05 20:02 ` Johannes Sixt
2023-07-03 18:45 ` [PATCH v2 09/10] gitk: improve keyboard convenience in reset dialog Jens Lidestrom via GitGitGadget
2023-07-05 19:52 ` Johannes Sixt
2023-07-03 18:45 ` [PATCH v2 10/10] gitk: allow checkout of remote branch Jens Lidestrom via GitGitGadget
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ad6617a7badfe1d3ac252d9faabbe21b2b0f65f8.1688409958.git.gitgitgadget@gmail.com \
--to=gitgitgadget@gmail.com \
--cc=git@vger.kernel.org \
--cc=j6t@kdbg.org \
--cc=jens@lidestrom.se \
--cc=paulus@ozlabs.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).