aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShawn O. Pearce <spearce@spearce.org>2007-10-23 16:55:32 -0400
committerShawn O. Pearce <spearce@spearce.org>2007-10-23 18:49:27 -0400
commitd4e890e5de1ea7107d8d1b4134ab0144bbf27b8c (patch)
tree544179f241eaaf5e5ec8767987b77141a7c82afd
parentbbbadf6e58f72ac6bf739d2a1109cbd872eb1083 (diff)
downloadgit-d4e890e5de1ea7107d8d1b4134ab0144bbf27b8c.tar.gz
git-d4e890e5de1ea7107d8d1b4134ab0144bbf27b8c.tar.xz
git-gui: Make sure we get errors from git-update-index
I'm seeing a lot of silent failures from git-update-index on Windows and this is leaving the index.lock file intact, which means users are later unable to perform additional operations. When the index is locked behind our back and we are unable to use it we may need to allow the user to delete the index lock and try again. However our UI state is probably not currect as we have assumed that some changes were applied but none of them actually did. A rescan is the easiest (in code anyway) solution to correct our UI to show what the index really has (or doesn't have). Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
-rw-r--r--lib/index.tcl61
1 files changed, 52 insertions, 9 deletions
diff --git a/lib/index.tcl b/lib/index.tcl
index 44689ab63..28ca03901 100644
--- a/lib/index.tcl
+++ b/lib/index.tcl
@@ -1,6 +1,55 @@
# git-gui index (add/remove) support
# Copyright (C) 2006, 2007 Shawn Pearce
+proc _delete_indexlock {} {
+ if {[catch {file delete -- [gitdir index.lock]} err]} {
+ error_popup [strcat [mc "Unable to unlock the index."] "\n\n$err"]
+ }
+}
+
+proc _close_updateindex {fd after} {
+ fconfigure $fd -blocking 1
+ if {[catch {close $fd} err]} {
+ set w .indexfried
+ toplevel $w
+ wm title $w [strcat "[appname] ([reponame]): " [mc "Index Error"]]
+ wm geometry $w "+[winfo rootx .]+[winfo rooty .]"
+ pack [label $w.msg \
+ -justify left \
+ -anchor w \
+ -text [strcat \
+ [mc "Updating the Git index failed. A rescan will be automatically started to resynchronize git-gui."] \
+ "\n\n$err"] \
+ ] -anchor w
+
+ frame $w.buttons
+ button $w.buttons.continue \
+ -text [mc "Continue"] \
+ -command [list destroy $w]
+ pack $w.buttons.continue -side right -padx 5
+ button $w.buttons.unlock \
+ -text [mc "Unlock Index"] \
+ -command "destroy $w; _delete_indexlock"
+ pack $w.buttons.unlock -side right
+ pack $w.buttons -side bottom -fill x -pady 10 -padx 10
+
+ wm protocol $w WM_DELETE_WINDOW update
+ bind $w.buttons.continue <Visibility> "
+ grab $w
+ focus $w.buttons.continue
+ "
+ tkwait window $w
+
+ $::main_status stop
+ unlock_index
+ rescan $after 0
+ return
+ }
+
+ unlock_index
+ uplevel #0 $after
+}
+
proc update_indexinfo {msg pathList after} {
global update_index_cp
@@ -41,9 +90,7 @@ proc write_update_indexinfo {fd pathList totalCnt batch msg after} {
global file_states current_diff_path
if {$update_index_cp >= $totalCnt} {
- close $fd
- unlock_index
- uplevel #0 $after
+ _close_updateindex $fd $after
return
}
@@ -116,9 +163,7 @@ proc write_update_index {fd pathList totalCnt batch msg after} {
global file_states current_diff_path
if {$update_index_cp >= $totalCnt} {
- close $fd
- unlock_index
- uplevel #0 $after
+ _close_updateindex $fd $after
return
}
@@ -201,9 +246,7 @@ proc write_checkout_index {fd pathList totalCnt batch msg after} {
global file_states current_diff_path
if {$update_index_cp >= $totalCnt} {
- close $fd
- unlock_index
- uplevel #0 $after
+ _close_updateindex $fd $after
return
}