[PATCH v3] gitk: tag add right click options
From: ZheNing Hu via GitGitGadget <hidden>
Date: 2021-02-18 16:57:00
Subsystem:
the rest · Maintainer:
Linus Torvalds
From: ZheNing Hu <redacted>
In gitk, we can right-click on the icon of the branch,
and a directory will pop up to provide us with functions
such as "Checkout this branch", "Rename this branch"...,
but we found that the right-click tag icon does not have such
a function , So I learned how to write the branch icon, and
added the following functions "Rename this tag","Remove this tag",
"Copy tag name" to right-click the tag icon. This function is
temporarily supported work on the branch with <=3 tags.
Signed-off-by: ZheNing Hu <redacted>
---
gitk: tag add right click options
This patch want to fix: https://github.com/gitgitgadget/git/issues/855
We can provide for right-clicking the tag icon in gitk Rename this tag",
"Remove this tag", "Copy tag name" function.
For convenience, only the tags on the branch with the number of tags <=3
are processed temporarily.
Thanks!
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-866%2Fadlternative%2Fgitk_tag_new_opt-v3
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-866/adlternative/gitk_tag_new_opt-v3
Pull-Request: https://github.com/gitgitgadget/git/pull/866
Range-diff vs v2:
1: f3a5d7d3be9f ! 1: 52ca9bcfa52f gitk: tag add right click options
@@ gitk-git/gitk: proc makewindow {} {
global rprogitem rprogcoord rownumsel numcommits
global have_tk85 use_ttk NS
@@ gitk-git/gitk: proc makewindow {} {
+ set headctxmenu .headctxmenu
+ makemenu $headctxmenu {
+ {mc "Check out this branch" command cobranch}
+- {mc "Rename this branch" command mvbranch}
++ {mc "Rename this branch..." command mvbranch}
+ {mc "Remove this branch" command rmbranch}
+ {mc "Copy branch name" command {clipboard clear; clipboard append $headmenuhead}}
}
$headctxmenu configure -tearoff 0
+ set tagctxmenu .tagctxmenu
+ makemenu $tagctxmenu {
-+ {mc "Rename this tag" command mvtag}
-+ {mc "Remove this tag" command rmtag}
++ {mc "Rename this tag..." command mvtag}
++ {mc "Remove this tag..." command rmtag}
+ {mc "Copy tag name" command {clipboard clear; clipboard append $tagmenutag}}
+ }
+ $tagctxmenu configure -tearoff 0
@@ gitk-git/gitk: proc branchdia {top valvar uivar} {
+ } else {
+ notbusy renametag
+ removetag $id $prevname
++ removedtag $id $tag
+ set tagids($name) $id
+ lappend idtags($id) $name
-+ redrawtags $id
+ addedtag $id
++ redrawtags $id
+ dispneartags 0
+ run refill_reflist
+ }
@@ gitk-git/gitk: proc rmbranch {} {
+
+ set tag $tagmenutag
+ set id $tagmenuid
-+
++ if {![confirm_popup [mc "Really delete tag %s?" $tag]]} return
+ nowbusy rmtag
+ update
+ if {[catch {exec git tag -d $tag} err]} {
@@ gitk-git/gitk: proc rmbranch {} {
+ return
+ }
+ removetag $id $tag
++ removedtag $id $tag
+ redrawtags $id
+ notbusy rmtag
++ dispneartags 0
+ run refill_reflist
+}
+
# Display a list of tags and heads
proc showrefs {} {
global showrefstop bgcolor fgcolor selectbgcolor NS
+@@ gitk-git/gitk: proc addedtag {id} {
+ unset -nocomplain cached_atags
+ }
+
++proc removedtag {id tag} {
++ global cached_dtags cached_atags cached_tagcontent
++
++ unset -nocomplain cached_tagcontent
++ unset -nocomplain cached_dtags
++ unset -nocomplain cached_atags
++}
++
+ proc addedhead {hid head} {
+ global arcnos arcout cached_dheads
+
gitk-git/gitk | 160 +++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 159 insertions(+), 1 deletion(-)
diff --git a/gitk-git/gitk b/gitk-git/gitk
index 23d9dd1fe0d0..99b667d4db3e 100755
--- a/gitk-git/gitk
+++ b/gitk-git/gitk@@ -1874,6 +1874,20 @@ proc removehead {id name} { unset headids($name) } +proc removetag {id name} { + global tagids idtags + + if {$idtags($id) eq $name} { + unset idtags($id) + } else { + set i [lsearch -exact $idtags($id) $name] + if {$i >= 0} { + set idtags($id) [lreplace $idtags($id) $i $i] + } + } + unset tagids($name) +} + proc ttk_toplevel {w args} { global use_ttk eval [linsert $args 0 ::toplevel $w]
@@ -2077,6 +2091,7 @@ proc makewindow {} { global filesepbgcolor filesepfgcolor global mergecolors foundbgcolor currentsearchhitbgcolor global headctxmenu progresscanv progressitem progresscoords statusw + global tagctxmenu global fprogitem fprogcoord lastprogupdate progupdatepending global rprogitem rprogcoord rownumsel numcommits global have_tk85 use_ttk NS
@@ -2679,12 +2694,20 @@ proc makewindow {} { set headctxmenu .headctxmenu makemenu $headctxmenu { {mc "Check out this branch" command cobranch} - {mc "Rename this branch" command mvbranch} + {mc "Rename this branch..." command mvbranch} {mc "Remove this branch" command rmbranch} {mc "Copy branch name" command {clipboard clear; clipboard append $headmenuhead}} } $headctxmenu configure -tearoff 0 + set tagctxmenu .tagctxmenu + makemenu $tagctxmenu { + {mc "Rename this tag..." command mvtag} + {mc "Remove this tag..." command rmtag} + {mc "Copy tag name" command {clipboard clear; clipboard append $tagmenutag}} + } + $tagctxmenu configure -tearoff 0 + global flist_menu set flist_menu .flistctxmenu makemenu $flist_menu {
@@ -6581,6 +6604,7 @@ proc drawtags {id x xt y1} { set marks {} set ntags 0 + set ntags_copy 0 set nheads 0 set singletag 0 set maxtags 3
@@ -6592,6 +6616,7 @@ proc drawtags {id x xt y1} { if {[info exists idtags($id)]} { set marks $idtags($id) set ntags [llength $marks] + set ntags_copy $ntags if {$ntags > $maxtags || [totalwidth $marks mainfont $extra] > $maxwidth} { # show just a single "n tags..." tag
@@ -6678,6 +6703,9 @@ proc drawtags {id x xt y1} { -font $font -tags [list tag.$id text]] if {$ntags >= 0} { $canv bind $t <1> $tagclick + if {$ntags_copy < $maxtags} { + $canv bind $t $ctxbut [list tagmenu %X %Y $id $tag_quoted] + } } elseif {$nheads >= 0} { $canv bind $t $ctxbut [list headmenu %X %Y $id $tag_quoted] }
@@ -9531,6 +9559,57 @@ proc mkbranch {} { branchdia $top val ui } +proc mvtag {} { + global NS + global tagmenuid tagmenutag + + set top .tagdialog + + set val(name) $tagmenutag + set val(id) $tagmenuid + set val(command) [list mvtaggo $top $tagmenutag] + + set ui(title) [mc "Rename tag %s" $tagmenutag] + set ui(accept) [mc "Rename"] + + tagdia $top val ui +} + +proc tagdia {top valvar uivar} { + global NS commitinfo + upvar $valvar val $uivar ui + + catch {destroy $top} + ttk_toplevel $top + make_transient $top . + ${NS}::label $top.title -text $ui(title) + grid $top.title - -pady 10 + ${NS}::label $top.id -text [mc "ID:"] + ${NS}::entry $top.sha1 -width 40 + $top.sha1 insert 0 $val(id) + $top.sha1 conf -state readonly + grid $top.id $top.sha1 -sticky w + ${NS}::entry $top.head -width 60 + $top.head insert 0 [lindex $commitinfo($val(id)) 0] + $top.head conf -state readonly + grid x $top.head -sticky ew + grid columnconfigure $top 1 -weight 1 + ${NS}::label $top.nlab -text [mc "Name:"] + ${NS}::entry $top.name -width 40 + $top.name insert 0 $val(name) + grid $top.nlab $top.name -sticky w + ${NS}::frame $top.buts + ${NS}::button $top.buts.go -text $ui(accept) -command $val(command) + ${NS}::button $top.buts.can -text [mc "Cancel"] -command "catch {destroy $top}" + bind $top <Key-Return> $val(command) + bind $top <Key-Escape> "catch {destroy $top}" + grid $top.buts.go $top.buts.can + grid columnconfigure $top.buts 0 -weight 1 -uniform a + grid columnconfigure $top.buts 1 -weight 1 -uniform a + grid $top.buts - -pady 10 -sticky ew + focus $top.name +} + proc mvbranch {} { global NS global headmenuid headmenuhead
@@ -9582,6 +9661,44 @@ proc branchdia {top valvar uivar} { focus $top.name } +proc mvtaggo {top prevname} { + global tagids idtags idheads mainhead mainheadid + + set name [$top.name get] + set id [$top.sha1 get] + if {$name eq $prevname} { + catch {destroy $top} + return + } + if {$name eq {}} { + error_popup [mc "Please specify a new name for the tag"] $top + return + } + catch {destroy $top} + nowbusy renametag + update + if {[catch { + # NOTE: for an annotated tag, the new tag points to the old tag object + # where the old primary tag name is still recorded inside. Acceptable. + eval exec "git tag $name $prevname" + eval exec "git tag -d $prevname" + } err]} { + notbusy renametag + error_popup $err + } else { + notbusy renametag + removetag $id $prevname + removedtag $id $tag + set tagids($name) $id + lappend idtags($id) $name + addedtag $id + redrawtags $id + dispneartags 0 + run refill_reflist + } + +} + proc mkbrgo {top} { global headids idheads
@@ -9915,6 +10032,17 @@ proc headmenu {x y id head} { tk_popup $headctxmenu $x $y } +# context menu for a tag +proc tagmenu {x y id tag} { + global tagmenuid tagmenutag tagctxmenu mainhead + + stopfinding + set tagmenuid $id + set tagmenutag $tag + + tk_popup $tagctxmenu $x $y +} + proc cobranch {} { global headmenuid headmenuhead headids global showlocalchanges
@@ -10019,6 +10147,28 @@ proc rmbranch {} { run refill_reflist } +proc rmtag {} { + global tagmenuid tagmenutag + global idtags + + set tag $tagmenutag + set id $tagmenuid + if {![confirm_popup [mc "Really delete tag %s?" $tag]]} return + nowbusy rmtag + update + if {[catch {exec git tag -d $tag} err]} { + notbusy rmtag + error_popup $err + return + } + removetag $id $tag + removedtag $id $tag + redrawtags $id + notbusy rmtag + dispneartags 0 + run refill_reflist +} + # Display a list of tags and heads proc showrefs {} { global showrefstop bgcolor fgcolor selectbgcolor NS
@@ -11228,6 +11378,14 @@ proc addedtag {id} { unset -nocomplain cached_atags } +proc removedtag {id tag} { + global cached_dtags cached_atags cached_tagcontent + + unset -nocomplain cached_tagcontent + unset -nocomplain cached_dtags + unset -nocomplain cached_atags +} + proc addedhead {hid head} { global arcnos arcout cached_dheads
base-commit: e6362826a0409539642a5738db61827e5978e2e4 -- gitgitgadget