diff options
Diffstat (limited to 'scripts/debclean.sh')
-rwxr-xr-x | scripts/debclean.sh | 218 |
1 files changed, 218 insertions, 0 deletions
diff --git a/scripts/debclean.sh b/scripts/debclean.sh new file mode 100755 index 0000000..5f25807 --- /dev/null +++ b/scripts/debclean.sh @@ -0,0 +1,218 @@ +#!/bin/bash + +set -e + +PROGNAME=${0##*/} +MODIFIED_CONF_MSG='Default settings modified by devscripts configuration files:' + +usage() { + echo \ +"Usage: $PROGNAME [options] + Clean all debian build trees under current directory. + + Options: + --cleandebs Also remove all .deb, .changes and .build + files from the parent of each build tree + + --nocleandebs Don't remove the .deb etc. files (default) + + --check-dirname-level N + How much to check directory names before cleaning trees: + N=0 never + N=1 only if program changes directory (default) + N=2 always + + --check-dirname-regex REGEX + What constitutes a matching directory name; REGEX is + a Perl regular expression; the string \`PACKAGE' will + be replaced by the package name; see manpage for details + (default: 'PACKAGE(-.+)?') + + --no-conf, --noconf + Do not read devscripts config files; + must be the first option given + + -d Do not run dpkg-checkbuilddeps to check build dependencies + + --help Display this help message and exit + + --version Display version information + +$MODIFIED_CONF_MSG" +} + +version() { + echo \ +"This is $PROGNAME, from the Debian devscripts package, version ###VERSION### +This code is copyright 1999 by Julian Gilbey, all rights reserved. +Original code by Christoph Lameter. +This program comes with ABSOLUTELY NO WARRANTY. +You are free to redistribute this code under the terms of the +GNU General Public License, version 2 or later." +} + +# Boilerplate: set config variables +DEFAULT_DEBCLEAN_CLEANDEBS=no +DEFAULT_DEVSCRIPTS_CHECK_DIRNAME_LEVEL=1 +DEFAULT_DEVSCRIPTS_CHECK_DIRNAME_REGEX='PACKAGE(-.+)?' +VARS="DEBCLEAN_CLEANDEBS DEVSCRIPTS_CHECK_DIRNAME_LEVEL DEVSCRIPTS_CHECK_DIRNAME_REGEX" + + +if [ "$1" = "--no-conf" -o "$1" = "--noconf" ]; then + shift + MODIFIED_CONF_MSG="$MODIFIED_CONF_MSG + (no configuration files read)" + + # set defaults + for var in $VARS; do + eval "$var=\$DEFAULT_$var" + done +else + # Run in a subshell for protection against accidental errors + # in the config files + eval $( + set +e + for var in $VARS; do + eval "$var=\$DEFAULT_$var" + done + + for file in /etc/devscripts.conf ~/.devscripts + do + [ -r $file ] && . $file + done + + set | grep -E '^(DEBCLEAN|DEVSCRIPTS)_') + + # check sanity + case "$DEBCLEAN_CLEANDEBS" in + yes|no) ;; + *) DEBCLEAN_CLEANDEBS=no ;; + esac + case "$DEVSCRIPTS_CHECK_DIRNAME_LEVEL" in + 0|1|2) ;; + *) DEVSCRIPTS_CHECK_DIRNAME_LEVEL=1 ;; + esac + + # set config message + MODIFIED_CONF='' + for var in $VARS; do + eval "if [ \"\$$var\" != \"\$DEFAULT_$var\" ]; then + MODIFIED_CONF_MSG=\"\$MODIFIED_CONF_MSG + $var=\$$var\"; + MODIFIED_CONF=yes; + fi" + done + + if [ -z "$MODIFIED_CONF" ]; then + MODIFIED_CONF_MSG="$MODIFIED_CONF_MSG + (none)" + fi +fi + +# synonyms +CHECK_DIRNAME_LEVEL="$DEVSCRIPTS_CHECK_DIRNAME_LEVEL" +CHECK_DIRNAME_REGEX="$DEVSCRIPTS_CHECK_DIRNAME_REGEX" + +# Need -o option to getopt or else it doesn't work +TEMP=$(getopt -s bash -o "" -o d \ + --long cleandebs,nocleandebs,no-cleandebs \ + --long no-conf,noconf \ + --long check-dirname-level:,check-dirname-regex: \ + --long help,version -n "$PROGNAME" -- "$@") +if [ $? != 0 ] ; then exit 1 ; fi + +eval set -- $TEMP + +# Process Parameters +while [ "$1" ]; do + case $1 in + --cleandebs) DEBCLEAN_CLEANDEBS=yes ;; + --nocleandebs|--no-cleandebs) DEBCLEAN_CLEANDEBS=no ;; + --check-dirname-level) + shift + case "$1" in + 0|1|2) CHECK_DIRNAME_LEVEL=$1 ;; + *) echo "$PROGNAME: unrecognised --check-dirname-level value (allowed are 0,1,2)" >&2 + exit 1 ;; + esac + ;; + -d) + CHECKBUILDDEP="-d" ;; + --check-dirname-regex) + shift; CHECK_DIRNAME_REGEX="$1" ;; + --no-conf|--noconf) + echo "$PROGNAME: $1 is only acceptable as the first command-line option!" >&2 + exit 1 ;; + --help) usage; exit 0 ;; + --version) version; exit 0 ;; + --) shift; break ;; + *) echo "$PROGNAME: bug in option parser, sorry!" >&2 ; exit 1 ;; + esac + shift +done + +# Still going? +if [ $# -gt 0 ]; then + echo "$PROGNAME takes no non-option arguments;" >&2 + echo "try $PROGNAME --help for usage information" >&2 + exit 1 +fi + + +# Script to clean up debian directories + +OPWD="$(pwd)" + +TESTDIR=$(echo $OPWD | grep -Eo '.*/debian/?' | sed 's/\/debian\/\?$//') + +if [ -f debian/changelog ]; then + directories=$OPWD +elif [ -f "$TESTDIR/debian/changelog" ]; then + directories=$TESTDIR +else + directories=$(find . -type d -name "debian" -a ! -wholename '*.git*/debian') +fi + +for i in $directories; do + ( # subshell to not lose where we are + DIR=${i%/debian} + echo "Cleaning in directory $DIR" + cd $DIR + + # Clean up the source package, but only if the directory looks like + # a genuine build tree + if [ ! -f debian/changelog ]; then + echo "Directory $DIR: contains no debian/changelog, skipping" >&2 + exit + fi + package="$(dpkg-parsechangelog -SSource)" + if [ -z "$package" ]; then + echo "Directory $DIR: unable to determine package name, skipping" >&2 + exit + fi + + # let's test the directory name if appropriate + if [ $CHECK_DIRNAME_LEVEL -eq 2 -o \ + \( $CHECK_DIRNAME_LEVEL -eq 1 -a "$OPWD" != "$(pwd)" \) ]; then + if ! perl -MFile::Basename -w \ + -e "\$pkg='$package'; \$re='$CHECK_DIRNAME_REGEX';" \ + -e '$re =~ s/PACKAGE/\\Q$pkg\\E/g; $pwd=`pwd`; chomp $pwd;' \ + -e 'if ($re =~ m%/%) { eval "exit (\$pwd =~ /^$re\$/ ? 0:1);"; }' \ + -e 'else { eval "exit (basename(\$pwd) =~ /^$re\$/ ? 0:1);"; }' + then + echo "Full directory path $(pwd) does not match package name, skipping." >&2 + echo "Run $PROGNAME --help for more information on directory name matching." >&2 + exit + fi + fi + + # We now know we're OK and debuild won't complain about the dirname + debuild $CHECKBUILDDEP -- clean + + # Clean up the package related files + if [ "$DEBCLEAN_CLEANDEBS" = yes ]; then + cd .. + rm -f *.changes *.deb *.build + fi + ) +done |