git-gui: prevent double UTF-8 conversion
[gitweb.git] / lib / commit.tcl
index 60edf99752f58a618a8ca59ec352f5c678b13671..75ea965dacd71289dd6b965a51f40bb3c1298f5b 100644 (file)
@@ -1,13 +1,8 @@
 # git-gui misc. commit reading/writing support
 # Copyright (C) 2006, 2007 Shawn Pearce
 
-set author_name ""
-set author_email ""
-set author_date ""
-
 proc load_last_commit {} {
-       global HEAD PARENT MERGE_HEAD commit_type ui_comm
-       global author_name author_email author_date
+       global HEAD PARENT MERGE_HEAD commit_type ui_comm commit_author
        global repo_config
 
        if {[llength $PARENT] == 0} {
@@ -30,6 +25,8 @@ You are currently in the middle of a merge that has not been fully completed.  Y
        set msg {}
        set parents [list]
        if {[catch {
+                       set name ""
+                       set email ""
                        set fd [git_read cat-file commit $curHEAD]
                        fconfigure $fd -encoding binary -translation lf
                        # By default commits are assumed to be in utf-8
@@ -39,11 +36,7 @@ You are currently in the middle of a merge that has not been fully completed.  Y
                                        lappend parents [string range $line 7 end]
                                } elseif {[string match {encoding *} $line]} {
                                        set enc [string tolower [string range $line 9 end]]
-                               } elseif {[regexp "author (.*)\\s<(.*)>\\s(\\d.*$)" $line all name email time]} {
-                                       set author_name $name
-                                       set author_email $email
-                                       set author_date $time
-                               }
+                               } elseif {[regexp "author (.*)\\s<(.*)>\\s(\\d.*$)" $line all name email time]} { }
                        }
                        set msg [read $fd]
                        close $fd
@@ -51,7 +44,13 @@ You are currently in the middle of a merge that has not been fully completed.  Y
                        set enc [tcl_encoding $enc]
                        if {$enc ne {}} {
                                set msg [encoding convertfrom $enc $msg]
+                               set name [encoding convertfrom $enc $name]
+                               set email [encoding convertfrom $enc $email]
+                       }
+                       if {$name ne {} && $email ne {}} {
+                               set commit_author [list name $name email $email date $time]
                        }
+
                        set msg [string trim $msg]
                } err]} {
                error_popup [strcat [mc "Error loading commit data for amend:"] "\n\n$err"]
@@ -115,13 +114,10 @@ proc do_signoff {} {
 }
 
 proc create_new_commit {} {
-       global commit_type ui_comm
-       global author_name author_email author_date
+       global commit_type ui_comm commit_author
 
        set commit_type normal
-       set author_name ""
-       set author_email ""
-       set author_date ""
+       unset -nocomplain commit_author
        $ui_comm delete 0.0 end
        $ui_comm edit reset
        $ui_comm edit modified false
@@ -335,12 +331,12 @@ proc commit_writetree {curHEAD msg_p} {
 }
 
 proc commit_committree {fd_wt curHEAD msg_p} {
-       global HEAD PARENT MERGE_HEAD commit_type
+       global HEAD PARENT MERGE_HEAD commit_type commit_author
        global current_branch
        global ui_comm selected_commit_type
        global file_states selected_paths rescan_active
        global repo_config
-       global env author_name author_email author_date
+       global env
 
        gets $fd_wt tree_id
        if {[catch {close $fd_wt} err]} {
@@ -380,14 +376,15 @@ A rescan will be automatically started now.
                }
        }
 
-       if {$author_name ne ""} {
-               set env(GIT_AUTHOR_NAME) $author_name
-               set env(GIT_AUTHOR_EMAIL) $author_email
-               set env(GIT_AUTHOR_DATE) $author_date
+       if {[info exists commit_author]} {
+               set old_author [commit_author_ident $commit_author]
        }
        # -- Create the commit.
        #
        set cmd [list commit-tree $tree_id]
+       if {[is_config_true commit.gpgsign]} {
+               lappend cmd -S
+       }
        foreach p [concat $PARENT $MERGE_HEAD] {
                lappend cmd -p $p
        }
@@ -397,8 +394,14 @@ A rescan will be automatically started now.
                error_popup [strcat [mc "commit-tree failed:"] "\n\n$err"]
                ui_status [mc "Commit failed."]
                unlock_index
+               unset -nocomplain commit_author
+               commit_author_reset $old_author
                return
        }
+       if {[info exists commit_author]} {
+               unset -nocomplain commit_author
+               commit_author_reset $old_author
+       }
 
        # -- Update the HEAD ref.
        #
@@ -525,3 +528,20 @@ proc commit_postcommit_wait {fd_ph cmt_id} {
        }
        fconfigure $fd_ph -blocking 0
 }
+
+proc commit_author_ident {details} {
+       global env
+       array set author $details
+       set old [array get env GIT_AUTHOR_*]
+       set env(GIT_AUTHOR_NAME) $author(name)
+       set env(GIT_AUTHOR_EMAIL) $author(email)
+       set env(GIT_AUTHOR_DATE) $author(date)
+       return $old
+}
+proc commit_author_reset {details} {
+       global env
+       unset env(GIT_AUTHOR_NAME) env(GIT_AUTHOR_EMAIL) env(GIT_AUTHOR_DATE)
+       if {$details ne {}} {
+               array set env $details
+       }
+}