Make backup-files a shell script instead of a binary, so we can make quilt arch: all [Steve Langasek, thanks so much] (Closes: #363659)
Signed-off-by: Jean Delvare <[email protected]> --- Makefile.in | 30 ---- bin/quilt.in | 4 quilt.spec.in | 1 quilt/add.in | 2 quilt/pop.in | 6 quilt/push.in | 2 quilt/remove.in | 2 quilt/scripts/backup-files.in | 289 ++++++++++++++++++++++++++++++++++++++++++ quilt/scripts/patchfns.in | 2 quilt/snapshot.in | 2 10 files changed, 305 insertions(+), 35 deletions(-) --- a/Makefile.in +++ b/Makefile.in @@ -6,7 +6,6 @@ PACKAGE_BUGREPORT := @PACKAGE_BUGREPORT@ prefix := @prefix@ exec_prefix := @exec_prefix@ bindir := @bindir@ -libdir := @libdir@ datarootdir := @datarootdir@ datadir := @datadir@ docdir := @docdir@ @@ -51,11 +50,6 @@ LDFLAGS += @LDFLAGS@ LIBS := @LIBS@ EXEEXT := @EXEEXT@ -LIBOBJS := $(filter $(patsubst lib/%.c,lib/%.o,$(wildcard lib/*.c)), $(patsubst %,lib/%,@LIBOBJS@)) -ifneq ($(LIBOBJS),) -CFLAGS += -Ilib -endif - COMPAT_SYMLINKS := @COMPAT_SYMLINKS@ COMPAT_PROGRAMS := @COMPAT_PROGRAMS@ @@ -83,7 +77,7 @@ SRC += $(QUILT_SRC:%=quilt/%) 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) @@ -94,10 +88,8 @@ COMPAT := $(COMPAT_PROGRAMS:%=compat/%) SRC += $(wildcard compat/*.in) $(wildcard compat/*.sh) DIRT += $(patsubst %.in,%,$(wildcard compat/*.in)) $(COMPAT_SYMLINKS:%=compat/%) -LIB_SRC := backup-files.c quilt.el -LIB := backup-files$(EXEEXT) +LIB_SRC := quilt.el SRC += $(LIB_SRC:%=lib/%) -DIRT += lib/backup-files$(EXEEXT) $(LIB_SRC:%.c=lib/%.o) DOC_IN := README DOC_SRC := $(DOC_IN:%=doc/%.in) @@ -131,16 +123,13 @@ DIRT += test/.depend $(wildcard test/.* # 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 QUILTRC := $(CURDIR)/test/test.quiltrc -export QUILT_DIR QUILT_LIB QUILTRC +export QUILT_DIR QUILTRC #----------------------------------------------------------------------- all : configure scripts compat $(DOC:%=doc/%) $(MAN1) mofiles -$(LIB:%=lib/%) :: $(LIBOBJS) - ifeq ($(USE_NLS),yes) mofiles : $(LINGUAS:%=po/%.mo) else @@ -154,7 +143,7 @@ endif $(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 @@ -259,8 +248,7 @@ $(PACKAGE).spec : $(PACKAGE).spec.in $(P $(patsubst %.in,%,$(wildcard bin/*.in quilt/*.in quilt/scripts/*.in)) :: Makefile % :: %.in @echo "$< -> $@" >&2 - @$(SED) -e 's:@QUILT_LIB''@:$(libdir)/$(PACKAGE):g' \ - -e 's:@QUILT_DIR''@:$(datadir)/$(PACKAGE):g' \ + @$(SED) -e 's:@QUILT_DIR''@:$(datadir)/$(PACKAGE):g' \ -e 's:@PERL''@:$(PERL):g' \ -e 's:@BASH''@:$(BASH):g' \ -e 's:@PATCH''@:$(PATCH):g' \ @@ -272,8 +260,6 @@ $(patsubst %.in,%,$(wildcard bin/*.in qu $< > $@ @$(if $(filter-out $<,$(NON_EXEC_IN)),chmod +x $@) -lib/backup-files.o :: Makefile - configure : configure.ac aclocal.m4 autoconf @echo "Please run ./configure" @@ -324,9 +310,6 @@ ifneq ($(PATCH_WRAPPER),) $(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)/ @@ -363,7 +346,6 @@ install: install-main install-compat uninstall :: rm -rf $(BIN:%=$(BUILD_ROOT)$(bindir)/%) \ - $(BUILD_ROOT)$(libdir)/$(PACKAGE) \ $(BUILD_ROOT)$(datadir)/$(PACKAGE) \ $(patsubst %,$(BUILD_ROOT)$(mandir)/man1/%, \ $(notdir $(MAN1))) \ @@ -387,7 +369,7 @@ test/.patch-wrapper.ok : bin/patch-wrapp # Include a run-time generated list of dependencies for each test case test/.depend : Makefile $(TESTS) - @( printf "%s : bin/quilt quilt/scripts/patchfns $(LIB:%=lib/%) $(COMPAT)\n" $(TESTS); \ + @( printf "%s : bin/quilt quilt/scripts/patchfns quilt/scripts/backup-files $(COMPAT)\n" $(TESTS); \ $(AWK) 'sub(/.*\$$ *quilt /, "") \ { print FILENAME, ":", "quilt/"$$1}' $(TESTS); \ $(AWK) 'sub(/.*\<quilt_command /, "") && ($$1 !~ /[^a-z]/) \ --- a/quilt/add.in +++ b/quilt/add.in @@ -121,7 +121,7 @@ do continue fi - if ! $QUILT_LIB/backup-files -b -s -L -B $QUILT_PC/$patch/ "$SUBDIR$file" + if ! $QUILT_DIR/scripts/backup-files -b -s -L -B $QUILT_PC/$patch/ "$SUBDIR$file" then printf $"Failed to back up file %s\n" "$SUBDIR$file" >&2 status=1 --- a/quilt/pop.in +++ b/quilt/pop.in @@ -95,7 +95,7 @@ check_for_pending_changes() local prefix=$QUILT_PC/$patch/ [ ${prefix:0:1} == / ] || prefix=$PWD/$prefix if ! ( cd $workdir && \ - $QUILT_LIB/backup-files -B $prefix -rks - ) + $QUILT_DIR/scripts/backup-files -B $prefix -r -k -s - ) then printf $"Failed to copy files to temporary directory\n" >&2 rm -rf $workdir @@ -162,7 +162,7 @@ remove_patch() status=$? else printf $"Removing patch %s\n" "$(print_patch $patch)" - $QUILT_LIB/backup-files $silent -r -t -B $QUILT_PC/$patch/ - + $QUILT_DIR/scripts/backup-files $silent -r -t -B $QUILT_PC/$patch/ - status=$? fi remove_from_db $patch @@ -264,7 +264,7 @@ else # of one: This will automatically be the case in the usual # situations, but we don't want to risk file corruption in weird # corner cases such as files added to a patch but not modified. - $QUILT_LIB/backup-files -L -s -B $QUILT_PC/$patch/ - + $QUILT_DIR/scripts/backup-files -L -s -B $QUILT_PC/$patch/ - printf $"Now at patch %s\n" "$(print_patch $patch)" fi ### Local Variables: --- a/quilt/push.in +++ b/quilt/push.in @@ -140,7 +140,7 @@ rollback_patch() { local patch=$1 - $QUILT_LIB/backup-files $silent_unless_verbose -r -B $QUILT_PC/$patch/ - + $QUILT_DIR/scripts/backup-files $silent_unless_verbose -r -B $QUILT_PC/$patch/ - } cleanup_patch_output() { --- a/quilt/snapshot.in +++ b/quilt/snapshot.in @@ -85,7 +85,7 @@ done \ } { print } ' \ -| $QUILT_LIB/backup-files -b -s -L -f - -B "$QUILT_PC/$snap_subdir/" +| $QUILT_DIR/scripts/backup-files -b -s -L -f - -B "$QUILT_PC/$snap_subdir/" ### Local Variables: ### mode: shell-script --- /dev/null +++ b/quilt/scripts/backup-files.in @@ -0,0 +1,289 @@ +#! @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 () { + local progname="$1" + echo "Usage: $progname [-B prefix] [-z suffix] [-f {file|-}] [-s] [-k] [-t] [-L] [-b|-r|-x] {file|-} ... + + Create hard linked backup copies of a list of files + read from standard input. + + -b Create backup + -r Restore the backup + -x Remove backup files and empty parent directories + -k When doing a restore, keep the backup files + -B Path name prefix for backup files + -z Path name suffix for backup files + -s Silent operation; only print error messages + -f Read the filenames to process from file (- = standard input) + -t Touch original files after restore (update their mtimes) + + -L Ensure that when finished, the source file has a link count of 1 +" +} + +copy_file() { + local from="$1" + local to="$2" + cp -dp --remove-destination "$from" "$to" +} + +link_or_copy_file() { + local from="$1" + local to="$2" + if ! ln "$from" "$to" 2>/dev/null ; then + copy_file "$from" "$to" + fi +} + +ensure_nolinks() { + local filename="$1" + local link_count dirname basename tmpname + + 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() { + local file="$1" + local 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" + else + $ECHO "Copying $file" + if [ -n "$OPT_NOLINKS" -a "$(stat -c '%h' "$file")" = "1" ]; then + copy_file "$file" "$backup" + else + link_or_copy_file "$file" "$backup" + if [ -n "$OPT_NOLINKS" ]; then + ensure_nolinks "$file" + fi + 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" + if [ -z "$OPT_KEEP_BACKUP" ]; then + rm "$backup" + while [ -d "${backup%/*}" ] && ! [ -L "${backup%/*}" ] + do + backup="${backup%/*}" + rmdir --ignore-fail-on-non-empty "$backup" 2>/dev/null + if [ -d "$backup" ]; then + break + fi + done + fi + else + $ECHO "Restoring $file" + if [ -e "$file" ]; then + rm "$file" + fi + if [ -n "$OPT_NOLINKS" -a "$(stat -c '%h' "$backup")" != "1" ]; then + copy_file "$backup" "$file" + else + link_or_copy_file "$backup" "$file" + if [ -n "$OPT_NOLINKS" ]; then + ensure_nolinks "$file" + fi + fi + + if [ -z "$OPT_KEEP_BACKUP" ]; then + rm "$backup" + while [ -d "${backup%/*}" ] && ! [ -L "${backup%/*}" ] + do + backup="${backup%/*}" + rmdir --ignore-fail-on-non-empty "$backup" 2>/dev/null + if [ -d "$backup" ]; then + break + fi + done + fi + if [ -n "$OPT_TOUCH" ]; then + touch "$file" + fi + fi + elif [ "$OPT_WHAT" == "remove" ]; then + if [ -e "$backup" ]; then + rm "$backup" + fi + while [ -d "${backup%/*}" ] && ! [ -L "${backup%/*}" ] + do + backup="${backup%/*}" + rmdir --ignore-fail-on-non-empty "$backup" 2>/dev/null + if [ -d "$backup" ]; then + break + fi + done + elif [ -z "$OPT_WHAT" ]; then + if [ -e "$file" ] && [ -n "$OPT_NOLINKS" ]; then + ensure_nolinks "$file" + fi + else + return 1 + fi +} + +walk() { + local 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=: + ;; + -k) OPT_KEEP_BACKUP=1 + ;; + -L) OPT_NOLINKS=1 + ;; + -t) OPT_TOUCH=1 + ;; + -?*) usage "$progname" + exit 0 + ;; + *) FILELIST=("$@") + break + ;; + esac + + shift +done + +if [ -z "${OPT_PREFIX}${OPT_SUFFIX}" ]; then + usage "$progname" + exit 1 +fi +if [ ${#FILELIST[@]} == 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 ${#FILELIST[@]} ]; do + + case "${FILELIST[$I]}" in + -) + path="${OPT_PREFIX%/*}" + + find "$path" -mindepth 1 \( -type f -o -type d \) -print 2>/dev/null \ + | while read + do + if [ -d "$REPLY" ] + then + if ! [ -r "$REPLY" ] || ! [ -x "$REPLY" ] + then + echo "$REPLY: Permission denied" + exit 1 + fi + else + walk "$REPLY" + fi + done + if [ $? != 0 ]; then + exit 1 + fi + ;; + *) + process_file "${FILELIST[$I]}" + ;; + esac + + I=$(($I+1)) +done --- a/bin/quilt.in +++ b/bin/quilt.in @@ -9,8 +9,8 @@ export TEXTDOMAIN=quilt export TEXTDOMAINDIR=@LOCALEDIR@ -: ${QUILT_DIR=@QUILT_DIR@} ${QUILT_LIB=@QUILT_LIB@} -export QUILT_DIR QUILT_LIB +: ${QUILT_DIR=@QUILT_DIR@} +export QUILT_DIR if [ -z "$QUILTRC" ] then --- a/quilt/scripts/patchfns.in +++ b/quilt/scripts/patchfns.in @@ -914,7 +914,7 @@ apply_patch_temporarily() local prefix=$QUILT_PC/$patch/ [ ${prefix:0:1} == / ] || prefix=$PWD/$prefix if ! ( cd $workdir && \ - $QUILT_LIB/backup-files -B $prefix -rks ${@:--} ) + $QUILT_DIR/scripts/backup-files -B $prefix -r -k -s ${@:--} ) then printf $"Failed to copy files to temporary directory\n" >&2 return 1 --- a/quilt/remove.in +++ b/quilt/remove.in @@ -86,7 +86,7 @@ do fi # Restore file from backup - if ! $QUILT_LIB/backup-files -r -t -s -B $QUILT_PC/$patch/ "$SUBDIR$file" + if ! $QUILT_DIR/scripts/backup-files -r -t -s -B $QUILT_PC/$patch/ "$SUBDIR$file" then printf $"Failed to remove file %s from patch %s\n" \ "$SUBDIR$file" "$(print_patch $patch)" >&2 --- a/quilt.spec.in +++ b/quilt.spec.in @@ -47,7 +47,6 @@ rm -rf $RPM_BUILD_ROOT /usr/bin/quilt /usr/share/quilt/ /usr/share/emacs/ -/usr/lib/quilt/ /etc/bash_completion.d/quilt %config(noreplace) /etc/quilt.quiltrc %doc %{_mandir}/man1/guards.1* _______________________________________________ Quilt-dev mailing list [email protected] http://lists.nongnu.org/mailman/listinfo/quilt-dev
