about summary refs log tree commit diff
path: root/third_party/git/git-gui/git-gui.sh
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/git/git-gui/git-gui.sh')
-rwxr-xr-xthird_party/git/git-gui/git-gui.sh235
1 files changed, 53 insertions, 182 deletions
diff --git a/third_party/git/git-gui/git-gui.sh b/third_party/git/git-gui/git-gui.sh
index 4610e4ca72..6de74ce639 100755
--- a/third_party/git/git-gui/git-gui.sh
+++ b/third_party/git/git-gui/git-gui.sh
@@ -30,8 +30,8 @@ along with this program; if not, see <http://www.gnu.org/licenses/>.}]
 ##
 ## Tcl/Tk sanity check
 
-if {[catch {package require Tcl 8.5} err]
- || [catch {package require Tk  8.5} err]
+if {[catch {package require Tcl 8.4} err]
+ || [catch {package require Tk  8.4} err]
 } {
 	catch {wm withdraw .}
 	tk_messageBox \
@@ -684,7 +684,6 @@ proc load_current_branch {} {
 	global current_branch is_detached
 
 	set fd [open [gitdir HEAD] r]
-	fconfigure $fd -translation binary -encoding utf-8
 	if {[gets $fd ref] < 1} {
 		set ref {}
 	}
@@ -1341,7 +1340,6 @@ set HEAD {}
 set PARENT {}
 set MERGE_HEAD [list]
 set commit_type {}
-set commit_type_is_amend 0
 set empty_tree {}
 set current_branch {}
 set is_detached 0
@@ -1349,9 +1347,8 @@ set current_diff_path {}
 set is_3way_diff 0
 set is_submodule_diff 0
 set is_conflict_diff 0
+set selected_commit_type new
 set diff_empty_count 0
-set last_revert {}
-set last_revert_enc {}
 
 set nullid "0000000000000000000000000000000000000000"
 set nullid2 "0000000000000000000000000000000000000001"
@@ -1437,7 +1434,7 @@ proc PARENT {} {
 }
 
 proc force_amend {} {
-	global commit_type_is_amend
+	global selected_commit_type
 	global HEAD PARENT MERGE_HEAD commit_type
 
 	repository_state newType newHEAD newMERGE_HEAD
@@ -1446,7 +1443,7 @@ proc force_amend {} {
 	set MERGE_HEAD $newMERGE_HEAD
 	set commit_type $newType
 
-	set commit_type_is_amend 1
+	set selected_commit_type amend
 	do_select_commit_type
 }
 
@@ -1798,10 +1795,10 @@ proc ui_status {msg} {
 	}
 }
 
-proc ui_ready {} {
+proc ui_ready {{test {}}} {
 	global main_status
 	if {[info exists main_status]} {
-		$main_status show [mc "Ready."]
+		$main_status show [mc "Ready."] $test
 	}
 }
 
@@ -2151,6 +2148,8 @@ proc incr_font_size {font {amt 1}} {
 ##
 ## ui commands
 
+set starting_gitk_msg [mc "Starting gitk... please wait..."]
+
 proc do_gitk {revs {is_submodule false}} {
 	global current_diff_path file_states current_diff_side ui_index
 	global _gitdir _gitworktree
@@ -2205,12 +2204,9 @@ proc do_gitk {revs {is_submodule false}} {
 		set env(GIT_WORK_TREE) $_gitworktree
 		cd $pwd
 
-		if {[info exists main_status]} {
-			set status_operation [$::main_status \
-				start \
-				[mc "Starting %s... please wait..." "gitk"]]
-
-			after 3500 [list $status_operation stop]
+		ui_status $::starting_gitk_msg
+		after 10000 {
+			ui_ready $starting_gitk_msg
 		}
 	}
 }
@@ -2242,16 +2238,16 @@ proc do_git_gui {} {
 		set env(GIT_WORK_TREE) $_gitworktree
 		cd $pwd
 
-		set status_operation [$::main_status \
-			start \
-			[mc "Starting %s... please wait..." "git-gui"]]
-
-		after 3500 [list $status_operation stop]
+		ui_status $::starting_gitk_msg
+		after 10000 {
+			ui_ready $starting_gitk_msg
+		}
 	}
 }
 
-# Get the system-specific explorer app/command.
-proc get_explorer {} {
+proc do_explore {} {
+	global _gitworktree
+	set explorer {}
 	if {[is_Cygwin] || [is_Windows]} {
 		set explorer "explorer.exe"
 	} elseif {[is_MacOSX]} {
@@ -2260,23 +2256,9 @@ proc get_explorer {} {
 		# freedesktop.org-conforming system is our best shot
 		set explorer "xdg-open"
 	}
-	return $explorer
-}
-
-proc do_explore {} {
-	global _gitworktree
-	set explorer [get_explorer]
 	eval exec $explorer [list [file nativename $_gitworktree]] &
 }
 
-# Open file relative to the working tree by the default associated app.
-proc do_file_open {file} {
-	global _gitworktree
-	set explorer [get_explorer]
-	set full_file_path [file join $_gitworktree $file]
-	exec $explorer [file nativename $full_file_path] &
-}
-
 set is_quitting 0
 set ret_code    1
 
@@ -2512,7 +2494,7 @@ proc force_first_diff {after} {
 
 proc toggle_or_diff {mode w args} {
 	global file_states file_lists current_diff_path ui_index ui_workdir
-	global last_clicked selected_paths file_lists_last_clicked
+	global last_clicked selected_paths
 
 	if {$mode eq "click"} {
 		foreach {x y} $args break
@@ -2569,8 +2551,6 @@ proc toggle_or_diff {mode w args} {
 	$ui_index tag remove in_sel 0.0 end
 	$ui_workdir tag remove in_sel 0.0 end
 
-	set file_lists_last_clicked($w) $path
-
 	# Determine the state of the file
 	if {[info exists file_states($path)]} {
 		set state [lindex $file_states($path) 0]
@@ -2684,32 +2664,6 @@ proc show_less_context {} {
 	}
 }
 
-proc focus_widget {widget} {
-	global file_lists last_clicked selected_paths
-	global file_lists_last_clicked
-
-	if {[llength $file_lists($widget)] > 0} {
-		set path $file_lists_last_clicked($widget)
-		set index [lsearch -sorted -exact $file_lists($widget) $path]
-		if {$index < 0} {
-			set index 0
-			set path [lindex $file_lists($widget) $index]
-		}
-
-		focus $widget
-		set last_clicked [list $widget [expr $index + 1]]
-		array unset selected_paths
-		set selected_paths($path) 1
-		show_diff $path $widget
-	}
-}
-
-proc toggle_commit_type {} {
-	global commit_type_is_amend
-	set commit_type_is_amend [expr !$commit_type_is_amend]
-	do_select_commit_type
-}
-
 ######################################################################
 ##
 ## ui construction
@@ -2752,18 +2706,10 @@ if {![is_bare]} {
 }
 
 if {[is_Windows]} {
-	# Use /git-bash.exe if available
-	set normalized [file normalize $::argv0]
-	regsub "/mingw../libexec/git-core/git-gui$" \
-		$normalized "/git-bash.exe" cmdLine
-	if {$cmdLine != $normalized && [file exists $cmdLine]} {
-		set cmdLine [list "Git Bash" $cmdLine &]
-	} else {
-		set cmdLine [list "Git Bash" bash --login -l &]
-	}
 	.mbar.repository add command \
 		-label [mc "Git Bash"] \
-		-command {eval exec [auto_execok start] $cmdLine}
+		-command {eval exec [auto_execok start] \
+					  [list "Git Bash" bash --login -l &]}
 }
 
 if {[is_Windows] || ![is_bare]} {
@@ -2906,11 +2852,19 @@ if {[is_enabled multicommit] || [is_enabled singlecommit]} {
 	menu .mbar.commit
 
 	if {![is_enabled nocommit]} {
-		.mbar.commit add checkbutton \
+		.mbar.commit add radiobutton \
+			-label [mc "New Commit"] \
+			-command do_select_commit_type \
+			-variable selected_commit_type \
+			-value new
+		lappend disable_on_lock \
+			[list .mbar.commit entryconf [.mbar.commit index last] -state]
+
+		.mbar.commit add radiobutton \
 			-label [mc "Amend Last Commit"] \
-			-accelerator $M1T-E \
-			-variable commit_type_is_amend \
-			-command do_select_commit_type
+			-command do_select_commit_type \
+			-variable selected_commit_type \
+			-value amend
 		lappend disable_on_lock \
 			[list .mbar.commit entryconf [.mbar.commit index last] -state]
 
@@ -3076,23 +3030,8 @@ unset doc_path doc_url
 wm protocol . WM_DELETE_WINDOW do_quit
 bind all <$M1B-Key-q> do_quit
 bind all <$M1B-Key-Q> do_quit
-
-set m1b_w_script {
-	set toplvl_win [winfo toplevel %W]
-
-	# If we are destroying the main window, we should call do_quit to take
-	# care of cleanup before exiting the program.
-	if {$toplvl_win eq "."} {
-		do_quit
-	} else {
-		destroy $toplvl_win
-	}
-}
-
-bind all <$M1B-Key-w> $m1b_w_script
-bind all <$M1B-Key-W> $m1b_w_script
-
-unset m1b_w_script
+bind all <$M1B-Key-w> {destroy [winfo toplevel %W]}
+bind all <$M1B-Key-W> {destroy [winfo toplevel %W]}
 
 set subcommand_args {}
 proc usage {} {
@@ -3398,10 +3337,18 @@ set ui_comm .vpane.lower.commarea.buffer.frame.t
 set ui_coml .vpane.lower.commarea.buffer.header.l
 
 if {![is_enabled nocommit]} {
-	${NS}::checkbutton .vpane.lower.commarea.buffer.header.amend \
+	${NS}::radiobutton .vpane.lower.commarea.buffer.header.new \
+		-text [mc "New Commit"] \
+		-command do_select_commit_type \
+		-variable selected_commit_type \
+		-value new
+	lappend disable_on_lock \
+		[list .vpane.lower.commarea.buffer.header.new conf -state]
+	${NS}::radiobutton .vpane.lower.commarea.buffer.header.amend \
 		-text [mc "Amend Last Commit"] \
-		-variable commit_type_is_amend \
-		-command do_select_commit_type
+		-command do_select_commit_type \
+		-variable selected_commit_type \
+		-value amend
 	lappend disable_on_lock \
 		[list .vpane.lower.commarea.buffer.header.amend conf -state]
 }
@@ -3426,6 +3373,7 @@ pack $ui_coml -side left -fill x
 
 if {![is_enabled nocommit]} {
 	pack .vpane.lower.commarea.buffer.header.amend -side right
+	pack .vpane.lower.commarea.buffer.header.new -side right
 }
 
 textframe .vpane.lower.commarea.buffer.frame
@@ -3439,16 +3387,10 @@ ttext $ui_comm -background white -foreground black \
 	-relief sunken \
 	-width $repo_config(gui.commitmsgwidth) -height 9 -wrap none \
 	-font font_diff \
-	-xscrollcommand {.vpane.lower.commarea.buffer.frame.sbx set} \
 	-yscrollcommand {.vpane.lower.commarea.buffer.frame.sby set}
-${NS}::scrollbar .vpane.lower.commarea.buffer.frame.sbx \
-	-orient horizontal \
-	-command [list $ui_comm xview]
 ${NS}::scrollbar .vpane.lower.commarea.buffer.frame.sby \
-	-orient vertical \
 	-command [list $ui_comm yview]
 
-pack .vpane.lower.commarea.buffer.frame.sbx -side bottom -fill x
 pack .vpane.lower.commarea.buffer.frame.sby -side right -fill y
 pack $ui_comm -side left -fill y
 pack .vpane.lower.commarea.buffer.header -side top -fill x
@@ -3528,11 +3470,9 @@ tlabel .vpane.lower.diff.header.file \
 	-justify left
 tlabel .vpane.lower.diff.header.path \
 	-background gold \
-	-foreground blue \
+	-foreground black \
 	-anchor w \
-	-justify left \
-	-font [eval font create [font configure font_ui] -underline 1] \
-	-cursor hand2
+	-justify left
 pack .vpane.lower.diff.header.status -side left
 pack .vpane.lower.diff.header.file -side left
 pack .vpane.lower.diff.header.path -fill x
@@ -3547,12 +3487,8 @@ $ctxm add command \
 			-type STRING \
 			-- $current_diff_path
 	}
-$ctxm add command \
-	-label [mc Open] \
-	-command {do_file_open $current_diff_path}
 lappend diff_actions [list $ctxm entryconf [$ctxm index last] -state]
 bind_button3 .vpane.lower.diff.header.path "tk_popup $ctxm %X %Y"
-bind .vpane.lower.diff.header.path <Button-1> {do_file_open $current_diff_path}
 
 # -- Diff Body
 #
@@ -3611,9 +3547,6 @@ $ui_diff tag conf d_s- \
 $ui_diff tag conf d< \
 	-foreground orange \
 	-font font_diffbold
-$ui_diff tag conf d| \
-	-foreground orange \
-	-font font_diffbold
 $ui_diff tag conf d= \
 	-foreground orange \
 	-font font_diffbold
@@ -3673,32 +3606,16 @@ set ctxm .vpane.lower.diff.body.ctxm
 menu $ctxm -tearoff 0
 $ctxm add command \
 	-label [mc "Apply/Reverse Hunk"] \
-	-command {apply_or_revert_hunk $cursorX $cursorY 0}
+	-command {apply_hunk $cursorX $cursorY}
 set ui_diff_applyhunk [$ctxm index last]
 lappend diff_actions [list $ctxm entryconf $ui_diff_applyhunk -state]
 $ctxm add command \
 	-label [mc "Apply/Reverse Line"] \
-	-command {apply_or_revert_range_or_line $cursorX $cursorY 0; do_rescan}
+	-command {apply_range_or_line $cursorX $cursorY; do_rescan}
 set ui_diff_applyline [$ctxm index last]
 lappend diff_actions [list $ctxm entryconf $ui_diff_applyline -state]
 $ctxm add separator
 $ctxm add command \
-	-label [mc "Revert Hunk"] \
-	-command {apply_or_revert_hunk $cursorX $cursorY 1}
-set ui_diff_reverthunk [$ctxm index last]
-lappend diff_actions [list $ctxm entryconf $ui_diff_reverthunk -state]
-$ctxm add command \
-	-label [mc "Revert Line"] \
-	-command {apply_or_revert_range_or_line $cursorX $cursorY 1; do_rescan}
-set ui_diff_revertline [$ctxm index last]
-lappend diff_actions [list $ctxm entryconf $ui_diff_revertline -state]
-$ctxm add command \
-	-label [mc "Undo Last Revert"] \
-	-command {undo_last_revert; do_rescan}
-set ui_diff_undorevert [$ctxm index last]
-lappend diff_actions [list $ctxm entryconf $ui_diff_undorevert -state]
-$ctxm add separator
-$ctxm add command \
 	-label [mc "Show Less Context"] \
 	-command show_less_context
 lappend diff_actions [list $ctxm entryconf [$ctxm index last] -state]
@@ -3776,7 +3693,7 @@ proc has_textconv {path} {
 }
 
 proc popup_diff_menu {ctxm ctxmmg ctxmsm x y X Y} {
-	global current_diff_path file_states last_revert
+	global current_diff_path file_states
 	set ::cursorX $x
 	set ::cursorY $y
 	if {[info exists file_states($current_diff_path)]} {
@@ -3790,28 +3707,19 @@ proc popup_diff_menu {ctxm ctxmmg ctxmsm x y X Y} {
 		tk_popup $ctxmsm $X $Y
 	} else {
 		set has_range [expr {[$::ui_diff tag nextrange sel 0.0] != {}}]
-		set u [mc "Undo Last Revert"]
 		if {$::ui_index eq $::current_diff_side} {
 			set l [mc "Unstage Hunk From Commit"]
-			set h [mc "Revert Hunk"]
-
 			if {$has_range} {
 				set t [mc "Unstage Lines From Commit"]
-				set r [mc "Revert Lines"]
 			} else {
 				set t [mc "Unstage Line From Commit"]
-				set r [mc "Revert Line"]
 			}
 		} else {
 			set l [mc "Stage Hunk For Commit"]
-			set h [mc "Revert Hunk"]
-
 			if {$has_range} {
 				set t [mc "Stage Lines For Commit"]
-				set r [mc "Revert Lines"]
 			} else {
 				set t [mc "Stage Line For Commit"]
-				set r [mc "Revert Line"]
 			}
 		}
 		if {$::is_3way_diff
@@ -3822,35 +3730,11 @@ proc popup_diff_menu {ctxm ctxmmg ctxmsm x y X Y} {
 			|| [string match {T?} $state]
 			|| [has_textconv $current_diff_path]} {
 			set s disabled
-			set revert_state disabled
 		} else {
 			set s normal
-
-			# Only allow reverting changes in the working tree. If
-			# the user wants to revert changes in the index, they
-			# need to unstage those first.
-			if {$::ui_workdir eq $::current_diff_side} {
-				set revert_state normal
-			} else {
-				set revert_state disabled
-			}
 		}
-
-		if {$last_revert eq {}} {
-			set undo_state disabled
-		} else {
-			set undo_state normal
-		}
-
 		$ctxm entryconf $::ui_diff_applyhunk -state $s -label $l
 		$ctxm entryconf $::ui_diff_applyline -state $s -label $t
-		$ctxm entryconf $::ui_diff_revertline -state $revert_state \
-			-label $r
-		$ctxm entryconf $::ui_diff_reverthunk -state $revert_state \
-			-label $h
-		$ctxm entryconf $::ui_diff_undorevert -state $undo_state \
-			-label $u
-
 		tk_popup $ctxm $X $Y
 	}
 }
@@ -3977,8 +3861,6 @@ bind .   <$M1B-Key-j> do_revert_selection
 bind .   <$M1B-Key-J> do_revert_selection
 bind .   <$M1B-Key-i> do_add_all
 bind .   <$M1B-Key-I> do_add_all
-bind .   <$M1B-Key-e> toggle_commit_type
-bind .   <$M1B-Key-E> toggle_commit_type
 bind .   <$M1B-Key-minus> {show_less_context;break}
 bind .   <$M1B-Key-KP_Subtract> {show_less_context;break}
 bind .   <$M1B-Key-equal> {show_more_context;break}
@@ -3995,14 +3877,6 @@ foreach i [list $ui_index $ui_workdir] {
 }
 unset i
 
-bind .   <Alt-Key-1> {focus_widget $::ui_workdir}
-bind .   <Alt-Key-2> {focus_widget $::ui_index}
-bind .   <Alt-Key-3> {focus $::ui_diff}
-bind .   <Alt-Key-4> {focus $::ui_comm}
-
-set file_lists_last_clicked($ui_index) {}
-set file_lists_last_clicked($ui_workdir) {}
-
 set file_lists($ui_index) [list]
 set file_lists($ui_workdir) [list]
 
@@ -4181,9 +4055,6 @@ if {$picked && [is_config_true gui.autoexplore]} {
 	do_explore
 }
 
-# Clear "Initializing..." status
-after 500 {$main_status show ""}
-
 # Local variables:
 # mode: tcl
 # indent-tabs-mode: t