Code

git-gui: Change accelerator for "Include All" to M1-I.
[git.git] / git-gui
diff --git a/git-gui b/git-gui
index 2d82152b362f9b34722b88b72f64539da2380a16..20c36c2d2e3e2c9bf68da635bdd001f0c806417a 100755 (executable)
--- a/git-gui
+++ b/git-gui
@@ -7,6 +7,86 @@ exec wish "$0" -- "$@"
 # and distributed under the terms of the GNU General Public Licence,
 # either version 2, or (at your option) any later version.
 
+######################################################################
+##
+## config
+
+proc load_repo_config {} {
+       global repo_config
+       global cfg_trust_mtime
+
+       array unset repo_config
+       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
+                       }
+               }
+               close $fd_rc
+       }
+
+       if {[catch {set cfg_trust_mtime \
+                       [lindex $repo_config(gui.trustmtime) 0]
+               }]} {
+               set cfg_trust_mtime false
+       }
+}
+
+proc save_my_config {} {
+       global repo_config
+       global cfg_trust_mtime
+
+       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]
+       }
+
+       set cfg_geometry [list \
+               [wm geometry .] \
+               [.vpane sash coord 0] \
+               [.vpane.files sash coord 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]
+       }
+}
+
+######################################################################
+##
+## repository setup
+
+set appname [lindex [file split $argv0] end]
+set gitdir {}
+set GIT_COMMITTER_IDENT {}
+
+if {[catch {set cdup [exec git rev-parse --show-cdup]} err]} {
+       show_msg {} . "Cannot find the git directory: $err"
+       exit 1
+}
+if {$cdup != ""} {
+       cd $cdup
+}
+unset cdup
+
+if {[catch {set gitdir [exec git rev-parse --git-dir]} err]} {
+       show_msg {} . "Cannot find the git directory: $err"
+       exit 1
+}
+
+if {$appname == {git-citool}} {
+       set single_commit 1
+}
+
+load_repo_config
+
 ######################################################################
 ##
 ## task management
@@ -14,7 +94,7 @@ exec wish "$0" -- "$@"
 set single_commit 0
 set status_active 0
 set diff_active 0
-set checkin_active 0
+set update_active 0
 set commit_active 0
 set update_index_fd {}
 
@@ -469,7 +549,7 @@ before committing.
                        error_popup "Unmerged files cannot be committed.
 
 File $path has merge conflicts.
-You must resolve them and check the file in before committing.
+You must resolve them and include the file before committing.
 "
                        unlock_index
                        return
