diff options
Diffstat (limited to 'third_party/git/git-gui/git-gui.sh')
-rwxr-xr-x | third_party/git/git-gui/git-gui.sh | 235 |
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 4610e4ca72a8..6de74ce639ce 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 |