[PATCH v3 0/2] gitk: changes for the "Tags and heads" view

classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

[PATCH v3 0/2] gitk: changes for the "Tags and heads" view

Michael Rappazzo
Changes since v2[1]:
 - Instead of getting the remote info for each local branch individually,
   grab it all at once and store the result
 - Instead of a command line option to enable the new sorting option,
   enable it with a preference which is stored in the config.

v1 can be found here[2].

[1] http://thread.gmane.org/gmane.comp.version-control.git/289244
[2] http://thread.gmane.org/gmane.comp.version-control.git/288544

Michael Rappazzo (2):
  gitk: alter the ordering for the "Tags and heads" view
  gitk: add an option to enable sorting the "Tags and heads" view by ref
    type

 gitk | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------
 1 file changed, 66 insertions(+), 13 deletions(-)

--
2.7.4

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [hidden email]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Reply | Threaded
Open this post in threaded view
|

[PATCH v3 1/2] gitk: alter the ordering for the "Tags and heads" view

Michael Rappazzo
In the "Tags and heads" view, the list of refs is globally sorted.
Because of this, the list of local refs (heads) can be interrupted by the
list of remote refs.  This change re-orders the view to be: local refs,
remote refs tracked by local refs, remote refs, tags, and then other refs.

Signed-off-by: Michael Rappazzo <[hidden email]>
---
 gitk | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++---------
 1 file changed, 51 insertions(+), 9 deletions(-)

diff --git a/gitk b/gitk
index 805a1c7..3686370 100755
--- a/gitk
+++ b/gitk
@@ -1772,12 +1772,12 @@ proc longid {prefix} {
 }
 
 proc readrefs {} {
-    global tagids idtags headids idheads tagobjid
+    global tagids idtags headids idheads tagobjid localrefs_tracking_remotes
     global otherrefids idotherrefs mainhead mainheadid
     global selecthead selectheadid
     global hideremotes
 
-    foreach v {tagids idtags headids idheads otherrefids idotherrefs} {
+    foreach v {tagids idtags headids idheads otherrefids idotherrefs localrefs_tracking_remotes} {
  unset -nocomplain $v
     }
     set refd [open [list | git show-ref -d] r]
@@ -1828,6 +1828,21 @@ proc readrefs {} {
     set selectheadid [exec git rev-parse --verify $selecthead]
  }
     }
+    #load the local_branch->upstream mapping
+    # the result of the for-each-ref command produces the local_branch NUL upstream
+    set locals_tracking [open [list | git for-each-ref {--format=%(refname:short)%00%(upstream)} refs/heads/] r]
+    while {[gets $locals_tracking local_tracking] >= 0} {
+ set line [split $local_tracking \0]
+ if {[lindex $line 1] ne {}} {
+    set upstream_ref [string map {"refs/" ""} [lindex $line 1]];
+    set upstream_exists {}
+    catch {set upstream_exists [exec git rev-parse --verify $upstream_ref]}
+    if {$upstream_exists ne ""} {
+ set localrefs_tracking_remotes([lindex $line 0]) $upstream_ref
+    }
+ }
+    }
+    catch {close $locals_tracking}
 }
 
 # skip over fake commits
