git-gui: avoid persisting modified author identity
authorPat Thoyts <patthoyts@users.sourceforge.net>
Thu, 6 Oct 2016 13:04:42 +0000 (14:04 +0100)
committerPat Thoyts <patthoyts@users.sourceforge.net>
Thu, 6 Oct 2016 21:18:47 +0000 (22:18 +0100)
Commit 7e71adc77f fixes a problem with git-gui failing to pick up the
original author identity during a commit --amend operation. However, the
new author details then become persistent for the remainder of the session.
This commit fixes this by ensuring the environment variables are reset
and the author information reset once the commit is completed.
The relevant changes were reworked to reduce global variables.

Signed-off-by: Pat Thoyts <patthoyts@users.sourceforge.net>
lib/commit.tcl

index 60edf99752f58a618a8ca59ec352f5c678b13671..1623897e0d4da4ed4ec84036b55d69202faf3a11 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} {
@@ -40,9 +35,7 @@ You are currently in the middle of a merge that has not been fully completed.  Y
                                } 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
+                                       set commit_author [list name $name email $email date $time]
                                }
                        }
                        set msg [read $fd]
@@ -115,13 +108,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 +325,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,10 +370,8 @@ 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.
        #
@@ -397,8 +385,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 +519,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
+       }
+}