git-gui: Add support for calling out to the prepare-commit-msg hook
Signed-off-by: Joshua Williams <joshua.williams@qlogic.com> Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
This commit is contained in:
parent
1e02b32e72
commit
2cd1fd1f6d
65
git-gui.sh
65
git-gui.sh
@ -1170,6 +1170,7 @@ proc rescan {after {honor_trustmtime 1}} {
|
||||
|| [string trim [$ui_comm get 0.0 end]] eq {})} {
|
||||
if {[string match amend* $commit_type]} {
|
||||
} elseif {[load_message GITGUI_MSG]} {
|
||||
} elseif {[run_prepare_commit_msg_hook]} {
|
||||
} elseif {[load_message MERGE_MSG]} {
|
||||
} elseif {[load_message SQUASH_MSG]} {
|
||||
}
|
||||
@ -1269,6 +1270,70 @@ proc load_message {file} {
|
||||
return 0
|
||||
}
|
||||
|
||||
proc run_prepare_commit_msg_hook {} {
|
||||
global pch_error
|
||||
|
||||
# prepare-commit-msg requires PREPARE_COMMIT_MSG exist. From git-gui
|
||||
# it will be .git/MERGE_MSG (merge), .git/SQUASH_MSG (squash), or an
|
||||
# empty file but existant file.
|
||||
|
||||
set fd_pcm [open [gitdir PREPARE_COMMIT_MSG] a]
|
||||
|
||||
if {[file isfile [gitdir MERGE_MSG]]} {
|
||||
set pcm_source "merge"
|
||||
set fd_mm [open [gitdir MERGE_MSG] r]
|
||||
puts -nonewline $fd_pcm [read $fd_mm]
|
||||
close $fd_mm
|
||||
} elseif {[file isfile [gitdir SQUASH_MSG]]} {
|
||||
set pcm_source "squash"
|
||||
set fd_sm [open [gitdir SQUASH_MSG] r]
|
||||
puts -nonewline $fd_pcm [read $fd_sm]
|
||||
close $fd_sm
|
||||
} else {
|
||||
set pcm_source ""
|
||||
}
|
||||
|
||||
close $fd_pcm
|
||||
|
||||
set fd_ph [githook_read prepare-commit-msg \
|
||||
[gitdir PREPARE_COMMIT_MSG] $pcm_source]
|
||||
if {$fd_ph eq {}} {
|
||||
catch {file delete [gitdir PREPARE_COMMIT_MSG]}
|
||||
return 0;
|
||||
}
|
||||
|
||||
ui_status [mc "Calling prepare-commit-msg hook..."]
|
||||
set pch_error {}
|
||||
|
||||
fconfigure $fd_ph -blocking 0 -translation binary -eofchar {}
|
||||
fileevent $fd_ph readable \
|
||||
[list prepare_commit_msg_hook_wait $fd_ph]
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
proc prepare_commit_msg_hook_wait {fd_ph} {
|
||||
global pch_error
|
||||
|
||||
append pch_error [read $fd_ph]
|
||||
fconfigure $fd_ph -blocking 1
|
||||
if {[eof $fd_ph]} {
|
||||
if {[catch {close $fd_ph}]} {
|
||||
ui_status [mc "Commit declined by prepare-commit-msg hook."]
|
||||
hook_failed_popup prepare-commit-msg $pch_error
|
||||
catch {file delete [gitdir PREPARE_COMMIT_MSG]}
|
||||
exit 1
|
||||
} else {
|
||||
load_message PREPARE_COMMIT_MSG
|
||||
}
|
||||
set pch_error {}
|
||||
catch {file delete [gitdir PREPARE_COMMIT_MSG]}
|
||||
return
|
||||
}
|
||||
fconfigure $fd_ph -blocking 0
|
||||
catch {file delete [gitdir PREPARE_COMMIT_MSG]}
|
||||
}
|
||||
|
||||
proc read_diff_index {fd after} {
|
||||
global buf_rdi
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user