Merge branch 'master' of git://repo.or.cz/git/fastimport
[gitweb.git] / git-gui / lib / commit.tcl
index f9791f64dbec927726622f3d0a368606a4f13b17..46a78c158f53372a481061e9a5a6072c40e54e58 100644 (file)
@@ -25,7 +25,7 @@ You are currently in the middle of a merge that has not been fully completed.  Y
        set msg {}
        set parents [list]
        if {[catch {
-                       set fd [open "| git cat-file commit $curHEAD" r]
+                       set fd [git_read cat-file commit $curHEAD]
                        fconfigure $fd -encoding binary -translation lf
                        if {[catch {set enc $repo_config(i18n.commitencoding)}]} {
                                set enc utf-8
@@ -58,7 +58,7 @@ You are currently in the middle of a merge that has not been fully completed.  Y
        $ui_comm insert end $msg
        $ui_comm edit reset
        $ui_comm edit modified false
-       rescan {set ui_status_value {Ready.}}
+       rescan ui_ready
 }
 
 set GIT_COMMITTER_IDENT {}
@@ -108,12 +108,12 @@ proc create_new_commit {} {
        $ui_comm delete 0.0 end
        $ui_comm edit reset
        $ui_comm edit modified false
-       rescan {set ui_status_value {Ready.}}
+       rescan ui_ready
 }
 
 proc commit_tree {} {
        global HEAD commit_type file_states ui_comm repo_config
-       global ui_status_value pch_error
+       global pch_error
 
        if {[committer_ident] eq {}} return
        if {![lock_index update]} return
@@ -132,7 +132,7 @@ Another Git program has modified this repository since the last scan.  A rescan
 The rescan will be automatically started now.
 }
                unlock_index
-               rescan {set ui_status_value {Ready.}}
+               rescan ui_ready
                return
        }
 
@@ -206,7 +206,7 @@ A good commit message has the following format:
                return
        }
 
-       set ui_status_value {Calling pre-commit hook...}
+       ui_status {Calling pre-commit hook...}
        set pch_error {}
        set fd_ph [open "| $pchook" r]
        fconfigure $fd_ph -blocking 0 -translation binary
@@ -215,13 +215,13 @@ A good commit message has the following format:
 }
 
 proc commit_prehook_wait {fd_ph curHEAD msg} {
-       global pch_error ui_status_value
+       global pch_error
 
        append pch_error [read $fd_ph]
        fconfigure $fd_ph -blocking 1
        if {[eof $fd_ph]} {
                if {[catch {close $fd_ph}]} {
-                       set ui_status_value {Commit declined by pre-commit hook.}
+                       ui_status {Commit declined by pre-commit hook.}
                        hook_failed_popup pre-commit $pch_error
                        unlock_index
                } else {
@@ -234,25 +234,23 @@ proc commit_prehook_wait {fd_ph curHEAD msg} {
 }
 
 proc commit_writetree {curHEAD msg} {
-       global ui_status_value
-
-       set ui_status_value {Committing changes...}
-       set fd_wt [open "| git write-tree" r]
+       ui_status {Committing changes...}
+       set fd_wt [git_read write-tree]
        fileevent $fd_wt readable \
                [list commit_committree $fd_wt $curHEAD $msg]
 }
 
 proc commit_committree {fd_wt curHEAD msg} {
        global HEAD PARENT MERGE_HEAD commit_type
-       global all_heads current_branch
-       global ui_status_value ui_comm selected_commit_type
+       global current_branch
+       global ui_comm selected_commit_type
        global file_states selected_paths rescan_active
        global repo_config
 
        gets $fd_wt tree_id
        if {$tree_id eq {} || [catch {close $fd_wt} err]} {
                error_popup "write-tree failed:\n\n$err"
-               set ui_status_value {Commit failed.}
+               ui_status {Commit failed.}
                unlock_index
                return
        }
@@ -260,7 +258,18 @@ proc commit_committree {fd_wt curHEAD msg} {
        # -- Verify this wasn't an empty change.
        #
        if {$commit_type eq {normal}} {
-               set old_tree [git rev-parse "$PARENT^{tree}"]
+               set fd_ot [git_read cat-file commit $PARENT]
+               fconfigure $fd_ot -encoding binary -translation lf
+               set old_tree [gets $fd_ot]
+               close $fd_ot
+
+               if {[string equal -length 5 {tree } $old_tree]
+                       && [string length $old_tree] == 45} {
+                       set old_tree [string range $old_tree 5 end]
+               } else {
+                       error "Commit $PARENT appears to be corrupt"
+               }
+
                if {$tree_id eq $old_tree} {
                        info_popup {No changes to commit.
 
@@ -269,7 +278,7 @@ No files were modified by this commit and it was not a merge commit.
 A rescan will be automatically started now.
 }
                        unlock_index
-                       rescan {set ui_status_value {No changes to commit.}}
+                       rescan {ui_status {No changes to commit.}}
                        return
                }
        }
@@ -294,7 +303,7 @@ A rescan will be automatically started now.
        lappend cmd <$msg_p
        if {[catch {set cmt_id [eval git $cmd]} err]} {
                error_popup "commit-tree failed:\n\n$err"
-               set ui_status_value {Commit failed.}
+               ui_status {Commit failed.}
                unlock_index
                return
        }
@@ -316,7 +325,7 @@ A rescan will be automatically started now.
                        git update-ref -m $reflogm HEAD $cmt_id $curHEAD
                } err]} {
                error_popup "update-ref failed:\n\n$err"
-               set ui_status_value {Commit failed.}
+               ui_status {Commit failed.}
                unlock_index
                return
        }
@@ -331,7 +340,12 @@ A rescan will be automatically started now.
 
        # -- Let rerere do its thing.
        #
-       if {[file isdirectory [gitdir rr-cache]]} {
+       if {[get_config rerere.enabled] eq {}} {
+               set rerere [file isdirectory [gitdir rr-cache]]
+       } else {
+               set rerere [is_config_true rerere.enabled]
+       }
+       if {$rerere} {
                catch {git rerere}
        }
 
@@ -356,14 +370,6 @@ A rescan will be automatically started now.
 
        if {[is_enabled singlecommit]} do_quit
 
-       # -- Make sure our current branch exists.
-       #
-       if {$commit_type eq {initial}} {
-               lappend all_heads $current_branch
-               set all_heads [lsort -unique $all_heads]
-               populate_branch_menu
-       }
-
        # -- Update in memory status
        #
        set selected_commit_type new
@@ -405,6 +411,5 @@ A rescan will be automatically started now.
        display_all_files
        unlock_index
        reshow_diff
-       set ui_status_value \
-               "Created commit [string range $cmt_id 0 7]: $subject"
+       ui_status "Created commit [string range $cmt_id 0 7]: $subject"
 }