diff options
Diffstat (limited to 'scripts/dcmd.sh')
-rwxr-xr-x | scripts/dcmd.sh | 326 |
1 files changed, 326 insertions, 0 deletions
diff --git a/scripts/dcmd.sh b/scripts/dcmd.sh new file mode 100755 index 0000000..927baf8 --- /dev/null +++ b/scripts/dcmd.sh @@ -0,0 +1,326 @@ +#!/bin/sh +# +# dcmd: expand file lists of .dsc/.changes files in the command line +# +# Copyright (C) 2008 Romain Francoise <rfrancoise@debian.org> +# Copyright (C) 2008 Christoph Berg <myon@debian.org> +# Copyright (C) 2008 Adam D. Barratt <adsb@debian.org> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +# Usage: +# +# dcmd replaces any reference to a .dsc or .changes file in the command +# line with the list of files in its 'Files' section, plus the +# .dsc/.changes file itself. +# +# $ dcmd sha1sum rcs_5.7-23_amd64.changes +# f61254e2b61e483c0de2fc163321399bbbeb43f1 rcs_5.7-23.dsc +# 7a2b283b4c505d8272a756b230486a9232376771 rcs_5.7-23.diff.gz +# e3bac970a57a6b0b41c28c615f2919c931a6cb68 rcs_5.7-23_amd64.deb +# c531310b18773d943249cfaa8b539a9b6e14b8f4 rcs_5.7-23_amd64.changes +# $ + +PROGNAME=${0##*/} + +version() { + echo \ +"This is $PROGNAME, from the Debian devscripts package, version ###VERSION### +This code is copyright 2008 by Romain Francoise, all rights reserved. +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." +} + +usage() { + printf "Usage: %s [options] [command] [dsc or changes file] [...]\n" $PROGNAME +} + +endswith() { + case $1 in + *$2) return 0 ;; + *) return 1;; + esac +} + +# Instead of parsing the file completely as the previous Python +# implementation did (using python-debian), let's just select lines +# that look like they might be part of the file list. +RE="^ [0-9a-f]{32} [0-9]+ ((([a-zA-Z0-9_.-]+/)?[a-zA-Z0-9_.-]+|-) ([a-zA-Z]+|-) )?(.*)$" + +maybe_expand() { + local dir + local sedre + if [ -e "$1" ] && (endswith "$1" .changes || endswith "$1" .dsc || endswith "$1" .buildinfo); then + # Need to escape whatever separator is being used in sed expression so + # it doesn't prematurely end the s command + dir=$(dirname "$1" | sed 's/,/\\,/g') + if [ "$(echo "$1" | cut -b1-2)" != "./" ]; then + sedre="\." + fi + sed --regexp-extended -n "s,$RE,$dir/\5,p" <"$1" | sed "s,^$sedre/,," + fi +} + +DSC=1; BCHANGES=1; SCHANGES=1; ARCHDEB=1; INDEPDEB=1; TARBALL=1; DIFF=1 +CHANGES=1; DEB=1; ARCHUDEB=1; INDEPUDEB=1; UDEB=1; BUILDINFO=1; +FILTERED=0; FAIL_MISSING=1 +EXTRACT_PACKAGE_NAME=0 +SORT=0 +TAC=0 + +while [ $# -gt 0 ]; do + TYPE="" + case "$1" in + --version|-v) version; exit 0;; + --help|-h) usage; exit 0;; + --no-fail-on-missing|-r) FAIL_MISSING=0;; + --fail-on-missing) FAIL_MISSING=1;; + --package|-p) EXTRACT_PACKAGE_NAME=1;; + --sort|-s) SORT=1;; + --tac|-t) TAC=1;; + --) shift; break;; + --no-*) + TYPE=${1#--no-} + case "$FILTERED" in + 1) echo "$PROGNAME: Can't combine --foo and --no-foo options" >&2; + exit 1;; + 0) FILTERED=-1;; + esac;; + --**) + TYPE=${1#--} + case "$FILTERED" in + -1) echo "$PROGNAME: Can't combine --foo and --no-foo options" >&2; + exit 1;; + 0) FILTERED=1; DSC=0; BCHANGES=0; SCHANGES=0; CHANGES=0 + ARCHDEB=0; INDEPDEB=0; DEB=0; ARCHUDEB=0; INDEPUDEB=0 + UDEB=0; TARBALL=0; DIFF=0; BUILDINFO=0;; + esac;; + *) break;; + esac + + case "$TYPE" in + "") ;; + dsc) [ "$FILTERED" = "1" ] && DSC=1 || DSC=0;; + buildinfo) [ "$FILTERED" = "1" ] && BUILDINFO=1 || BUILDINFO=0;; + changes) [ "$FILTERED" = "1" ] && + { BCHANGES=1; SCHANGES=1; CHANGES=1; } || + { BCHANGES=0; SCHANGES=0; CHANGES=0; } ;; + bchanges) [ "$FILTERED" = "1" ] && BCHANGES=1 || BCHANGES=0;; + schanges) [ "$FILTERED" = "1" ] && SCHANGES=1 || SCHANGES=1;; + deb) [ "$FILTERED" = "1" ] && + { ARCHDEB=1; INDEPDEB=1; DEB=1; } || + { ARCHDEB=0; INDEPDEB=0; DEB=0; };; + archdeb) [ "$FILTERED" = "1" ] && ARCHDEB=1 || ARCHDEB=0;; + indepdeb) [ "$FILTERED" = "1" ] && INDEPDEB=1 || INDEPDEB=0;; + udeb) [ "$FILTERED" = "1" ] && + { ARCHUDEB=1; INDEPUDEB=1; UDEB=1; } || + { ARCHUDEB=0; INDEPUDEB=0; UDEB=0; };; + archudeb) [ "$FILTERED" = "1" ] && ARCHUDEB=1 || ARCHUDEB=0;; + indepudeb) [ "$FILTERED" = "1" ] && INDEPUDEB=1 || INDEPUDEB=0;; + tar|orig) [ "$FILTERED" = "1" ] && TARBALL=1 || TARBALL=0;; + diff|debtar) [ "$FILTERED" = "1" ] && DIFF=1 || DIFF=0;; + *) echo "$PROGNAME: Unknown option '$1'" >&2; exit 1;; + esac + shift +done + +cmd= +args="" +while [ $# -gt 0 ]; do + arg="$1" + shift + temparg="$(maybe_expand "$arg")" + if [ -z "$temparg" ]; then + if [ -z "$cmd" ]; then + cmd="$arg" + continue + fi + # Not expanded, so simply add to argument list + args="$args +$arg" + else + SEEN_INDEPDEB=0; SEEN_ARCHDEB=0; SEEN_SCHANGES=0; SEEN_BCHANGES=0 + SEEN_INDEPUDEB=0; SEEN_ARCHUDEB=0; SEEN_UDEB=0; + SEEN_TARBALL=0; SEEN_DIFF=0; SEEN_DSC=0; SEEN_BUILDINFO=0; + MISSING=0 + newarg="" + # Output those items from the expanded list which were + # requested, and record which files are contained in the list + eval "$(echo "$temparg" | while read THISARG; do + if [ -z "$THISARG" ]; then + # Skip + : + elif endswith "$THISARG" _all.deb; then + [ "$INDEPDEB" = "0" ] || echo "newarg=\"\$newarg +$THISARG\";" + echo "SEEN_INDEPDEB=1;" + elif endswith "$THISARG" .deb; then + [ "$ARCHDEB" = "0" ] || echo "newarg=\"\$newarg +$THISARG\";" + echo "SEEN_ARCHDEB=1;" + elif endswith "$THISARG" _all.udeb; then + [ "$INDEPUDEB" = "0" ] || echo "newarg=\"\$newarg +$THISARG\";" + echo "SEEN_INDEPUDEB=1;" + elif endswith "$THISARG" .udeb; then + [ "$ARCHUDEB" = "0" ] || echo "newarg=\"\$newarg +$THISARG\";" + echo "SEEN_ARCHUDEB=1;" + elif endswith "$THISARG" .debian.tar.gz || \ + endswith "$THISARG" .debian.tar.xz || \ + endswith "$THISARG" .debian.tar.bz2; then + [ "$DIFF" = "0" ] || echo "newarg=\"\$newarg +$THISARG\";" + echo "SEEN_DIFF=1;" + elif endswith "$THISARG" .tar.bz2 || \ + endswith "$THISARG" .tar.gz || \ + endswith "$THISARG" .tar.lzma || \ + endswith "$THISARG" .tar.xz || \ + endswith "$THISARG" .tar.zst || \ + endswith "$THISARG" .tar.*.asc; then + [ "$TARBALL" = "0" ] || echo "newarg=\"\$newarg +$THISARG\";" + echo "SEEN_TARBALL=1;" + elif endswith "$THISARG" _source.changes; then + [ "$SCHANGES" = "0" ] || echo "newarg=\"\$newarg +$THISARG\";" + echo "SEEN_SCHANGES=1;" + elif endswith "$THISARG" .changes; then + [ "$BCHANGES" = "0" ] || echo "newarg\"\$newarg +$THISARG\";" + echo "SEEN_BCHANGES=1;" + elif endswith "$THISARG" .dsc; then + [ "$DSC" = "0" ] || echo "newarg=\"\$newarg +$THISARG\";" + echo "SEEN_DSC=1;" + elif endswith "$THISARG" .buildinfo; then + [ "$BUILDINFO" = "0" ] || echo "newarg=\"\$newarg +$THISARG\";" + echo "SEEN_BUILDINFO=1;" + elif endswith "$THISARG" .diff.gz; then + [ "$DIFF" = "0" ] || echo "newarg=\"\$newarg +$THISARG\";" + echo "SEEN_DIFF=1;" + elif [ "$FILTERED" != "1" ]; then + # What is it? Output anyway + echo "newarg=\"\$newarg +$THISARG\";" + fi + done)" + + INCLUDEARG=1 + if endswith "$arg" _source.changes; then + [ "$SCHANGES" = "1" ] || INCLUDEARG=0 + SEEN_SCHANGES=1 + elif endswith "$arg" .changes; then + [ "$BCHANGES" = "1" ] || INCLUDEARG=0 + SEEN_BCHANGES=1 + elif endswith "$arg" .dsc; then + [ "$DSC" = "1" ] || INCLUDEARG=0 + SEEN_DSC=1 + elif endswith "$arg" .buildinfo; then + [ "$BUILDINFO" = "1" ] || INCLUDEARG=0 + SEEN_BUILDINFO=1 + fi + + if [ "$FAIL_MISSING" = "1" ] && [ "$FILTERED" = "1" ]; then + if [ "$CHANGES" = "1" ]; then + if [ "$SEEN_SCHANGES" = "0" ] && [ "$SEEN_BCHANGES" = "0" ]; then + MISSING=1; echo "$arg: .changes fiie not found" >&2 + fi + else + if [ "$SCHANGES" = "1" ] && [ "$SEEN_SCHANGES" = "0" ]; then + MISSING=1; echo "$arg: source .changes file not found" >&2 + fi + if [ "$BCHANGES" = "1" ] && [ "$SEEN_BCHANGES" = "0" ]; then + MISSING=1; echo "$arg: binary .changes file not found" >&2 + fi + fi + + if [ "$DEB" = "1" ]; then + if [ "$SEEN_INDEPDEB" = "0" ] && [ "$SEEN_ARCHDEB" = "0" ]; then + MISSING=1; echo "$arg: binary packages not found" >&2 + fi + else + if [ "$INDEPDEB" = "1" ] && [ "$SEEN_INDEPDEB" = "0" ]; then + MISSING=1; echo "$arg: arch-indep packages not found" >&2 + fi + if [ "$ARCHDEB" = "1" ] && [ "$SEEN_ARCHDEB" = "0" ]; then + MISSING=1; echo "$arg: arch-dep packages not found" >&2 + fi + fi + + if [ "$UDEB" = "1" ]; then + if [ "$SEEN_INDEPUDEB" = "0" ] && [ "$SEEN_ARCHUDEB" = "0" ]; then + MISSING=1; echo "$arg: udeb packages not found" >&2 + fi + else + if [ "$INDEPUDEB" = "1" ] && [ "$SEEN_INDEPUDEB" = "0" ]; then + MISSING=1; echo "$arg: arch-indep udeb packages not found" >&2 + fi + if [ "$ARCHUDEB" = "1" ] && [ "$SEEN_ARCHUDEB" = "0" ]; then + MISSING=1; echo "$arg: arch-dep udeb packages not found" >&2 + fi + + fi + + if [ "$BUILDINFO" = "1" ] && [ "$SEEN_BUILDINFO" = "0" ]; then + MISSING=1; echo "$arg: .buildinfo file not found" >&2 + fi + if [ "$DSC" = "1" ] && [ "$SEEN_DSC" = "0" ]; then + MISSING=1; echo "$arg: .dsc file not found" >&2 + fi + if [ "$TARBALL" = "1" ] && [ "$SEEN_TARBALL" = "0" ]; then + MISSING=1; echo "$arg: upstream tar not found" >&2 + fi + if [ "$DIFF" = "1" ] && [ "$SEEN_DIFF" = "0" ]; then + MISSING=1; echo "$arg: Debian debian.tar/diff not found" >&2 + fi + + [ "$MISSING" = "0" ] || exit 1 + fi + + args="$args +$newarg" + [ "$INCLUDEARG" = "0" ] || args="$args +$arg" + fi +done + +IFS=' +' +if [ "$EXTRACT_PACKAGE_NAME" = "1" ]; then + packages="" + for arg in $args; do + packages="$packages +$(echo "$arg" |sed s/_.*//)" + done + args="$packages" +fi +if [ "$SORT" = "1" ]; then + args="$(echo "$args"| sort -)" +fi +if [ "$TAC" = "1" ]; then + args="$(echo "$args"| tac -)" +fi +if [ -z "$cmd" ]; then + for arg in $args; do + echo $arg + done + exit 0 +fi + +exec $cmd $args |