On Sat, Jul 15, 2017 at 10:19:34AM -0400, John J Foerch wrote:
> The feature would be a command line option for git commit that would
> automatically prepend the "<filename>: " to the commit message. The
> different cases of its behavior could be:
>
> - commit affecting a single file, with commit message given by -m:
>
> : prepend "<filename>: " to the message given by -m
>
> - commit affecting a single file, with commit message from editor:
>
> : pre-fill commit message template with "<filename>: "
>
> - commit affecting multiple files:
>
> : use common base directory of all affected files for <filename>,
> behaviors as above for use with -m or editor.
>
> Anybody think that this or something like it would be a good convenience?
Johannes already pointed you to the prepare-commit-msg hook, which I
think is the right solution. I wrote a rough sketch for fun (note that
you could write it in whatever language you like if the mix of
perl/shell isn't to your liking):
-- >8 --
#!/bin/sh
# only kick in for vanilla commit, or "-m"
case "$2" in
""|message) ;;
*) exit 0
esac
# common prefix of all changed files
prefix=$(
git diff-index --name-only HEAD |
perl -lne '
if (!defined $prefix) {
$prefix = $_;
} else {
chop $prefix while !/^\Q$prefix\E/;
}
END {
# trim trailing slash if present
$prefix =~ s{/$}{};
print $prefix
}
'
)
# now stick the prefix at the start of the message-in-progress
{
printf '%s' "$prefix: "
cat "$1"
} >"$1".tmp &&
mv "$1".tmp "$1"