emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Mistakes in commit log messages


From: Jim Porter
Subject: Re: Mistakes in commit log messages
Date: Tue, 11 Apr 2023 17:20:26 -0700

On 4/11/2023 12:36 PM, Eli Zaretskii wrote:
Date: Tue, 11 Apr 2023 12:27:40 -0700
Cc: acm@muc.de, emacs-devel@gnu.org
From: Jim Porter <jporterbugs@gmail.com>

One issue with the current implementation (mentioned elsewhere in this
thread) is that it doesn't work for deleting a file from the repo.
Fixing this in the commit-msg hook is tricky. We can get the list of
changed files via "git diff --name-only" (and then we could compare our
commit message against that list), but there's a problem: I don't know
of a good way to detect when the user is amending a commit[1]. For a
normal commit, you'd get the changed files via something like "git diff
--staged --name-only", but for an amended commit, you'd want to add
"HEAD^" to that command.

If this will cry wolf on every removal or rename of a file, then this
cure is worse than the disease, IMNSHO.  I'd prefer to waste a few
hours of my time when preparing the tarball than risk annoying
everyone with such false positives.

Yeah, I think doing this in a different hook would be less error-prone. Below is a demonstration of a post-commit hook that would warn the user about files listed in the commit message that aren't in the diff. The only potential for error I see is when creating or deleting entire directories, but that should be fixable by adding the parent directories of touched files into the 'CHANGES' variable.

Since this is a post-commit hook, it's only advisory, and can't error out. However, we could do something similar for a pre-push hook, except we'd iterate over each commit that's about to be pushed. A pre-push *could* error out, thus preventing users from pushing any badly-formatted commits upstream.

If we did something like this, I think both post-commit and pre-push hooks would be useful. The former gives committers immediate feedback on their commit message (if they read the output), while the latter is what ensures that the upstream commit messages are properly-formatted.

--------------------------------------------------

#!/bin/sh

git log -1 --format=%B | awk '
BEGIN {
  # Collect all the files touched in the last commit.
  while (("git log -1 --name-status --format=" | getline) > 0) {
    for (i = 2; i <= NF; i++) {
      CHANGES[$i] = 1
    }
  }
}

/^\* / {
  if (match($2, "[^:/][^:]*")) {
    FILE = substr($2, RSTART, RLENGTH)
    if (! (FILE in CHANGES)) {
      printf("File %s listed in commit message, but not in diff\n", FILE)
      status = 1
    }
  }
}

END {
  if (status != 0) {
    print "Bad commit; please see the file '\''CONTRIBUTE'\''"
  }
}
'



reply via email to

[Prev in Thread] Current Thread [Next in Thread]