Code

Merge branch 'maint'
authorShawn O. Pearce <spearce@spearce.org>
Fri, 29 Jan 2010 15:58:56 +0000 (07:58 -0800)
committerShawn O. Pearce <spearce@spearce.org>
Fri, 29 Jan 2010 15:58:56 +0000 (07:58 -0800)
* maint:
  git-gui: fix shortcut for menu "Commit/Revert Changes"

1  2 
git-gui.sh

diff --combined git-gui.sh
index debcc5f41bafe47f90ad95cc2fcf6b7cd4e4bcc4,85fbc021fe93071c014677a509e183dcec699985..7d5451198cb109e1d3e30e3e33f1557bbd8b12c0
@@@ -121,8 -121,6 +121,8 @@@ unset oguims
  
  set _appname {Git Gui}
  set _gitdir {}
 +set _gitworktree {}
 +set _isbare {}
  set _gitexec {}
  set _githtmldir {}
  set _reponame {}
@@@ -278,32 -276,6 +278,32 @@@ proc get_config {name} 
        }
  }
  
 +proc is_bare {} {
 +      global _isbare
 +      global _gitdir
 +      global _gitworktree
 +
 +      if {$_isbare eq {}} {
 +              if {[catch {
 +                      set _bare [git rev-parse --is-bare-repository]
 +                      switch  -- $_bare {
 +                      true { set _isbare 1 }
 +                      false { set _isbare 0}
 +                      default { throw }
 +                      }
 +              }]} {
 +                      if {[is_config_true core.bare]
 +                              || ($_gitworktree eq {}
 +                                      && [lindex [file split $_gitdir] end] ne {.git})} {
 +                              set _isbare 1
 +                      } else {
 +                              set _isbare 0
 +                      }
 +              }
 +      }
 +      return $_isbare
 +}
 +
  ######################################################################
  ##
  ## handy utils
@@@ -677,17 -649,12 +677,17 @@@ if {[is_Windows]} 
  ## 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
 +if {[lsearch -exact [font names] TkDefaultFont] != -1} {
 +      eval [linsert [font actual TkDefaultFont] 0 font configure font_ui]
 +      eval [linsert [font actual TkFixedFont] 0 font create font_diff]
 +} else {
 +      font create font_diff -family Courier -size 10
 +      catch {
 +              label .dummy
 +              eval font configure font_ui [font actual [.dummy cget -font]]
 +              destroy .dummy
 +      }
  }
  
  font create font_uiitalic
@@@ -702,9 -669,6 +702,9 @@@ foreach class {Button Checkbutton Entr
  }
  if {![is_MacOSX]} {
        option add *Menu.font font_ui
 +      option add *Entry.borderWidth 1 startupFile
 +      option add *Entry.relief sunken startupFile
 +      option add *RadioButton.anchor w startupFile
  }
  unset class
  
@@@ -757,18 -721,6 +757,18 @@@ proc apply_config {} 
                font configure ${font}bold -weight bold
                font configure ${font}italic -slant italic
        }
 +
 +      global use_ttk NS
 +      set use_ttk 0
 +      set NS {}
 +      if {$repo_config(gui.usettk)} {
 +              set use_ttk [package vsatisfies [package provide Tk] 8.5]
 +              if {$use_ttk} {
 +                      set NS ttk
 +                      bind [winfo class .] <<ThemeChanged>> [list InitTheme]
 +                      pave_toplevel .
 +              }
 +      }
  }
  
  set default_config(branch.autosetupmerge) true
