| # git-gui transport (fetch/push) support |
| # Copyright (C) 2006, 2007 Shawn Pearce |
| |
| proc fetch_from {remote} { |
| set w [console::new \ |
| [mc "fetch %s" $remote] \ |
| [mc "Fetching new changes from %s" $remote]] |
| set cmds [list] |
| lappend cmds [list exec git fetch $remote] |
| if {[is_config_true gui.pruneduringfetch]} { |
| lappend cmds [list exec git remote prune $remote] |
| } |
| console::chain $w $cmds |
| } |
| |
| proc prune_from {remote} { |
| set w [console::new \ |
| [mc "remote prune %s" $remote] \ |
| [mc "Pruning tracking branches deleted from %s" $remote]] |
| console::exec $w [list git remote prune $remote] |
| } |
| |
| proc fetch_from_all {} { |
| set w [console::new \ |
| [mc "fetch all remotes"] \ |
| [mc "Fetching new changes from all remotes"]] |
| |
| set cmd [list git fetch --all] |
| if {[is_config_true gui.pruneduringfetch]} { |
| lappend cmd --prune |
| } |
| |
| console::exec $w $cmd |
| } |
| |
| proc prune_from_all {} { |
| global all_remotes |
| |
| set w [console::new \ |
| [mc "remote prune all remotes"] \ |
| [mc "Pruning tracking branches deleted from all remotes"]] |
| |
| set cmd [list git remote prune] |
| |
| foreach r $all_remotes { |
| lappend cmd $r |
| } |
| |
| console::exec $w $cmd |
| } |
| |
| proc push_to {remote} { |
| set w [console::new \ |
| [mc "push %s" $remote] \ |
| [mc "Pushing changes to %s" $remote]] |
| set cmd [list git push] |
| lappend cmd -v |
| lappend cmd $remote |
| console::exec $w $cmd |
| } |
| |
| proc start_push_anywhere_action {w} { |
| global push_urltype push_remote push_url push_thin push_tags |
| global push_force |
| global repo_config |
| |
| set is_mirror 0 |
| set r_url {} |
| switch -- $push_urltype { |
| remote { |
| set r_url $push_remote |
| catch {set is_mirror $repo_config(remote.$push_remote.mirror)} |
| } |
| url {set r_url $push_url} |
| } |
| if {$r_url eq {}} return |
| |
| set cmd [list git push] |
| lappend cmd -v |
| if {$push_thin} { |
| lappend cmd --thin |
| } |
| if {$push_force} { |
| lappend cmd --force |
| } |
| if {$push_tags} { |
| lappend cmd --tags |
| } |
| lappend cmd $r_url |
| if {$is_mirror} { |
| set cons [console::new \ |
| [mc "push %s" $r_url] \ |
| [mc "Mirroring to %s" $r_url]] |
| } else { |
| set cnt 0 |
| foreach i [$w.source.l curselection] { |
| set b [$w.source.l get $i] |
| lappend cmd "refs/heads/$b:refs/heads/$b" |
| incr cnt |
| } |
| if {$cnt == 0} { |
| return |
| } elseif {$cnt == 1} { |
| set unit branch |
| } else { |
| set unit branches |
| } |
| |
| set cons [console::new \ |
| [mc "push %s" $r_url] \ |
| [mc "Pushing %s %s to %s" $cnt $unit $r_url]] |
| } |
| console::exec $cons $cmd |
| destroy $w |
| } |
| |
| trace add variable push_remote write \ |
| [list radio_selector push_urltype remote] |
| |
| proc do_push_anywhere {} { |
| global all_remotes current_branch |
| global push_urltype push_remote push_url push_thin push_tags |
| global push_force use_ttk NS |
| |
| set w .push_setup |
| toplevel $w |
| catch {wm attributes $w -type dialog} |
| wm withdraw $w |
| wm geometry $w "+[winfo rootx .]+[winfo rooty .]" |
| pave_toplevel $w |
| |
| ${NS}::label $w.header -text [mc "Push Branches"] \ |
| -font font_uibold -anchor center |
| pack $w.header -side top -fill x |
| |
| ${NS}::frame $w.buttons |
| ${NS}::button $w.buttons.create -text [mc Push] \ |
| -default active \ |
| -command [list start_push_anywhere_action $w] |
| pack $w.buttons.create -side right |
| ${NS}::button $w.buttons.cancel -text [mc "Cancel"] \ |
| -default normal \ |
| -command [list destroy $w] |
| pack $w.buttons.cancel -side right -padx 5 |
| pack $w.buttons -side bottom -fill x -pady 10 -padx 10 |
| |
| ${NS}::labelframe $w.source -text [mc "Source Branches"] |
| slistbox $w.source.l \ |
| -height 10 \ |
| -width 70 \ |
| -selectmode extended |
| foreach h [load_all_heads] { |
| $w.source.l insert end $h |
| if {$h eq $current_branch} { |
| $w.source.l select set end |
| $w.source.l yview end |
| } |
| } |
| pack $w.source.l -side left -fill both -expand 1 |
| pack $w.source -fill both -expand 1 -pady 5 -padx 5 |
| |
| ${NS}::labelframe $w.dest -text [mc "Destination Repository"] |
| if {$all_remotes ne {}} { |
| ${NS}::radiobutton $w.dest.remote_r \ |
| -text [mc "Remote:"] \ |
| -value remote \ |
| -variable push_urltype |
| if {$use_ttk} { |
| ttk::combobox $w.dest.remote_m -state readonly \ |
| -exportselection false \ |
| -textvariable push_remote \ |
| -values $all_remotes |
| } else { |
| eval tk_optionMenu $w.dest.remote_m push_remote $all_remotes |
| } |
| grid $w.dest.remote_r $w.dest.remote_m -sticky w |
| if {[lsearch -sorted -exact $all_remotes origin] != -1} { |
| set push_remote origin |
| } else { |
| set push_remote [lindex $all_remotes 0] |
| } |
| set push_urltype remote |
| } else { |
| set push_urltype url |
| } |
| ${NS}::radiobutton $w.dest.url_r \ |
| -text [mc "Arbitrary Location:"] \ |
| -value url \ |
| -variable push_urltype |
| ${NS}::entry $w.dest.url_t \ |
| -width 50 \ |
| -textvariable push_url \ |
| -validate key \ |
| -validatecommand { |
| if {%d == 1 && [regexp {\s} %S]} {return 0} |
| if {%d == 1 && [string length %S] > 0} { |
| set push_urltype url |
| } |
| return 1 |
| } |
| grid $w.dest.url_r $w.dest.url_t -sticky we -padx {0 5} |
| grid columnconfigure $w.dest 1 -weight 1 |
| pack $w.dest -anchor nw -fill x -pady 5 -padx 5 |
| |
| ${NS}::labelframe $w.options -text [mc "Transfer Options"] |
| ${NS}::checkbutton $w.options.force \ |
| -text [mc "Force overwrite existing branch (may discard changes)"] \ |
| -variable push_force |
| grid $w.options.force -columnspan 2 -sticky w |
| ${NS}::checkbutton $w.options.thin \ |
| -text [mc "Use thin pack (for slow network connections)"] \ |
| -variable push_thin |
| grid $w.options.thin -columnspan 2 -sticky w |
| ${NS}::checkbutton $w.options.tags \ |
| -text [mc "Include tags"] \ |
| -variable push_tags |
| grid $w.options.tags -columnspan 2 -sticky w |
| grid columnconfigure $w.options 1 -weight 1 |
| pack $w.options -anchor nw -fill x -pady 5 -padx 5 |
| |
| set push_url {} |
| set push_force 0 |
| set push_thin 0 |
| set push_tags 0 |
| |
| bind $w <Visibility> "grab $w; focus $w.buttons.create" |
| bind $w <Key-Escape> "destroy $w" |
| bind $w <Key-Return> [list start_push_anywhere_action $w] |
| wm title $w [mc "%s (%s): Push" [appname] [reponame]] |
| wm deiconify $w |
| tkwait window $w |
| } |