@@ -483,9 +563,9 @@ File $path cannot be committed by this program.
                }
        }
        if {!$files_ready} {
-               error_popup {No checked-in files to commit.
+               error_popup {No included files to commit.
 
-You must check-in at least 1 file before you can commit.
+You must include at least 1 file before you can commit.
 }
                unlock_index
                return
@@ -626,7 +706,7 @@ proc commit_stage2 {fd_wt curHEAD msg} {
        set HEAD $cmt_id
        set PARENT $cmt_id
        unlock_index
-       update_status "Changes committed as $cmt_id."
+       update_status "Changes committed as [string range $cmt_id 0 7]."
 }
 
 ######################################################################
@@ -642,7 +722,40 @@ proc fetch_from {remote} {
 }
 
 proc pull_remote {remote branch} {
+       global HEAD commit_type
+       global file_states
+
        if {![lock_index update]} return
+
+       # -- Our in memory state should match the repository.
+       #
+       repository_state curHEAD cur_type
+       if {$commit_type != $cur_type || $HEAD != $curHEAD} {
+               error_popup {Last scanned state does not match repository state.
+
+Its highly likely that another Git program modified the
+repository since our last scan.  A rescan is required
+before a pull can be started.
+}
+               unlock_index
+               update_status
+               return
+       }
+
+       # -- No differences should exist before a pull.
+       #
+       if {[array size file_states] != 0} {
+               error_popup {Uncommitted but modified files are present.
+
+You should not perform a pull with unmodified files in your working
+directory as Git would be unable to recover from an incorrect merge.
+
+Commit or throw away all changes before starting a pull operation.
+}
+               unlock_index
+               return
+       }
+
        set w [new_console "pull $remote $branch" \
                "Pulling new changes from branch $branch in $remote"]
        set cmd [list git pull]
@@ -652,9 +765,14 @@ proc pull_remote {remote branch} {
 }
 
 proc post_pull_remote {remote branch success} {
+       global HEAD PARENT commit_type
+       global ui_status_value
+
        unlock_index
        if {$success} {
-               update_status "Successfully pulled $branch from $remote."
+               repository_state HEAD commit_type
+               set PARENT $HEAD
+               set $ui_status_value {Ready.}
        } else {
                update_status "Conflicts detected while pulling $branch from $remote."
        }
@@ -781,7 +899,7 @@ proc display_file {path state} {
                $new_w image create $lno.0 \
                        -align center -padx 5 -pady 1 \
                        -name [lindex $s 1] \
-                       -image [mapicon $m $path]
+                       -image $new_icon
                $new_w insert $lno.1 "$path\n"
                $new_w conf -state disabled
        } elseif {$new_icon != [mapicon $old_m $path]} {
@@ -865,39 +983,7 @@ proc toggle_mode {path} {
 
 ######################################################################
 ##
-## config (fetch push pull)
-
-proc load_repo_config {} {
-       global repo_config
-       global cfg_trust_mtime
-
-       array unset repo_config
-       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
-                       }
-               }
-               close $fd_rc
-       }
-
-       if {[catch {set cfg_trust_mtime $repo_config(gui.trustmtime)}]} {
-               set cfg_trust_mtime false
-       }
-}
-
-proc save_my_config {} {
-       global repo_config
-       global cfg_trust_mtime
-
-       if {[catch {set rc_trustMTime $repo_config(gui.trustmtime)}]} {
-               set rc_trustMTime false
-       }
-       if {$cfg_trust_mtime != $rc_trustMTime} {
-               exec git repo-config gui.trustMTime $cfg_trust_mtime
-       }
-}
+## remote management
 
 proc load_all_remotes {} {
        global gitdir all_remotes repo_config
@@ -932,7 +1018,7 @@ proc populate_remote_menu {m pfx op} {
 }
 
 proc populate_pull_menu {m} {
-       global gitdir repo_config all_remotes mainfont
+       global gitdir repo_config all_remotes mainfont disable_on_lock
 
        foreach remote $all_remotes {
                set rb {}
@@ -961,6 +1047,8 @@ proc populate_pull_menu {m} {
                                -label "Branch $rb_short from $remote..." \
                                -command [list pull_remote $remote $rb] \
                                -font $mainfont
+                       lappend disable_on_lock \
+                               [list $m entryconf [$m index last] -state]
                }
        }
 }
@@ -1048,7 +1136,7 @@ foreach i {
                {__ i plain    "Unmodified"}
                {_M i mod      "Modified"}
                {M_ i fulltick "Checked in"}
-               {MM i parttick "Partially checked in"}
+               {MM i parttick "Partially included"}
 
                {_O o plain    "Untracked"}
                {A_ o fulltick "Added"}
@@ -1333,13 +1421,13 @@ proc do_rescan {} {
        update_status
 }
 
-proc do_checkin_all {} {
-       global checkin_active ui_status_value
+proc do_include_all {} {
+       global update_active ui_status_value
 
-       if {$checkin_active || ![lock_index begin-update]} return
+       if {$update_active || ![lock_index begin-update]} return
 
-       set checkin_active 1
-       set ui_status_value {Checking in all files...}
+       set update_active 1
+       set ui_status_value {Including all modified files...}
        after 1 {
                with_update_index {
                        foreach path [array names file_states] {
@@ -1353,25 +1441,32 @@ proc do_checkin_all {} {
                                }
                        }
                }
-               set checkin_active 0
+               set update_active 0
                set ui_status_value {Ready.}
        }
 }
 
 proc do_signoff {} {
-       global ui_comm
+       global ui_comm GIT_COMMITTER_IDENT
 
-       catch {
-               set me [exec git var GIT_COMMITTER_IDENT]
-               if {[regexp {(.*) [0-9]+ [-+0-9]+$} $me me name]} {
-                       set str "Signed-off-by: $name"
-                       if {[$ui_comm get {end -1c linestart} {end -1c}] != $str} {
-                               $ui_comm insert end "\n"
-                               $ui_comm insert end $str
-                               $ui_comm see end
-                       }
+       if {$GIT_COMMITTER_IDENT == {}} {
+               if {[catch {set me [exec git var GIT_COMMITTER_IDENT]} err]} {
+                       error_popup "Unable to obtain your identity:\n$err"
+                       return
+               }
+               if {![regexp {^(.*) [0-9]+ [-+0-9]+$} \
+                       $me me GIT_COMMITTER_IDENT]} {
+                       error_popup "Invalid GIT_COMMITTER_IDENT:\n$me"
+                       return
                }
        }
+
+       set str "Signed-off-by: $GIT_COMMITTER_IDENT"
+       if {[$ui_comm get {end -1c linestart} {end -1c}] != $str} {
+               $ui_comm insert end "\n"
+               $ui_comm insert end $str
+               $ui_comm see end
+       }
 }
 
 proc do_amend_last {} {
@@ -1463,9 +1558,9 @@ lappend disable_on_lock \
        -font $mainfont
 lappend disable_on_lock \
        [list .mbar.commit entryconf [.mbar.commit index last] -state]
-.mbar.commit add command -label {Check-in All Files} \
-       -command do_checkin_all \
-       -accelerator $M1T-U \
+.mbar.commit add command -label {Include All Files} \
+       -command do_include_all \
+       -accelerator $M1T-I \
        -font $mainfont
 lappend disable_on_lock \
        [list .mbar.commit entryconf [.mbar.commit index last] -state]
@@ -1491,7 +1586,7 @@ menu .mbar.push
 
 # -- Options Menu
 menu .mbar.options
-.mbar.options add checkbutton -label {Trust File Modification Timestamp} \
+.mbar.options add checkbutton -label {Trust File Modification Timestamps} \
        -offvalue false \
        -onvalue true \
        -variable cfg_trust_mtime
@@ -1568,11 +1663,11 @@ button .vpane.lower.commarea.buttons.amend -text {Amend Last} \
 pack .vpane.lower.commarea.buttons.amend -side top -fill x
 lappend disable_on_lock {.vpane.lower.commarea.buttons.amend conf -state}
 
-button .vpane.lower.commarea.buttons.ciall -text {Check-in All} \
-       -command do_checkin_all \
+button .vpane.lower.commarea.buttons.incall -text {Include All} \
+       -command do_include_all \
        -font $mainfont
-pack .vpane.lower.commarea.buttons.ciall -side top -fill x
-lappend disable_on_lock {.vpane.lower.commarea.buttons.ciall conf -state}
+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} \
        -command do_signoff \
@@ -1675,16 +1770,26 @@ label .status -textvariable ui_status_value \
        -font $mainfont
 pack .status -anchor w -side bottom -fill x
 
+# -- Load geometry
+catch {
+wm geometry . [lindex $repo_config(gui.geometry) 0 0]
+eval .vpane sash place 0 [lindex $repo_config(gui.geometry) 0 1]
+eval .vpane.files sash place 0 [lindex $repo_config(gui.geometry) 0 2]
+}
+
 # -- Key Bindings
 bind $ui_comm <$M1B-Key-Return> {do_commit;break}
+bind $ui_comm <$M1B-Key-i> {do_include_all;break}
+bind $ui_comm <$M1B-Key-I> {do_include_all;break}
+
 bind .   <Destroy> do_quit
 bind all <Key-F5> do_rescan
 bind all <$M1B-Key-r> do_rescan
 bind all <$M1B-Key-R> do_rescan
 bind .   <$M1B-Key-s> do_signoff
 bind .   <$M1B-Key-S> do_signoff
-bind .   <$M1B-Key-u> do_checkin_all
-bind .   <$M1B-Key-U> do_checkin_all
+bind .   <$M1B-Key-i> do_include_all
+bind .   <$M1B-Key-I> do_include_all
 bind .   <$M1B-Key-Return> do_commit
 bind all <$M1B-Key-q> do_quit
 bind all <$M1B-Key-Q> do_quit
@@ -1697,34 +1802,8 @@ foreach i [list $ui_index $ui_other] {
 }
 unset i M1B M1T
 
-######################################################################
-##
-## main
-
-set appname [lindex [file split $argv0] end]
-set gitdir {}
-
-if {[catch {set cdup [exec git rev-parse --show-cdup]} err]} {
-       show_msg {} . "Cannot find the git directory: $err"
-       exit 1
-}
-if {$cdup != ""} {
-       cd $cdup
-}
-unset cdup
-
-if {[catch {set gitdir [exec git rev-parse --git-dir]} err]} {
-       show_msg {} . "Cannot find the git directory: $err"
-       exit 1
-}
-
-if {$appname == {git-citool}} {
-       set single_commit 1
-}
-
 wm title . "$appname ([file normalize [file dirname $gitdir]])"
 focus -force $ui_comm
-load_repo_config
 load_all_remotes
 populate_remote_menu .mbar.fetch From fetch_from
 populate_remote_menu .mbar.push To push_to