git-gui: avoid persisting modified author identity

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>
This commit is contained in:
Pat Thoyts
2016-10-06 14:04:42 +01:00
parent 7e71adc77f
commit cfe616bcb1

View File

@ -1,13 +1,8 @@
# git-gui misc. commit reading/writing support # git-gui misc. commit reading/writing support
# Copyright (C) 2006, 2007 Shawn Pearce # Copyright (C) 2006, 2007 Shawn Pearce
set author_name ""
set author_email ""
set author_date ""
proc load_last_commit {} { proc load_last_commit {} {
global HEAD PARENT MERGE_HEAD commit_type ui_comm global HEAD PARENT MERGE_HEAD commit_type ui_comm commit_author
global author_name author_email author_date
global repo_config global repo_config
if {[llength $PARENT] == 0} { 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]} { } elseif {[string match {encoding *} $line]} {
set enc [string tolower [string range $line 9 end]] set enc [string tolower [string range $line 9 end]]
} elseif {[regexp "author (.*)\\s<(.*)>\\s(\\d.*$)" $line all name email time]} { } elseif {[regexp "author (.*)\\s<(.*)>\\s(\\d.*$)" $line all name email time]} {
set author_name $name set commit_author [list name $name email $email date $time]
set author_email $email
set author_date $time
} }
} }
set msg [read $fd] set msg [read $fd]
@ -115,13 +108,10 @@ proc do_signoff {} {
} }
proc create_new_commit {} { proc create_new_commit {} {
global commit_type ui_comm global commit_type ui_comm commit_author
global author_name author_email author_date
set commit_type normal set commit_type normal
set author_name "" unset -nocomplain commit_author
set author_email ""
set author_date ""
$ui_comm delete 0.0 end $ui_comm delete 0.0 end
$ui_comm edit reset $ui_comm edit reset
$ui_comm edit modified false $ui_comm edit modified false
@ -335,12 +325,12 @@ proc commit_writetree {curHEAD msg_p} {
} }
proc commit_committree {fd_wt 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 current_branch
global ui_comm selected_commit_type global ui_comm selected_commit_type
global file_states selected_paths rescan_active global file_states selected_paths rescan_active
global repo_config global repo_config
global env author_name author_email author_date global env
gets $fd_wt tree_id gets $fd_wt tree_id
if {[catch {close $fd_wt} err]} { if {[catch {close $fd_wt} err]} {
@ -380,10 +370,8 @@ A rescan will be automatically started now.
} }
} }
if {$author_name ne ""} { if {[info exists commit_author]} {
set env(GIT_AUTHOR_NAME) $author_name set old_author [commit_author_ident $commit_author]
set env(GIT_AUTHOR_EMAIL) $author_email
set env(GIT_AUTHOR_DATE) $author_date
} }
# -- Create the commit. # -- Create the commit.
# #
@ -397,8 +385,14 @@ A rescan will be automatically started now.
error_popup [strcat [mc "commit-tree failed:"] "\n\n$err"] error_popup [strcat [mc "commit-tree failed:"] "\n\n$err"]
ui_status [mc "Commit failed."] ui_status [mc "Commit failed."]
unlock_index unlock_index
unset -nocomplain commit_author
commit_author_reset $old_author
return return
} }
if {[info exists commit_author]} {
unset -nocomplain commit_author
commit_author_reset $old_author
}
# -- Update the HEAD ref. # -- Update the HEAD ref.
# #
@ -525,3 +519,20 @@ proc commit_postcommit_wait {fd_ph cmt_id} {
} }
fconfigure $fd_ph -blocking 0 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
}
}