1# git-gui transport (fetch/push) support 2# Copyright (C) 2006, 2007 Shawn Pearce 3 4proc fetch_from {remote} { 5 set w [console::new \ 6 [mc "fetch %s" $remote] \ 7 [mc "Fetching new changes from %s" $remote]] 8 set cmds [list] 9 lappend cmds [list exec git fetch $remote] 10 if {[is_config_true gui.pruneduringfetch]} { 11 lappend cmds [list exec git remote prune $remote] 12 } 13 console::chain $w $cmds 14} 15 16proc prune_from {remote} { 17 set w [console::new \ 18 [mc "remote prune %s" $remote] \ 19 [mc "Pruning tracking branches deleted from %s" $remote]] 20 console::exec $w [list git remote prune $remote] 21} 22 23proc fetch_from_all {} { 24 set w [console::new \ 25 [mc "fetch all remotes"] \ 26 [mc "Fetching new changes from all remotes"]] 27 28 set cmd [list git fetch --all] 29 if {[is_config_true gui.pruneduringfetch]} { 30 lappend cmd --prune 31 } 32 33 console::exec $w $cmd 34} 35 36proc prune_from_all {} { 37 global all_remotes 38 39 set w [console::new \ 40 [mc "remote prune all remotes"] \ 41 [mc "Pruning tracking branches deleted from all remotes"]] 42 43 set cmd [list git remote prune] 44 45 foreach r $all_remotes { 46 lappend cmd $r 47 } 48 49 console::exec $w $cmd 50} 51 52proc push_to {remote} { 53 set w [console::new \ 54 [mc "push %s" $remote] \ 55 [mc "Pushing changes to %s" $remote]] 56 set cmd [list git push] 57 lappend cmd -v 58 lappend cmd $remote 59 console::exec $w $cmd 60} 61 62proc start_push_anywhere_action {w} { 63 global push_urltype push_remote push_url push_thin push_tags 64 global push_force 65 global repo_config 66 67 set is_mirror 0 68 set r_url {} 69 switch -- $push_urltype { 70 remote { 71 set r_url $push_remote 72 catch {set is_mirror $repo_config(remote.$push_remote.mirror)} 73 } 74 url {set r_url $push_url} 75 } 76 if {$r_url eq {}} return 77 78 set cmd [list git push] 79 lappend cmd -v 80 if {$push_thin} { 81 lappend cmd --thin 82 } 83 if {$push_force} { 84 lappend cmd --force 85 } 86 if {$push_tags} { 87 lappend cmd --tags 88 } 89 lappend cmd $r_url 90 if {$is_mirror} { 91 set cons [console::new \ 92 [mc "push %s" $r_url] \ 93 [mc "Mirroring to %s" $r_url]] 94 } else { 95 set cnt 0 96 foreach i [$w.source.l curselection] { 97 set b [$w.source.l get $i] 98 lappend cmd "refs/heads/$b:refs/heads/$b" 99 incr cnt 100 } 101 if {$cnt == 0} { 102 return 103 } elseif {$cnt == 1} { 104 set unit branch 105 } else { 106 set unit branches 107 } 108 109 set cons [console::new \ 110 [mc "push %s" $r_url] \ 111 [mc "Pushing %s %s to %s" $cnt $unit $r_url]] 112 } 113 console::exec $cons $cmd 114 destroy $w 115} 116 117trace add variable push_remote write \ 118 [list radio_selector push_urltype remote] 119 120proc do_push_anywhere {} { 121 global all_remotes current_branch 122 global push_urltype push_remote push_url push_thin push_tags 123 global push_force use_ttk NS 124 125 set w .push_setup 126 toplevel $w 127 catch {wm attributes $w -type dialog} 128 wm withdraw $w 129 wm geometry $w "+[winfo rootx .]+[winfo rooty .]" 130 pave_toplevel $w 131 132 ${NS}::label $w.header -text [mc "Push Branches"] \ 133 -font font_uibold -anchor center 134 pack $w.header -side top -fill x 135 136 ${NS}::frame $w.buttons 137 ${NS}::button $w.buttons.create -text [mc Push] \ 138 -default active \ 139 -command [list start_push_anywhere_action $w] 140 pack $w.buttons.create -side right 141 ${NS}::button $w.buttons.cancel -text [mc "Cancel"] \ 142 -default normal \ 143 -command [list destroy $w] 144 pack $w.buttons.cancel -side right -padx 5 145 pack $w.buttons -side bottom -fill x -pady 10 -padx 10 146 147 ${NS}::labelframe $w.source -text [mc "Source Branches"] 148 slistbox $w.source.l \ 149 -height 10 \ 150 -width 70 \ 151 -selectmode extended 152 foreach h [load_all_heads] { 153 $w.source.l insert end $h 154 if {$h eq $current_branch} { 155 $w.source.l select set end 156 $w.source.l yview end 157 } 158 } 159 pack $w.source.l -side left -fill both -expand 1 160 pack $w.source -fill both -expand 1 -pady 5 -padx 5 161 162 ${NS}::labelframe $w.dest -text [mc "Destination Repository"] 163 if {$all_remotes ne {}} { 164 ${NS}::radiobutton $w.dest.remote_r \ 165 -text [mc "Remote:"] \ 166 -value remote \ 167 -variable push_urltype 168 if {$use_ttk} { 169 ttk::combobox $w.dest.remote_m -state readonly \ 170 -exportselection false \ 171 -textvariable push_remote \ 172 -values $all_remotes 173 } else { 174 eval tk_optionMenu $w.dest.remote_m push_remote $all_remotes 175 } 176 grid $w.dest.remote_r $w.dest.remote_m -sticky w 177 if {[lsearch -sorted -exact $all_remotes origin] != -1} { 178 set push_remote origin 179 } else { 180 set push_remote [lindex $all_remotes 0] 181 } 182 set push_urltype remote 183 } else { 184 set push_urltype url 185 } 186 ${NS}::radiobutton $w.dest.url_r \ 187 -text [mc "Arbitrary Location:"] \ 188 -value url \ 189 -variable push_urltype 190 ${NS}::entry $w.dest.url_t \ 191 -width 50 \ 192 -textvariable push_url \ 193 -validate key \ 194 -validatecommand { 195 if {%d == 1 && [regexp {\s} %S]} {return 0} 196 if {%d == 1 && [string length %S] > 0} { 197 set push_urltype url 198 } 199 return 1 200 } 201 grid $w.dest.url_r $w.dest.url_t -sticky we -padx {0 5} 202 grid columnconfigure $w.dest 1 -weight 1 203 pack $w.dest -anchor nw -fill x -pady 5 -padx 5 204 205 ${NS}::labelframe $w.options -text [mc "Transfer Options"] 206 ${NS}::checkbutton $w.options.force \ 207 -text [mc "Force overwrite existing branch (may discard changes)"] \ 208 -variable push_force 209 grid $w.options.force -columnspan 2 -sticky w 210 ${NS}::checkbutton $w.options.thin \ 211 -text [mc "Use thin pack (for slow network connections)"] \ 212 -variable push_thin 213 grid $w.options.thin -columnspan 2 -sticky w 214 ${NS}::checkbutton $w.options.tags \ 215 -text [mc "Include tags"] \ 216 -variable push_tags 217 grid $w.options.tags -columnspan 2 -sticky w 218 grid columnconfigure $w.options 1 -weight 1 219 pack $w.options -anchor nw -fill x -pady 5 -padx 5 220 221 set push_url {} 222 set push_force 0 223 set push_thin 0 224 set push_tags 0 225 226 bind $w <Visibility> "grab $w; focus $w.buttons.create" 227 bind $w <Key-Escape> "destroy $w" 228 bind $w <Key-Return> [list start_push_anywhere_action $w] 229 wm title $w [mc "%s (%s): Push" [appname] [reponame]] 230 wm deiconify $w 231 tkwait window $w 232} 233