From ef70e3d7e62671d0cadb2731e6965768f73ca290 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 3 Jan 2008 21:12:05 -0500 Subject: * Added configuration options for highlevel and lowlevel package managers in etckeeper.conf. * Only install apt hooks if apt is used. * Only add backup conffile exclusion to gitignore if dpkg is used. * Rename pre/post-apt.d to pre/post-install.d to allow the same directories to be used for other package managers. * Use the name of the highlevel package manager in commit messages. --- INSTALL | 5 +++++ Makefile | 13 ++++++++++--- README | 8 ++++---- TODO | 11 +++++++---- apt.conf | 4 ++-- debian/changelog | 12 ++++++++++++ etckeeper | 6 ++++++ etckeeper.1 | 15 ++++++++------- etckeeper.conf | 6 ++++++ init.d/50git-ignore | 9 ++++++--- post-apt.d/10git-test | 6 ------ post-apt.d/30git-add | 7 ------- post-apt.d/40git-rm | 12 ------------ post-apt.d/50git-commit | 12 ------------ post-apt.d/README | 2 -- post-install.d/10git-test | 6 ++++++ post-install.d/30git-add | 7 +++++++ post-install.d/40git-rm | 12 ++++++++++++ post-install.d/50git-commit | 9 +++++++++ post-install.d/README | 2 ++ pre-apt.d/50uncommitted-changes | 22 ---------------------- pre-apt.d/README | 2 -- pre-install.d/50uncommitted-changes | 22 ++++++++++++++++++++++ pre-install.d/README | 3 +++ 24 files changed, 127 insertions(+), 86 deletions(-) create mode 100644 INSTALL delete mode 100755 post-apt.d/10git-test delete mode 100755 post-apt.d/30git-add delete mode 100755 post-apt.d/40git-rm delete mode 100755 post-apt.d/50git-commit delete mode 100644 post-apt.d/README create mode 100755 post-install.d/10git-test create mode 100755 post-install.d/30git-add create mode 100755 post-install.d/40git-rm create mode 100755 post-install.d/50git-commit create mode 100644 post-install.d/README delete mode 100755 pre-apt.d/50uncommitted-changes delete mode 100644 pre-apt.d/README create mode 100755 pre-install.d/50uncommitted-changes create mode 100644 pre-install.d/README diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..56c26e7 --- /dev/null +++ b/INSTALL @@ -0,0 +1,5 @@ +Before running 'make install', you should edit etckeeper.conf and make sure +it configured appropriately for your distribution. + +Distribution packagers may find it more convenient to set CONFFILE to point +to a different etckeeper.conf that is preconfigured for your distribution. diff --git a/Makefile b/Makefile index 17ac854..23cb3ea 100644 --- a/Makefile +++ b/Makefile @@ -1,8 +1,15 @@ +# You should configure etckeeper.conf for your distribution before +# installing etckeeper. +CONFFILE=etckeeper.conf +include $(CONFFILE) + install: mkdir -p $(PREFIX)/etc/etckeeper/ cp -a *.d $(PREFIX)/etc/etckeeper/ - cp etckeeper.conf $(PREFIX)/etc/etckeeper/ + cp $(CONFFILE) $(PREFIX)/etc/etckeeper/etckeeper.conf install -D etckeeper $(PREFIX)/usr/bin/etckeeper - install -m 0644 -D apt.conf $(PREFIX)/etc/apt/apt.conf.d/05etckeeper install -m 0644 -D etckeeper.1 $(PREFIX)/usr/share/man/man1/etckeeper.1 - install -m 0644 -D bash_completion $(PREFIX)/etc/bash_completion.d/etckeeper \ No newline at end of file + install -m 0644 -D bash_completion $(PREFIX)/etc/bash_completion.d/etckeeper +ifeq ($(HIGHLEVEL_PACKAGE_MANAGER),apt)) + install -m 0644 -D apt.conf $(PREFIX)/etc/apt/apt.conf.d/05etckeeper +endif diff --git a/README b/README index 7ec20b2..c4887c5 100644 --- a/README +++ b/README @@ -33,8 +33,8 @@ So don't use it on git repositories from untrusted sources. etckeeper has special support to handle changes to /etc caused by installing and upgrading packages. Before apt installs packages, -`etckeeper pre-apt` will check that /etc contains no uncommitted changes. -After apt installs packages, `etckeeper post-apt` will add any new +`etckeeper pre-install` will check that /etc contains no uncommitted changes. +After apt installs packages, `etckeeper post-install` will add any new interesting files to the repository, and commit the changes. git is designed as a way to manage source code, not as a way to manage @@ -143,7 +143,7 @@ action. For example, here's how to configure it to run `git gc` after each apt run, which will save a lot of disk space: - cd /etc/etckeeper/post-apt.d + cd /etc/etckeeper/post-install.d (echo '#!/bin/sh' ; echo 'exec git-gc') > 99git-gc chmod +x 99git-gc git add . @@ -152,7 +152,7 @@ which will save a lot of disk space: Here's how to disable the automatic commits after each apt run, while still letting it git-add new files and git-rm removed ones: - chmod -x /etc/etckeeper/post-apt.d/75git-commit + chmod -x /etc/etckeeper/post-install.d/75git-commit Note that the etckeeper commands are careful to not hardcode anything about git. If you want to use some other revision control system, that's diff --git a/TODO b/TODO index 4bcd9a9..245f3a4 100644 --- a/TODO +++ b/TODO @@ -17,7 +17,10 @@ in one repo, and public in another. This would need either symlink farming or git "fake bare" repos, both of which are not pleasant, yet. - Another way would be to allow splitting out subdirs into their own - repos. This is already doable, would just need modifying the pre-apt and - post-apt stuff (ie, it needs to commit in the subdirs too). Using - mr would be a possibility.. + Another way would be to allow splitting out subdirs into their own repos. + This is already doable, would just need modifying the pre-install and + post-instlal stuff (ie, it needs to commit in the subdirs too). Using mr + would be a possibility.. + +* Figure out what packages were acted on, and include that info in the commit + message diff --git a/apt.conf b/apt.conf index 4293637..97d0f87 100644 --- a/apt.conf +++ b/apt.conf @@ -1,2 +1,2 @@ -DPkg::Pre-Install-Pkgs { "if [ -x /usr/bin/etckeeper ]; then etckeeper pre-apt; fi"; }; -DPkg::Post-Invoke { "if [ -x /usr/bin/etckeeper ]; then etckeeper post-apt; fi"; }; +DPkg::Pre-Install-Pkgs { "if [ -x /usr/bin/etckeeper ]; then etckeeper pre-install; fi"; }; +DPkg::Post-Invoke { "if [ -x /usr/bin/etckeeper ]; then etckeeper post-install; fi"; }; diff --git a/debian/changelog b/debian/changelog index 999da6f..f818472 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,15 @@ +etckeeper (0.7) UNRELEASED; urgency=low + + * Added configuration options for highlevel and lowlevel package managers + in etckeeper.conf. + * Only install apt hooks if apt is used. + * Only add backup conffile exclusion to gitignore if dpkg is used. + * Rename pre/post-apt.d to pre/post-install.d to allow the same directories + to be used for other package managers. + * Use the name of the highlevel package manager in commit messages. + + -- Joey Hess Thu, 03 Jan 2008 20:43:23 -0500 + etckeeper (0.6) unstable; urgency=low * Depend on a fairly recent git-core. Closes: #453063 diff --git a/etckeeper b/etckeeper index dfd44bb..f78afdf 100755 --- a/etckeeper +++ b/etckeeper @@ -8,6 +8,12 @@ fi if [ ! -z "$GIT_COMMIT_OPTIONS" ]; then export GIT_COMMIT_OPTIONS fi +if [ ! -z "$HIGHLEVEL_PACKAGE_MANAGER" ]; then + export HIGHLEVEL_PACKAGE_MANAGER +fi +if [ ! -z "$LOWLEVEL_PACKAGE_MANAGER" ]; then + export LOWLEVEL_PACKAGE_MANAGER +fi if [ -z "$1" ]; then echo "usage: etckeeper command [directory]" >&2 diff --git a/etckeeper.1 b/etckeeper.1 index 2d38bf8..6d00cdb 100644 --- a/etckeeper.1 +++ b/etckeeper.1 @@ -21,13 +21,14 @@ a clone of the /etc repository located elsewhere. This is called as a git pre-commit hook. It stores metadata and does sanity checks. .TP -.B pre-apt -This is called by apt's DPkg::Pre-Install-Pkgs hook. It allows committing -any uncommitted changes before the apt run. +.B pre-install +This is called by apt's DPkg::Pre-Install-Pkgs hook, or by equivilant hooks +of other package managers. It allows committing any uncommitted changes before +packages are installed, upgraded, etc. .TP -.B post-apt -This is called by apt's DPkg::Post-Invoke hook. It commits changes made by -packages into the repository. (You can also call this by hand after running -dpkg by hand.) +.B post-install +This is called by apt's DPkg::Post-Invoke hook, or by equivilant hooks +of other package managers. It commits changes made by packages into the +repository. (You can also call this by hand after running dpkg by hand.) .SH AUTHOR Joey Hess, . diff --git a/etckeeper.conf b/etckeeper.conf index 74bb34a..4a22a65 100644 --- a/etckeeper.conf +++ b/etckeeper.conf @@ -2,3 +2,9 @@ # You could for exemple use "-e" if you want to edit all commit messages # before committing. #GIT_COMMIT_OPTIONS="-e" + +# The high level package manager that's being used. +HIGHLEVEL_PACKAGE_MANAGER=apt + +# The low-level package manager that's being used. +LOWLEVEL_PACKAGE_MANAGER=dpkg diff --git a/init.d/50git-ignore b/init.d/50git-ignore index f931592..de58ed5 100755 --- a/init.d/50git-ignore +++ b/init.d/50git-ignore @@ -1,11 +1,14 @@ #!/bin/sh set -e if [ ! -e .gitignore ]; then - cat >.gitignore <.gitignore <>.gitignore <&2 - echo "etckeeper warning: run etckeeper init to enable it" >&2 -fi diff --git a/post-apt.d/30git-add b/post-apt.d/30git-add deleted file mode 100755 index 79aa406..0000000 --- a/post-apt.d/30git-add +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/sh -set -e -if [ -d .git ]; then - if ! git-add .; then - echo "etckeeper warning: git-add failed" >&2 - fi -fi diff --git a/post-apt.d/40git-rm b/post-apt.d/40git-rm deleted file mode 100755 index 680dac0..0000000 --- a/post-apt.d/40git-rm +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/sh -set -e - -TAB=" " - -if [ -d .git ]; then - for file in $(git ls-files --deleted); do - if [ ! -d "$file" ]; then - git rm --quiet "$file" - fi - done -fi diff --git a/post-apt.d/50git-commit b/post-apt.d/50git-commit deleted file mode 100755 index 1a5c55a..0000000 --- a/post-apt.d/50git-commit +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/sh -set -e - -if [ -d .git ]; then - - # TODO: figure out what packages were acted on by the apt run, and - # include that info in the commit message - message="committing changes after apt run" - - # ignore exit code since it exits nonzero if there is nothing to do - git commit $GIT_COMMIT_OPTIONS -m "$message" || true -fi diff --git a/post-apt.d/README b/post-apt.d/README deleted file mode 100644 index befa5c0..0000000 --- a/post-apt.d/README +++ /dev/null @@ -1,2 +0,0 @@ -Files in this directory are run after apt has run. They should commit -changes and new files in /etc to repository. diff --git a/post-install.d/10git-test b/post-install.d/10git-test new file mode 100755 index 0000000..e72f195 --- /dev/null +++ b/post-install.d/10git-test @@ -0,0 +1,6 @@ +#!/bin/sh +set -e +if [ ! -d .git ]; then + echo "etckeeper warning: etckeeper is not yet enabled for $(pwd)" >&2 + echo "etckeeper warning: run etckeeper init to enable it" >&2 +fi diff --git a/post-install.d/30git-add b/post-install.d/30git-add new file mode 100755 index 0000000..79aa406 --- /dev/null +++ b/post-install.d/30git-add @@ -0,0 +1,7 @@ +#!/bin/sh +set -e +if [ -d .git ]; then + if ! git-add .; then + echo "etckeeper warning: git-add failed" >&2 + fi +fi diff --git a/post-install.d/40git-rm b/post-install.d/40git-rm new file mode 100755 index 0000000..680dac0 --- /dev/null +++ b/post-install.d/40git-rm @@ -0,0 +1,12 @@ +#!/bin/sh +set -e + +TAB=" " + +if [ -d .git ]; then + for file in $(git ls-files --deleted); do + if [ ! -d "$file" ]; then + git rm --quiet "$file" + fi + done +fi diff --git a/post-install.d/50git-commit b/post-install.d/50git-commit new file mode 100755 index 0000000..78247ca --- /dev/null +++ b/post-install.d/50git-commit @@ -0,0 +1,9 @@ +#!/bin/sh +set -e + +if [ -d .git ]; then + message="committing changes after $HIGHLEVEL_PACKAGE_MANAGER run" + + # ignore exit code since it exits nonzero if there is nothing to do + git commit $GIT_COMMIT_OPTIONS -m "$message" || true +fi diff --git a/post-install.d/README b/post-install.d/README new file mode 100644 index 0000000..62f4f9c --- /dev/null +++ b/post-install.d/README @@ -0,0 +1,2 @@ +Files in this directory are run after packages are installed, upgraded, etc. +They should commit changes and new files in /etc to repository. diff --git a/pre-apt.d/50uncommitted-changes b/pre-apt.d/50uncommitted-changes deleted file mode 100755 index d39401c..0000000 --- a/pre-apt.d/50uncommitted-changes +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/sh -set -e -if [ -d .git ] && ! LANG=C git-status 2>&1 | grep -q "working directory clean"; then - . /usr/share/debconf/confmodule - db_capb escape - db_title etckeeper - - db_reset etckeeper/unclean || true - db_subst etckeeper/unclean STATUS $(git-status | debconf-escape -e) || true - db_input critical etckeeper/unclean || true - db_go || true - db_get etckeeper/unclean - if [ "$RET" = true ]; then - git add . - if ! git commit $GIT_COMMIT_OPTIONS -m "saving uncommitted changes in /etc prior to apt run"; then - db_input critical etckeeper/commit_failed || true - db_go || true - db_reset etckeeper/commit_failed || true - fi - fi - db_reset etckeeper/unclean || true -fi diff --git a/pre-apt.d/README b/pre-apt.d/README deleted file mode 100644 index 47001b4..0000000 --- a/pre-apt.d/README +++ /dev/null @@ -1,2 +0,0 @@ -Files in this directory are run before apt is run. This is mostly used for -sanity checks, ie, does /etc have any uncommitted changes? diff --git a/pre-install.d/50uncommitted-changes b/pre-install.d/50uncommitted-changes new file mode 100755 index 0000000..f8811ad --- /dev/null +++ b/pre-install.d/50uncommitted-changes @@ -0,0 +1,22 @@ +#!/bin/sh +set -e +if [ -d .git ] && ! LANG=C git-status 2>&1 | grep -q "working directory clean"; then + . /usr/share/debconf/confmodule + db_capb escape + db_title etckeeper + + db_reset etckeeper/unclean || true + db_subst etckeeper/unclean STATUS $(git-status | debconf-escape -e) || true + db_input critical etckeeper/unclean || true + db_go || true + db_get etckeeper/unclean + if [ "$RET" = true ]; then + git add . + if ! git commit $GIT_COMMIT_OPTIONS -m "saving uncommitted changes in /etc prior to $HIGHLEVEL_PACKAGE_MANAGER run"; then + db_input critical etckeeper/commit_failed || true + db_go || true + db_reset etckeeper/commit_failed || true + fi + fi + db_reset etckeeper/unclean || true +fi diff --git a/pre-install.d/README b/pre-install.d/README new file mode 100644 index 0000000..a3b5a57 --- /dev/null +++ b/pre-install.d/README @@ -0,0 +1,3 @@ +Files in this directory are run before packages are installed, upgraded, +etc. This is mostly used for sanity checks, ie, does /etc have any +uncommitted changes? -- cgit v1.2.3