[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Quilt-dev] [PATCH 01/39] Make backup-files a shell script
From: |
Jean Delvare |
Subject: |
[Quilt-dev] [PATCH 01/39] Make backup-files a shell script |
Date: |
Sat, 19 Mar 2011 10:52:31 +0100 |
User-agent: |
quilt/0.48-17.1 |
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 <address@hidden>
---
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 <address@hidden>
+# portions Copyright (C) 2003, 2004, 2005, 2006 Andreas Gruenbacher
+# <address@hidden>, 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 [ address@hidden == 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 address@hidden ]; 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 address@hidden@
-: address@hidden@} address@hidden@}
-export QUILT_DIR QUILT_LIB
+: address@hidden@}
+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] [PATCH 03/39] BSD compatibility: cp, (continued)
- [Quilt-dev] [PATCH 03/39] BSD compatibility: cp, Jean Delvare, 2011/03/19
- [Quilt-dev] [PATCH 02/39] BSD compatibility: stat, Jean Delvare, 2011/03/19
- [Quilt-dev] [PATCH 21/39] backup-files: Drop curly braces, Jean Delvare, 2011/03/19
- [Quilt-dev] [PATCH 07/39] backup-files: Skip test for file presence, Jean Delvare, 2011/03/19
- [Quilt-dev] [PATCH 18/39] backup-files: Make input methods mutually exclusive, Jean Delvare, 2011/03/19
- [Quilt-dev] [PATCH 25/39] backup-files: Separate function restore_all, Jean Delvare, 2011/03/19
- [Quilt-dev] [PATCH 26/39] backup-files: Quick exit when unlinking is not needed, Jean Delvare, 2011/03/19
- [Quilt-dev] [PATCH 13/39] backup-files: Split code to sparate functions, Jean Delvare, 2011/03/19
- [Quilt-dev] [PATCH 24/39] backup-files: Avoid negations, Jean Delvare, 2011/03/19
- [Quilt-dev] [PATCH 14/39] backup-files: Mass reindent, Jean Delvare, 2011/03/19
- [Quilt-dev] [PATCH 01/39] Make backup-files a shell script,
Jean Delvare <=
- [Quilt-dev] [PATCH 22/39] backup-files: Check if backup exists, Jean Delvare, 2011/03/19
- [Quilt-dev] [PATCH 12/39] backup-files: Simplify find loop, Jean Delvare, 2011/03/19
- [Quilt-dev] [PATCH 15/39] backup-files: Optimize restore, Jean Delvare, 2011/03/19
- [Quilt-dev] [PATCH 23/39] backup-files: Optimize noop, Jean Delvare, 2011/03/19
- [Quilt-dev] [PATCH 27/39] backup-files: Remember the list of files, Jean Delvare, 2011/03/19
- [Quilt-dev] [PATCH 17/39] backup-files: Drop variable filelist, Jean Delvare, 2011/03/19
- [Quilt-dev] [PATCH 09/39] backup-files: Inline copy_file and link_or_copy_file, Jean Delvare, 2011/03/19
- [Quilt-dev] [PATCH 19/39] backup-files: Use internal implementation of dirname, Jean Delvare, 2011/03/19
- [Quilt-dev] [PATCH 33/39] backup-files: Try mass copy first on copy, Jean Delvare, 2011/03/19