All of lore.kernel.org
 help / color / mirror / Atom feed
From: "ZheNing Hu via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: Anders Kaseorg <andersk@MIT.EDU>,
	Junio C Hamano <gitster@pobox.com>,
	ZheNing Hu <adlternative@gmail.com>,
	ZheNing Hu <adlternative@gmail.com>
Subject: [PATCH v2] gitk: tag add right click options
Date: Tue, 16 Feb 2021 13:53:42 +0000	[thread overview]
Message-ID: <pull.866.v2.git.1613483622881.gitgitgadget@gmail.com> (raw)
In-Reply-To: <pull.866.git.1612426689172.gitgitgadget@gmail.com>

From: ZheNing Hu <adlternative@gmail.com>

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 <adlternative@gmail.com>
---
    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-v2
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-866/adlternative/gitk_tag_new_opt-v2
Pull-Request: https://github.com/gitgitgadget/git/pull/866

Range-diff vs v1:

 1:  b246cdf06d6e ! 1:  f3a5d7d3be9f [RFC] gitk: tag add right click options
     @@ Metadata
      Author: ZheNing Hu <adlternative@gmail.com>
      
       ## Commit message ##
     -    [RFC] gitk: tag add right click options
     +    gitk: tag add right click options
      
          In gitk, we can right-click on the icon of the branch,
          and a directory will pop up to provide us with functions
     @@ Commit message
          "Copy tag name" to right-click the tag icon. This function is
          temporarily supported work on the branch with <=3 tags.
      
     -    But now I may need a little help:
     -    after we successfully deleted or modified the tag,the content
     -    show on gitk has not changed, and I am stuck here.
     -
          Signed-off-by: ZheNing Hu <adlternative@gmail.com>
      
       ## gitk-git/gitk ##
     @@ gitk-git/gitk: proc removehead {id name} {
           unset headids($name)
       }
       
     -+proc movetag {id name} {
     -+    global tagids idtags
     -+
     -+    removetag $tagids($name) $name
     -+    set tagids($name) $id
     -+    lappend idtags($id) $name
     -+}
     -+
      +proc removetag {id name} {
      +    global tagids idtags
      +
     @@ gitk-git/gitk: proc mkbranch {} {
      +
      +    set val(name) $tagmenutag
      +    set val(id) $tagmenuid
     -+    set val(command) [list mvtago $top $tagmenutag]
     ++    set val(command) [list mvtaggo $top $tagmenutag]
      +
      +    set ui(title) [mc "Rename tag %s" $tagmenutag]
      +    set ui(accept) [mc "Rename"]
     @@ gitk-git/gitk: proc branchdia {top valvar uivar} {
           focus $top.name
       }
       
     -+proc mvtago {top prevname} {
     -+    global tagids idheads mainhead mainheadid
     ++proc mvtaggo {top prevname} {
     ++    global tagids idtags idheads mainhead mainheadid
      +
      +    set name [$top.name get]
      +    set id [$top.sha1 get]
     @@ gitk-git/gitk: proc branchdia {top valvar uivar} {
      +    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]} {
     ++        } err]} {
      +        notbusy renametag
      +        error_popup $err
      +    } else {
     @@ gitk-git/gitk: proc branchdia {top valvar uivar} {
      +        removetag $id $prevname
      +        set tagids($name) $id
      +        lappend idtags($id) $name
     ++        redrawtags $id
     ++        addedtag $id
     ++        dispneartags 0
      +        run refill_reflist
      +    }
      +
     @@ gitk-git/gitk: proc rmbranch {} {
      +        return
      +    }
      +    removetag $id $tag
     ++    redrawtags $id
      +    notbusy rmtag
      +    run refill_reflist
      +}


 gitk-git/gitk | 147 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 147 insertions(+)

diff --git a/gitk-git/gitk b/gitk-git/gitk
index 23d9dd1fe0d0..7ff4b3603e98 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
@@ -2685,6 +2700,14 @@ proc makewindow {} {
     }
     $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,43 @@ 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
+        set tagids($name) $id
+        lappend idtags($id) $name
+        redrawtags $id
+        addedtag $id
+        dispneartags 0
+        run refill_reflist
+    }
+
+}
+
 proc mkbrgo {top} {
     global headids idheads
 
@@ -9915,6 +10031,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 +10146,26 @@ proc rmbranch {} {
     run refill_reflist
 }
 
+proc rmtag {} {
+    global tagmenuid tagmenutag
+    global idtags
+
+    set tag $tagmenutag
+    set id $tagmenuid
+
+    nowbusy rmtag
+    update
+    if {[catch {exec git tag -d $tag} err]} {
+        notbusy rmtag
+        error_popup $err
+        return
+    }
+    removetag $id $tag
+    redrawtags $id
+    notbusy rmtag
+    run refill_reflist
+}
+
 # Display a list of tags and heads
 proc showrefs {} {
     global showrefstop bgcolor fgcolor selectbgcolor NS

base-commit: e6362826a0409539642a5738db61827e5978e2e4
-- 
gitgitgadget

  reply	other threads:[~2021-02-16 13:54 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-02-04  8:18 [PATCH] [RFC] gitk: tag add right click options 阿德烈 via GitGitGadget
2021-02-16 13:53 ` ZheNing Hu via GitGitGadget [this message]
2021-02-18 15:55   ` [PATCH v3] " ZheNing Hu via GitGitGadget
2021-02-24 10:58     ` [PATCH v4] " ZheNing Hu via GitGitGadget
2021-02-25  4:38       ` [PATCH v5] gitk: add right-click context menu for tags ZheNing Hu 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=pull.866.v2.git.1613483622881.gitgitgadget@gmail.com \
    --to=gitgitgadget@gmail.com \
    --cc=adlternative@gmail.com \
    --cc=andersk@MIT.EDU \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.