diff options
Diffstat (limited to 'git-gui/lib/remote.tcl')
| -rw-r--r-- | git-gui/lib/remote.tcl | 89 | 
1 files changed, 62 insertions, 27 deletions
diff --git a/git-gui/lib/remote.tcl b/git-gui/lib/remote.tcl index b54824ab72..e235ca8876 100644 --- a/git-gui/lib/remote.tcl +++ b/git-gui/lib/remote.tcl @@ -1,14 +1,13 @@  # git-gui remote management  # Copyright (C) 2006, 2007 Shawn Pearce +set some_heads_tracking 0;  # assume not +  proc is_tracking_branch {name} {  	global tracking_branches - -	if {![catch {set info $tracking_branches($name)}]} { -		return 1 -	} -	foreach t [array names tracking_branches] { -		if {[string match {*/\*} $t] && [string match $t $name]} { +	foreach spec $tracking_branches { +		set t [lindex $spec 0] +		if {$t eq $name || [string match $t $name]} {  			return 1  		}  	} @@ -18,36 +17,53 @@ proc is_tracking_branch {name} {  proc all_tracking_branches {} {  	global tracking_branches -	set all_trackings {} -	set cmd {} -	foreach name [array names tracking_branches] { -		if {[regsub {/\*$} $name {} name]} { -			lappend cmd $name +	set all [list] +	set pat [list] +	set cmd [list] + +	foreach spec $tracking_branches { +		set dst [lindex $spec 0] +		if {[string range $dst end-1 end] eq {/*}} { +			lappend pat $spec +			lappend cmd [string range $dst 0 end-2]  		} else { -			regsub ^refs/(heads|remotes)/ $name {} name -			lappend all_trackings $name +			lappend all $spec  		}  	} -	if {$cmd ne {}} { -		set fd [open "| git for-each-ref --format=%(refname) $cmd" r] -		while {[gets $fd name] > 0} { -			regsub ^refs/(heads|remotes)/ $name {} name -			lappend all_trackings $name +	if {$pat ne {}} { +		set fd [eval git_read for-each-ref --format=%(refname) $cmd] +		while {[gets $fd n] > 0} { +			foreach spec $pat { +				set dst [string range [lindex $spec 0] 0 end-2] +				set len [string length $dst] +				if {[string equal -length $len $dst $n]} { +					set src [string range [lindex $spec 2] 0 end-2] +					set spec [list \ +						$n \ +						[lindex $spec 1] \ +						$src[string range $n $len end] \ +						] +					lappend all $spec +				} +			}  		}  		close $fd  	} -	return [lsort -unique $all_trackings] +	return [lsort -index 0 -unique $all]  }  proc load_all_remotes {} {  	global repo_config -	global all_remotes tracking_branches +	global all_remotes tracking_branches some_heads_tracking +	set some_heads_tracking 0  	set all_remotes [list] -	array unset tracking_branches +	set trck [list] +	set rh_str refs/heads/ +	set rh_len [string length $rh_str]  	set rm_dir [gitdir remotes]  	if {[file isdirectory $rm_dir]} {  		set all_remotes [glob \ @@ -62,10 +78,19 @@ proc load_all_remotes {} {  				while {[gets $fd line] >= 0} {  					if {![regexp {^Pull:[ 	]*([^:]+):(.+)$} \  						$line line src dst]} continue -					if {![regexp ^refs/ $dst]} { -						set dst "refs/heads/$dst" +					if {[string index $src 0] eq {+}} { +						set src [string range $src 1 end]  					} -					set tracking_branches($dst) [list $name $src] +					if {![string equal -length 5 refs/ $src]} { +						set src $rh_str$src +					} +					if {![string equal -length 5 refs/ $dst]} { +						set dst $rh_str$dst +					} +					if {[string equal -length $rh_len $rh_str $dst]} { +						set some_heads_tracking 1 +					} +					lappend trck [list $dst $name $src]  				}  				close $fd  			} @@ -81,13 +106,23 @@ proc load_all_remotes {} {  		}  		foreach line $fl {  			if {![regexp {^([^:]+):(.+)$} $line line src dst]} continue -			if {![regexp ^refs/ $dst]} { -				set dst "refs/heads/$dst" +			if {[string index $src 0] eq {+}} { +				set src [string range $src 1 end] +			} +			if {![string equal -length 5 refs/ $src]} { +				set src $rh_str$src +			} +			if {![string equal -length 5 refs/ $dst]} { +				set dst $rh_str$dst +			} +			if {[string equal -length $rh_len $rh_str $dst]} { +				set some_heads_tracking 1  			} -			set tracking_branches($dst) [list $name $src] +			lappend trck [list $dst $name $src]  		}  	} +	set tracking_branches [lsort -index 0 -unique $trck]  	set all_remotes [lsort -unique $all_remotes]  }  | 
