git-gui: Automatically skip tracking branches in branch menu.
[gitweb.git] / git-gui
diff --git a/git-gui b/git-gui
index 69ebd90958acaa488e3c06a560e4454ecd8d8c27..7406238c9029b2cd4639361c34c50d2e910c64d0 100755 (executable)
--- a/git-gui
+++ b/git-gui
@@ -266,7 +266,7 @@ proc repository_state {ctvar hdvar mhvar} {
        if {[catch {set current_branch [exec git symbolic-ref HEAD]}]} {
                set current_branch {}
        } else {
-               regsub ^refs/(heads|tags)/ \
+               regsub ^refs/((heads|tags|remotes)/)? \
                        $current_branch \
                        {} \
                        current_branch
@@ -1610,7 +1610,7 @@ proc write_checkout_index {fd pathList totalCnt batch msg after} {
 ## branch management
 
 proc load_all_branches {} {
-       global all_branches
+       global all_branches tracking_branches
 
        set all_branches [list]
        set cmd [list git for-each-ref]
@@ -1618,9 +1618,9 @@ proc load_all_branches {} {
        lappend cmd refs/heads
        set fd [open "| $cmd" r]
        while {[gets $fd line] > 0} {
-               if {[regsub ^refs/heads/ $line {} line]} {
-                       lappend all_branches $line
-               }
+               if {![catch {set info $tracking_branches($line)}]} continue
+               if {![regsub ^refs/heads/ $line {} name]} continue
+               lappend all_branches $name
        }
        close $fd
 
@@ -1634,7 +1634,7 @@ proc populate_branch_menu {m} {
        foreach b $all_branches {
                $m add radiobutton \
                        -label $b \
-                       -command [list do_switch_branch $b] \
+                       -command [list switch_branch $b] \
                        -variable current_branch \
                        -value $b \
                        -font font_ui
@@ -1643,26 +1643,58 @@ proc populate_branch_menu {m} {
        }
 }
 
+proc switch_branch {b} {
+       error "NOT IMPLEMENTED"
+}
+
 ######################################################################
 ##
 ## remote management
 
 proc load_all_remotes {} {
-       global gitdir all_remotes repo_config
+       global gitdir repo_config
+       global all_remotes tracking_branches
 
        set all_remotes [list]
+       array unset tracking_branches
+
        set rm_dir [file join $gitdir remotes]
        if {[file isdirectory $rm_dir]} {
-               set all_remotes [concat $all_remotes [glob \
+               set all_remotes [glob \
                        -types f \
                        -tails \
                        -nocomplain \
-                       -directory $rm_dir *]]
+                       -directory $rm_dir *]
+
+               foreach name $all_remotes {
+                       catch {
+                               set fd [open [file join $rm_dir $name] r]
+                               while {[gets $fd line] >= 0} {
+                                       if {![regexp {^Pull:[   ]*([^:]+):(.+)$} \
+                                               $line line src dst]} continue
+                                       if {![regexp ^refs/ $dst]} {
+                                               set dst "refs/heads/$dst"
+                                       }
+                                       set tracking_branches($dst) [list $name $src]
+                               }
+                               close $fd
+                       }
+               }
        }
 
        foreach line [array names repo_config remote.*.url] {
-               if {[regexp ^remote\.(.*)\.url\$ $line line name]} {
-                       lappend all_remotes $name
+               if {![regexp ^remote\.(.*)\.url\$ $line line name]} continue
+               lappend all_remotes $name
+
+               if {[catch {set fl $repo_config(remote.$name.fetch)}]} {
+                       set fl {}
+               }
+               foreach line $fl {
+                       if {![regexp {^([^:]+):(.+)$} $line line src dst]} continue
+                       if {![regexp ^refs/ $dst]} {
+                               set dst "refs/heads/$dst"
+                       }
+                       set tracking_branches($dst) [list $name $src]
                }
        }