Merge branch 'master' of https://github.com/j6t/git-gui
* 'master' of https://github.com/j6t/git-gui: git-gui: sync Makefiles with git.git git-gui: fix error handling of Revert Changes command git-gui--askyesno (mingw): use Git for Windows' icon, if available git-gui--askyesno: allow overriding the window title git gui: set GIT_ASKPASS=git-gui--askpass if not set yet git-gui: provide question helper for retry fallback on Windows git-gui: simplify using nice(1) git-gui: simplify PATH de-duplicationmain
commit
ab427cd991
|
@ -186,6 +186,7 @@ install: all
|
||||||
$(QUIET)$(INSTALL_D0)'$(DESTDIR_SQ)$(gitexecdir_SQ)' $(INSTALL_D1)
|
$(QUIET)$(INSTALL_D0)'$(DESTDIR_SQ)$(gitexecdir_SQ)' $(INSTALL_D1)
|
||||||
$(QUIET)$(INSTALL_X0)git-gui $(INSTALL_X1) '$(DESTDIR_SQ)$(gitexecdir_SQ)'
|
$(QUIET)$(INSTALL_X0)git-gui $(INSTALL_X1) '$(DESTDIR_SQ)$(gitexecdir_SQ)'
|
||||||
$(QUIET)$(INSTALL_X0)git-gui--askpass $(INSTALL_X1) '$(DESTDIR_SQ)$(gitexecdir_SQ)'
|
$(QUIET)$(INSTALL_X0)git-gui--askpass $(INSTALL_X1) '$(DESTDIR_SQ)$(gitexecdir_SQ)'
|
||||||
|
$(QUIET)$(INSTALL_X0)git-gui--askyesno $(INSTALL_X1) '$(DESTDIR_SQ)$(gitexecdir_SQ)'
|
||||||
$(QUIET)$(foreach p,$(GITGUI_BUILT_INS), $(INSTALL_L0)'$(DESTDIR_SQ)$(gitexecdir_SQ)/$p' $(INSTALL_L1)'$(DESTDIR_SQ)$(gitexecdir_SQ)/git-gui' $(INSTALL_L2)'$(DESTDIR_SQ)$(gitexecdir_SQ)/$p' $(INSTALL_L3) &&) true
|
$(QUIET)$(foreach p,$(GITGUI_BUILT_INS), $(INSTALL_L0)'$(DESTDIR_SQ)$(gitexecdir_SQ)/$p' $(INSTALL_L1)'$(DESTDIR_SQ)$(gitexecdir_SQ)/git-gui' $(INSTALL_L2)'$(DESTDIR_SQ)$(gitexecdir_SQ)/$p' $(INSTALL_L3) &&) true
|
||||||
ifdef GITGUI_WINDOWS_WRAPPER
|
ifdef GITGUI_WINDOWS_WRAPPER
|
||||||
$(QUIET)$(INSTALL_R0)git-gui.tcl $(INSTALL_R1) '$(DESTDIR_SQ)$(gitexecdir_SQ)'
|
$(QUIET)$(INSTALL_R0)git-gui.tcl $(INSTALL_R1) '$(DESTDIR_SQ)$(gitexecdir_SQ)'
|
||||||
|
@ -200,6 +201,7 @@ uninstall:
|
||||||
$(QUIET)$(CLEAN_DST) '$(DESTDIR_SQ)$(gitexecdir_SQ)'
|
$(QUIET)$(CLEAN_DST) '$(DESTDIR_SQ)$(gitexecdir_SQ)'
|
||||||
$(QUIET)$(REMOVE_F0)'$(DESTDIR_SQ)$(gitexecdir_SQ)'/git-gui $(REMOVE_F1)
|
$(QUIET)$(REMOVE_F0)'$(DESTDIR_SQ)$(gitexecdir_SQ)'/git-gui $(REMOVE_F1)
|
||||||
$(QUIET)$(REMOVE_F0)'$(DESTDIR_SQ)$(gitexecdir_SQ)'/git-gui--askpass $(REMOVE_F1)
|
$(QUIET)$(REMOVE_F0)'$(DESTDIR_SQ)$(gitexecdir_SQ)'/git-gui--askpass $(REMOVE_F1)
|
||||||
|
$(QUIET)$(REMOVE_F0)'$(DESTDIR_SQ)$(gitexecdir_SQ)'/git-gui--askyesno $(REMOVE_F1)
|
||||||
$(QUIET)$(foreach p,$(GITGUI_BUILT_INS), $(REMOVE_F0)'$(DESTDIR_SQ)$(gitexecdir_SQ)'/$p $(REMOVE_F1) &&) true
|
$(QUIET)$(foreach p,$(GITGUI_BUILT_INS), $(REMOVE_F0)'$(DESTDIR_SQ)$(gitexecdir_SQ)'/$p $(REMOVE_F1) &&) true
|
||||||
ifdef GITGUI_WINDOWS_WRAPPER
|
ifdef GITGUI_WINDOWS_WRAPPER
|
||||||
$(QUIET)$(REMOVE_F0)'$(DESTDIR_SQ)$(gitexecdir_SQ)'/git-gui.tcl $(REMOVE_F1)
|
$(QUIET)$(REMOVE_F0)'$(DESTDIR_SQ)$(gitexecdir_SQ)'/git-gui.tcl $(REMOVE_F1)
|
||||||
|
|
|
@ -0,0 +1,63 @@
|
||||||
|
#!/bin/sh
|
||||||
|
# Tcl ignores the next line -*- tcl -*- \
|
||||||
|
exec wish "$0" -- "$@"
|
||||||
|
|
||||||
|
# This is an implementation of a simple yes no dialog
|
||||||
|
# which is injected into the git commandline by git gui
|
||||||
|
# in case a yesno question needs to be answered.
|
||||||
|
#
|
||||||
|
# The window title, which defaults to "Question?", can be
|
||||||
|
# overridden via the optional `--title` command-line
|
||||||
|
# option.
|
||||||
|
|
||||||
|
set NS {}
|
||||||
|
set use_ttk [package vsatisfies [package provide Tk] 8.5]
|
||||||
|
if {$use_ttk} {
|
||||||
|
set NS ttk
|
||||||
|
}
|
||||||
|
|
||||||
|
set title "Question?"
|
||||||
|
if {$argc < 1} {
|
||||||
|
puts stderr "Usage: $argv0 <question>"
|
||||||
|
exit 1
|
||||||
|
} else {
|
||||||
|
if {$argc > 2 && [lindex $argv 0] == "--title"} {
|
||||||
|
set title [lindex $argv 1]
|
||||||
|
set argv [lreplace $argv 0 1]
|
||||||
|
}
|
||||||
|
set prompt [join $argv " "]
|
||||||
|
}
|
||||||
|
|
||||||
|
${NS}::frame .t
|
||||||
|
${NS}::label .t.m -text $prompt -justify center -width 40
|
||||||
|
.t.m configure -wraplength 400
|
||||||
|
pack .t.m -side top -fill x -padx 20 -pady 20 -expand 1
|
||||||
|
pack .t -side top -fill x -ipadx 20 -ipady 20 -expand 1
|
||||||
|
|
||||||
|
${NS}::frame .b
|
||||||
|
${NS}::frame .b.left -width 200
|
||||||
|
${NS}::button .b.yes -text Yes -command {exit 0}
|
||||||
|
${NS}::button .b.no -text No -command {exit 1}
|
||||||
|
|
||||||
|
pack .b.left -side left -expand 1 -fill x
|
||||||
|
pack .b.yes -side left -expand 1
|
||||||
|
pack .b.no -side right -expand 1 -ipadx 5
|
||||||
|
pack .b -side bottom -fill x -ipadx 20 -ipady 15
|
||||||
|
|
||||||
|
bind . <Key-Return> {exit 0}
|
||||||
|
bind . <Key-Escape> {exit 1}
|
||||||
|
|
||||||
|
if {$::tcl_platform(platform) eq {windows}} {
|
||||||
|
set icopath [file dirname [file normalize $argv0]]
|
||||||
|
if {[file tail $icopath] eq {git-core}} {
|
||||||
|
set icopath [file dirname $icopath]
|
||||||
|
}
|
||||||
|
set icopath [file dirname $icopath]
|
||||||
|
set icopath [file join $icopath share git git-for-windows.ico]
|
||||||
|
if {[file exists $icopath]} {
|
||||||
|
wm iconbitmap . -default $icopath
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
wm title . $title
|
||||||
|
tk::PlaceWindow .
|
|
@ -103,7 +103,6 @@ if {[is_Windows]} {
|
||||||
set _path_sep {:}
|
set _path_sep {:}
|
||||||
}
|
}
|
||||||
|
|
||||||
set _search_path {}
|
|
||||||
set _path_seen [dict create]
|
set _path_seen [dict create]
|
||||||
foreach p [split $env(PATH) $_path_sep] {
|
foreach p [split $env(PATH) $_path_sep] {
|
||||||
# Keep only absolute paths, getting rid of ., empty, etc.
|
# Keep only absolute paths, getting rid of ., empty, etc.
|
||||||
|
@ -112,12 +111,9 @@ foreach p [split $env(PATH) $_path_sep] {
|
||||||
}
|
}
|
||||||
# Keep only the first occurence of any duplicates.
|
# Keep only the first occurence of any duplicates.
|
||||||
set norm_p [file normalize $p]
|
set norm_p [file normalize $p]
|
||||||
if {[dict exists $_path_seen $norm_p]} {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
dict set _path_seen $norm_p 1
|
dict set _path_seen $norm_p 1
|
||||||
lappend _search_path $norm_p
|
|
||||||
}
|
}
|
||||||
|
set _search_path [dict keys $_path_seen]
|
||||||
unset _path_seen
|
unset _path_seen
|
||||||
|
|
||||||
set env(PATH) [join $_search_path $_path_sep]
|
set env(PATH) [join $_search_path $_path_sep]
|
||||||
|
@ -583,21 +579,6 @@ proc open_cmd_pipe {cmd path} {
|
||||||
return [open |$run r]
|
return [open |$run r]
|
||||||
}
|
}
|
||||||
|
|
||||||
proc _lappend_nice {cmd_var} {
|
|
||||||
global _nice
|
|
||||||
upvar $cmd_var cmd
|
|
||||||
|
|
||||||
if {![info exists _nice]} {
|
|
||||||
set _nice [_which nice]
|
|
||||||
if {[catch {safe_exec [list $_nice git version]}]} {
|
|
||||||
set _nice {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if {$_nice ne {}} {
|
|
||||||
lappend cmd $_nice
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
proc git {args} {
|
proc git {args} {
|
||||||
git_redir $args {}
|
git_redir $args {}
|
||||||
}
|
}
|
||||||
|
@ -631,15 +612,14 @@ proc git_read {cmd {redir {}}} {
|
||||||
return [safe_open_command $cmdp $redir]
|
return [safe_open_command $cmdp $redir]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
set _nice [list [_which nice]]
|
||||||
|
if {[catch {safe_exec [list {*}$_nice git version]}]} {
|
||||||
|
set _nice {}
|
||||||
|
}
|
||||||
|
|
||||||
proc git_read_nice {cmd} {
|
proc git_read_nice {cmd} {
|
||||||
global _git
|
set cmdp [list {*}$::_nice $::_git {*}$cmd]
|
||||||
set opt [list]
|
return [safe_open_command $cmdp]
|
||||||
|
|
||||||
_lappend_nice opt
|
|
||||||
|
|
||||||
set cmdp [concat [list $_git] $cmd]
|
|
||||||
|
|
||||||
return [safe_open_command [concat $opt $cmdp]]
|
|
||||||
}
|
}
|
||||||
|
|
||||||
proc git_write {cmd} {
|
proc git_write {cmd} {
|
||||||
|
@ -1130,6 +1110,12 @@ set argv0dir [file dirname [file normalize $::argv0]]
|
||||||
if {![info exists env(SSH_ASKPASS)]} {
|
if {![info exists env(SSH_ASKPASS)]} {
|
||||||
set env(SSH_ASKPASS) [file join $argv0dir git-gui--askpass]
|
set env(SSH_ASKPASS) [file join $argv0dir git-gui--askpass]
|
||||||
}
|
}
|
||||||
|
if {![info exists env(GIT_ASKPASS)]} {
|
||||||
|
set env(GIT_ASKPASS) [file join $argv0dir git-gui--askpass]
|
||||||
|
}
|
||||||
|
if {![info exists env(GIT_ASK_YESNO)]} {
|
||||||
|
set env(GIT_ASK_YESNO) [file join $argv0dir git-gui--askyesno]
|
||||||
|
}
|
||||||
unset argv0dir
|
unset argv0dir
|
||||||
|
|
||||||
######################################################################
|
######################################################################
|
||||||
|
|
|
@ -425,6 +425,11 @@ proc revert_helper {txt paths} {
|
||||||
|
|
||||||
if {![lock_index begin-update]} return
|
if {![lock_index begin-update]} return
|
||||||
|
|
||||||
|
# Workaround for Tcl < 9.0: chord namespaces are not obeyed and
|
||||||
|
# operated in the global namespace. This clears an error that could
|
||||||
|
# have been left over from a previous operation.
|
||||||
|
set ::err {}
|
||||||
|
|
||||||
# Common "after" functionality that waits until multiple asynchronous
|
# Common "after" functionality that waits until multiple asynchronous
|
||||||
# operations are complete (by waiting for them to activate their notes
|
# operations are complete (by waiting for them to activate their notes
|
||||||
# on the chord).
|
# on the chord).
|
||||||
|
@ -432,7 +437,7 @@ proc revert_helper {txt paths} {
|
||||||
# The asynchronous operations are each indicated below by a comment
|
# The asynchronous operations are each indicated below by a comment
|
||||||
# before the code block that starts the async operation.
|
# before the code block that starts the async operation.
|
||||||
set after_chord [SimpleChord::new {
|
set after_chord [SimpleChord::new {
|
||||||
if {[string trim $err] != ""} {
|
if {[info exists err] && [string trim $err] ne ""} {
|
||||||
rescan_on_error $err
|
rescan_on_error $err
|
||||||
} else {
|
} else {
|
||||||
unlock_index
|
unlock_index
|
||||||
|
|
Loading…
Reference in New Issue