git-gui: strip the commit message after running commit-msg hook
When commit-msg writes the file using CRLF, the lines in the final message include trailing spaces. Postpone stripping until after hooks execute. This aligns with Git's behavior, which passes the original message to commit-msg, then strips comments and whitespace. Signed-off-by: Orgad Shaneh <orgads@gmail.com>
Orgad Shaneh committed
Jul 13, 2025 at 23:59 UTC
bfacf832b040885f876053244a75491b0dd792b6
1 file changed
+45
-22
lib/commit.tcl
+45
-22
@@ -208,28 +208,6 @@ You must stage at least 1 file before you can commit.
208
# -- A message is required.
209
#
210
set msg [$ui_comm get 1.0 end]
211
- # Strip trailing whitespace
212
- regsub -all -line {[ \t\r]+$} $msg {} msg
213
- # Strip comment lines
214
- global comment_string
215
- set cmt_rx [strcat {(^|\n)} [regsub -all {\W} $comment_string {\\&}] {[^\n]*}]
216
- regsub -all $cmt_rx $msg {\1} msg
217
- # Strip leading and trailing empty lines (puts adds one \n)
218
- set msg [string trim $msg \n]
219
- # Compress consecutive empty lines
220
- regsub -all {\n{3,}} $msg "\n\n" msg
221
- if {$msg eq {}} {
222
- error_popup [mc "Please supply a commit message.
223
-
224
-A good commit message has the following format:
225
-
226
-- First line: Describe in one sentence what you did.
227
-- Second line: Blank
228
-- Remaining lines: Describe why this change is good.
229
-"]
230
- unlock_index
231
- return
232
- }
211
212
# -- Build the message file.
213
#
@@ -332,7 +310,52 @@ proc commit_commitmsg_wait {fd_ph curHEAD msg_p} {
310
fconfigure $fd_ph -blocking 0
311
}
312
313
+proc wash_commit_message {msg} {
314
+ # Strip trailing whitespace
315
+ regsub -all -line {[ \t\r]+$} $msg {} msg
316
+ # Strip comment lines
317
+ global comment_string
318
+ set cmt_rx [strcat {(^|\n)} [regsub -all {\W} $comment_string {\\&}] {[^\n]*}]
319
+ regsub -all $cmt_rx $msg {\1} msg
320
+ # Strip leading and trailing empty lines (puts adds one \n)
321
+ set msg [string trim $msg \n]
322
+ # Compress consecutive empty lines
323
+ regsub -all {\n{3,}} $msg \n\n msg
324
+
325
+ return $msg
326
+}
327
+
328
proc commit_writetree {curHEAD msg_p} {
329
+ # -- Process the commit message after hooks have run.
330
+ #
331
+ set msg_fd [safe_open_file $msg_p r]
332
+ setup_commit_encoding $msg_fd 1
333
+ set msg [read $msg_fd]
334
+ close $msg_fd
335
+
336
+ # Process the message (strip whitespace, comments, etc.)
337
+ set msg [wash_commit_message $msg]
338
+
339
+ if {$msg eq {}} {
340
+ error_popup [mc "Please supply a commit message.
341
+
342
+A good commit message has the following format:
343
+
344
+- First line: Describe in one sentence what you did.
345
+- Second line: Blank
346
+- Remaining lines: Describe why this change is good.
347
+"]
348
+ unlock_index
349
+ return
350
+ }
351
+
352
+ # Write the processed message back to the file
353
+ set msg_wt [safe_open_file $msg_p w]
354
+ fconfigure $msg_wt -translation lf
355
+ setup_commit_encoding $msg_wt
356
+ puts $msg_wt $msg
357
+ close $msg_wt
358
+
359
ui_status [mc "Committing changes..."]
360
set fd_wt [git_read [list write-tree]]
361
fileevent $fd_wt readable \