Josh Triplett wrote on 2011-02-13: > After apt finishes, etckeeper autocommits the changes to /etc, with a > commit message listing the changes to installed packages and versions. > I'd like the option of entering a commit message at that point, ...
I've written a patch to etckeeper to do this. I've attached a patch set, but the changes can also be pulled from: git pull git://gitorious.org/etckeeper/etckeeper.git bkuhn/edit-auto-commit-messages Note that the attached patch *does not* support any VCS's except for Git. This is because the feature as implemented relies on Git's --edit/-e option, which forces a commit edit even though there's already a commit message given another way. if other VCS's support this command in future, it's a two-line change to support this feature on those VCS's as well. FWIW, I've submitted a bug to bzr to add a --edit/-e option: https://bugs.launchpad.net/bzr/+bug/1222470 And I've also submitted a patch for Mercurial for the same: http://www.selenic.com/pipermail/mercurial-devel/2013-September/053435.html http://thread.gmane.org/gmane.comp.version-control.mercurial.devel/63400 Meanwhile, I hereby affirm that I am the author of the new copyrighted material found in the attached patch, and I hereby license those copyrights under GPLv2-or-later.
>From a6b9629d2285ec73654f752ab45572773b6fc722 Mon Sep 17 00:00:00 2001 From: "Bradley M. Kuhn" <bk...@ebb.org> Date: Sun, 8 Sep 2013 13:09:42 -0400 Subject: Save TTY and use variable as part of determination if running interactively. --- commit.d/50vcs-commit | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/commit.d/50vcs-commit b/commit.d/50vcs-commit index 3a4c819..75b3a6e 100755 --- a/commit.d/50vcs-commit +++ b/commit.d/50vcs-commit @@ -28,17 +28,23 @@ if [ -n "$dnsdomainname" ]; then hostname="$hostname.$dnsdomainname" fi +# Save TTY for use for tty ownership determination, and interactivity test. +TTY="$(tty 2>/dev/null || true)" USER= if [ -n "$SUDO_USER" ]; then USER="$SUDO_USER" else # try to check tty ownership, in case user su'd to root - TTY="$(tty 2>/dev/null || true)" if [ -n "$TTY" ] && [ -c "$TTY" ]; then USER="$(find "$TTY" -printf "%u")" fi fi +isInteractive="0" +if [ -f "$TTY" ] && [ ! -z "$PS1" ];then + isInteractive="1" +fi + if [ "$VCS" = git ] && [ -d .git ]; then if [ -n "$USER" ]; then # Use user.name and user.email from the gitconfig belonging -- 1.7.10.4 >From dc30b61d27987026de8cee2181bac07f7b60bdbf Mon Sep 17 00:00:00 2001 From: "Bradley M. Kuhn" <bk...@ebb.org> Date: Sun, 8 Sep 2013 13:12:58 -0400 Subject: Add EDIT_AUTO_COMMIT_MESSAGES_WHEN_INTERACTIVE configuration option. Currently, only Git seems to support the --edit option, and therefore will be the only VCS able to honor this option at this time. --- etckeeper.conf | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/etckeeper.conf b/etckeeper.conf index 639c77b..8b49fb4 100644 --- a/etckeeper.conf +++ b/etckeeper.conf @@ -29,6 +29,11 @@ DARCS_COMMIT_OPTIONS="-a" # so you can commit the changes by hand. #AVOID_COMMIT_BEFORE_INSTALL=1 +# Uncomment to force etckeeper, when running in an interactive terminal, to +# edit automatically generated commit messages before completing the commit. +# This option is only supported if the underlying VCS supports it. +#EDIT_AUTO_COMMIT_MESSAGES_WHEN_INTERACTIVE=1 + # The high-level package manager that's being used. # (apt, pacman-g2, yum, zypper etc) HIGHLEVEL_PACKAGE_MANAGER=apt -- 1.7.10.4 >From ce56296530cb2494520171391e0115e633c29fbf Mon Sep 17 00:00:00 2001 From: "Bradley M. Kuhn" <bk...@ebb.org> Date: Sun, 8 Sep 2013 13:13:38 -0400 Subject: Initial support for EDIT_AUTO_COMMIT_MESSAGES_WHEN_INTERACTIVE with Git on commits. --- commit.d/50vcs-commit | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/commit.d/50vcs-commit b/commit.d/50vcs-commit index 75b3a6e..bd09db9 100755 --- a/commit.d/50vcs-commit +++ b/commit.d/50vcs-commit @@ -73,7 +73,11 @@ if [ "$VCS" = git ] && [ -d .git ]; then fi fi if [ -n "$logfile" ]; then + if [ "$isInteractive" = 1 ] && [ "$EDIT_AUTO_COMMIT_MESSAGES_WHEN_INTERACTIVE" = 1 ]; then + git commit $GIT_COMMIT_OPTIONS --edit -F "$logfile" + else git commit $GIT_COMMIT_OPTIONS -F "$logfile" + fi else git commit $GIT_COMMIT_OPTIONS fi -- 1.7.10.4 >From 4e181cdccd5275ca2a8c822410bf8f14272fffd0 Mon Sep 17 00:00:00 2001 From: "Bradley M. Kuhn" <bk...@ebb.org> Date: Sun, 8 Sep 2013 13:39:16 -0400 Subject: tempfile code already found in other files, as we'll need a tempfile here. Perhaps this tempfile code should be a utility function somewhere? --- post-install.d/50vcs-commit | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/post-install.d/50vcs-commit b/post-install.d/50vcs-commit index 7710c4a..c6fa0a0 100755 --- a/post-install.d/50vcs-commit +++ b/post-install.d/50vcs-commit @@ -3,6 +3,16 @@ set -e pl="/var/cache/etckeeper/packagelist" +if which tempfile >/dev/null 2>&1 || type -p tempfile >/dev/null 2>&1; then + tempfile="tempfile" +elif which mktemp >/dev/null 2>&1 || type -p mktemp >/dev/null 2>&1; then + tempfile="mktemp" +else + echo "etckeeper warning: can't find tempfile or mktemp" >&2 + exit 1 +fi +commitfile=$($tempfile) + if etckeeper unclean; then message="committing changes in /etc after $HIGHLEVEL_PACKAGE_MANAGER run" -- 1.7.10.4 >From 1b1785d6fd95d66ef12cfeb0165f02df246e74b2 Mon Sep 17 00:00:00 2001 From: "Bradley M. Kuhn" <bk...@ebb.org> Date: Sun, 8 Sep 2013 16:38:10 -0400 Subject: =?UTF-8?q?Support=20-F=20<logfile>=20option,=20for=20precreated=20l?= =?UTF-8?q?og=20files.=0ANote=20that=20they'll=20still=20be=20deleted=20here?= =?UTF-8?q?=20by=20the=20EXIT=20trap.?= --- commit.d/50vcs-commit | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/commit.d/50vcs-commit b/commit.d/50vcs-commit index bd09db9..5157558 100755 --- a/commit.d/50vcs-commit +++ b/commit.d/50vcs-commit @@ -8,14 +8,19 @@ cleanup () { } if [ -n "$1" ]; then trap cleanup EXIT - logfile="$(mktemp -t etckeeper-$VCS.XXXXXXXXXX)" - if [ "x$1" = "x--stdin" ]; then - cat > "$logfile" + if [ "x$1" = "x-F" ]; then + shift 1 + logfile="$1" else + logfile="$(mktemp -t etckeeper-$VCS.XXXXXXXXXX)" + if [ "x$1" = "x--stdin" ]; then + cat > "$logfile" + else if [ "x$1" = "x-m" ]; then shift 1 fi echo "$1" > "$logfile" + fi fi else logfile="" -- 1.7.10.4 >From e96838660090e82f526e99071ce0bd3da29d9059 Mon Sep 17 00:00:00 2001 From: "Bradley M. Kuhn" <bk...@ebb.org> Date: Sun, 8 Sep 2013 16:38:23 -0400 Subject: Call this logfile to make it consistent with other scripts. --- post-install.d/50vcs-commit | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/post-install.d/50vcs-commit b/post-install.d/50vcs-commit index c6fa0a0..1752345 100755 --- a/post-install.d/50vcs-commit +++ b/post-install.d/50vcs-commit @@ -11,7 +11,7 @@ else echo "etckeeper warning: can't find tempfile or mktemp" >&2 exit 1 fi -commitfile=$($tempfile) +logfile=$($tempfile) if etckeeper unclean; then message="committing changes in /etc after $HIGHLEVEL_PACKAGE_MANAGER run" @@ -22,9 +22,11 @@ if etckeeper unclean; then echo echo "Package changes:" etckeeper list-installed | diff -U0 $pl.pre-install - | tail -n+4 | egrep '^[-+]' || true - ) | etckeeper commit --stdin + ) > $logfile + etckeeper commit -F $logfile else etckeeper commit "$(printf "$message")" + fi fi -- 1.7.10.4 >From 200231fa23aad4409d8ce1ce061bbd2e44347747 Mon Sep 17 00:00:00 2001 From: "Bradley M. Kuhn" <bk...@ebb.org> Date: Sun, 8 Sep 2013 17:03:31 -0400 Subject: PS1 is probably never going to be set this deep down in calls of shell scripts. --- commit.d/50vcs-commit | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/commit.d/50vcs-commit b/commit.d/50vcs-commit index 5157558..5010a6b 100755 --- a/commit.d/50vcs-commit +++ b/commit.d/50vcs-commit @@ -46,7 +46,7 @@ else fi isInteractive="0" -if [ -f "$TTY" ] && [ ! -z "$PS1" ];then +if [ -f "$TTY" ]; then isInteractive="1" fi -- 1.7.10.4 >From a3f16689c8ab0488ee903b01d670e5640c33dd19 Mon Sep 17 00:00:00 2001 From: "Bradley M. Kuhn" <bk...@ebb.org> Date: Sun, 8 Sep 2013 17:29:33 -0400 Subject: TTY's aren't regular files, so -e is the right test, not -f. --- commit.d/50vcs-commit | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/commit.d/50vcs-commit b/commit.d/50vcs-commit index 5010a6b..25df8b5 100755 --- a/commit.d/50vcs-commit +++ b/commit.d/50vcs-commit @@ -46,7 +46,7 @@ else fi isInteractive="0" -if [ -f "$TTY" ]; then +if [ -e "$TTY" ]; then isInteractive="1" fi -- 1.7.10.4 >From 81d998de51e3bb344fb6fa6d87fb074199c76d01 Mon Sep 17 00:00:00 2001 From: "Bradley M. Kuhn" <bk...@ebb.org> Date: Sun, 8 Sep 2013 17:57:46 -0400 Subject: =?UTF-8?q?We=20need=20to=20load=20the=20etckeeper.conf=20file=20her?= =?UTF-8?q?e,=20because=20this=20script=0Ais=20usually=20called=20from=20the?= =?UTF-8?q?=20package=20manager=20rather=20than=20etckeeper=20script.?= --- commit.d/50vcs-commit | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/commit.d/50vcs-commit b/commit.d/50vcs-commit index 25df8b5..cf4a87b 100755 --- a/commit.d/50vcs-commit +++ b/commit.d/50vcs-commit @@ -1,6 +1,16 @@ #!/bin/sh set -e +if [ -z "$ETCKEEPER_CONF_DIR" ]; then + ETCKEEPER_CONF_DIR=/etc/etckeeper +fi + +conf="$ETCKEEPER_CONF_DIR/etckeeper.conf" + +if [ -e $conf ]; then + . $conf +fi + cleanup () { if [ -n "$logfile" ]; then rm -f "$logfile" -- 1.7.10.4
-- -- bkuhn