From 359ca42a4b9288421d2f0409652f76e9a365b801 Mon Sep 17 00:00:00 2001
From: "Shawn O. Pearce" <spearce@spearce.org>
Date: Sat, 25 Nov 2006 03:33:03 -0500
Subject: [PATCH] git-gui: Automatically skip tracking branches in branch menu.

Since the user should not work on a tracking branch we automatically
hide any branch which is used as a tracking branch by either a
remote.<name>.fetch config entry or by a Pull: line in a remotes file.

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
---
 git-gui | 46 +++++++++++++++++++++++++++++++++++++---------
 1 file changed, 37 insertions(+), 9 deletions(-)

diff --git a/git-gui b/git-gui
index 9bfed1f6a9..7406238c90 100755
--- a/git-gui
+++ b/git-gui
@@ -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
 
@@ -1652,21 +1652,49 @@ proc switch_branch {b} {
 ## 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]
 		}
 	}
 
-- 
GitLab