@@@ -795,7 -747,6 +795,7 @@@ set default_config(gui.fontui) [font co
  set default_config(gui.fontdiff) [font configure font_diff]
  # TODO: this option should be added to the git-config documentation
  set default_config(gui.maxfilesdisplayed) 5000
 +set default_config(gui.usettk) 1
  set font_descs {
        {fontui   font_ui   {mc "Main Font"}}
        {fontdiff font_diff {mc "Diff/Console Font"}}
@@@ -1149,41 -1100,25 +1149,41 @@@ if {![file isdirectory $_gitdir]} 
        error_popup [strcat [mc "Git directory not found:"] "\n\n$_gitdir"]
        exit 1
  }
 +# _gitdir exists, so try loading the config
 +load_config 0
 +apply_config
 +# try to set work tree from environment, falling back to core.worktree
 +if {[catch { set _gitworktree $env(GIT_WORK_TREE) }]} {
 +      set _gitworktree [get_config core.worktree]
 +}
  if {$_prefix ne {}} {
 -      regsub -all {[^/]+/} $_prefix ../ cdup
 +      if {$_gitworktree eq {}} {
 +              regsub -all {[^/]+/} $_prefix ../ cdup
 +      } else {
 +              set cdup $_gitworktree
 +      }
        if {[catch {cd $cdup} err]} {
                catch {wm withdraw .}
                error_popup [strcat [mc "Cannot move to top of working directory:"] "\n\n$err"]
                exit 1
        }
 +      set _gitworktree [pwd]
        unset cdup
  } elseif {![is_enabled bare]} {
 -      if {[lindex [file split $_gitdir] end] ne {.git}} {
 +      if {[is_bare]} {
                catch {wm withdraw .}
 -              error_popup [strcat [mc "Cannot use funny .git directory:"] "\n\n$_gitdir"]
 +              error_popup [strcat [mc "Cannot use bare repository:"] "\n\n$_gitdir"]
                exit 1
        }
 -      if {[catch {cd [file dirname $_gitdir]} err]} {
 +      if {$_gitworktree eq {}} {
 +              set _gitworktree [file dirname $_gitdir]
 +      }
 +      if {[catch {cd $_gitworktree} err]} {
                catch {wm withdraw .}
 -              error_popup [strcat [mc "No working directory"] " [file dirname $_gitdir]:\n\n$err"]
 +              error_popup [strcat [mc "No working directory"] " $_gitworktree:\n\n$err"]
                exit 1
        }
 +      set _gitworktree [pwd]
  }
  set _reponame [file split [file normalize $_gitdir]]
  if {[lindex $_reponame end] eq {.git}} {
        set _reponame [lindex $_reponame end]
  }
  
 +set env(GIT_DIR) $_gitdir
 +set env(GIT_WORK_TREE) $_gitworktree
 +
  ######################################################################
  ##
  ## global init
@@@ -1876,6 -1808,15 +1876,6 @@@ static unsigned char file_fulltick_bits
     0x62, 0x10, 0x02, 0x10, 0xfe, 0x1f};
  } -maskdata $filemask
  
 -image create bitmap file_parttick -background white -foreground "#005050" -data {
 -#define parttick_width 14
 -#define parttick_height 15
 -static unsigned char parttick_bits[] = {
 -   0xfe, 0x01, 0x02, 0x03, 0x7a, 0x05, 0x02, 0x09, 0x7a, 0x1f, 0x02, 0x10,
 -   0x7a, 0x14, 0x02, 0x16, 0x02, 0x13, 0x8a, 0x11, 0xda, 0x10, 0x72, 0x10,
 -   0x22, 0x10, 0x02, 0x10, 0xfe, 0x1f};
 -} -maskdata $filemask
 -
  image create bitmap file_question -background white -foreground black -data {
  #define file_question_width 14
  #define file_question_height 15
@@@ -1916,7 -1857,7 +1916,7 @@@ set ui_index .vpane.files.index.lis
  set ui_workdir .vpane.files.workdir.list
  
  set all_icons(_$ui_index)   file_plain
 -set all_icons(A$ui_index)   file_fulltick
 +set all_icons(A$ui_index)   file_plain
  set all_icons(M$ui_index)   file_fulltick
  set all_icons(D$ui_index)   file_removed
  set all_icons(U$ui_index)   file_merge
@@@ -1992,10 -1933,7 +1992,10 @@@ proc incr_font_size {font {amt 1}} 
  
  set starting_gitk_msg [mc "Starting gitk... please wait..."]
  
 -proc do_gitk {revs} {
 +proc do_gitk {revs {is_submodule false}} {
 +      global current_diff_path file_states current_diff_side ui_index
 +      global _gitdir _gitworktree
 +
        # -- Always start gitk through whatever we were loaded with.  This
        #    lets us bypass using shell process on Windows systems.
        #
        } else {
                global env
  
 -              if {[info exists env(GIT_DIR)]} {
 -                      set old_GIT_DIR $env(GIT_DIR)
 +              set pwd [pwd]
 +
 +              if {!$is_submodule} {
 +                      if {![is_bare]} {
 +                              cd $_gitworktree
 +                      }
                } else {
 -                      set old_GIT_DIR {}
 +                      cd $current_diff_path
 +                      if {$revs eq {--}} {
 +                              set s $file_states($current_diff_path)
 +                              set old_sha1 {}
 +                              set new_sha1 {}
 +                              switch -glob -- [lindex $s 0] {
 +                              M_ { set old_sha1 [lindex [lindex $s 2] 1] }
 +                              _M { set old_sha1 [lindex [lindex $s 3] 1] }
 +                              MM {
 +                                      if {$current_diff_side eq $ui_index} {
 +                                              set old_sha1 [lindex [lindex $s 2] 1]
 +                                              set new_sha1 [lindex [lindex $s 3] 1]
 +                                      } else {
 +                                              set old_sha1 [lindex [lindex $s 3] 1]
 +                                      }
 +                              }
 +                              }
 +                              set revs $old_sha1...$new_sha1
 +                      }
 +                      # GIT_DIR and GIT_WORK_TREE for the submodule are not the ones
 +                      # we've been using for the main repository, so unset them.
 +                      # TODO we could make life easier (start up faster?) for gitk
 +                      # by setting these to the appropriate values to allow gitk
 +                      # to skip the heuristics to find their proper value
 +                      unset env(GIT_DIR)
 +                      unset env(GIT_WORK_TREE)
 +              }
 +              eval exec $cmd $revs "--" "--" &
 +
 +              set env(GIT_DIR) $_gitdir
 +              set env(GIT_WORK_TREE) $_gitworktree
 +              cd $pwd
 +
 +              ui_status $::starting_gitk_msg
 +              after 10000 {
 +                      ui_ready $starting_gitk_msg
                }
 +      }
 +}
 +
 +proc do_git_gui {} {
 +      global current_diff_path
 +
 +      # -- Always start git gui through whatever we were loaded with.  This
 +      #    lets us bypass using shell process on Windows systems.
 +      #
 +      set exe [list [_which git]]
 +      if {$exe eq {}} {
 +              error_popup [mc "Couldn't find git gui in PATH"]
 +      } else {
 +              global env
 +              global _gitdir _gitworktree
 +
 +              # see note in do_gitk about unsetting these vars when
 +              # running tools in a submodule
 +              unset env(GIT_DIR)
 +              unset env(GIT_WORK_TREE)
  
                set pwd [pwd]
 -              cd [file dirname [gitdir]]
 -              set env(GIT_DIR) [file tail [gitdir]]
 +              cd $current_diff_path
  
 -              eval exec $cmd $revs "--" "--" &
 +              eval exec $exe gui &
  
 -              if {$old_GIT_DIR eq {}} {
 -                      unset env(GIT_DIR)
 -              } else {
 -                      set env(GIT_DIR) $old_GIT_DIR
 -              }
 +              set env(GIT_DIR) $_gitdir
 +              set env(GIT_WORK_TREE) $_gitworktree
                cd $pwd
  
                ui_status $::starting_gitk_msg
  }
  
  proc do_explore {} {
 +      global _gitworktree
        set explorer {}
        if {[is_Cygwin] || [is_Windows]} {
                set explorer "explorer.exe"
                # freedesktop.org-conforming system is our best shot
                set explorer "xdg-open"
        }
 -      eval exec $explorer [list [file nativename [file dirname [gitdir]]]] &
 +      eval exec $explorer $_gitworktree &
  }
  
  set is_quitting 0
@@@ -2114,7 -1996,7 +2114,7 @@@ proc do_quit {{rc {1}}} 
        global ui_comm is_quitting repo_config commit_type
        global GITGUI_BCK_exists GITGUI_BCK_i
        global ui_comm_spell
 -      global ret_code
 +      global ret_code use_ttk
  
        if {$is_quitting} return
        set is_quitting 1
                }
                set cfg_geometry [list]
                lappend cfg_geometry [wm geometry .]
 -              lappend cfg_geometry [lindex [.vpane sash coord 0] 0]
 -              lappend cfg_geometry [lindex [.vpane.files sash coord 0] 1]
 +              if {$use_ttk} {
 +                      lappend cfg_geometry [.vpane sashpos 0]
 +                      lappend cfg_geometry [.vpane.files sashpos 0]
 +              } else {
 +                      lappend cfg_geometry [lindex [.vpane sash coord 0] 0]
 +                      lappend cfg_geometry [lindex [.vpane.files sash coord 0] 1]
 +              }
                if {[catch {set rc_geometry $repo_config(gui.geometry)}]} {
                        set rc_geometry {}
                }
@@@ -2467,6 -2344,8 +2467,6 @@@ proc show_less_context {} 
  ##
  ## ui construction
  
 -load_config 0
 -apply_config
  set ui_comm {}
  
  # -- Menu Bar
@@@ -2498,12 -2377,10 +2498,12 @@@ if {[is_enabled multicommit] || [is_ena
  #
  menu .mbar.repository
  
 -.mbar.repository add command \
 -      -label [mc "Explore Working Copy"] \
 -      -command {do_explore}
 -.mbar.repository add separator
 +if {![is_bare]} {
 +      .mbar.repository add command \
 +              -label [mc "Explore Working Copy"] \
 +              -command {do_explore}
 +      .mbar.repository add separator
 +}
  
  .mbar.repository add command \
        -label [mc "Browse Current Branch's Files"] \
@@@ -2945,13 -2822,14 +2945,13 @@@ default 
  
  # -- Branch Control
  #
 -frame .branch \
 -      -borderwidth 1 \
 -      -relief sunken
 -label .branch.l1 \
 +${NS}::frame .branch
 +if {!$use_ttk} {.branch configure -borderwidth 1 -relief sunken}
 +${NS}::label .branch.l1 \
        -text [mc "Current Branch:"] \
        -anchor w \
        -justify left
 -label .branch.cb \
 +${NS}::label .branch.cb \
        -textvariable current_branch \
        -anchor w \
        -justify left
@@@ -2961,20 -2839,15 +2961,20 @@@ pack .branch -side top -fill 
  
  # -- Main Window Layout
  #
 -panedwindow .vpane -orient horizontal
 -panedwindow .vpane.files -orient vertical
 -.vpane add .vpane.files -sticky nsew -height 100 -width 200
 +${NS}::panedwindow .vpane -orient horizontal
 +${NS}::panedwindow .vpane.files -orient vertical
 +if {$use_ttk} {
 +      .vpane add .vpane.files
 +} else {
 +      .vpane add .vpane.files -sticky nsew -height 100 -width 200
 +}
  pack .vpane -anchor n -side top -fill both -expand 1
  
  # -- Index File List
  #
 -frame .vpane.files.index -height 100 -width 200
 -label .vpane.files.index.title -text [mc "Staged Changes (Will Commit)"] \
 +${NS}::frame .vpane.files.index -height 100 -width 200
 +tlabel .vpane.files.index.title \
 +      -text [mc "Staged Changes (Will Commit)"] \
        -background lightgreen -foreground black
  text $ui_index -background white -foreground black \
        -borderwidth 0 \
        -xscrollcommand {.vpane.files.index.sx set} \
        -yscrollcommand {.vpane.files.index.sy set} \
        -state disabled
 -scrollbar .vpane.files.index.sx -orient h -command [list $ui_index xview]
 -scrollbar .vpane.files.index.sy -orient v -command [list $ui_index yview]
 +${NS}::scrollbar .vpane.files.index.sx -orient h -command [list $ui_index xview]
 +${NS}::scrollbar .vpane.files.index.sy -orient v -command [list $ui_index yview]
  pack .vpane.files.index.title -side top -fill x
  pack .vpane.files.index.sx -side bottom -fill x
  pack .vpane.files.index.sy -side right -fill y
@@@ -2993,8 -2866,8 +2993,8 @@@ 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 [mc "Unstaged Changes"] \
 +${NS}::frame .vpane.files.workdir -height 100 -width 200
 +tlabel .vpane.files.workdir.title -text [mc "Unstaged Changes"] \
        -background lightsalmon -foreground black
  text $ui_workdir -background white -foreground black \
        -borderwidth 0 \
        -xscrollcommand {.vpane.files.workdir.sx set} \
        -yscrollcommand {.vpane.files.workdir.sy set} \
        -state disabled
 -scrollbar .vpane.files.workdir.sx -orient h -command [list $ui_workdir xview]
 -scrollbar .vpane.files.workdir.sy -orient v -command [list $ui_workdir yview]
 +${NS}::scrollbar .vpane.files.workdir.sx -orient h -command [list $ui_workdir xview]
 +${NS}::scrollbar .vpane.files.workdir.sy -orient v -command [list $ui_workdir yview]
  pack .vpane.files.workdir.title -side top -fill x
  pack .vpane.files.workdir.sx -side bottom -fill x
  pack .vpane.files.workdir.sy -side right -fill y
  pack $ui_workdir -side left -fill both -expand 1
  
 -.vpane.files add .vpane.files.workdir -sticky nsew
 -.vpane.files add .vpane.files.index -sticky nsew
 +.vpane.files add .vpane.files.workdir
 +.vpane.files add .vpane.files.index
 +if {!$use_ttk} {
 +      .vpane.files paneconfigure .vpane.files.workdir -sticky news
 +      .vpane.files paneconfigure .vpane.files.index -sticky news
 +}
  
  foreach i [list $ui_index $ui_workdir] {
        rmsel_tag $i
@@@ -3026,69 -2895,68 +3026,69 @@@ unset 
  
  # -- Diff and Commit Area
  #
 -frame .vpane.lower -height 300 -width 400
 -frame .vpane.lower.commarea
 -frame .vpane.lower.diff -relief sunken -borderwidth 1
 +${NS}::frame .vpane.lower -height 300 -width 400
 +${NS}::frame .vpane.lower.commarea
 +${NS}::frame .vpane.lower.diff -relief sunken -borderwidth 1
  pack .vpane.lower.diff -fill both -expand 1
  pack .vpane.lower.commarea -side bottom -fill x
 -.vpane add .vpane.lower -sticky nsew
 +.vpane add .vpane.lower
 +if {!$use_ttk} {.vpane paneconfigure .vpane.lower -sticky nsew}
  
  # -- Commit Area Buttons
  #
 -frame .vpane.lower.commarea.buttons
 -label .vpane.lower.commarea.buttons.l -text {} \
 +${NS}::frame .vpane.lower.commarea.buttons
 +${NS}::label .vpane.lower.commarea.buttons.l -text {} \
        -anchor w \
        -justify left
  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 [mc Rescan] \
 +${NS}::button .vpane.lower.commarea.buttons.rescan -text [mc Rescan] \
        -command ui_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 [mc "Stage Changed"] \
 +${NS}::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}
  
  if {![is_enabled nocommitmsg]} {
 -      button .vpane.lower.commarea.buttons.signoff -text [mc "Sign Off"] \
 +      ${NS}::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_btn_caption] \
 +${NS}::button .vpane.lower.commarea.buttons.commit -text [commit_btn_caption] \
        -command do_commit
  pack .vpane.lower.commarea.buttons.commit -side top -fill x
  lappend disable_on_lock \
        {.vpane.lower.commarea.buttons.commit conf -state}
  
  if {![is_enabled nocommit]} {
 -      button .vpane.lower.commarea.buttons.push -text [mc Push] \
 +      ${NS}::button .vpane.lower.commarea.buttons.push -text [mc Push] \
                -command do_push_anywhere
        pack .vpane.lower.commarea.buttons.push -side top -fill x
  }
  
  # -- Commit Message Buffer
  #
 -frame .vpane.lower.commarea.buffer
 -frame .vpane.lower.commarea.buffer.header
 +${NS}::frame .vpane.lower.commarea.buffer
 +${NS}::frame .vpane.lower.commarea.buffer.header
  set ui_comm .vpane.lower.commarea.buffer.t
  set ui_coml .vpane.lower.commarea.buffer.header.l
  
  if {![is_enabled nocommit]} {
 -      radiobutton .vpane.lower.commarea.buffer.header.new \
 +      ${NS}::radiobutton .vpane.lower.commarea.buffer.header.new \
                -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 \
 +      ${NS}::radiobutton .vpane.lower.commarea.buffer.header.amend \
                -text [mc "Amend Last Commit"] \
                -command do_select_commit_type \
                -variable selected_commit_type \
                [list .vpane.lower.commarea.buffer.header.amend conf -state]
  }
  
 -label $ui_coml \
 +${NS}::label $ui_coml \
        -anchor w \
        -justify left
  proc trace_commit_type {varname args} {
@@@ -3129,7 -2997,7 +3129,7 @@@ text $ui_comm -background white -foregr
        -width $repo_config(gui.commitmsgwidth) -height 9 -wrap none \
        -font font_diff \
        -yscrollcommand {.vpane.lower.commarea.buffer.sby set}
 -scrollbar .vpane.lower.commarea.buffer.sby \
 +${NS}::scrollbar .vpane.lower.commarea.buffer.sby \
        -command [list $ui_comm yview]
  pack .vpane.lower.commarea.buffer.header -side top -fill x
  pack .vpane.lower.commarea.buffer.sby -side right -fill y
@@@ -3195,19 -3063,19 +3195,19 @@@ proc trace_current_diff_path {varname a
  }
  trace add variable current_diff_path write trace_current_diff_path
  
 -frame .vpane.lower.diff.header -background gold
 -label .vpane.lower.diff.header.status \
 +gold_frame .vpane.lower.diff.header
 +tlabel .vpane.lower.diff.header.status \
        -background gold \
        -foreground black \
        -width $max_status_desc \
        -anchor w \
        -justify left
 -label .vpane.lower.diff.header.file \
 +tlabel .vpane.lower.diff.header.file \
        -background gold \
        -foreground black \
        -anchor w \
        -justify left
 -label .vpane.lower.diff.header.path \
 +tlabel .vpane.lower.diff.header.path \
        -background gold \
        -foreground black \
        -anchor w \
@@@ -3231,7 -3099,7 +3231,7 @@@ bind_button3 .vpane.lower.diff.header.p
  
  # -- Diff Body
  #
 -frame .vpane.lower.diff.body
 +${NS}::frame .vpane.lower.diff.body
  set ui_diff .vpane.lower.diff.body.t
  text $ui_diff -background white -foreground black \
        -borderwidth 0 \
        -xscrollcommand {.vpane.lower.diff.body.sbx set} \
        -yscrollcommand {.vpane.lower.diff.body.sby set} \
        -state disabled
 -scrollbar .vpane.lower.diff.body.sbx -orient horizontal \
 +${NS}::scrollbar .vpane.lower.diff.body.sbx -orient horizontal \
        -command [list $ui_diff xview]
 -scrollbar .vpane.lower.diff.body.sby -orient vertical \
 +${NS}::scrollbar .vpane.lower.diff.body.sby -orient vertical \
        -command [list $ui_diff yview]
  pack .vpane.lower.diff.body.sbx -side bottom -fill x
  pack .vpane.lower.diff.body.sby -side right -fill y
@@@ -3286,6 -3154,15 +3286,6 @@@ $ui_diff tag raise se
  #
  
  proc create_common_diff_popup {ctxm} {
 -      $ctxm add command \
 -              -label [mc "Show Less Context"] \
 -              -command show_less_context
 -      lappend diff_actions [list $ctxm entryconf [$ctxm index last] -state]
 -      $ctxm add command \
 -              -label [mc "Show More Context"] \
 -              -command show_more_context
 -      lappend diff_actions [list $ctxm entryconf [$ctxm index last] -state]
 -      $ctxm add separator
        $ctxm add command \
                -label [mc Refresh] \
                -command reshow_diff
@@@ -3337,19 -3214,10 +3337,19 @@@ set ui_diff_applyhunk [$ctxm index last
  lappend diff_actions [list $ctxm entryconf $ui_diff_applyhunk -state]
  $ctxm add command \
        -label [mc "Apply/Reverse Line"] \
 -      -command {apply_line $cursorX $cursorY; do_rescan}
 +      -command {apply_range_or_line $cursorX $cursorY; do_rescan}
  set ui_diff_applyline [$ctxm index last]
  lappend diff_actions [list $ctxm entryconf $ui_diff_applyline -state]
  $ctxm add separator
 +$ctxm add command \
 +      -label [mc "Show Less Context"] \
 +      -command show_less_context
 +lappend diff_actions [list $ctxm entryconf [$ctxm index last] -state]
 +$ctxm add command \
 +      -label [mc "Show More Context"] \
 +      -command show_more_context
 +lappend diff_actions [list $ctxm entryconf [$ctxm index last] -state]
 +$ctxm add separator
  create_common_diff_popup $ctxm
  
  set ctxmmg .vpane.lower.diff.body.ctxmmg
@@@ -3372,40 -3240,9 +3372,40 @@@ $ctxmmg add command 
        -command {merge_resolve_one 1}
  lappend diff_actions [list $ctxmmg entryconf [$ctxmmg index last] -state]
  $ctxmmg add separator
 +$ctxmmg add command \
 +      -label [mc "Show Less Context"] \
 +      -command show_less_context
 +lappend diff_actions [list $ctxmmg entryconf [$ctxmmg index last] -state]
 +$ctxmmg add command \
 +      -label [mc "Show More Context"] \
 +      -command show_more_context
 +lappend diff_actions [list $ctxmmg entryconf [$ctxmmg index last] -state]
 +$ctxmmg add separator
  create_common_diff_popup $ctxmmg
  
 -proc popup_diff_menu {ctxm ctxmmg x y X Y} {
 +set ctxmsm .vpane.lower.diff.body.ctxmsm
 +menu $ctxmsm -tearoff 0
 +$ctxmsm add command \
 +      -label [mc "Visualize These Changes In The Submodule"] \
 +      -command {do_gitk -- true}
 +lappend diff_actions [list $ctxmsm entryconf [$ctxmsm index last] -state]
 +$ctxmsm add command \
 +      -label [mc "Visualize Current Branch History In The Submodule"] \
 +      -command {do_gitk {} true}
 +lappend diff_actions [list $ctxmsm entryconf [$ctxmsm index last] -state]
 +$ctxmsm add command \
 +      -label [mc "Visualize All Branch History In The Submodule"] \
 +      -command {do_gitk --all true}
 +lappend diff_actions [list $ctxmsm entryconf [$ctxmsm index last] -state]
 +$ctxmsm add separator
 +$ctxmsm add command \
 +      -label [mc "Start git gui In The Submodule"] \
 +      -command {do_git_gui}
 +lappend diff_actions [list $ctxmsm entryconf [$ctxmsm index last] -state]
 +$ctxmsm add separator
 +create_common_diff_popup $ctxmsm
 +
 +proc popup_diff_menu {ctxm ctxmmg ctxmsm x y X Y} {
        global current_diff_path file_states
        set ::cursorX $x
        set ::cursorY $y
        }
        if {[string first {U} $state] >= 0} {
                tk_popup $ctxmmg $X $Y
 +      } elseif {$::is_submodule_diff} {
 +              tk_popup $ctxmsm $X $Y
        } else {
 +              set has_range [expr {[$::ui_diff tag nextrange sel 0.0] != {}}]
                if {$::ui_index eq $::current_diff_side} {
                        set l [mc "Unstage Hunk From Commit"]
 -                      set t [mc "Unstage Line From Commit"]
 +                      if {$has_range} {
 +                              set t [mc "Unstage Lines From Commit"]
 +                      } else {
 +                              set t [mc "Unstage Line From Commit"]
 +                      }
                } else {
                        set l [mc "Stage Hunk For Commit"]
 -                      set t [mc "Stage Line For Commit"]
 +                      if {$has_range} {
 +                              set t [mc "Stage Lines For Commit"]
 +                      } else {
 +                              set t [mc "Stage Line For Commit"]
 +                      }
                }
 -              if {$::is_3way_diff || $::is_submodule_diff
 +              if {$::is_3way_diff
                        || $current_diff_path eq {}
                        || {__} eq $state
                        || {_O} eq $state
                tk_popup $ctxm $X $Y
        }
  }
 -bind_button3 $ui_diff [list popup_diff_menu $ctxm $ctxmmg %x %y %X %Y]
 +bind_button3 $ui_diff [list popup_diff_menu $ctxm $ctxmmg $ctxmsm %x %y %X %Y]
  
  # -- Status Bar
  #
@@@ -3463,17 -3289,12 +3463,17 @@@ $main_status show [mc "Initializing..."
  catch {
  set gm $repo_config(gui.geometry)
  wm geometry . [lindex $gm 0]
 -.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]
 +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
  }
  
@@@ -3550,6 -3371,8 +3550,8 @@@ bind .   <$M1B-Key-s> do_signof
  bind .   <$M1B-Key-S> do_signoff
  bind .   <$M1B-Key-t> do_add_selection
  bind .   <$M1B-Key-T> do_add_selection
+ bind .   <$M1B-Key-j> do_revert_selection
+ bind .   <$M1B-Key-J> do_revert_selection
  bind .   <$M1B-Key-i> do_add_all
  bind .   <$M1B-Key-I> do_add_all
  bind .   <$M1B-Key-minus> {show_less_context;break}
@@@ -3568,7 -3391,7 +3570,7 @@@ unset 
  set file_lists($ui_index) [list]
  set file_lists($ui_workdir) [list]
  
 -wm title . "[appname] ([reponame]) [file normalize [file dirname [gitdir]]]"
 +wm title . "[appname] ([reponame]) [file normalize $_gitworktree]"
  focus -force $ui_comm
  
  # -- Warn the user about environmental problems.  Cygwin's Tcl
@@@ -3741,9 -3564,3 +3743,9 @@@ if {[is_enabled retcode]} 
  if {$picked && [is_config_true gui.autoexplore]} {
        do_explore
  }
 +
 +# Local variables:
 +# mode: tcl
 +# indent-tabs-mode: t
 +# tab-width: 4
 +# End: