Code

git-gui: Remove usernames from absolute SSH urls during merging
[git.git] / lib / commit.tcl
index dc7c88c6017bcb390c599f8b904ad3e7c31cc7d2..1f5c2c3d44684459fa9b9692ab85f54ff858d83b 100644 (file)
@@ -37,9 +37,14 @@ You are currently in the middle of a merge that has not been fully completed.  Y
                                        set enc [string tolower [string range $line 9 end]]
                                }
                        }
-                       set msg [encoding convertfrom $enc [read $fd]]
-                       set msg [string trim $msg]
+                       set msg [read $fd]
                        close $fd
+
+                       set enc [tcl_encoding $enc]
+                       if {$enc ne {}} {
+                               set msg [encoding convertfrom $enc $msg]
+                       }
+                       set msg [string trim $msg]
                } err]} {
                error_popup "Error loading commit data for amend:\n\n$err"
                return
@@ -209,7 +214,7 @@ A good commit message has the following format:
        ui_status {Calling pre-commit hook...}
        set pch_error {}
        set fd_ph [open "| $pchook" r]
-       fconfigure $fd_ph -blocking 0 -translation binary
+       fconfigure $fd_ph -blocking 0 -translation binary -eofchar {}
        fileevent $fd_ph readable \
                [list commit_prehook_wait $fd_ph $curHEAD $msg]
 }
@@ -258,7 +263,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.
 
@@ -276,11 +292,18 @@ A rescan will be automatically started now.
        #
        set msg_p [gitdir COMMIT_EDITMSG]
        set msg_wt [open $msg_p w]
+       fconfigure $msg_wt -translation lf
        if {[catch {set enc $repo_config(i18n.commitencoding)}]} {
                set enc utf-8
        }
-       fconfigure $msg_wt -encoding binary -translation binary
-       puts -nonewline $msg_wt [encoding convertto $enc $msg]
+       set use_enc [tcl_encoding $enc]
+       if {$use_enc ne {}} {
+               fconfigure $msg_wt -encoding $use_enc
+       } else {
+               puts stderr "warning: Tcl does not support encoding '$enc'."
+               fconfigure $msg_wt -encoding utf-8
+       }
+       puts -nonewline $msg_wt $msg
        close $msg_wt
 
        # -- Create the commit.
@@ -356,6 +379,10 @@ A rescan will be automatically started now.
        $ui_comm delete 0.0 end
        $ui_comm edit reset
        $ui_comm edit modified false
+       if {$::GITGUI_BCK_exists} {
+               catch {file delete [gitdir GITGUI_BCK]}
+               set ::GITGUI_BCK_exists 0
+       }
 
        if {[is_enabled singlecommit]} do_quit