Merge branch 'pt/git-gui' into maint

* pt/git-gui:
  git-gui: fix size and position of window panes on startup
  git-gui: mc cannot be used before msgcat has been loaded
  git-gui: use textconv filter for diff and blame
  git-gui: Avoid using the <<Copy>> binding as a menu accelerator on win32
  git-gui: fix shortcut creation on cygwin
  git-gui: fix PATH environment for mingw development environment
  git-gui: fix usage of _gitworktree when creating shortcut for windows
  git-gui: fix "Explore Working Copy" for Windows again
  git-gui: fix usage of themed widgets variable
  git-gui: Handle failure of core.worktree to identify the working directory.
  git-gui: check whether systems nice command works or disable it
This commit is contained in:
Junio C Hamano 2010-08-03 15:16:38 -07:00
commit e9aa24123d
9 changed files with 112 additions and 33 deletions

View file

@ -38,7 +38,7 @@ if {[catch {package require Tcl 8.4} err]
tk_messageBox \ tk_messageBox \
-icon error \ -icon error \
-type ok \ -type ok \
-title [mc "git-gui: fatal error"] \ -title "git-gui: fatal error" \
-message $err -message $err
exit 1 exit 1
} }
@ -269,6 +269,17 @@ proc is_config_true {name} {
} }
} }
proc is_config_false {name} {
global repo_config
if {[catch {set v $repo_config($name)}]} {
return 0
} elseif {$v eq {false} || $v eq {0} || $v eq {no}} {
return 1
} else {
return 0
}
}
proc get_config {name} { proc get_config {name} {
global repo_config global repo_config
if {[catch {set v $repo_config($name)}]} { if {[catch {set v $repo_config($name)}]} {
@ -323,6 +334,8 @@ proc _trace_exec {cmd} {
puts stderr $d puts stderr $d
} }
#'" fix poor old emacs font-lock mode
proc _git_cmd {name} { proc _git_cmd {name} {
global _git_cmd_path global _git_cmd_path
@ -416,6 +429,9 @@ proc _lappend_nice {cmd_var} {
if {![info exists _nice]} { if {![info exists _nice]} {
set _nice [_which nice] set _nice [_which nice]
if {[catch {exec $_nice git version}]} {
set _nice {}
}
} }
if {$_nice ne {}} { if {$_nice ne {}} {
lappend cmd $_nice lappend cmd $_nice
@ -634,6 +650,7 @@ proc rmsel_tag {text} {
return $text return $text
} }
wm withdraw .
set root_exists 0 set root_exists 0
bind . <Visibility> { bind . <Visibility> {
bind . <Visibility> {} bind . <Visibility> {}
@ -782,6 +799,7 @@ set default_config(user.email) {}
set default_config(gui.encoding) [encoding system] set default_config(gui.encoding) [encoding system]
set default_config(gui.matchtrackingbranch) false set default_config(gui.matchtrackingbranch) false
set default_config(gui.textconv) true
set default_config(gui.pruneduringfetch) false set default_config(gui.pruneduringfetch) false
set default_config(gui.trustmtime) false set default_config(gui.trustmtime) false
set default_config(gui.fastcopyblame) false set default_config(gui.fastcopyblame) false
@ -1155,6 +1173,9 @@ apply_config
# try to set work tree from environment, falling back to core.worktree # try to set work tree from environment, falling back to core.worktree
if {[catch { set _gitworktree $env(GIT_WORK_TREE) }]} { if {[catch { set _gitworktree $env(GIT_WORK_TREE) }]} {
set _gitworktree [get_config core.worktree] set _gitworktree [get_config core.worktree]
if {$_gitworktree eq ""} {
set _gitworktree [file dirname [file normalize $_gitdir]]
}
} }
if {$_prefix ne {}} { if {$_prefix ne {}} {
if {$_gitworktree eq {}} { if {$_gitworktree eq {}} {
@ -2098,7 +2119,7 @@ proc do_explore {} {
# freedesktop.org-conforming system is our best shot # freedesktop.org-conforming system is our best shot
set explorer "xdg-open" set explorer "xdg-open"
} }
eval exec $explorer $_gitworktree & eval exec $explorer [list [file nativename $_gitworktree]] &
} }
set is_quitting 0 set is_quitting 0
@ -2901,6 +2922,7 @@ blame {
set current_branch $head set current_branch $head
} }
wm deiconify .
switch -- $subcommand { switch -- $subcommand {
browser { browser {
if {$jump_spec ne {}} usage if {$jump_spec ne {}} usage
@ -3405,6 +3427,19 @@ lappend diff_actions [list $ctxmsm entryconf [$ctxmsm index last] -state]
$ctxmsm add separator $ctxmsm add separator
create_common_diff_popup $ctxmsm create_common_diff_popup $ctxmsm
proc has_textconv {path} {
if {[is_config_false gui.textconv]} {
return 0
}
set filter [gitattr $path diff set]
set textconv [get_config [join [list diff $filter textconv] .]]
if {$filter ne {set} && $textconv ne {}} {
return 1
} else {
return 0
}
}
proc popup_diff_menu {ctxm ctxmmg ctxmsm x y X Y} { proc popup_diff_menu {ctxm ctxmmg ctxmsm x y X Y} {
global current_diff_path file_states global current_diff_path file_states
set ::cursorX $x set ::cursorX $x
@ -3440,7 +3475,8 @@ proc popup_diff_menu {ctxm ctxmmg ctxmsm x y X Y} {
|| {__} eq $state || {__} eq $state
|| {_O} eq $state || {_O} eq $state
|| {_T} eq $state || {_T} eq $state
|| {T_} eq $state} { || {T_} eq $state
|| [has_textconv $current_diff_path]} {
set s disabled set s disabled
} else { } else {
set s normal set s normal
@ -3460,29 +3496,44 @@ $main_status show [mc "Initializing..."]
# -- Load geometry # -- Load geometry
# #
catch { proc on_ttk_pane_mapped {w pane pos} {
set gm $repo_config(gui.geometry) bind $w <Map> {}
wm geometry . [lindex $gm 0] after 0 [list after idle [list $w sashpos $pane $pos]]
if {$use_ttk} {
.vpane sashpos 0 [lindex $gm 1]
.vpane.files sashpos 0 [lindex $gm 2]
} else {
.vpane sash place 0 \
[lindex $gm 1] \
[lindex [.vpane sash coord 0] 1]
.vpane.files sash place 0 \
[lindex [.vpane.files sash coord 0] 0] \
[lindex $gm 2]
} }
unset gm proc on_tk_pane_mapped {w pane x y} {
bind $w <Map> {}
after 0 [list after idle [list $w sash place $pane $x $y]]
}
proc on_application_mapped {} {
global repo_config use_ttk
bind . <Map> {}
set gm $repo_config(gui.geometry)
if {$use_ttk} {
bind .vpane <Map> \
[list on_ttk_pane_mapped %W 0 [lindex $gm 1]]
bind .vpane.files <Map> \
[list on_ttk_pane_mapped %W 0 [lindex $gm 2]]
} else {
bind .vpane <Map> \
[list on_tk_pane_mapped %W 0 \
[lindex $gm 1] \
[lindex [.vpane sash coord 0] 1]]
bind .vpane.files <Map> \
[list on_tk_pane_mapped %W 0 \
[lindex [.vpane.files sash coord 0] 0] \
[lindex $gm 2]]
}
wm geometry . [lindex $gm 0]
}
if {[info exists repo_config(gui.geometry)]} {
bind . <Map> [list on_application_mapped]
wm geometry . [lindex $repo_config(gui.geometry) 0]
} }
# -- Load window state # -- Load window state
# #
catch { if {[info exists repo_config(gui.wmstate)]} {
set gws $repo_config(gui.wmstate) catch {wm state . $repo_config(gui.wmstate)}
wm state . $gws
unset gws
} }
# -- Key Bindings # -- Key Bindings

View file

@ -449,11 +449,28 @@ method _load {jump} {
$status show [mc "Reading %s..." "$commit:[escape_path $path]"] $status show [mc "Reading %s..." "$commit:[escape_path $path]"]
$w_path conf -text [escape_path $path] $w_path conf -text [escape_path $path]
set do_textconv 0
if {![is_config_false gui.textconv] && [git-version >= 1.7.2]} {
set filter [gitattr $path diff set]
set textconv [get_config [join [list diff $filter textconv] .]]
if {$filter ne {set} && $textconv ne {}} {
set do_textconv 1
}
}
if {$commit eq {}} { if {$commit eq {}} {
set fd [open $path r] if {$do_textconv ne 0} {
set fd [open |[list $textconv $path] r]
} else {
set fd [open $path r]
}
fconfigure $fd -eofchar {} fconfigure $fd -eofchar {}
} else { } else {
set fd [git_read cat-file blob "$commit:$path"] if {$do_textconv ne 0} {
set fd [git_read cat-file --textconv "$commit:$path"]
} else {
set fd [git_read cat-file blob "$commit:$path"]
}
} }
fconfigure $fd \ fconfigure $fd \
-blocking 0 \ -blocking 0 \

View file

@ -100,12 +100,17 @@ constructor pick {} {
$opts insert end [mc "Clone Existing Repository"] link_clone $opts insert end [mc "Clone Existing Repository"] link_clone
$opts insert end "\n" $opts insert end "\n"
if {$m_repo ne {}} { if {$m_repo ne {}} {
if {[tk windowingsystem] eq "win32"} {
set key L
} else {
set key C
}
$m_repo add command \ $m_repo add command \
-command [cb _next clone] \ -command [cb _next clone] \
-accelerator $M1T-C \ -accelerator $M1T-$key \
-label [mc "Clone..."] -label [mc "Clone..."]
bind $top <$M1B-c> [cb _next clone] bind $top <$M1B-[string tolower $key]> [cb _next clone]
bind $top <$M1B-C> [cb _next clone] bind $top <$M1B-[string toupper $key]> [cb _next clone]
} }
$opts tag conf link_open -foreground blue -underline 1 $opts tag conf link_open -foreground blue -underline 1

View file

@ -55,7 +55,7 @@ proc handle_empty_diff {} {
set path $current_diff_path set path $current_diff_path
set s $file_states($path) set s $file_states($path)
if {[lindex $s 0] ne {_M}} return if {[lindex $s 0] ne {_M} || [has_textconv $path]} return
# Prevent infinite rescan loops # Prevent infinite rescan loops
incr diff_empty_count incr diff_empty_count
@ -280,6 +280,9 @@ proc start_show_diff {cont_info {add_opts {}}} {
lappend cmd diff-files lappend cmd diff-files
} }
} }
if {![is_config_false gui.textconv] && [git-version >= 1.6.1]} {
lappend cmd --textconv
}
if {[string match {160000 *} [lindex $s 2]] if {[string match {160000 *} [lindex $s 2]]
|| [string match {160000 *} [lindex $s 3]]} { || [string match {160000 *} [lindex $s 3]]} {

View file

@ -148,6 +148,7 @@ proc do_options {} {
{b gui.trustmtime {mc "Trust File Modification Timestamps"}} {b gui.trustmtime {mc "Trust File Modification Timestamps"}}
{b gui.pruneduringfetch {mc "Prune Tracking Branches During Fetch"}} {b gui.pruneduringfetch {mc "Prune Tracking Branches During Fetch"}}
{b gui.matchtrackingbranch {mc "Match Tracking Branches"}} {b gui.matchtrackingbranch {mc "Match Tracking Branches"}}
{b gui.textconv {mc "Use Textconv For Diffs and Blames"}}
{b gui.fastcopyblame {mc "Blame Copy Only On Changed Files"}} {b gui.fastcopyblame {mc "Blame Copy Only On Changed Files"}}
{i-20..200 gui.copyblamethreshold {mc "Minimum Letters To Blame Copy On"}} {i-20..200 gui.copyblamethreshold {mc "Minimum Letters To Blame Copy On"}}
{i-0..300 gui.blamehistoryctx {mc "Blame History Context Radius (days)"}} {i-0..300 gui.blamehistoryctx {mc "Blame History Context Radius (days)"}}

View file

@ -16,7 +16,7 @@ proc do_windows_shortcut {} {
[info nameofexecutable] \ [info nameofexecutable] \
[file normalize $::argv0] \ [file normalize $::argv0] \
] \ ] \
[file normalize [$_gitworktree]] [file normalize $_gitworktree]
} err]} { } err]} {
error_popup [strcat [mc "Cannot write shortcut:"] "\n\n$err"] error_popup [strcat [mc "Cannot write shortcut:"] "\n\n$err"]
} }
@ -57,7 +57,7 @@ proc do_cygwin_shortcut {} {
$sh -c \ $sh -c \
"CHERE_INVOKING=1 source /etc/profile;[sq $me] &" \ "CHERE_INVOKING=1 source /etc/profile;[sq $me] &" \
] \ ] \
[file normalize [$_gitworktree]] [file normalize $_gitworktree]
} err]} { } err]} {
error_popup [strcat [mc "Cannot write shortcut:"] "\n\n$err"] error_popup [strcat [mc "Cannot write shortcut:"] "\n\n$err"]
} }

View file

@ -39,6 +39,7 @@ method _oneline_pack {} {
} }
constructor two_line {path} { constructor two_line {path} {
global NS
set w $path set w $path
set w_l $w.l set w_l $w.l
set w_c $w.c set w_c $w.c

View file

@ -18,9 +18,9 @@ proc win32_create_lnk {lnk_path lnk_exec lnk_dir} {
eval [list exec wscript.exe \ eval [list exec wscript.exe \
/E:jscript \ /E:jscript \
/nologo \ /nologo \
[file join $oguilib win32_shortcut.js] \ [file nativename [file join $oguilib win32_shortcut.js]] \
$lnk_path \ $lnk_path \
[file join $oguilib git-gui.ico] \ [file nativename [file join $oguilib git-gui.ico]] \
$lnk_dir \ $lnk_dir \
$lnk_exec] $lnk_args $lnk_exec] $lnk_args
} }

View file

@ -13,10 +13,11 @@ if { $argc >=2 && [lindex $argv 0] == "--working-dir" } {
incr argc -2 incr argc -2
} }
set bindir [file dirname \ set basedir [file dirname \
[file dirname \ [file dirname \
[file dirname [info script]]]] [file dirname [info script]]]]
set bindir [file join $bindir bin] set bindir [file join $basedir bin]
set bindir "$bindir;[file join $basedir mingw bin]"
regsub -all ";" $bindir "\\;" bindir regsub -all ";" $bindir "\\;" bindir
set env(PATH) "$bindir;$env(PATH)" set env(PATH) "$bindir;$env(PATH)"
unset bindir unset bindir