Browse Source

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>
maint
Joshua Williams 17 years ago committed by Shawn O. Pearce
parent
commit
2cd1fd1f6d
  1. 65
      git-gui.sh

65
git-gui.sh

@ -1170,6 +1170,7 @@ proc rescan {after {honor_trustmtime 1}} { @@ -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} { @@ -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…
Cancel
Save