Package: quilt
Version: 0.44-4
Severity: wishlist
Tags: patch

Hi Martin,

Since quilt is now quite deeply embedded as a build-dependency in Debian,
used both for glibc and for etch, bootstrapping a new port is a lot more
painful due to quilt's own rich build-deps.

So since there was only one architecture-dependent file in the whole
package, and it came from a single 600-line C file, I thought I'd take a
look at making quilt arch: all instead of arch: any.

The result is the attached patch, replacing lib/backup-files.c with a Very
Small Shell Script.  (Ok, it's 230 lines... not small, but still smaller
than the C version.)  No new dependencies are introduced, as it makes use
only of features of essential packages.  It does use bash as a shell, rather
than just /bin/sh, because it makes use of non-POSIX array variables.

If you would consider applying this patch (and/or submitting it upstream),
I'm sure future generations of porters would appreciate it. :)

-- 
Steve Langasek                   Give me a lever long enough and a Free OS
Debian Developer                   to set it on, and I can move the world.
[EMAIL PROTECTED]                                   http://www.debian.org/
diff -u quilt-0.44/Makefile.in quilt-0.44/Makefile.in
--- quilt-0.44/Makefile.in
+++ quilt-0.44/Makefile.in
@@ -81,7 +81,7 @@
 DIRT +=                $(QUILT_IN:%=quilt/%)
 
 SCRIPTS_IN :=  patchfns parse-patch inspect dependency-graph edmail    \
-               remove-trailing-ws
+               remove-trailing-ws backup-files
 
 SCRIPTS_SRC := $(SCRIPTS_IN:%=%.in)
 SCRIPTS :=     $(SCRIPTS_IN)
