diff --git a/git-gui b/git-gui index 29877e4150..520ec1efff 100755 --- a/git-gui +++ b/git-gui @@ -14,49 +14,90 @@ set gitdir {} ## ## config -proc load_repo_config {} { - global repo_config - global cfg_trust_mtime +set default_config(gui.trustmtime) false +proc is_many_config {name} { + switch -glob -- $name { + remote.*.fetch - + remote.*.push + {return 1} + * + {return 0} + } +} + +proc load_config {} { + global repo_config global_config default_config + + array unset global_config array unset repo_config + catch { + set fd_rc [open "| git repo-config --global --list" r] + while {[gets $fd_rc line] >= 0} { + if {[regexp {^([^=]+)=(.*)$} $line line name value]} { + if {[is_many_config $name]} { + lappend global_config($name) $value + } else { + set global_config($name) $value + } + } + } + close $fd_rc + } catch { set fd_rc [open "| git repo-config --list" r] while {[gets $fd_rc line] >= 0} { if {[regexp {^([^=]+)=(.*)$} $line line name value]} { - lappend repo_config($name) $value + if {[is_many_config $name]} { + lappend repo_config($name) $value + } else { + set repo_config($name) $value + } } } close $fd_rc } - if {[catch {set cfg_trust_mtime \ - [lindex $repo_config(gui.trustmtime) 0] - }]} { - set cfg_trust_mtime false + foreach name [array names default_config] { + if {[catch {set v $global_config($name)}]} { + set global_config($name) $default_config($name) + } + if {[catch {set v $repo_config($name)}]} { + set repo_config($name) $default_config($name) + } } } -proc save_my_config {} { - global repo_config - global cfg_trust_mtime +proc save_config {} { + global repo_config global_config default_config + global repo_config_new global_config_new - if {[catch {set rc_trustMTime $repo_config(gui.trustmtime)}]} { - set rc_trustMTime [list false] - } - if {$cfg_trust_mtime != [lindex $rc_trustMTime 0]} { - exec git repo-config gui.trustMTime $cfg_trust_mtime - set repo_config(gui.trustmtime) [list $cfg_trust_mtime] + foreach name [array names global_config_new] { + set value $global_config_new($name) + if {$value != $global_config($name)} { + if {$value == $default_config($name)} { + catch {exec git repo-config --global --unset $name} + } else { + catch {exec git repo-config --global $name $value} + } + set global_config($name) $value + if {$value == $repo_config($name)} { + catch {exec git repo-config --unset $name} + set repo_config($name) $value + } + } } - set cfg_geometry [wm geometry .] - append cfg_geometry " [lindex [.vpane sash coord 0] 1]" - append cfg_geometry " [lindex [.vpane.files sash coord 0] 0]" - if {[catch {set rc_geometry $repo_config(gui.geometry)}]} { - set rc_geometry [list [list]] - } - if {$cfg_geometry != [lindex $rc_geometry 0]} { - exec git repo-config gui.geometry $cfg_geometry - set repo_config(gui.geometry) [list $cfg_geometry] + foreach name [array names repo_config_new] { + set value $repo_config_new($name) + if {$value != $repo_config($name)} { + if {$value == $global_config($name)} { + catch {exec git repo-config --unset $name} + } else { + catch {exec git repo-config $name $value} + } + set repo_config($name) $value + } } } @@ -117,7 +158,7 @@ if {$appname == {git-citool}} { set single_commit 1 } -load_repo_config +load_config ###################################################################### ## @@ -183,7 +224,7 @@ proc update_status {{final Ready.}} { global HEAD PARENT commit_type global ui_index ui_other ui_status_value ui_comm global status_active file_states - global cfg_trust_mtime + global repo_config if {$status_active || ![lock_index read]} return @@ -209,7 +250,7 @@ proc update_status {{final Ready.}} { $ui_comm edit reset } - if {$cfg_trust_mtime == {true}} { + if {$repo_config(gui.trustmtime) == {true}} { update_status_stage2 {} $final } else { set status_active 1 @@ -409,7 +450,7 @@ proc handle_empty_diff {} { The modification date of this file was updated by another application and you currently have the Trust File Modification -Timestamps feature enabled, so Git did not automatically detect +Timestamps option enabled, so Git did not automatically detect that there are no content differences in this file. This file will now be removed from the modified files list, to @@ -502,7 +543,7 @@ proc show_diff {path {w {}} {lno {}}} { proc read_diff {fd} { global ui_diff ui_status_value diff_3way diff_active - global cfg_trust_mtime + global repo_config while {[gets $fd line] >= 0} { if {[string match {diff --git *} $line]} continue @@ -550,7 +591,8 @@ proc read_diff {fd} { unlock_index set ui_status_value {Ready.} - if {$cfg_trust_mtime && [$ui_diff index end] == {2.0}} { + if {$repo_config(gui.trustmtime) == {true} + && [$ui_diff index end] == {2.0}} { handle_empty_diff } } @@ -1314,7 +1356,6 @@ proc hook_failed_popup {hook msg} { set w .hookfail toplevel $w - wm transient $w . frame $w.m label $w.m.l1 -text "$hook hook failed:" \ @@ -1535,11 +1576,13 @@ proc do_repack {} { set is_quitting 0 proc do_quit {} { - global gitdir ui_comm is_quitting + global gitdir ui_comm is_quitting repo_config if {$is_quitting} return set is_quitting 1 + # -- Stash our current commit buffer. + # set save [file join $gitdir GITGUI_MSG] set msg [string trim [$ui_comm get 0.0 end]] if {[$ui_comm edit modified] && $msg != {}} { @@ -1552,7 +1595,19 @@ proc do_quit {} { file delete $save } - save_my_config + # -- Stash our current window geometry into this repository. + # + set cfg_geometry [list] + lappend cfg_geometry [wm geometry .] + lappend cfg_geometry [lindex [.vpane sash coord 0] 1] + lappend cfg_geometry [lindex [.vpane.files sash coord 0] 0] + if {[catch {set rc_geometry $repo_config(gui.geometry)}]} { + set rc_geometry {} + } + if {$cfg_geometry != $rc_geometry} { + catch {exec git repo-config gui.geometry $cfg_geometry} + } + destroy . } @@ -1624,6 +1679,69 @@ proc do_commit {} { commit_tree } +proc do_options {} { + global appname gitdir + global repo_config global_config + global repo_config_new global_config_new + + load_config + array unset repo_config_new + array unset global_config_new + foreach name [array names repo_config] { + set repo_config_new($name) $repo_config($name) + } + foreach name [array names global_config] { + set global_config_new($name) $global_config($name) + } + + set w .options_editor + toplevel $w + + label $w.header -text "$appname Options" \ + -font font_uibold + pack $w.header -side top -fill x + + frame $w.buttons + button $w.buttons.save -text Save \ + -font font_ui \ + -command "save_config; destroy $w" + pack $w.buttons.save -side right + button $w.buttons.cancel -text {Cancel} \ + -font font_ui \ + -command "destroy $w" + pack $w.buttons.cancel -side right + pack $w.buttons -side bottom -anchor e -pady 10 -padx 10 + + labelframe $w.repo -text {This Repository} \ + -relief raised -borderwidth 2 + labelframe $w.global -text {Global (All Repositories)} \ + -relief raised -borderwidth 2 + pack $w.repo -side left -fill both -expand 1 -pady 5 -padx 5 + pack $w.global -side right -fill both -expand 1 -pady 5 -padx 5 + + foreach option { + {trustmtime {Trust File Modification Timestamps}} + } { + set name [lindex $option 0] + set text [lindex $option 1] + foreach f {repo global} { + checkbutton $w.$f.$name -text $text \ + -variable ${f}_config_new(gui.$name) \ + -onvalue true \ + -offvalue false \ + -font font_ui + pack $w.$f.$name -side top -anchor w + } + } + + bind $w "grab $w; focus $w" + bind $w "destroy $w" + wm title $w "$appname ([lindex [file split \ + [file normalize [file dirname $gitdir]]] \ + end]): Options" + tkwait window $w +} + # shift == 1: left click # 3: right click proc click {w x y shift wx wy} { @@ -1690,7 +1808,6 @@ menu .mbar -tearoff 0 .mbar add cascade -label Fetch -menu .mbar.fetch .mbar add cascade -label Pull -menu .mbar.pull .mbar add cascade -label Push -menu .mbar.push -.mbar add cascade -label Options -menu .mbar.options . configure -menu .mbar # -- Project Menu @@ -1739,6 +1856,10 @@ menu .mbar.edit -command {catch {[focus] tag add sel 0.0 end}} \ -accelerator $M1T-A \ -font font_ui +.mbar.edit add separator +.mbar.edit add command -label {Options...} \ + -command do_options \ + -font font_ui # -- Commit Menu menu .mbar.commit @@ -1779,15 +1900,6 @@ menu .mbar.pull # -- Push Menu menu .mbar.push -# -- Options Menu -menu .mbar.options -.mbar.options add checkbutton \ - -label {Trust File Modification Timestamps} \ - -font font_ui \ - -offvalue false \ - -onvalue true \ - -variable cfg_trust_mtime - # -- Main Window Layout panedwindow .vpane -orient vertical panedwindow .vpane.files -orient horizontal @@ -2032,7 +2144,7 @@ pack .status -anchor w -side bottom -fill x # -- Load geometry catch { -set gm [lindex $repo_config(gui.geometry) 0] +set gm $repo_config(gui.geometry) wm geometry . [lindex $gm 0] .vpane sash place 0 \ [lindex [.vpane sash coord 0] 0] \