@@ -9929,39 +9944,66 @@ proc reflistfilter_change {n1 n2 op} {
 }
 
 proc refill_reflist {} {
-    global reflist reflistfilter showrefstop headids tagids otherrefids
+    global reflist reflistfilter showrefstop headids tagids otherrefids localrefs_tracking_remotes
     global curview
 
     if {![info exists showrefstop] || ![winfo exists $showrefstop]} return
-    set refs {}
+    set localrefs {}
+    set remoterefs {}
+    set locally_tracked_remote_refs {}
+    set tagrefs {}
+    set otherrefs {}
+
     foreach n [array names headids] {
- if {[string match $reflistfilter $n]} {
+ if {![string match "remotes/*" $n] && [string match $reflistfilter $n]} {
     if {[commitinview $headids($n) $curview]} {
- lappend refs [list $n H]
+ lappend localrefs [list $n H]
+ if {[info exists localrefs_tracking_remotes($n)]} {
+    lappend locally_tracked_remote_refs [list $localrefs_tracking_remotes($n) H]
+ }
     } else {
  interestedin $headids($n) {run refill_reflist}
     }
  }
     }
+    set locally_tracked_remote_refs [lsort -index 0 $locally_tracked_remote_refs]
+    set localrefs [lsort -index 0 $localrefs]
+
+    foreach n [array names headids] {
+ if {[string match "remotes/*" $n] && [string match $reflistfilter $n]} {
+    if {[commitinview $headids($n) $curview]} {
+ if {[lsearch -exact $locally_tracked_remote_refs [list $n H]] < 0} {
+    lappend remoterefs [list $n H]
+ }
+    } else {
+ interestedin $headids($n) {run refill_reflist}
+    }
+ }
+    }
+    set remoterefs [lsort -index 0 $remoterefs]
+
     foreach n [array names tagids] {
  if {[string match $reflistfilter $n]} {
     if {[commitinview $tagids($n) $curview]} {
- lappend refs [list $n T]
+ lappend tagrefs [list $n T]
     } else {
  interestedin $tagids($n) {run refill_reflist}
     }
  }
     }
+    set tagrefs [lsort -index 0 $tagrefs]
+
     foreach n [array names otherrefids] {
  if {[string match $reflistfilter $n]} {
     if {[commitinview $otherrefids($n) $curview]} {
- lappend refs [list $n o]
+ lappend otherrefs [list "$n" o]
     } else {
  interestedin $otherrefids($n) {run refill_reflist}
     }
  }
     }
-    set refs [lsort -index 0 $refs]
+    set otherrefs [lsort -index 0 $otherrefs]
+    lappend refs {*}$localrefs {*}$locally_tracked_remote_refs {*}$remoterefs {*}$tagrefs {*}$otherrefs
     if {$refs eq $reflist} return
 
     # Update the contents of $showrefstop.list according to the
--
2.7.4

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [hidden email]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Reply | Threaded
Open this post in threaded view
|

[PATCH v3 2/2] gitk: add an option to enable sorting the "Tags and heads" view by ref type

Michael Rappazzo
In reply to this post by Michael Rappazzo
Signed-off-by: Michael Rappazzo <[hidden email]>
---
 gitk | 21 ++++++++++++++++-----
 1 file changed, 16 insertions(+), 5 deletions(-)

diff --git a/gitk b/gitk
index 3686370..29ef36c 100755
--- a/gitk
+++ b/gitk
@@ -9944,7 +9944,7 @@ proc reflistfilter_change {n1 n2 op} {
 }
 
 proc refill_reflist {} {
-    global reflist reflistfilter showrefstop headids tagids otherrefids localrefs_tracking_remotes
+    global reflist reflistfilter showrefstop headids tagids otherrefids localrefs_tracking_remotes sortrefsbytype
     global curview
 
     if {![info exists showrefstop] || ![winfo exists $showrefstop]} return
@@ -10004,6 +10004,10 @@ proc refill_reflist {} {
     }
     set otherrefs [lsort -index 0 $otherrefs]
     lappend refs {*}$localrefs {*}$locally_tracked_remote_refs {*}$remoterefs {*}$tagrefs {*}$otherrefs
+    if {$sortrefsbytype ne 1} {
+       set refs [lsort -index 0 $refs]
+    }
+
     if {$refs eq $reflist} return
 
     # Update the contents of $showrefstop.list according to the
@@ -11416,7 +11420,7 @@ proc create_prefs_page {w} {
 proc prefspage_general {notebook} {
     global NS maxwidth maxgraphpct showneartags showlocalchanges
     global tabstop limitdiffs autoselect autosellen extdifftool perfile_attrs
-    global hideremotes want_ttk have_ttk maxrefs
+    global hideremotes want_ttk have_ttk maxrefs sortrefsbytype
 
     set page [create_prefs_page $notebook.general]
 
@@ -11440,6 +11444,9 @@ proc prefspage_general {notebook} {
     ${NS}::checkbutton $page.hideremotes -text [mc "Hide remote refs"] \
  -variable hideremotes
     grid x $page.hideremotes -sticky w
+    ${NS}::checkbutton $page.sortrefsbytype -text [mc "Sort refs by type"] \
+ -variable sortrefsbytype
+    grid x $page.sortrefsbytype -sticky w
 
     ${NS}::label $page.ddisp -text [mc "Diff display options"]
     grid $page.ddisp - -sticky w -pady 10
@@ -11544,7 +11551,7 @@ proc doprefs {} {
     global oldprefs prefstop showneartags showlocalchanges
     global uicolor bgcolor fgcolor ctext diffcolors selectbgcolor markbgcolor
     global tabstop limitdiffs autoselect autosellen extdifftool perfile_attrs
-    global hideremotes want_ttk have_ttk
+    global hideremotes want_ttk have_ttk sortrefsbytype
 
     set top .gitkprefs
     set prefstop $top
@@ -11553,7 +11560,8 @@ proc doprefs {} {
  return
     }
     foreach v {maxwidth maxgraphpct showneartags showlocalchanges \
-   limitdiffs tabstop perfile_attrs hideremotes want_ttk} {
+   limitdiffs tabstop perfile_attrs hideremotes want_ttk \
+   sortrefsbytype} {
  set oldprefs($v) [set $v]
     }
     ttk_toplevel $top
@@ -11679,7 +11687,8 @@ proc prefscan {} {
     global oldprefs prefstop
 
     foreach v {maxwidth maxgraphpct showneartags showlocalchanges \
-   limitdiffs tabstop perfile_attrs hideremotes want_ttk} {
+   limitdiffs tabstop perfile_attrs hideremotes want_ttk \
+   sortrefsbytype} {
  global $v
  set $v $oldprefs($v)
     }
@@ -12215,6 +12224,7 @@ set showneartags 1
 set hideremotes 0
 set maxrefs 20
 set visiblerefs {"master"}
+set sortrefsbytype 0
 set maxlinelen 200
 set showlocalchanges 1
 set limitdiffs 1
@@ -12318,6 +12328,7 @@ set config_variables {
     filesepbgcolor filesepfgcolor linehoverbgcolor linehoverfgcolor
     linehoveroutlinecolor mainheadcirclecolor workingfilescirclecolor
     indexcirclecolor circlecolors linkfgcolor circleoutlinecolor
+    sortrefsbytype
 }
 foreach var $config_variables {
     config_init_trace $var
--
2.7.4

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [hidden email]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Reply | Threaded
Open this post in threaded view
|

Re: [PATCH v3 0/2] gitk: changes for the "Tags and heads" view

Michael Rappazzo
In reply to this post by Michael Rappazzo
On Sun, Mar 27, 2016 at 11:06 AM, Michael Rappazzo <[hidden email]> wrote:

> Changes since v2[1]:
>  - Instead of getting the remote info for each local branch individually,
>    grab it all at once and store the result
>  - Instead of a command line option to enable the new sorting option,
>    enable it with a preference which is stored in the config.
>
> v1 can be found here[2].
>
> [1] http://thread.gmane.org/gmane.comp.version-control.git/289244
> [2] http://thread.gmane.org/gmane.comp.version-control.git/288544
>
> Michael Rappazzo (2):
>   gitk: alter the ordering for the "Tags and heads" view
>   gitk: add an option to enable sorting the "Tags and heads" view by ref
>     type
>
>  gitk | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------
>  1 file changed, 66 insertions(+), 13 deletions(-)
>
> --
> 2.7.4
>

I am still looking for comments on this patch.

Also, is there a 'pu' repo for gitk?  Currently, I am only tracking
git://ozlabs.org/~paulus/gitk
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [hidden email]
More majordomo info at  http://vger.kernel.org/majordomo-info.html