@@ -92,10 +92,6 @@
 DIRT +=                $(patsubst %.in,%,$(wildcard compat/*.in))
 
 COMPAT :=      $(COMPAT_PROGRAMS:%=compat/%) $(COMPAT_SYMLINKS:%=compat/%)
-LIB_SRC :=     backup-files.c
-LIB :=         backup-files$(EXEEXT)
-SRC +=         $(LIB_SRC:%=lib/%)
-DIRT +=                lib/backup-files$(EXEEXT) $(LIB_SRC:%.c=lib/%.o)
 
 DOC_IN :=      README
 DOC_SRC :=     $(DOC_IN:%=doc/%.in)
@@ -126,7 +122,7 @@
 # Settings for running the uninstalled version of quilt in the source tree:
 PATH :=                $(CURDIR)/bin:$(CURDIR)/compat:$(PATH)
 QUILT_DIR :=   $(CURDIR)/quilt
-QUILT_LIB :=   $(CURDIR)/lib
+QUILT_LIB :=   $(CURDIR)/quilt/scripts
 QUILTRC :=     $(CURDIR)/test/test.quiltrc
 export QUILT_DIR QUILT_LIB QUILTRC
 
@@ -149,7 +145,7 @@
        $(MSGMERGE) -o $@ $@ $^
 
 scripts : $(BIN:%=bin/%) $(QUILT:%=quilt/%)                            \
-         $(SCRIPTS:%=quilt/scripts/%) $(LIB:%=lib/%)                   \
+         $(SCRIPTS:%=quilt/scripts/%)                                  \
          $(if $(PATCH_WRAPPER),bin/patch-wrapper)
 
 dist : clean $(PACKAGE)-$(VERSION).tar.gz
@@ -249,7 +245,7 @@
 $(patsubst %.in,%,$(wildcard bin/*.in quilt/*.in quilt/scripts/*.in)) :: 
Makefile
 % :: %.in
        @echo "$< -> $@" >&2
-       @$(SED) -e 's:@QUILT_LIB''@:$(libdir)/$(PACKAGE):g'             \
+       @$(SED) -e 's:@QUILT_LIB''@:$(datadir)/$(PACKAGE)/scripts:g'    \
                -e 's:@QUILT_DIR''@:$(datadir)/$(PACKAGE):g'            \
                -e 's:@PERL''@:$(PERL):g'                               \
                -e 's:@BASH''@:$(BASH):g'                               \
@@ -261,8 +257,6 @@
                $< > $@
        @$(if $(filter-out $<,$(NON_EXEC_IN)),chmod +x $@)
 
-lib/backup-files.o :: Makefile
-
 configure : configure.ac
        autoconf
        @echo "Please run ./configure"
@@ -318,9 +312,6 @@
                   $(BUILD_ROOT)$(datadir)/$(PACKAGE)/wrapper/patch
 endif
        
-       $(INSTALL) -d $(BUILD_ROOT)$(libdir)/$(PACKAGE)
-       $(INSTALL) -m 755 $(LIB:%=lib/%) $(BUILD_ROOT)$(libdir)/$(PACKAGE)/
-
        $(INSTALL) -d $(BUILD_ROOT)$(docdir)/$(PACKAGE)-$(VERSION)/
        $(INSTALL) -m 644 doc/README                                    \
                   $(BUILD_ROOT)$(docdir)/$(PACKAGE)-$(VERSION)/
diff -u quilt-0.44/debian/changelog quilt-0.44/debian/changelog
--- quilt-0.44/debian/changelog
+++ quilt-0.44/debian/changelog
@@ -1,3 +1,11 @@
+quilt (0.44-4.1) unstable; urgency=low
+
+  * Non-maintainer upload.
+  * Make backup-files a shell script instead of a binary, so we can make
+    quilt arch: all
+
+ -- Steve Langasek <[EMAIL PROTECTED]>  Wed, 19 Apr 2006 17:53:06 -0700
+
 quilt (0.44-4) unstable; urgency=low
 
   * Build-depend on diffstat so that diffstat support gets compiled in
diff -u quilt-0.44/debian/control quilt-0.44/debian/control
--- quilt-0.44/debian/control
+++ quilt-0.44/debian/control
@@ -4,11 +4,11 @@
 Section: devel
 Priority: optional
 Maintainer: Martin Quinson <[EMAIL PROTECTED]>
-Build-Depends: cdbs (>= 0.4.23-1.1), debhelper (>= 4.1.0), gettext, hevea, 
lynx, gawk, diffstat
+Build-Depends-Indep: cdbs (>= 0.4.23-1.1), debhelper (>= 4.1.0), gettext, 
hevea, lynx, gawk, diffstat
 Standards-Version: 3.6.1.0
 
 Package: quilt
-Architecture: any
+Architecture: all
 Depends: patch, diffstat, bzip2, gettext, gawk, ${shlibs:Depends}
 Description: Tool to work with series of patches
  Quilt manages a series of patches by keeping track of the changes
diff -u quilt-0.44/debian/rules quilt-0.44/debian/rules
--- quilt-0.44/debian/rules
+++ quilt-0.44/debian/rules
@@ -22,7 +22,7 @@
 DEB_CONFIGURE_EXTRA_FLAGS := --with-awk=/usr/bin/gawk 
--with-mta=/usr/sbin/sendmail
 
 # distribute a text version of the doc for fool souls
-common-build-arch::
+common-build-indep::
        mkdir doc/tmp || true
        cd doc/tmp; LC_ALL=C hevea ../main.tex ; LC_ALL=C hevea ../main.tex; 
LC_ALL=C hevea ../main.tex
        cp doc/tmp/main.html doc/quilt.html 
only in patch2:
unchanged:
--- quilt-0.44.orig/quilt/scripts/backup-files.in
+++ quilt-0.44/quilt/scripts/backup-files.in
@@ -0,0 +1,230 @@
+#! @BASH@
+
+set -e
+
+# File: backup-files.sh
+
+# Copyright (C) 2006 Steve Langasek <[EMAIL PROTECTED]>
+# portions Copyright (C) 2003, 2004, 2005, 2006 Andreas Gruenbacher
+# <[EMAIL PROTECTED]>, SuSE Labs
+
+# 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; version 2 dated June, 1991.
+
+# 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.
+
+
+# Create backup files of a list of files similar to GNU patch. A path
+# name prefix and suffix for the backup file can be specified with the
+# -B and -z options.
+
+usage () {
+       progname="$1"
+       echo -e "Usage: $progname [-B prefix] [-z suffix] [-f {file|-}] [-s] 
[-b|-r|-x] [-t] [-L] {file|-} ...\n"\
+       "\n"\
+       "\tCreate hard linked backup copies of a list of files\n"\
+       "\tread from standard input.\n"\
+       "\n"\
+       "\t-b\tCreate backup\n"\
+       "\t-r\tRestore the backup\n"\
+       "\t-x\tRemove backup files and empty parent directories\n"\
+       "\t-B\tPath name prefix for backup files\n"\
+       "\t-z\tPath name suffix for backup files\n"\
+       "\t-s\tSilent operation; only print error messages\n"\
+       "\t-f\tRead the filenames to process from file (- = standard input)\n"\
+       "\t-t\tTouch original files after restore (update their mtimes)\n\n"\
+       "\t-L\tEnsure that when finished, the source file has a link count of 
1\n\n"
+}
+
+link_or_copy_file() {
+       from="$1"
+       to="$2"
+       ln -T "$from" "$to" || cp -dp --remove-destination "$from" "$to"
+}
+
+ensure_nolinks() {
+       filename="$1"
+
+       link_count=$(stat -c '%h' "$filename")
+       if [ -z "$link_count" ] || [ "$link_count" -gt 1 ]; then
+               dirname=$(dirname "$filename")
+               basename=$(basename "$filename")
+               # Temp file name is "path/to/.file.XXXXXX"
+               tmpname=$(mktemp "${dirname}/.${basename}.XXXXXX")
+               cp -dp "$filename" "$tmpname"
+               mv "$tmpname" "$filename"
+       fi
+}
+
+process_file() {
+       file="$1"
+       backup="${OPT_PREFIX}${file}${OPT_SUFFIX}"
+
+       if [ "$OPT_WHAT" == "backup" ]; then
+               if [ -e "$backup" ]; then
+                       rm "$backup"
+               else
+                       mkdir -p "$(dirname "$backup")"
+               fi
+               if [ ! -e "$file" ]; then
+                       $ECHO "New file $file"
+                       touch "$backup"
+                       chmod 000 "$backup"
+               else
+                       $ECHO "Copying $file"
+                       link_or_copy_file "$file" "$backup"
+                       if [ -n "$OPT_NOLINKS" ]; then
+                               ensure_nolinks "$file"
+                       fi
+                       if [ -n "OPT_TOUCH" ]; then
+                               touch "$backup"
+                       fi
+               fi
+       elif [ "$OPT_WHAT" == "restore" ]; then
+               mkdir -p "$(dirname "$file")"
+
+               if [ ! -e "$backup" ]; then
+                       return 1
+               fi
+               if [ ! -s "$backup" ]; then
+                       if [ -e "$file" ]; then
+                               rm "$file"
+                       fi
+                       $ECHO "Removing $file"
+                       rm "$backup"
+                       rmdir --ignore-fail-on-non-empty -p "$(dirname 
"$backup")" 2> /dev/null
+               else
+                       $ECHO "Restoring $file"
+                       if [ -e "$file" ]; then
+                               rm "$file"
+                       fi
+                       link_or_copy_file "$backup" "$file"
+                       rm "$backup"
+                       rmdir --ignore-fail-on-non-empty -p "$(dirname 
"$backup")" 2>/dev/null
+                       if [ -n "$OPT_NOLINKS" ]; then
+                               ensure_nolinks "$file"
+                       fi
+                       if [ -n "$OPT_TOUCH" ]; then
+                               touch "$file"
+                       fi
+               fi
+       elif [ "$OPT_WHAT" == "remove" ]; then
+               if [ -e "$backup" ]; then
+                       rm "$backup"
+               fi
+               rmdir --ignore-fail-on-non-empty -p "$(dirname "$backup")" 
2>/dev/null
+       elif [ "$OPT_WHAT" == "noop" ]; then
+               if [ -e "$file" ] && [ -n "$OPT_NOLINKS" ]; then
+                       ensure_nolinks "$file"
+               fi
+       else
+               return 1
+       fi
+}
+
+walk() {
+       path="$1"
+       if [ ! -f "$path" ]; then
+               return 0
+       fi
+
+       if [ "${path#$OPT_PREFIX}" == "$path" ]
+       then
+               # prefix does not match
+               return 0
+       fi
+       path="${path#$OPT_PREFIX}"
+
+       if [ -n "$OPT_SUFFIX" ] && [ "${path%$OPT_SUFFIX}" == "$path" ]
+       then
+               # suffix does not match
+               return 0
+       fi
+       path="${path%$OPT_SUFFIX}"
+
+       process_file "$path"
+}
+
+
+ECHO=echo
+declare -a FILELIST
+progname="$0"
+while [ $# -gt 0 ]; do
+       case $1 in
+       -b)     OPT_WHAT=backup
+               ;;
+       -r)     OPT_WHAT=restore
+               ;;
+       -x)     OPT_WHAT=remove
+               ;;
+       -B)     OPT_PREFIX=$2
+               shift
+               ;;
+       -f)     OPT_FILE=$2
+               shift
+               ;;
+       -z)     OPT_SUFFIX=$2
+               shift
+               ;;
+       -s)     ECHO=:
+               ;;
+       -L)     OPT_NOLINKS=1
+               ;;
+       -t)     OPT_TOUCH=1
+               ;;
+       -?*)    usage "$progname"
+               exit 0
+               ;;
+       *)      FILELIST=($1)
+               ;;
+       esac
+
+        shift
+done
+
+if [ -z "${OPT_PREFIX}${OPT_SUFFIX}" ]; then
+       usage "$progname"
+       exit 1
+fi
+if [ [EMAIL PROTECTED] == 0 ] && [ -z "$OPT_FILE" ]; then
+       usage "$progname"
+       exit 1
+fi
+
+if [ -n "$OPT_FILE" ]; then
+       cat "$OPT_FILE" \
+       | while read nextfile; do
+               process_file "$nextfile"
+       done
+fi
+
+I=0
+while [ $I -lt [EMAIL PROTECTED] ]; do
+
+       case "${FILELIST[$I]}" in
+       -)
+               path="${OPT_PREFIX%/*}"
+               [ -n "$path" ] && [ -d "$path" ] || continue
+
+               find "$path" -mindepth 1 -type f -print \
+               | while read
+               do
+                       walk "$REPLY"
+               done
+               ;;
+       *)
+               process_file "${FILELIST[$I]}"
+               ;;
+       esac
+               
+       I=$(($I+1))
+done

Attachment: signature.asc
Description: Digital signature

Reply via email to