git-gui: Grab the index lock while running pull.
[gitweb.git] / git-gui
diff --git a/git-gui b/git-gui
index eb7329c218e9411beb0c5a57f6dd1014e5b1e1e5..2d82152b362f9b34722b88b72f64539da2380a16 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 {} {
@@ -1299,6 +1325,7 @@ proc do_quit {} {
                file delete $save
        }
 
+       save_my_config
        destroy .
 }
 
@@ -1407,6 +1434,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
@@ -1461,6 +1489,13 @@ menu .mbar.pull
 # -- Push Menu
 menu .mbar.push
 
+# -- Options Menu
+menu .mbar.options
+.mbar.options add checkbutton -label {Trust File Modification Timestamp} \
+       -offvalue false \
+       -onvalue true \
+       -variable cfg_trust_mtime
+
 # -- Main Window Layout
 panedwindow .vpane -orient vertical
 panedwindow .vpane.files -orient horizontal