summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xgit-gui204
1 files changed, 158 insertions, 46 deletions
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 <Visibility> "grab $w; focus $w"
+ bind $w <Key-Escape> "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] \