git-gui: Disable pull menu items when the index is locked.
[gitweb.git] / git-gui
diff --git a/git-gui b/git-gui
index 83f713535f323f605a426bf27420c1dd22940ee6..4041aaacd9ff6d82010b1344372192bfdcc3b04b 100755 (executable)
--- a/git-gui
+++ b/git-gui
@@ -71,6 +71,7 @@ proc update_status {{final Ready.}} {
        global HEAD PARENT commit_type
        global ui_index ui_other ui_status_value ui_comm
        global status_active file_states
+       global cfg_trust_mtime
 
        if {$status_active || ![lock_index read]} return
 
@@ -100,22 +101,28 @@ proc update_status {{final Ready.}} {
                $ui_comm edit modified false
        }
 
-       set status_active 1
-       set ui_status_value {Refreshing file status...}
-       set fd_rf [open "| git update-index -q --unmerged --refresh" r]
-       fconfigure $fd_rf -blocking 0 -translation binary
-       fileevent $fd_rf readable [list read_refresh $fd_rf $final]
+       if {$cfg_trust_mtime == {true}} {
+               update_status_stage2 {} $final
+       } else {
+               set status_active 1
+               set ui_status_value {Refreshing file status...}
+               set fd_rf [open "| git update-index -q --unmerged --refresh" r]
+               fconfigure $fd_rf -blocking 0 -translation binary
+               fileevent $fd_rf readable [list update_status_stage2 $fd_rf $final]
+       }
 }
 
-proc read_refresh {fd final} {
+proc update_status_stage2 {fd final} {
        global gitdir PARENT commit_type
        global ui_index ui_other ui_status_value ui_comm
        global status_active file_states
        global buf_rdi buf_rdf buf_rlo
 
-       read $fd
-       if {![eof $fd]} return
-       close $fd
+       if {$fd != {}} {
+               read $fd
+               if {![eof $fd]} return
+               close $fd
+       }
 
        set ls_others [list | git ls-files --others -z \
                --exclude-per-directory=.gitignore]
@@ -635,6 +642,7 @@ proc fetch_from {remote} {
 }
 
 proc pull_remote {remote branch} {
+       if {![lock_index update]} return
        set w [new_console "pull $remote $branch" \
                "Pulling new changes from branch $branch in $remote"]
        set cmd [list git pull]
@@ -644,6 +652,7 @@ proc pull_remote {remote branch} {
 }
 
 proc post_pull_remote {remote branch success} {
+       unlock_index
        if {$success} {
                update_status "Successfully pulled $branch from $remote."
        } else {
@@ -860,6 +869,7 @@ proc toggle_mode {path} {
 
 proc load_repo_config {} {
        global repo_config
+       global cfg_trust_mtime
 
        array unset repo_config
        catch {
@@ -871,6 +881,22 @@ proc load_repo_config {} {
                }
                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
+       }
 }
 
 proc load_all_remotes {} {
@@ -906,7 +932,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 {}
@@ -935,6 +961,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]
                }
        }
 }
@@ -1276,6 +1304,14 @@ proc do_gitk {} {
        }
 }
 
+proc do_repack {} {
+       set w [new_console "repack" "Repacking the object database"]
+       set cmd [list git repack]
+       lappend cmd -a
+       lappend cmd -d
+       console_exec $w $cmd
+}
+
 proc do_quit {} {
        global gitdir ui_comm
 
@@ -1291,6 +1327,7 @@ proc do_quit {} {
                file delete $save
        }
 
+       save_my_config
        destroy .
 }
 
@@ -1399,6 +1436,7 @@ menu .mbar -tearoff 0
 .mbar add cascade -label Fetch -menu .mbar.fetch
 .mbar add cascade -label Pull -menu .mbar.pull
 .mbar add cascade -label Push -menu .mbar.push
+.mbar add cascade -label Options -menu .mbar.options
 . configure -menu .mbar
 
 # -- Project Menu
@@ -1406,6 +1444,9 @@ menu .mbar.project
 .mbar.project add command -label Visualize \
        -command do_gitk \
        -font $mainfont
+.mbar.project add command -label {Repack Database} \
+       -command do_repack \
+       -font $mainfont
 .mbar.project add command -label Quit \
        -command do_quit \
        -accelerator $M1T-Q \
@@ -1450,6 +1491,13 @@ menu .mbar.pull
 # -- Push Menu
 menu .mbar.push
 
+# -- Options Menu
+menu .mbar.options
+.mbar.options add checkbutton -label {Trust File Modification Timestamps} \
+       -offvalue false \
+       -onvalue true \
+       -variable cfg_trust_mtime
+
 # -- Main Window Layout
 panedwindow .vpane -orient vertical
 panedwindow .vpane.files -orient horizontal