summaryrefslogtreecommitdiff
path: root/lib/transport.tcl
diff options
context:
space:
mode:
authorShawn O. Pearce <spearce@spearce.org>2007-05-08 03:35:48 (GMT)
committerShawn O. Pearce <spearce@spearce.org>2007-05-08 03:35:48 (GMT)
commitf522c9b5ed367172f969397589ae3d686b867ac0 (patch)
tree61315e92a1cf8f5edb67181a4e22a724195babeb /lib/transport.tcl
parentc6a5e4030320c934bca70471d04aa9e7d8e2cd67 (diff)
downloadgit-f522c9b5ed367172f969397589ae3d686b867ac0.zip
git-f522c9b5ed367172f969397589ae3d686b867ac0.tar.gz
git-f522c9b5ed367172f969397589ae3d686b867ac0.tar.bz2
git-gui: Refactor into multiple files to save my sanity
I'm finding it difficult to work with a 6,000+ line Tcl script and not go insane while looking for a particular block of code. Since most of the program is organized into different units of functionality and not all users will need all units immediately on startup we can improve things by splitting procs out into multiple files and let auto_load handle things for us. This should help not only to better organize the source, but it may also improve startup times for some users as the Tcl parser does not need to read as much script before it can show the UI. In many cases the user can avoid reading at least half of git-gui now. Unfortunately we now need a library directory in our runtime location. This is currently assumed to be $(sharedir)/git-gui/lib and its expected that the Makefile invoker will setup some sort of reasonable sharedir value for us, or let us assume its going to be $(gitexecdir)/../share. We now also require a tclsh (in TCL_PATH) to just run the Makefile, as we use tclsh to generate the tclIndex for our lib directory. I'm hoping this is not an unncessary burden on end-users who are building from source. I haven't really made any functionality changes here, this is just a huge migration of code from one file to many smaller files. All of the new changes are to setup the library path and install the library files. Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
Diffstat (limited to 'lib/transport.tcl')
-rw-r--r--lib/transport.tcl162
1 files changed, 162 insertions, 0 deletions
diff --git a/lib/transport.tcl b/lib/transport.tcl
new file mode 100644
index 0000000..ce6fc45
--- /dev/null
+++ b/lib/transport.tcl
@@ -0,0 +1,162 @@
+# git-gui transport (fetch/push) support
+# Copyright (C) 2006, 2007 Shawn Pearce
+
+proc fetch_from {remote} {
+ set w [new_console \
+ "fetch $remote" \
+ "Fetching new changes from $remote"]
+ set cmd [list git fetch]
+ lappend cmd $remote
+ console_exec $w $cmd console_done
+}
+
+proc push_to {remote} {
+ set w [new_console \
+ "push $remote" \
+ "Pushing changes to $remote"]
+ set cmd [list git push]
+ lappend cmd -v
+ lappend cmd $remote
+ console_exec $w $cmd console_done
+}
+
+proc start_push_anywhere_action {w} {
+ global push_urltype push_remote push_url push_thin push_tags
+
+ set r_url {}
+ switch -- $push_urltype {
+ remote {set r_url $push_remote}
+ 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_tags} {
+ lappend cmd --tags
+ }
+ lappend cmd $r_url
+ 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 [new_console "push $r_url" "Pushing $cnt $unit to $r_url"]
+ console_exec $cons $cmd console_done
+ destroy $w
+}
+
+trace add variable push_remote write \
+ [list radio_selector push_urltype remote]
+
+proc do_push_anywhere {} {
+ global all_heads all_remotes current_branch
+ global push_urltype push_remote push_url push_thin push_tags
+
+ set w .push_setup
+ toplevel $w
+ wm geometry $w "+[winfo rootx .]+[winfo rooty .]"
+
+ label $w.header -text {Push Branches} -font font_uibold
+ pack $w.header -side top -fill x
+
+ frame $w.buttons
+ button $w.buttons.create -text Push \
+ -default active \
+ -command [list start_push_anywhere_action $w]
+ pack $w.buttons.create -side right
+ button $w.buttons.cancel -text {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
+
+ labelframe $w.source -text {Source Branches}
+ listbox $w.source.l \
+ -height 10 \
+ -width 70 \
+ -selectmode extended \
+ -yscrollcommand [list $w.source.sby set]
+ foreach h $all_heads {
+ $w.source.l insert end $h
+ if {$h eq $current_branch} {
+ $w.source.l select set end
+ }
+ }
+ scrollbar $w.source.sby -command [list $w.source.l yview]
+ pack $w.source.sby -side right -fill y
+ pack $w.source.l -side left -fill both -expand 1
+ pack $w.source -fill both -expand 1 -pady 5 -padx 5
+
+ labelframe $w.dest -text {Destination Repository}
+ if {$all_remotes ne {}} {
+ radiobutton $w.dest.remote_r \
+ -text {Remote:} \
+ -value remote \
+ -variable push_urltype
+ 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
+ }
+ radiobutton $w.dest.url_r \
+ -text {Arbitrary URL:} \
+ -value url \
+ -variable push_urltype
+ entry $w.dest.url_t \
+ -borderwidth 1 \
+ -relief sunken \
+ -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
+
+ labelframe $w.options -text {Transfer Options}
+ checkbutton $w.options.thin \
+ -text {Use thin pack (for slow network connections)} \
+ -variable push_thin
+ grid $w.options.thin -columnspan 2 -sticky w
+ checkbutton $w.options.tags \
+ -text {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_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 "[appname] ([reponame]): Push"
+ tkwait window $w
+}