You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
170 lines
3.4 KiB
170 lines
3.4 KiB
# git-gui remote management |
|
# Copyright (C) 2006, 2007 Shawn Pearce |
|
|
|
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]} { |
|
return 1 |
|
} |
|
} |
|
return 0 |
|
} |
|
|
|
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 |
|
} else { |
|
regsub ^refs/(heads|remotes)/ $name {} name |
|
lappend all_trackings $name |
|
} |
|
} |
|
|
|
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 |
|
} |
|
close $fd |
|
} |
|
|
|
return [lsort -unique $all_trackings] |
|
} |
|
|
|
proc load_all_remotes {} { |
|
global repo_config |
|
global all_remotes tracking_branches |
|
|
|
set all_remotes [list] |
|
array unset tracking_branches |
|
|
|
set rm_dir [gitdir remotes] |
|
if {[file isdirectory $rm_dir]} { |
|
set all_remotes [glob \ |
|
-types f \ |
|
-tails \ |
|
-nocomplain \ |
|
-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]} 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] |
|
} |
|
} |
|
|
|
set all_remotes [lsort -unique $all_remotes] |
|
} |
|
|
|
proc populate_fetch_menu {} { |
|
global all_remotes repo_config |
|
|
|
set m .mbar.fetch |
|
set prune_list [list] |
|
foreach r $all_remotes { |
|
set enable 0 |
|
if {![catch {set a $repo_config(remote.$r.url)}]} { |
|
if {![catch {set a $repo_config(remote.$r.fetch)}]} { |
|
set enable 1 |
|
} |
|
} else { |
|
catch { |
|
set fd [open [gitdir remotes $r] r] |
|
while {[gets $fd n] >= 0} { |
|
if {[regexp {^Pull:[ \t]*([^:]+):} $n]} { |
|
set enable 1 |
|
break |
|
} |
|
} |
|
close $fd |
|
} |
|
} |
|
|
|
if {$enable} { |
|
lappend prune_list $r |
|
$m add command \ |
|
-label "Fetch from $r..." \ |
|
-command [list fetch_from $r] |
|
} |
|
} |
|
|
|
if {$prune_list ne {}} { |
|
$m add separator |
|
} |
|
foreach r $prune_list { |
|
$m add command \ |
|
-label "Prune from $r..." \ |
|
-command [list prune_from $r] |
|
} |
|
} |
|
|
|
proc populate_push_menu {} { |
|
global all_remotes repo_config |
|
|
|
set m .mbar.push |
|
set fast_count 0 |
|
foreach r $all_remotes { |
|
set enable 0 |
|
if {![catch {set a $repo_config(remote.$r.url)}]} { |
|
if {![catch {set a $repo_config(remote.$r.push)}]} { |
|
set enable 1 |
|
} |
|
} else { |
|
catch { |
|
set fd [open [gitdir remotes $r] r] |
|
while {[gets $fd n] >= 0} { |
|
if {[regexp {^Push:[ \t]*([^:]+):} $n]} { |
|
set enable 1 |
|
break |
|
} |
|
} |
|
close $fd |
|
} |
|
} |
|
|
|
if {$enable} { |
|
if {!$fast_count} { |
|
$m add separator |
|
} |
|
$m add command \ |
|
-label "Push to $r..." \ |
|
-command [list push_to $r] |
|
incr fast_count |
|
} |
|
} |
|
}
|
|
|