Merge branch 'maint'
authorShawn O. Pearce <spearce@spearce.org>
Wed, 10 Oct 2007 05:09:41 +0000 (01:09 -0400)
committerShawn O. Pearce <spearce@spearce.org>
Wed, 10 Oct 2007 05:09:41 +0000 (01:09 -0400)
* maint:
git-gui: accept versions containing text annotations, like 1.5.3.mingw.1

1  2 
git-gui.sh
diff --combined git-gui.sh
index 3f5927fb2921d6e493fd1fd3d4541a7ab736f768,9335a9761b458f5e8d75abf342630672751c7f2a..ca391136c8df2236f0de91617e6a417ece29bb9e
@@@ -6,12 -6,11 +6,12 @@@
        echo 'git-gui version @@GITGUI_VERSION@@'; \
        exit; \
   fi; \
 - exec wish "$0" -- "$@"
 + argv0=$0; \
 + exec wish "$argv0" -- "$@"
  
  set appvers {@@GITGUI_VERSION@@}
  set copyright {
 -Copyright © 2006, 2007 Shawn Pearce, et. al.
 +Copyright Â© 2006, 2007 Shawn Pearce, et. al.
  
  This program is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
@@@ -38,31 -37,13 +38,31 @@@ if {[catch {package require Tcl 8.4} er
        tk_messageBox \
                -icon error \
                -type ok \
 -              -title "git-gui: fatal error" \
 +              -title [mc "git-gui: fatal error"] \
                -message $err
        exit 1
  }
  
  catch {rename send {}} ; # What an evil concept...
  
 +######################################################################
 +##
 +## locate our library
 +
 +set oguilib {@@GITGUI_LIBDIR@@}
 +set oguirel {@@GITGUI_RELATIVE@@}
 +if {$oguirel eq {1}} {
 +      set oguilib [file dirname [file dirname [file normalize $argv0]]]
 +      set oguilib [file join $oguilib share git-gui lib]
 +      set oguimsg [file join $oguilib msgs]
 +} elseif {[string match @@* $oguirel]} {
 +      set oguilib [file join [file dirname [file normalize $argv0]] lib]
 +      set oguimsg [file join [file dirname [file normalize $argv0]] po]
 +} else {
 +      set oguimsg [file join $oguilib msgs]
 +}
 +unset oguirel
 +
  ######################################################################
  ##
  ## enable verbose loading?
@@@ -83,13 -64,9 +83,13 @@@ if {![catch {set _verbose $env(GITGUI_V
  
  ######################################################################
  ##
 -## Fake internationalization to ease backporting of changes.
 +## Internationalization (i18n) through msgcat and gettext. See
 +## http://www.gnu.org/software/gettext/manual/html_node/Tcl.html
 +
 +package require msgcat
  
  proc mc {fmt args} {
 +      set fmt [::msgcat::mc $fmt]
        set cmk [string first @@ $fmt]
        if {$cmk > 0} {
                set fmt [string range $fmt 0 [expr {$cmk - 1}]]
        return [eval [list format $fmt] $args]
  }
  
 +proc strcat {args} {
 +      return [join $args {}]
 +}
 +
 +::msgcat::mcload $oguimsg
 +unset oguimsg
 +
  ######################################################################
  ##
  ## read only globals
  
 -set _appname [lindex [file split $argv0] end]
 +set _appname {Git Gui}
  set _gitdir {}
  set _gitexec {}
  set _reponame {}
@@@ -521,103 -491,6 +521,103 @@@ proc rmsel_tag {text} 
        return $text
  }
  
 +set root_exists 0
 +bind . <Visibility> {
 +      bind . <Visibility> {}
 +      set root_exists 1
 +}
 +
 +if {[is_Windows]} {
 +      wm iconbitmap . -default $oguilib/git-gui.ico
 +}
 +
 +######################################################################
 +##
 +## config defaults
 +
 +set cursor_ptr arrow
 +font create font_diff -family Courier -size 10
 +font create font_ui
 +catch {
 +      label .dummy
 +      eval font configure font_ui [font actual [.dummy cget -font]]
 +      destroy .dummy
 +}
 +
 +font create font_uiitalic
 +font create font_uibold
 +font create font_diffbold
 +font create font_diffitalic
 +
 +foreach class {Button Checkbutton Entry Label
 +              Labelframe Listbox Menu Message
 +              Radiobutton Spinbox Text} {
 +      option add *$class.font font_ui
 +}
 +unset class
 +
 +if {[is_Windows] || [is_MacOSX]} {
 +      option add *Menu.tearOff 0
 +}
 +
 +if {[is_MacOSX]} {
 +      set M1B M1
 +      set M1T Cmd
 +} else {
 +      set M1B Control
 +      set M1T Ctrl
 +}
 +
 +proc bind_button3 {w cmd} {
 +      bind $w <Any-Button-3> $cmd
 +      if {[is_MacOSX]} {
 +              # Mac OS X sends Button-2 on right click through three-button mouse,
 +              # or through trackpad right-clicking (two-finger touch + click).
 +              bind $w <Any-Button-2> $cmd
 +              bind $w <Control-Button-1> $cmd
 +      }
 +}
 +
 +proc apply_config {} {
 +      global repo_config font_descs
 +
 +      foreach option $font_descs {
 +              set name [lindex $option 0]
 +              set font [lindex $option 1]
 +              if {[catch {
 +                      foreach {cn cv} $repo_config(gui.$name) {
 +                              font configure $font $cn $cv -weight normal
 +                      }
 +                      } err]} {
 +                      error_popup [strcat [mc "Invalid font specified in %s:" "gui.$name"] "\n\n$err"]
 +              }
 +              foreach {cn cv} [font configure $font] {
 +                      font configure ${font}bold $cn $cv
 +                      font configure ${font}italic $cn $cv
 +              }
 +              font configure ${font}bold -weight bold
 +              font configure ${font}italic -slant italic
 +      }
 +}
 +
 +set default_config(merge.diffstat) true
 +set default_config(merge.summary) false
 +set default_config(merge.verbosity) 2
 +set default_config(user.name) {}
 +set default_config(user.email) {}
 +
 +set default_config(gui.matchtrackingbranch) false
 +set default_config(gui.pruneduringfetch) false
 +set default_config(gui.trustmtime) false
 +set default_config(gui.diffcontext) 5
 +set default_config(gui.newbranchtemplate) {}
 +set default_config(gui.fontui) [font configure font_ui]
 +set default_config(gui.fontdiff) [font configure font_diff]
 +set font_descs {
 +      {fontui   font_ui   {mc "Main Font"}}
 +      {fontdiff font_diff {mc "Diff/Console Font"}}
 +}
 +
  ######################################################################
  ##
  ## find git
@@@ -642,7 -515,7 +642,7 @@@ if {[catch {set _git_version [git --ver
        tk_messageBox \
                -icon error \
                -type ok \
 -              -title "git-gui: fatal error" \
 +              -title [mc "git-gui: fatal error"] \
                -message "Cannot determine Git version:
  
  $err
@@@ -655,8 -528,8 +655,8 @@@ if {![regsub {^git version } $_git_vers
        tk_messageBox \
                -icon error \
                -type ok \
 -              -title "git-gui: fatal error" \
 -              -message "Cannot parse Git version string:\n\n$_git_version"
 +              -title [mc "git-gui: fatal error"] \
 +              -message [strcat [mc "Cannot parse Git version string:"] "\n\n$_git_version"]
        exit 1
  }
  
@@@ -665,6 -538,7 +665,7 @@@ regsub -- {-dirty$} $_git_version {} _g
  regsub {\.[0-9]+\.g[0-9a-f]+$} $_git_version {} _git_version
  regsub {\.rc[0-9]+$} $_git_version {} _git_version
  regsub {\.GIT$} $_git_version {} _git_version
+ regsub {\.[a-zA-Z]+\.[0-9]+$} $_git_version {} _git_version
  
  if {![regexp {^[1-9]+(\.[0-9]+)+$} $_git_version]} {
        catch {wm withdraw .}
                -type yesno \
                -default no \
                -title "[appname]: warning" \
 -              -message "Git version cannot be determined.
 +               -message [mc "Git version cannot be determined.
  
 -$_git claims it is version '$_real_git_version'.
 +%s claims it is version '%s'.
  
 -[appname] requires at least Git 1.5.0 or later.
 +%s requires at least Git 1.5.0 or later.
  
 -Assume '$_real_git_version' is version 1.5.0?
 -"] eq {yes}} {
 +Assume '%s' is version 1.5.0?
 +" $_git $_real_git_version [appname] $_real_git_version]] eq {yes}} {
                set _git_version 1.5.0
        } else {
                exit 1
@@@ -737,7 -611,7 +738,7 @@@ if {[git-version < 1.5]} 
        tk_messageBox \
                -icon error \
                -type ok \
 -              -title "git-gui: fatal error" \
 +              -title [mc "git-gui: fatal error"] \
                -message "[appname] requires Git 1.5.0 or later.
  
  You are using [git-version]:
  ##
  ## configure our library
  
 -set oguilib {@@GITGUI_LIBDIR@@}
 -set oguirel {@@GITGUI_RELATIVE@@}
 -if {$oguirel eq {1}} {
 -      set oguilib [file dirname [file dirname [file normalize $argv0]]]
 -      set oguilib [file join $oguilib share git-gui lib]
 -} elseif {[string match @@* $oguirel]} {
 -      set oguilib [file join [file dirname [file normalize $argv0]] lib]
 -}
 -
  set idx [file join $oguilib tclIndex]
  if {[catch {set fd [open $idx r]} err]} {
        catch {wm withdraw .}
        tk_messageBox \
                -icon error \
                -type ok \
 -              -title "git-gui: fatal error" \
 +              -title [mc "git-gui: fatal error"] \
                -message $err
        exit 1
  }
@@@ -783,13 -666,13 +784,13 @@@ if {$idx ne {}} 
  } else {
        set auto_path [concat [list $oguilib] $auto_path]
  }
 -unset -nocomplain oguirel idx fd
 +unset -nocomplain idx fd
  
  ######################################################################
  ##
  ## feature option selection
  
 -if {[regexp {^git-(.+)$} [appname] _junk subcommand]} {
 +if {[regexp {^git-(.+)$} [file tail $argv0] _junk subcommand]} {
        unset _junk
  } else {
        set subcommand gui
@@@ -837,35 -720,35 +838,35 @@@ if {[catch 
                set _gitdir [git rev-parse --git-dir]
                set _prefix [git rev-parse --show-prefix]
        } err]} {
 -      catch {wm withdraw .}
 -      error_popup "Cannot find the git directory:\n\n$err"
 -      exit 1
 +      load_config 1
 +      apply_config
 +      choose_repository::pick
  }
  if {![file isdirectory $_gitdir] && [is_Cygwin]} {
 -      catch {set _gitdir [exec cygpath --unix $_gitdir]}
 +      catch {set _gitdir [exec cygpath --windows $_gitdir]}
  }
  if {![file isdirectory $_gitdir]} {
        catch {wm withdraw .}
 -      error_popup "Git directory not found:\n\n$_gitdir"
 +      error_popup [strcat [mc "Git directory not found:"] "\n\n$_gitdir"]
        exit 1
  }
  if {$_prefix ne {}} {
        regsub -all {[^/]+/} $_prefix ../ cdup
        if {[catch {cd $cdup} err]} {
                catch {wm withdraw .}
 -              error_popup "Cannot move to top of working directory:\n\n$err"
 +              error_popup [strcat [mc "Cannot move to top of working directory:"] "\n\n$err"]
                exit 1
        }
        unset cdup
  } elseif {![is_enabled bare]} {
        if {[lindex [file split $_gitdir] end] ne {.git}} {
                catch {wm withdraw .}
 -              error_popup "Cannot use funny .git directory:\n\n$_gitdir"
 +              error_popup [strcat [mc "Cannot use funny .git directory:"] "\n\n$_gitdir"]
                exit 1
        }
        if {[catch {cd [file dirname $_gitdir]} err]} {
                catch {wm withdraw .}
 -              error_popup "No working directory [file dirname $_gitdir]:\n\n$err"
 +              error_popup [strcat [mc "No working directory"] " [file dirname $_gitdir]:\n\n$err"]
                exit 1
        }
  }
@@@ -1012,7 -895,7 +1013,7 @@@ proc rescan {after {honor_trustmtime 1}
                rescan_stage2 {} $after
        } else {
                set rescan_active 1
 -              ui_status {Refreshing file status...}
 +              ui_status [mc "Refreshing file status..."]
                set fd_rf [git_read update-index \
                        -q \
                        --unmerged \
@@@ -1077,7 -960,7 +1078,7 @@@ proc rescan_stage2 {fd after} 
        set buf_rlo {}
  
        set rescan_active 3
 -      ui_status {Scanning for modified files ...}
 +      ui_status [mc "Scanning for modified files ..."]
        set fd_di [git_read diff-index --cached -z [PARENT]]
        set fd_df [git_read diff-files -z]
        set fd_lo [eval git_read ls-files --others -z $ls_others]
@@@ -1518,32 -1401,31 +1519,32 @@@ set all_icons(O$ui_workdir) file_plai
  
  set max_status_desc 0
  foreach i {
 -              {__ "Unmodified"}
 -
 -              {_M "Modified, not staged"}
 -              {M_ "Staged for commit"}
 -              {MM "Portions staged for commit"}
 -              {MD "Staged for commit, missing"}
 -
 -              {_O "Untracked, not staged"}
 -              {A_ "Staged for commit"}
 -              {AM "Portions staged for commit"}
 -              {AD "Staged for commit, missing"}
 -
 -              {_D "Missing"}
 -              {D_ "Staged for removal"}
 -              {DO "Staged for removal, still present"}
 -
 -              {U_ "Requires merge resolution"}
 -              {UU "Requires merge resolution"}
 -              {UM "Requires merge resolution"}
 -              {UD "Requires merge resolution"}
 +              {__ {mc "Unmodified"}}
 +
 +              {_M {mc "Modified, not staged"}}
 +              {M_ {mc "Staged for commit"}}
 +              {MM {mc "Portions staged for commit"}}
 +              {MD {mc "Staged for commit, missing"}}
 +
 +              {_O {mc "Untracked, not staged"}}
 +              {A_ {mc "Staged for commit"}}
 +              {AM {mc "Portions staged for commit"}}
 +              {AD {mc "Staged for commit, missing"}}
 +
 +              {_D {mc "Missing"}}
 +              {D_ {mc "Staged for removal"}}
 +              {DO {mc "Staged for removal, still present"}}
 +
 +              {U_ {mc "Requires merge resolution"}}
 +              {UU {mc "Requires merge resolution"}}
 +              {UM {mc "Requires merge resolution"}}
 +              {UD {mc "Requires merge resolution"}}
        } {
 -      if {$max_status_desc < [string length [lindex $i 1]]} {
 -              set max_status_desc [string length [lindex $i 1]]
 +      set text [eval [lindex $i 1]]
 +      if {$max_status_desc < [string length $text]} {
 +              set max_status_desc [string length $text]
        }
 -      set all_descs([lindex $i 0]) [lindex $i 1]
 +      set all_descs([lindex $i 0]) $text
  }
  unset i
  
  ##
  ## util
  
 -proc bind_button3 {w cmd} {
 -      bind $w <Any-Button-3> $cmd
 -      if {[is_MacOSX]} {
 -              # Mac OS X sends Button-2 on right click through three-button mouse,
 -              # or through trackpad right-clicking (two-finger touch + click).
 -              bind $w <Any-Button-2> $cmd
 -              bind $w <Control-Button-1> $cmd
 -      }
 -}
 -
  proc scrollbar2many {list mode args} {
        foreach w $list {eval $w $mode $args}
  }
@@@ -1572,7 -1464,7 +1573,7 @@@ proc incr_font_size {font {amt 1}} 
  ##
  ## ui commands
  
 -set starting_gitk_msg {Starting gitk... please wait...}
 +set starting_gitk_msg [mc "Starting gitk... please wait..."]
  
  proc do_gitk {revs} {
        # -- Always start gitk through whatever we were loaded with.  This
        set exe [file join [file dirname $::_git] gitk]
        set cmd [list [info nameofexecutable] $exe]
        if {! [file exists $exe]} {
 -              error_popup "Unable to start gitk:\n\n$exe does not exist"
 +              error_popup [mc "Unable to start gitk:\n\n%s does not exist" $exe]
        } else {
                global env
  
@@@ -1772,27 -1664,104 +1773,27 @@@ proc add_range_to_selection {w x y} 
  
  ######################################################################
  ##
 -## config defaults
 -
 -set cursor_ptr arrow
 -font create font_diff -family Courier -size 10
 -font create font_ui
 -catch {
 -      label .dummy
 -      eval font configure font_ui [font actual [.dummy cget -font]]
 -      destroy .dummy
 -}
 -
 -font create font_uiitalic
 -font create font_uibold
 -font create font_diffbold
 -font create font_diffitalic
 -
 -foreach class {Button Checkbutton Entry Label
 -              Labelframe Listbox Menu Message
 -              Radiobutton Spinbox Text} {
 -      option add *$class.font font_ui
 -}
 -unset class
 -
 -if {[is_Windows] || [is_MacOSX]} {
 -      option add *Menu.tearOff 0
 -}
 -
 -if {[is_MacOSX]} {
 -      set M1B M1
 -      set M1T Cmd
 -} else {
 -      set M1B Control
 -      set M1T Ctrl
 -}
 -
 -proc apply_config {} {
 -      global repo_config font_descs
 -
 -      foreach option $font_descs {
 -              set name [lindex $option 0]
 -              set font [lindex $option 1]
 -              if {[catch {
 -                      foreach {cn cv} $repo_config(gui.$name) {
 -                              font configure $font $cn $cv -weight normal
 -                      }
 -                      } err]} {
 -                      error_popup "Invalid font specified in gui.$name:\n\n$err"
 -              }
 -              foreach {cn cv} [font configure $font] {
 -                      font configure ${font}bold $cn $cv
 -                      font configure ${font}italic $cn $cv
 -              }
 -              font configure ${font}bold -weight bold
 -              font configure ${font}italic -slant italic
 -      }
 -}
 -
 -set default_config(merge.diffstat) true
 -set default_config(merge.summary) false
 -set default_config(merge.verbosity) 2
 -set default_config(user.name) {}
 -set default_config(user.email) {}
 +## ui construction
  
 -set default_config(gui.matchtrackingbranch) false
 -set default_config(gui.pruneduringfetch) false
 -set default_config(gui.trustmtime) false
 -set default_config(gui.diffcontext) 5
 -set default_config(gui.newbranchtemplate) {}
 -set default_config(gui.fontui) [font configure font_ui]
 -set default_config(gui.fontdiff) [font configure font_diff]
 -set font_descs {
 -      {fontui   font_ui   {Main Font}}
 -      {fontdiff font_diff {Diff/Console Font}}
 -}
  load_config 0
  apply_config
 -
 -######################################################################
 -##
 -## ui construction
 -
  set ui_comm {}
  
  # -- Menu Bar
  #
  menu .mbar -tearoff 0
 -.mbar add cascade -label Repository -menu .mbar.repository
 -.mbar add cascade -label Edit -menu .mbar.edit
 +.mbar add cascade -label [mc Repository] -menu .mbar.repository
 +.mbar add cascade -label [mc Edit] -menu .mbar.edit
  if {[is_enabled branch]} {
 -      .mbar add cascade -label Branch -menu .mbar.branch
 +      .mbar add cascade -label [mc Branch] -menu .mbar.branch
  }
  if {[is_enabled multicommit] || [is_enabled singlecommit]} {
 -      .mbar add cascade -label Commit -menu .mbar.commit
 +      .mbar add cascade -label [mc Commit@@noun] -menu .mbar.commit
  }
  if {[is_enabled transport]} {
 -      .mbar add cascade -label Merge -menu .mbar.merge
 -      .mbar add cascade -label Fetch -menu .mbar.fetch
 -      .mbar add cascade -label Push -menu .mbar.push
 +      .mbar add cascade -label [mc Merge] -menu .mbar.merge
 +      .mbar add cascade -label [mc Fetch] -menu .mbar.fetch
 +      .mbar add cascade -label [mc Push] -menu .mbar.push
  }
  . configure -menu .mbar
  
  menu .mbar.repository
  
  .mbar.repository add command \
 -      -label {Browse Current Branch's Files} \
 +      -label [mc "Browse Current Branch's Files"] \
        -command {browser::new $current_branch}
  set ui_browse_current [.mbar.repository index last]
  .mbar.repository add command \
 -      -label {Browse Branch Files...} \
 +      -label [mc "Browse Branch Files..."] \
        -command browser_open::dialog
  .mbar.repository add separator
  
  .mbar.repository add command \
 -      -label {Visualize Current Branch's History} \
 +      -label [mc "Visualize Current Branch's History"] \
        -command {do_gitk $current_branch}
  set ui_visualize_current [.mbar.repository index last]
  .mbar.repository add command \
 -      -label {Visualize All Branch History} \
 +      -label [mc "Visualize All Branch History"] \
        -command {do_gitk --all}
  .mbar.repository add separator
  
  proc current_branch_write {args} {
        global current_branch
        .mbar.repository entryconf $::ui_browse_current \
 -              -label "Browse $current_branch's Files"
 +              -label [mc "Browse %s's Files" $current_branch]
        .mbar.repository entryconf $::ui_visualize_current \
 -              -label "Visualize $current_branch's History"
 +              -label [mc "Visualize %s's History" $current_branch]
  }
  trace add variable current_branch write current_branch_write
  
  if {[is_enabled multicommit]} {
 -      .mbar.repository add command -label {Database Statistics} \
 +      .mbar.repository add command -label [mc "Database Statistics"] \
                -command do_stats
  
 -      .mbar.repository add command -label {Compress Database} \
 +      .mbar.repository add command -label [mc "Compress Database"] \
                -command do_gc
  
 -      .mbar.repository add command -label {Verify Database} \
 +      .mbar.repository add command -label [mc "Verify Database"] \
                -command do_fsck_objects
  
        .mbar.repository add separator
  
        if {[is_Cygwin]} {
                .mbar.repository add command \
 -                      -label {Create Desktop Icon} \
 +                      -label [mc "Create Desktop Icon"] \
                        -command do_cygwin_shortcut
        } elseif {[is_Windows]} {
                .mbar.repository add command \
 -                      -label {Create Desktop Icon} \
 +                      -label [mc "Create Desktop Icon"] \
                        -command do_windows_shortcut
        } elseif {[is_MacOSX]} {
                .mbar.repository add command \
 -                      -label {Create Desktop Icon} \
 +                      -label [mc "Create Desktop Icon"] \
                        -command do_macosx_app
        }
  }
  
 -.mbar.repository add command -label Quit \
 +.mbar.repository add command -label [mc Quit] \
        -command do_quit \
        -accelerator $M1T-Q
  
  # -- Edit Menu
  #
  menu .mbar.edit
 -.mbar.edit add command -label Undo \
 +.mbar.edit add command -label [mc Undo] \
        -command {catch {[focus] edit undo}} \
        -accelerator $M1T-Z
 -.mbar.edit add command -label Redo \
 +.mbar.edit add command -label [mc Redo] \
        -command {catch {[focus] edit redo}} \
        -accelerator $M1T-Y
  .mbar.edit add separator
 -.mbar.edit add command -label Cut \
 +.mbar.edit add command -label [mc Cut] \
        -command {catch {tk_textCut [focus]}} \
        -accelerator $M1T-X
 -.mbar.edit add command -label Copy \
 +.mbar.edit add command -label [mc Copy] \
        -command {catch {tk_textCopy [focus]}} \
        -accelerator $M1T-C
 -.mbar.edit add command -label Paste \
 +.mbar.edit add command -label [mc Paste] \
        -command {catch {tk_textPaste [focus]; [focus] see insert}} \
        -accelerator $M1T-V
 -.mbar.edit add command -label Delete \
 +.mbar.edit add command -label [mc Delete] \
        -command {catch {[focus] delete sel.first sel.last}} \
        -accelerator Del
  .mbar.edit add separator
 -.mbar.edit add command -label {Select All} \
 +.mbar.edit add command -label [mc "Select All"] \
        -command {catch {[focus] tag add sel 0.0 end}} \
        -accelerator $M1T-A
  
  if {[is_enabled branch]} {
        menu .mbar.branch
  
 -      .mbar.branch add command -label {Create...} \
 +      .mbar.branch add command -label [mc "Create..."] \
                -command branch_create::dialog \
                -accelerator $M1T-N
        lappend disable_on_lock [list .mbar.branch entryconf \
                [.mbar.branch index last] -state]
  
 -      .mbar.branch add command -label {Checkout...} \
 +      .mbar.branch add command -label [mc "Checkout..."] \
                -command branch_checkout::dialog \
                -accelerator $M1T-O
        lappend disable_on_lock [list .mbar.branch entryconf \
                [.mbar.branch index last] -state]
  
 -      .mbar.branch add command -label {Rename...} \
 +      .mbar.branch add command -label [mc "Rename..."] \
                -command branch_rename::dialog
        lappend disable_on_lock [list .mbar.branch entryconf \
                [.mbar.branch index last] -state]
  
 -      .mbar.branch add command -label {Delete...} \
 +      .mbar.branch add command -label [mc "Delete..."] \
                -command branch_delete::dialog
        lappend disable_on_lock [list .mbar.branch entryconf \
                [.mbar.branch index last] -state]
  
 -      .mbar.branch add command -label {Reset...} \
 +      .mbar.branch add command -label [mc "Reset..."] \
                -command merge::reset_hard
        lappend disable_on_lock [list .mbar.branch entryconf \
                [.mbar.branch index last] -state]
@@@ -1924,7 -1893,7 +1925,7 @@@ if {[is_enabled multicommit] || [is_ena
        menu .mbar.commit
  
        .mbar.commit add radiobutton \
 -              -label {New Commit} \
 +              -label [mc "New Commit"] \
                -command do_select_commit_type \
                -variable selected_commit_type \
                -value new
                [list .mbar.commit entryconf [.mbar.commit index last] -state]
  
        .mbar.commit add radiobutton \
 -              -label {Amend Last Commit} \
 +              -label [mc "Amend Last Commit"] \
                -command do_select_commit_type \
                -variable selected_commit_type \
                -value amend
  
        .mbar.commit add separator
  
 -      .mbar.commit add command -label Rescan \
 +      .mbar.commit add command -label [mc Rescan] \
                -command do_rescan \
                -accelerator F5
        lappend disable_on_lock \
                [list .mbar.commit entryconf [.mbar.commit index last] -state]
  
 -      .mbar.commit add command -label {Stage To Commit} \
 +      .mbar.commit add command -label [mc "Stage To Commit"] \
                -command do_add_selection
        lappend disable_on_lock \
                [list .mbar.commit entryconf [.mbar.commit index last] -state]
  
 -      .mbar.commit add command -label {Stage Changed Files To Commit} \
 +      .mbar.commit add command -label [mc "Stage Changed Files To Commit"] \
                -command do_add_all \
                -accelerator $M1T-I
        lappend disable_on_lock \
                [list .mbar.commit entryconf [.mbar.commit index last] -state]
  
 -      .mbar.commit add command -label {Unstage From Commit} \
 +      .mbar.commit add command -label [mc "Unstage From Commit"] \
                -command do_unstage_selection
        lappend disable_on_lock \
                [list .mbar.commit entryconf [.mbar.commit index last] -state]
  
 -      .mbar.commit add command -label {Revert Changes} \
 +      .mbar.commit add command -label [mc "Revert Changes"] \
                -command do_revert_selection
        lappend disable_on_lock \
                [list .mbar.commit entryconf [.mbar.commit index last] -state]
  
        .mbar.commit add separator
  
 -      .mbar.commit add command -label {Sign Off} \
 +      .mbar.commit add command -label [mc "Sign Off"] \
                -command do_signoff \
                -accelerator $M1T-S
  
 -      .mbar.commit add command -label Commit \
 +      .mbar.commit add command -label [mc Commit@@verb] \
                -command do_commit \
                -accelerator $M1T-Return
        lappend disable_on_lock \
  #
  if {[is_enabled branch]} {
        menu .mbar.merge
 -      .mbar.merge add command -label {Local Merge...} \
 +      .mbar.merge add command -label [mc "Local Merge..."] \
                -command merge::dialog \
                -accelerator $M1T-M
        lappend disable_on_lock \
                [list .mbar.merge entryconf [.mbar.merge index last] -state]
 -      .mbar.merge add command -label {Abort Merge...} \
 +      .mbar.merge add command -label [mc "Abort Merge..."] \
                -command merge::reset_hard
        lappend disable_on_lock \
                [list .mbar.merge entryconf [.mbar.merge index last] -state]
@@@ -2002,38 -1971,38 +2003,38 @@@ if {[is_enabled transport]} 
        menu .mbar.fetch
  
        menu .mbar.push
 -      .mbar.push add command -label {Push...} \
 +      .mbar.push add command -label [mc "Push..."] \
                -command do_push_anywhere \
                -accelerator $M1T-P
 -      .mbar.push add command -label {Delete...} \
 +      .mbar.push add command -label [mc "Delete..."] \
                -command remote_branch_delete::dialog
  }
  
  if {[is_MacOSX]} {
        # -- Apple Menu (Mac OS X only)
        #
 -      .mbar add cascade -label Apple -menu .mbar.apple
 +      .mbar add cascade -label [mc Apple] -menu .mbar.apple
        menu .mbar.apple
  
 -      .mbar.apple add command -label "About [appname]" \
 +      .mbar.apple add command -label [mc "About %s" [appname]] \
                -command do_about
 -      .mbar.apple add command -label "Options..." \
 +      .mbar.apple add command -label [mc "Options..."] \
                -command do_options
  } else {
        # -- Edit Menu
        #
        .mbar.edit add separator
 -      .mbar.edit add command -label {Options...} \
 +      .mbar.edit add command -label [mc "Options..."] \
                -command do_options
  }
  
  # -- Help Menu
  #
 -.mbar add cascade -label Help -menu .mbar.help
 +.mbar add cascade -label [mc Help] -menu .mbar.help
  menu .mbar.help
  
  if {![is_MacOSX]} {
 -      .mbar.help add command -label "About [appname]" \
 +      .mbar.help add command -label [mc "About %s" [appname]] \
                -command do_about
  }
  
@@@ -2070,11 -2039,17 +2071,11 @@@ if {[file isfile $doc_path]} 
  }
  
  if {$browser ne {}} {
 -      .mbar.help add command -label {Online Documentation} \
 +      .mbar.help add command -label [mc "Online Documentation"] \
                -command [list exec $browser $doc_url &]
  }
  unset browser doc_path doc_url
  
 -set root_exists 0
 -bind . <Visibility> {
 -      bind . <Visibility> {}
 -      set root_exists 1
 -}
 -
  # -- Standard bindings
  #
  wm protocol . WM_DELETE_WINDOW do_quit
@@@ -2154,7 -2129,7 +2155,7 @@@ blame 
        }
        blame   {
                if {$head eq {} && ![file exists $path]} {
 -                      puts stderr "fatal: cannot stat path $path: No such file or directory"
 +                      puts stderr [mc "fatal: cannot stat path %s: No such file or directory" $path]
                        exit 1
                }
                blame::new $head $path
@@@ -2166,8 -2141,7 +2167,8 @@@ citool 
  gui {
        if {[llength $argv] != 0} {
                puts -nonewline stderr "usage: $argv0"
 -              if {$subcommand ne {gui} && [appname] ne "git-$subcommand"} {
 +              if {$subcommand ne {gui}
 +                      && [file tail $argv0] ne "git-$subcommand"} {
                        puts -nonewline stderr " $subcommand"
                }
                puts stderr {}
@@@ -2187,7 -2161,7 +2188,7 @@@ frame .branch 
        -borderwidth 1 \
        -relief sunken
  label .branch.l1 \
 -      -text {Current Branch:} \
 +      -text [mc "Current Branch:"] \
        -anchor w \
        -justify left
  label .branch.cb \
@@@ -2208,7 -2182,7 +2209,7 @@@ pack .vpane -anchor n -side top -fill b
  # -- Index File List
  #
  frame .vpane.files.index -height 100 -width 200
 -label .vpane.files.index.title -text {Staged Changes (Will Be Committed)} \
 +label .vpane.files.index.title -text [mc "Staged Changes (Will Be Committed)"] \
        -background lightgreen
  text $ui_index -background white -borderwidth 0 \
        -width 20 -height 10 \
@@@ -2228,7 -2202,7 +2229,7 @@@ pack $ui_index -side left -fill both -e
  # -- Working Directory File List
  #
  frame .vpane.files.workdir -height 100 -width 200
 -label .vpane.files.workdir.title -text {Unstaged Changes (Will Not Be Committed)} \
 +label .vpane.files.workdir.title -text [mc "Unstaged Changes (Will Not Be Committed)"] \
        -background lightsalmon
  text $ui_workdir -background white -borderwidth 0 \
        -width 20 -height 10 \
@@@ -2269,29 -2243,29 +2270,29 @@@ label .vpane.lower.commarea.buttons.l -
  pack .vpane.lower.commarea.buttons.l -side top -fill x
  pack .vpane.lower.commarea.buttons -side left -fill y
  
 -button .vpane.lower.commarea.buttons.rescan -text {Rescan} \
 +button .vpane.lower.commarea.buttons.rescan -text [mc Rescan] \
        -command do_rescan
  pack .vpane.lower.commarea.buttons.rescan -side top -fill x
  lappend disable_on_lock \
        {.vpane.lower.commarea.buttons.rescan conf -state}
  
 -button .vpane.lower.commarea.buttons.incall -text {Stage Changed} \
 +button .vpane.lower.commarea.buttons.incall -text [mc "Stage Changed"] \
        -command do_add_all
  pack .vpane.lower.commarea.buttons.incall -side top -fill x
  lappend disable_on_lock \
        {.vpane.lower.commarea.buttons.incall conf -state}
  
 -button .vpane.lower.commarea.buttons.signoff -text {Sign Off} \
 +button .vpane.lower.commarea.buttons.signoff -text [mc "Sign Off"] \
        -command do_signoff
  pack .vpane.lower.commarea.buttons.signoff -side top -fill x
  
 -button .vpane.lower.commarea.buttons.commit -text {Commit} \
 +button .vpane.lower.commarea.buttons.commit -text [mc Commit@@verb] \
        -command do_commit
  pack .vpane.lower.commarea.buttons.commit -side top -fill x
  lappend disable_on_lock \
        {.vpane.lower.commarea.buttons.commit conf -state}
  
 -button .vpane.lower.commarea.buttons.push -text {Push} \
 +button .vpane.lower.commarea.buttons.push -text [mc Push] \
        -command do_push_anywhere
  pack .vpane.lower.commarea.buttons.push -side top -fill x
  
@@@ -2302,14 -2276,14 +2303,14 @@@ frame .vpane.lower.commarea.buffer.head
  set ui_comm .vpane.lower.commarea.buffer.t
  set ui_coml .vpane.lower.commarea.buffer.header.l
  radiobutton .vpane.lower.commarea.buffer.header.new \
 -      -text {New Commit} \
 +      -text [mc "New Commit"] \
        -command do_select_commit_type \
        -variable selected_commit_type \
        -value new
  lappend disable_on_lock \
        [list .vpane.lower.commarea.buffer.header.new conf -state]
  radiobutton .vpane.lower.commarea.buffer.header.amend \
 -      -text {Amend Last Commit} \
 +      -text [mc "Amend Last Commit"] \
        -command do_select_commit_type \
        -variable selected_commit_type \
        -value amend
@@@ -2321,12 -2295,12 +2322,12 @@@ label $ui_coml 
  proc trace_commit_type {varname args} {
        global ui_coml commit_type
        switch -glob -- $commit_type {
 -      initial       {set txt {Initial Commit Message:}}
 -      amend         {set txt {Amended Commit Message:}}
 -      amend-initial {set txt {Amended Initial Commit Message:}}
 -      amend-merge   {set txt {Amended Merge Commit Message:}}
 -      merge         {set txt {Merge Commit Message:}}
 -      *             {set txt {Commit Message:}}
 +      initial       {set txt [mc "Initial Commit Message:"]}
 +      amend         {set txt [mc "Amended Commit Message:"]}
 +      amend-initial {set txt [mc "Amended Initial Commit Message:"]}
 +      amend-merge   {set txt [mc "Amended Merge Commit Message:"]}
 +      merge         {set txt [mc "Merge Commit Message:"]}
 +      *             {set txt [mc "Commit Message:"]}
        }
        $ui_coml conf -text $txt
  }
@@@ -2355,23 -2329,23 +2356,23 @@@ pack .vpane.lower.commarea.buffer -sid
  set ctxm .vpane.lower.commarea.buffer.ctxm
  menu $ctxm -tearoff 0
  $ctxm add command \
 -      -label {Cut} \
 +      -label [mc Cut] \
        -command {tk_textCut $ui_comm}
  $ctxm add command \
 -      -label {Copy} \
 +      -label [mc Copy] \
        -command {tk_textCopy $ui_comm}
  $ctxm add command \
 -      -label {Paste} \
 +      -label [mc Paste] \
        -command {tk_textPaste $ui_comm}
  $ctxm add command \
 -      -label {Delete} \
 +      -label [mc Delete] \
        -command {$ui_comm delete sel.first sel.last}
  $ctxm add separator
  $ctxm add command \
 -      -label {Select All} \
 +      -label [mc "Select All"] \
        -command {focus $ui_comm;$ui_comm tag add sel 0.0 end}
  $ctxm add command \
 -      -label {Copy All} \
 +      -label [mc "Copy All"] \
        -command {
                $ui_comm tag add sel 0.0 end
                tk_textCopy $ui_comm
        }
  $ctxm add separator
  $ctxm add command \
 -      -label {Sign Off} \
 +      -label [mc "Sign Off"] \
        -command do_signoff
  bind_button3 $ui_comm "tk_popup $ctxm %X %Y"
  
@@@ -2395,7 -2369,7 +2396,7 @@@ proc trace_current_diff_path {varname a
        } else {
                set p $current_diff_path
                set s [mapdesc [lindex $file_states($p) 0] $p]
 -              set f {File:}
 +              set f [mc "File:"]
                set p [escape_path $p]
                set o normal
        }
@@@ -2429,7 -2403,7 +2430,7 @@@ pack .vpane.lower.diff.header.path -fil
  set ctxm .vpane.lower.diff.header.ctxm
  menu $ctxm -tearoff 0
  $ctxm add command \
 -      -label {Copy} \
 +      -label [mc Copy] \
        -command {
                clipboard clear
                clipboard append \
@@@ -2497,19 -2471,19 +2498,19 @@@ $ui_diff tag raise se
  set ctxm .vpane.lower.diff.body.ctxm
  menu $ctxm -tearoff 0
  $ctxm add command \
 -      -label {Refresh} \
 +      -label [mc Refresh] \
        -command reshow_diff
  lappend diff_actions [list $ctxm entryconf [$ctxm index last] -state]
  $ctxm add command \
 -      -label {Copy} \
 +      -label [mc Copy] \
        -command {tk_textCopy $ui_diff}
  lappend diff_actions [list $ctxm entryconf [$ctxm index last] -state]
  $ctxm add command \
 -      -label {Select All} \
 +      -label [mc "Select All"] \
        -command {focus $ui_diff;$ui_diff tag add sel 0.0 end}
  lappend diff_actions [list $ctxm entryconf [$ctxm index last] -state]
  $ctxm add command \
 -      -label {Copy All} \
 +      -label [mc "Copy All"] \
        -command {
                $ui_diff tag add sel 0.0 end
                tk_textCopy $ui_diff
  lappend diff_actions [list $ctxm entryconf [$ctxm index last] -state]
  $ctxm add separator
  $ctxm add command \
 -      -label {Apply/Reverse Hunk} \
 +      -label [mc "Apply/Reverse Hunk"] \
        -command {apply_hunk $cursorX $cursorY}
  set ui_diff_applyhunk [$ctxm index last]
  lappend diff_actions [list $ctxm entryconf $ui_diff_applyhunk -state]
  $ctxm add separator
  $ctxm add command \
 -      -label {Decrease Font Size} \
 +      -label [mc "Decrease Font Size"] \
        -command {incr_font_size font_diff -1}
  lappend diff_actions [list $ctxm entryconf [$ctxm index last] -state]
  $ctxm add command \
 -      -label {Increase Font Size} \
 +      -label [mc "Increase Font Size"] \
        -command {incr_font_size font_diff 1}
  lappend diff_actions [list $ctxm entryconf [$ctxm index last] -state]
  $ctxm add separator
  $ctxm add command \
 -      -label {Show Less Context} \
 +      -label [mc "Show Less Context"] \
        -command {if {$repo_config(gui.diffcontext) >= 1} {
                incr repo_config(gui.diffcontext) -1
                reshow_diff
        }}
  lappend diff_actions [list $ctxm entryconf [$ctxm index last] -state]
  $ctxm add command \
 -      -label {Show More Context} \
 +      -label [mc "Show More Context"] \
        -command {if {$repo_config(gui.diffcontext) < 99} {
                incr repo_config(gui.diffcontext)
                reshow_diff
        }}
  lappend diff_actions [list $ctxm entryconf [$ctxm index last] -state]
  $ctxm add separator
 -$ctxm add command -label {Options...} \
 +$ctxm add command -label [mc "Options..."] \
        -command do_options
  proc popup_diff_menu {ctxm x y X Y} {
        global current_diff_path file_states
        set ::cursorX $x
        set ::cursorY $y
        if {$::ui_index eq $::current_diff_side} {
 -              set l "Unstage Hunk From Commit"
 +              set l [mc "Unstage Hunk From Commit"]
        } else {
 -              set l "Stage Hunk For Commit"
 +              set l [mc "Stage Hunk For Commit"]
        }
        if {$::is_3way_diff
                || $current_diff_path eq {}
@@@ -2575,7 -2549,7 +2576,7 @@@ bind_button3 $ui_diff [list popup_diff_
  #
  set main_status [::status_bar::new .status]
  pack .status -anchor w -side bottom -fill x
 -$main_status show {Initializing...}
 +$main_status show [mc "Initializing..."]
  
  # -- Load geometry
  #
@@@ -2666,13 -2640,13 +2667,13 @@@ focus -force $ui_com
  if {[is_Cygwin]} {
        set ignored_env 0
        set suggest_user {}
 -      set msg "Possible environment issues exist.
 +      set msg [mc "Possible environment issues exist.
  
  The following environment variables are probably
  going to be ignored by any Git subprocess run
 -by [appname]:
 +by %s:
  
 -"
 +" [appname]]
        foreach name [array names env] {
                switch -regexp -- $name {
                {^GIT_INDEX_FILE$} -
                }
        }
        if {$ignored_env > 0} {
 -              append msg "
 +              append msg [mc "
  This is due to a known issue with the
 -Tcl binary distributed by Cygwin."
 +Tcl binary distributed by Cygwin."]
  
                if {$suggest_user ne {}} {
 -                      append msg "
 +                      append msg [mc "
  
 -A good replacement for $suggest_user
 +A good replacement for %s
  is placing values for the user.name and
  user.email settings into your personal
  ~/.gitconfig file.
 -"
 +" $suggest_user]
                }
                warn_popup $msg
        }