git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [GIT-GUI PATCH] call prepare-commit-msg hook

From
JWJoshua Williams <joshua.williams@qlogic.com>
Date
Sep 24, 2008, 19:11 UTC
Message-ID
<48DA90F9.8070606@qlogic.com>
In-Reply-To
<20080924170434.GW3669@spearce.org>
Shawn O. Pearce wrote:
Show 10 quoted lines
> Joshua Williams <joshua.williams@qlogic.com> wrote:
>> Small change.  Still need to load MERGE_MSG and SQUASH_MSG
>> if there's no prepare-commit-msg hook.  We now process the hook
>> first and if it's not there, load MERGE_MSG or SQUASH_MSG.
>>
>> Signed-off-by: Joshua Williams <joshua.williams@qlogic.com>
> 
> This patch looks reasonable.  My only comment is maybe we want
> to delete PREPARE_COMMIT_MSG file when we "exit 1" when the hook
> has declined.
Good catch.  I've added that to the latest patch.
Show 8 quoted lines
>> diff --git a/git-gui/git-gui.sh b/git-gui/git-gui.sh
>> index 10d8a44..8d06cd1 100755
>> --- a/git-gui/git-gui.sh
>> +++ b/git-gui/git-gui.sh
> 
> Can you please try to put this onto my current git-gui tree?
> I don't have the base 10d8a44 object so I can't 3-way merge
> this in, and the patch doesn't apply cleanly anymore.
Absolutely.  Here it is:
Add support to git-gui for calling out to the prepare-commit-msg hook.
Signed-off-by: Joshua Williams <joshua.williams@qlogic.com>
---
diff --git a/git-gui.sh b/git-gui.sh
index 1939001..cb0fcac 100755
--- a/git-gui.sh
+++ b/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
Previous: Shawn O. PearceNext: Shawn O. Pearce
Message 4 of 5 in “call prepare-commit-msg hook”
  1. call prepare-commit-msg hookJoshua Williams, Sep 16, 2008
  2. Joshua WilliamsSep 16, 2008
  3. Shawn O. PearceSep 24, 2008
  4. Joshua WilliamsSep 24, 2008
  5. Shawn O. PearceSep 24, 2008

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.