SHA256
1
0
forked from pool/quilt

Accepting request 854517 from home:jdelvare:branches:devel:tools:scm

- Handle git-generated patches which include symbolic link manipulation (savannah bug
  #59479).
- quilt setup: procfs resolves links, so we must do the same (bsc#1179023).
- quilt.spec: Recommend "ed", as the annotate command requires it.

OBS-URL: https://build.opensuse.org/request/show/854517
OBS-URL: https://build.opensuse.org/package/show/devel:tools:scm/quilt?expand=0&rev=122
This commit is contained in:
Jean Delvare 2020-12-10 10:38:09 +00:00 committed by Git OBS Bridge
parent d747e66ac5
commit a1d18c6c3f
4 changed files with 223 additions and 2 deletions

View File

@ -0,0 +1,164 @@
From: Jean Delvare <jdelvare@suse.de>
Date: Wed, 9 Dec 2020 11:39:56 +0100
Subject: backup-files: Restore symbolic links
Patch-mainline: yes
Git-commit: 26f7bc93d2bbe49a96d23f879b24e82651392497
References: https://savannah.nongnu.org/bugs/index.php?59479
As "patch" originally did not handle symbolic links, backup-files
didn't have to care about them either. But now that git has
introduced an extended syntax which allows manipulating symbolic
links in patch files, "quilt push" may create or delete symbolic
links, which means that backup-files must support such operations
too.
Also extend the backup-files test case to cover these operations.
This fixes bug #59479:
https://savannah.nongnu.org/bugs/index.php?59479
Signed-off-by: Jean Delvare <jdelvare@suse.de>
---
quilt/scripts/backup-files.in | 40 ++++++++++++++++++++++++++++++----------
test/backup-files.test | 33 +++++++++++++++++++++++++++++++++
2 files changed, 63 insertions(+), 10 deletions(-)
--- a/quilt/scripts/backup-files.in
+++ b/quilt/scripts/backup-files.in
@@ -89,7 +89,7 @@ backup()
dir=$(dirname "$backup")
[ -d "$dir" ] || mkdir -p "$dir"
- if [ -e "$file" ]; then
+ if [ -L "$file" -o -e "$file" ]; then
$ECHO "Copying $file"
if [ -n "$OPT_NOLINKS" -a "$(stat @STAT_HARDLINK@ "$file")" = 1 ]; then
cp -p "$file" "$backup"
@@ -110,24 +110,28 @@ restore()
local file=$1
local backup=$OPT_PREFIX$file
- if [ ! -e "$backup" ]; then
+ if [ ! -L "$backup" -a ! -e "$backup" ]; then
return 1
fi
- if [ -s "$backup" ]; then
+ if [ -L "$backup" -o -s "$backup" ]; then
$ECHO "Restoring $file"
- if [ -e "$file" ]; then
+ if [ -L "$file" -o -e "$file" ]; then
rm "$file"
else
mkdir -p "$(dirname "$file")"
fi
- ln "$backup" "$file" 2>&4 || cp -p "$backup" "$file"
+ if [ -L "$backup" ]; then
+ ln -s "$(readlink "$backup")" "$file"
+ else
+ ln "$backup" "$file" 2>&4 || cp -p "$backup" "$file"
+ fi
- if [ -n "$OPT_TOUCH" ]; then
+ if [ -n "$OPT_TOUCH" -a ! -L "$file" ]; then
touch "$file"
fi
else
$ECHO "Removing $file"
- if [ -e "$file" ]; then
+ if [ -L "$file" -o -e "$file" ]; then
rm "$file"
fi
fi
@@ -145,11 +149,13 @@ restore_all()
# Store the list of files to process
EMPTY_FILES=$(gen_tempfile)
NONEMPTY_FILES=$(gen_tempfile)
- trap "rm -f \"$EMPTY_FILES\" \"$NONEMPTY_FILES\"" EXIT
+ LINK_FILES=$(gen_tempfile)
+ trap "rm -f \"$EMPTY_FILES\" \"$NONEMPTY_FILES\" \"$LINK_FILES\"" EXIT
cd "$OPT_PREFIX"
find . -type f -size 0 -print0 > "$EMPTY_FILES"
find . -type f -size +0 -print0 > "$NONEMPTY_FILES"
+ find . -type l -print0 > "$LINK_FILES"
cd "$OLDPWD"
if [ -s "$EMPTY_FILES" ]; then
@@ -189,6 +195,20 @@ restore_all()
fi
fi
+ if [ -s "$LINK_FILES" ]; then
+ (cd "$OPT_PREFIX" && find . -type d -print0) \
+ | xargs -0 mkdir -p
+
+ while read -d $'\0' -r
+ do
+ local file=${REPLY#./}
+ local backup=$OPT_PREFIX$file
+
+ $ECHO "Restoring $file"
+ ln -sf "$(readlink "$backup")" "$file"
+ done < "$LINK_FILES"
+ fi
+
if [ -z "$OPT_KEEP_BACKUP" ]; then
rm -rf "$OPT_PREFIX"
fi
@@ -212,7 +232,7 @@ copy()
dir=$(dirname "$backup")
[ -d "$dir" ] || mkdir -p "$dir"
- if [ -e "$file" ]; then
+ if [ -L "$file" -o -e "$file" ]; then
$ECHO "Copying $file"
cp -p "$file" "$backup"
else
@@ -234,7 +254,7 @@ copy_many()
cat "$OPT_FILE" \
| while read
do
- if [ -e "$REPLY" ]; then
+ if [ -L "$REPLY" -o -e "$REPLY" ]; then
printf '%s\0' "$REPLY" >&3
else
# This is a rare case, not worth optimizing
--- a/test/backup-files.test
+++ b/test/backup-files.test
@@ -229,3 +229,36 @@ Unit test of the backup-files script.
> 1
$ [ ! -s new ] || echo "file snapshot/new should be empty"
$ rm -rf snapshot
+
+ # Test backup and restoration of a symbolic link
+ $ mkdir dir
+ $ ln -s foo dir/link
+ $ readlink dir/link
+ > foo
+ $ %{QUILT_DIR}/scripts/backup-files -B backup/ -b dir/link
+ > Copying dir/link
+ $ readlink backup/dir/link
+ > foo
+ $ rm -f dir/link
+ $ echo crap > dir/link
+ $ %{QUILT_DIR}/scripts/backup-files -B backup/ -r -k dir/link
+ > Restoring dir/link
+ $ readlink dir/link
+ > foo
+
+ # Same but reading from a file
+ $ rm -f dir/link
+ $ echo crap > dir/link
+ $ %{QUILT_DIR}/scripts/backup-files -B backup/ -r -k -f -
+ < dir/link
+ > Restoring dir/link
+ $ readlink dir/link
+ > foo
+
+ # Same but without specifying the file
+ $ rm -f dir/link
+ $ echo crap > dir/link
+ $ %{QUILT_DIR}/scripts/backup-files -B backup/ -r -
+ > Restoring dir/link
+ $ readlink dir/link
+ > foo

View File

@ -0,0 +1,38 @@
From: Jean Delvare <jdelvare@suse.de>
Subject: inspect-wrapper: procfs resolves links
Patch-mainline: yes
Git-commit: 6363f217b08b07cabbbe09d2d2ddc68596502e38
References: boo#1179023
When patch files are passed through stdin, we get the actual patch
file name from procfs. It turns out that procfs resolves symbolic
links, and that breaks our later attempt to strip the prefix from
the path to extract a relative path to the patch file.
This is solved by also resolving symbolic links in the prefix
before stripping it.
Signed-off-by: Jean Delvare <jdelvare@suse.de>
---
quilt/scripts/inspect-wrapper.in | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
--- a/quilt/scripts/inspect-wrapper.in
+++ b/quilt/scripts/inspect-wrapper.in
@@ -268,7 +268,15 @@ esac
if [ -n "$QUILT_SETUP_FAST" -a -z "$inputfile" ]
then
inputfile=$(readlink /proc/self/fd/0)
- [ "${inputfile:0:1}" = / -a -f "$inputfile" ] || inputfile=
+ if [ "${inputfile:0:1}" = / -a -f "$inputfile" ]
+ then
+ # procfs resolved the symlinks, so do the same, otherwise the
+ # path prefix won't match
+ RPM_SOURCE_DIR=$(cd -P "$RPM_SOURCE_DIR" && echo "$PWD")/
+ else
+ # Didn't work, so fall back to the slow method
+ inputfile=
+ fi
fi
if [ -n "$inputfile" ]

View File

@ -1,3 +1,17 @@
-------------------------------------------------------------------
Wed Dec 9 14:15:38 UTC 2020 - Jean Delvare <jdelvare@suse.com>
- backup-files-restore-symbolic-links.patch: Handle git-generated
patches which include symbolic link manipulation (savannah bug
#59479).
- quilt.spec: Recommend "ed", as the annotate command requires it.
-------------------------------------------------------------------
Tue Nov 24 14:37:49 UTC 2020 - Jean Delvare <jdelvare@suse.com>
- inspect-handle-link-in-path.patch: inspect-wrapper: procfs
resolves links, so we must do the same (bsc#1179023)
------------------------------------------------------------------- -------------------------------------------------------------------
Fri Mar 29 16:06:38 UTC 2019 - Jean Delvare <jdelvare@suse.com> Fri Mar 29 16:06:38 UTC 2019 - Jean Delvare <jdelvare@suse.com>

View File

@ -1,7 +1,7 @@
# #
# spec file for package quilt # spec file for package quilt
# #
# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany. # Copyright (c) 2020 SUSE LLC
# #
# All modifications and additions to the file contributed by third parties # All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed # remain the property of their copyright owners, unless otherwise agreed
@ -35,18 +35,21 @@ Requires: less
Requires: mktemp Requires: mktemp
Requires: patch Requires: patch
Requires: perl Requires: perl
Url: http://savannah.nongnu.org/projects/quilt URL: http://savannah.nongnu.org/projects/quilt
Source: %{name}-%{version}.tar.bz2 Source: %{name}-%{version}.tar.bz2
Source1: suse-start-quilt-mode.el Source1: suse-start-quilt-mode.el
Patch1: expand.diff Patch1: expand.diff
Patch2: quilt-support-vimdiff.patch Patch2: quilt-support-vimdiff.patch
Patch3: test-faildiff-workaround-order-bug.patch Patch3: test-faildiff-workaround-order-bug.patch
Patch4: suse-workaround-pseudo-release.patch Patch4: suse-workaround-pseudo-release.patch
Patch5: inspect-handle-link-in-path.patch
Patch6: backup-files-restore-symbolic-links.patch
BuildRoot: %{_tmppath}/%{name}-%{version}-build BuildRoot: %{_tmppath}/%{name}-%{version}-build
BuildArch: noarch BuildArch: noarch
%if 0%{?suse_version} %if 0%{?suse_version}
Recommends: procmail Recommends: procmail
Recommends: bzip2 Recommends: bzip2
Recommends: ed
Recommends: /usr/bin/rpmbuild Recommends: /usr/bin/rpmbuild
%endif %endif
%if 0%{?suse_version} > 1120 %if 0%{?suse_version} > 1120
@ -64,6 +67,8 @@ un-applied, refreshed, and more.
%patch2 -p1 %patch2 -p1
%patch3 -p1 %patch3 -p1
%patch4 -p1 %patch4 -p1
%patch5 -p1
%patch6 -p1
%build %build
# --with-rpmbuild=/usr/lib/rpm/rpmb: # --with-rpmbuild=/usr/lib/rpm/rpmb: