Spaces:
Runtime error
Runtime error
| # git-gui options editor | |
| # Copyright (C) 2006, 2007 Shawn Pearce | |
| proc config_check_encodings {} { | |
| global repo_config_new global_config_new | |
| set enc $global_config_new(gui.encoding) | |
| if {$enc eq {}} { | |
| set global_config_new(gui.encoding) [encoding system] | |
| } elseif {[tcl_encoding $enc] eq {}} { | |
| error_popup [mc "Invalid global encoding '%s'" $enc] | |
| return 0 | |
| } | |
| set enc $repo_config_new(gui.encoding) | |
| if {$enc eq {}} { | |
| set repo_config_new(gui.encoding) [encoding system] | |
| } elseif {[tcl_encoding $enc] eq {}} { | |
| error_popup [mc "Invalid repo encoding '%s'" $enc] | |
| return 0 | |
| } | |
| return 1 | |
| } | |
| proc save_config {} { | |
| global default_config font_descs | |
| global repo_config global_config system_config | |
| global repo_config_new global_config_new | |
| global ui_comm_spell | |
| foreach option $font_descs { | |
| set name [lindex $option 0] | |
| set font [lindex $option 1] | |
| font configure $font \ | |
| -family $global_config_new(gui.$font^^family) \ | |
| -size $global_config_new(gui.$font^^size) | |
| font configure ${font}bold \ | |
| -family $global_config_new(gui.$font^^family) \ | |
| -size $global_config_new(gui.$font^^size) | |
| font configure ${font}italic \ | |
| -family $global_config_new(gui.$font^^family) \ | |
| -size $global_config_new(gui.$font^^size) | |
| set global_config_new(gui.$name) [font configure $font] | |
| unset global_config_new(gui.$font^^family) | |
| unset global_config_new(gui.$font^^size) | |
| } | |
| foreach name [array names default_config] { | |
| set value $global_config_new($name) | |
| if {$value ne $global_config($name)} { | |
| if {$value eq $system_config($name)} { | |
| catch {git config --global --unset $name} | |
| } else { | |
| regsub -all "\[{}\]" $value {"} value | |
| git config --global $name $value | |
| } | |
| set global_config($name) $value | |
| if {$value eq $repo_config($name)} { | |
| catch {git config --unset $name} | |
| set repo_config($name) $value | |
| } | |
| } | |
| } | |
| foreach name [array names default_config] { | |
| set value $repo_config_new($name) | |
| if {$value ne $repo_config($name)} { | |
| if {$value eq $global_config($name)} { | |
| catch {git config --unset $name} | |
| } else { | |
| regsub -all "\[{}\]" $value {"} value | |
| git config $name $value | |
| } | |
| set repo_config($name) $value | |
| } | |
| } | |
| if {[info exists repo_config(gui.spellingdictionary)]} { | |
| set value $repo_config(gui.spellingdictionary) | |
| if {$value eq {none}} { | |
| if {[info exists ui_comm_spell]} { | |
| $ui_comm_spell stop | |
| } | |
| } elseif {[info exists ui_comm_spell]} { | |
| $ui_comm_spell lang $value | |
| } | |
| } | |
| } | |
| proc do_options {} { | |
| global repo_config global_config font_descs | |
| global repo_config_new global_config_new | |
| global ui_comm_spell use_ttk NS | |
| array unset repo_config_new | |
| array unset global_config_new | |
| foreach name [array names repo_config] { | |
| set repo_config_new($name) $repo_config($name) | |
| } | |
| load_config 1 | |
| foreach name [array names repo_config] { | |
| switch -- $name { | |
| gui.diffcontext {continue} | |
| } | |
| 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 | |
| Dialog $w | |
| wm withdraw $w | |
| wm transient $w [winfo parent $w] | |
| wm geometry $w "+[winfo rootx .]+[winfo rooty .]" | |
| ${NS}::frame $w.buttons | |
| ${NS}::button $w.buttons.restore -text [mc "Restore Defaults"] \ | |
| -default normal \ | |
| -command do_restore_defaults | |
| pack $w.buttons.restore -side left | |
| ${NS}::button $w.buttons.save -text [mc Save] \ | |
| -default active \ | |
| -command [list do_save_config $w] | |
| pack $w.buttons.save -side right | |
| ${NS}::button $w.buttons.cancel -text [mc "Cancel"] \ | |
| -default normal \ | |
| -command [list destroy $w] | |
| pack $w.buttons.cancel -side right -padx 5 | |
| pack $w.buttons -side bottom -fill x -pady 10 -padx 10 | |
| ${NS}::labelframe $w.repo -text [mc "%s Repository" [reponame]] | |
| ${NS}::labelframe $w.global -text [mc "Global (All Repositories)"] | |
| 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 | |
| set optid 0 | |
| foreach option { | |
| {t user.name {mc "User Name"}} | |
| {t user.email {mc "Email Address"}} | |
| {b merge.summary {mc "Summarize Merge Commits"}} | |
| {i-1..5 merge.verbosity {mc "Merge Verbosity"}} | |
| {b merge.diffstat {mc "Show Diffstat After Merge"}} | |
| {t merge.tool {mc "Use Merge Tool"}} | |
| {b gui.trustmtime {mc "Trust File Modification Timestamps"}} | |
| {b gui.pruneduringfetch {mc "Prune Tracking Branches During Fetch"}} | |
| {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"}} | |
| {i-0..100 gui.maxrecentrepo {mc "Maximum Length of Recent Repositories List"}} | |
| {i-20..200 gui.copyblamethreshold {mc "Minimum Letters To Blame Copy On"}} | |
| {i-0..300 gui.blamehistoryctx {mc "Blame History Context Radius (days)"}} | |
| {i-1..99 gui.diffcontext {mc "Number of Diff Context Lines"}} | |
| {t gui.diffopts {mc "Additional Diff Parameters"}} | |
| {i-0..99 gui.commitmsgwidth {mc "Commit Message Text Width"}} | |
| {t gui.newbranchtemplate {mc "New Branch Name Template"}} | |
| {c gui.encoding {mc "Default File Contents Encoding"}} | |
| {b gui.warndetachedcommit {mc "Warn before committing to a detached head"}} | |
| {s gui.stageuntracked {mc "Staging of untracked files"} {list "yes" "no" "ask"}} | |
| {b gui.displayuntracked {mc "Show untracked files"}} | |
| {i-1..99 gui.tabsize {mc "Tab spacing"}} | |
| } { | |
| set type [lindex $option 0] | |
| set name [lindex $option 1] | |
| set text [eval [lindex $option 2]] | |
| incr optid | |
| foreach f {repo global} { | |
| switch -glob -- $type { | |
| b { | |
| ${NS}::checkbutton $w.$f.$optid -text $text \ | |
| -variable ${f}_config_new($name) \ | |
| -onvalue true \ | |
| -offvalue false | |
| pack $w.$f.$optid -side top -anchor w | |
| } | |
| i-* { | |
| regexp -- {-(\d+)\.\.(\d+)$} $type _junk min max | |
| ${NS}::frame $w.$f.$optid | |
| ${NS}::label $w.$f.$optid.l -text [mc "%s:" $text] | |
| pack $w.$f.$optid.l -side left -anchor w -fill x | |
| tspinbox $w.$f.$optid.v \ | |
| -textvariable ${f}_config_new($name) \ | |
| -from $min \ | |
| -to $max \ | |
| -increment 1 \ | |
| -width [expr {1 + [string length $max]}] | |
| bind $w.$f.$optid.v <FocusIn> {%W selection range 0 end} | |
| pack $w.$f.$optid.v -side right -anchor e -padx 5 | |
| pack $w.$f.$optid -side top -anchor w -fill x | |
| } | |
| c - | |
| t { | |
| ${NS}::frame $w.$f.$optid | |
| ${NS}::label $w.$f.$optid.l -text [mc "%s:" $text] | |
| ${NS}::entry $w.$f.$optid.v \ | |
| -width 20 \ | |
| -textvariable ${f}_config_new($name) | |
| pack $w.$f.$optid.l -side left -anchor w | |
| pack $w.$f.$optid.v -side left -anchor w \ | |
| -fill x -expand 1 \ | |
| -padx 5 | |
| if {$type eq {c}} { | |
| menu $w.$f.$optid.m | |
| build_encoding_menu $w.$f.$optid.m \ | |
| [list set ${f}_config_new($name)] 1 | |
| ${NS}::button $w.$f.$optid.b \ | |
| -text [mc "Change"] \ | |
| -command [list popup_btn_menu \ | |
| $w.$f.$optid.m $w.$f.$optid.b] | |
| pack $w.$f.$optid.b -side left -anchor w | |
| } | |
| pack $w.$f.$optid -side top -anchor w -fill x | |
| } | |
| s { | |
| set opts [eval [lindex $option 3]] | |
| ${NS}::frame $w.$f.$optid | |
| ${NS}::label $w.$f.$optid.l -text [mc "%s:" $text] | |
| if {$use_ttk} { | |
| ttk::combobox $w.$f.$optid.v \ | |
| -textvariable ${f}_config_new($name) \ | |
| -values $opts -state readonly | |
| } else { | |
| eval tk_optionMenu $w.$f.$optid.v \ | |
| ${f}_config_new($name) \ | |
| $opts | |
| } | |
| pack $w.$f.$optid.l -side left -anchor w -fill x | |
| pack $w.$f.$optid.v -side right -anchor e -padx 5 | |
| pack $w.$f.$optid -side top -anchor w -fill x | |
| } | |
| } | |
| } | |
| } | |
| set all_dicts [linsert \ | |
| [spellcheck::available_langs] \ | |
| 0 \ | |
| none] | |
| incr optid | |
| foreach f {repo global} { | |
| if {![info exists ${f}_config_new(gui.spellingdictionary)]} { | |
| if {[info exists ui_comm_spell]} { | |
| set value [$ui_comm_spell lang] | |
| } else { | |
| set value none | |
| } | |
| set ${f}_config_new(gui.spellingdictionary) $value | |
| } | |
| ${NS}::frame $w.$f.$optid | |
| ${NS}::label $w.$f.$optid.l -text [mc "Spelling Dictionary:"] | |
| if {$use_ttk} { | |
| ttk::combobox $w.$f.$optid.v \ | |
| -textvariable ${f}_config_new(gui.spellingdictionary) \ | |
| -values $all_dicts -state readonly | |
| } else { | |
| eval tk_optionMenu $w.$f.$optid.v \ | |
| ${f}_config_new(gui.spellingdictionary) \ | |
| $all_dicts | |
| } | |
| pack $w.$f.$optid.l -side left -anchor w -fill x | |
| pack $w.$f.$optid.v -side right -anchor e -padx 5 | |
| pack $w.$f.$optid -side top -anchor w -fill x | |
| } | |
| unset all_dicts | |
| set all_fonts [lsort [font families]] | |
| foreach option $font_descs { | |
| set name [lindex $option 0] | |
| set font [lindex $option 1] | |
| set text [eval [lindex $option 2]] | |
| set global_config_new(gui.$font^^family) \ | |
| [font configure $font -family] | |
| set global_config_new(gui.$font^^size) \ | |
| [font configure $font -size] | |
| ${NS}::frame $w.global.$name | |
| ${NS}::label $w.global.$name.l -text [mc "%s:" $text] | |
| ${NS}::button $w.global.$name.b \ | |
| -text [mc "Change Font"] \ | |
| -command [list \ | |
| tchoosefont \ | |
| $w \ | |
| [mc "Choose %s" $text] \ | |
| global_config_new(gui.$font^^family) \ | |
| global_config_new(gui.$font^^size) \ | |
| ] | |
| ${NS}::label $w.global.$name.f -textvariable global_config_new(gui.$font^^family) | |
| ${NS}::label $w.global.$name.s -textvariable global_config_new(gui.$font^^size) | |
| ${NS}::label $w.global.$name.pt -text [mc "pt."] | |
| pack $w.global.$name.l -side left -anchor w | |
| pack $w.global.$name.b -side right -anchor e | |
| pack $w.global.$name.pt -side right -anchor w | |
| pack $w.global.$name.s -side right -anchor w | |
| pack $w.global.$name.f -side right -anchor w | |
| pack $w.global.$name -side top -anchor w -fill x | |
| } | |
| bind $w <Visibility> "grab $w; focus $w.buttons.save" | |
| bind $w <Key-Escape> "destroy $w" | |
| bind $w <Key-Return> [list do_save_config $w] | |
| if {[is_MacOSX]} { | |
| set t [mc "Preferences"] | |
| } else { | |
| set t [mc "Options"] | |
| } | |
| wm title $w "[appname] ([reponame]): $t" | |
| wm deiconify $w | |
| tkwait window $w | |
| } | |
| proc do_restore_defaults {} { | |
| global font_descs default_config repo_config system_config | |
| global repo_config_new global_config_new | |
| foreach name [array names default_config] { | |
| set repo_config_new($name) $system_config($name) | |
| set global_config_new($name) $system_config($name) | |
| } | |
| foreach option $font_descs { | |
| set name [lindex $option 0] | |
| set repo_config(gui.$name) $system_config(gui.$name) | |
| } | |
| apply_config | |
| foreach option $font_descs { | |
| set name [lindex $option 0] | |
| set font [lindex $option 1] | |
| set global_config_new(gui.$font^^family) \ | |
| [font configure $font -family] | |
| set global_config_new(gui.$font^^size) \ | |
| [font configure $font -size] | |
| } | |
| } | |
| proc do_save_config {w} { | |
| if {![config_check_encodings]} return | |
| if {[catch {save_config} err]} { | |
| error_popup [strcat [mc "Failed to completely save options:"] "\n\n$err"] | |
| } | |
| reshow_diff | |
| destroy $w | |
| } | |