about summary refs log tree commit diff
path: root/git-gui/lib/transport.tcl
diff options
context:
space:
mode:
Diffstat (limited to 'git-gui/lib/transport.tcl')
-rw-r--r--git-gui/lib/transport.tcl232
1 files changed, 232 insertions, 0 deletions
diff --git a/git-gui/lib/transport.tcl b/git-gui/lib/transport.tcl
new file mode 100644
index 000000000000..a1a424aab540
--- /dev/null
+++ b/git-gui/lib/transport.tcl
@@ -0,0 +1,232 @@
+# 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
+}