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>
This commit is contained in:
Shawn O. Pearce 2006-11-25 03:33:03 -05:00
Родитель 2171bf4b44
Коммит 359ca42a4b
1 изменённых файлов: 37 добавлений и 9 удалений

46
git-gui
Просмотреть файл

@ -1610,7 +1610,7 @@ proc write_checkout_index {fd pathList totalCnt batch msg after} {
## branch management ## branch management
proc load_all_branches {} { proc load_all_branches {} {
global all_branches global all_branches tracking_branches
set all_branches [list] set all_branches [list]
set cmd [list git for-each-ref] set cmd [list git for-each-ref]
@ -1618,9 +1618,9 @@ proc load_all_branches {} {
lappend cmd refs/heads lappend cmd refs/heads
set fd [open "| $cmd" r] set fd [open "| $cmd" r]
while {[gets $fd line] > 0} { while {[gets $fd line] > 0} {
if {[regsub ^refs/heads/ $line {} line]} { if {![catch {set info $tracking_branches($line)}]} continue
lappend all_branches $line if {![regsub ^refs/heads/ $line {} name]} continue
} lappend all_branches $name
} }
close $fd close $fd
@ -1652,21 +1652,49 @@ proc switch_branch {b} {
## remote management ## remote management
proc load_all_remotes {} { proc load_all_remotes {} {
global gitdir all_remotes repo_config global gitdir repo_config
global all_remotes tracking_branches
set all_remotes [list] set all_remotes [list]
array unset tracking_branches
set rm_dir [file join $gitdir remotes] set rm_dir [file join $gitdir remotes]
if {[file isdirectory $rm_dir]} { if {[file isdirectory $rm_dir]} {
set all_remotes [concat $all_remotes [glob \ set all_remotes [glob \
-types f \ -types f \
-tails \ -tails \
-nocomplain \ -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] { foreach line [array names repo_config remote.*.url] {
if {[regexp ^remote\.(.*)\.url\$ $line line name]} { if {![regexp ^remote\.(.*)\.url\$ $line line name]} continue
lappend all_remotes $name 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]
} }
} }