Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[pkgsrc/trunk]: pkgsrc mk/configure/replace-interpreter.mk: silently skip bro...
details: https://anonhg.NetBSD.org/pkgsrc/rev/34788398d2b5
branches: trunk
changeset: 432001:34788398d2b5
user: rillig <rillig%pkgsrc.org@localhost>
date: Mon May 18 06:06:34 2020 +0000
description:
mk/configure/replace-interpreter.mk: silently skip broken symlinks
Like directories, they probably come from shell globs.
Seen in misc/byobu.
diffstat:
mk/configure/replace-interpreter.mk | 10 +-
regress/infra-unittests/replace-interpreter.sh | 119 +++++++++++++++++++++++++
2 files changed, 124 insertions(+), 5 deletions(-)
diffs (161 lines):
diff -r fe59625d478a -r 34788398d2b5 mk/configure/replace-interpreter.mk
--- a/mk/configure/replace-interpreter.mk Mon May 18 05:49:03 2020 +0000
+++ b/mk/configure/replace-interpreter.mk Mon May 18 06:06:34 2020 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: replace-interpreter.mk,v 1.19 2020/03/24 04:40:34 rillig Exp $
+# $NetBSD: replace-interpreter.mk,v 1.20 2020/05/18 06:06:34 rillig Exp $
# This file provides common templates for replacing #! interpreters
# in script files.
@@ -31,7 +31,7 @@
# variable, all identifiers starting with "sys-" are reserved for the
# pkgsrc infrastructure. All others may be used freely.
#
-# Keywords: replace_interpreter interpreter interp hashbang #!
+# Keywords: replace_interpreter interpreter interp hashbang #! shebang
# Keywords: awk bash csh ksh perl sh
######################################################################
@@ -111,7 +111,7 @@
${RUN} set -u; \
cd ${WRKSRC}; \
for f in ${REPLACE_FILES.${_lang_}}; do \
- if [ -f "$${f}" ]; then \
+ if [ -f "$$f" ]; then \
${SED} -e '1s|^#![[:space:]]*${REPLACE.optional-env-space}${REPLACE.${_lang_}.old}|#!${REPLACE.${_lang_}.new}|' \
< "$${f}" > "$${f}.new"; \
if [ -x "$${f}" ]; then \
@@ -123,8 +123,8 @@
else \
${MV} -f "$${f}.new" "$${f}"; \
fi; \
- elif [ -d "$$f" ]; then \
- ${SHCOMMENT} "Ignore it, most probably comes from shell globs"; \
+ elif [ -d "$$f" ] || [ -h "$$f" ]; then \
+ : 'Ignore it, most probably comes from shell globs'; \
else \
${WARNING_MSG} "[replace-interpreter] Skipping non-existent file \"$$f\"."; \
fi; \
diff -r fe59625d478a -r 34788398d2b5 regress/infra-unittests/replace-interpreter.sh
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/regress/infra-unittests/replace-interpreter.sh Mon May 18 06:06:34 2020 +0000
@@ -0,0 +1,119 @@
+#! /bin/sh
+# $NetBSD: replace-interpreter.sh,v 1.1 2020/05/18 06:06:34 rillig Exp $
+#
+# Tests for mk/configure/replace-interpreter.mk.
+#
+
+set -eu
+
+. './test.subr'
+
+test_case_set_up() {
+ create_file 'setup.mk' <<-EOF
+ # The tools that are used by replace-interpreter.mk
+ CHMOD= chmod
+ CMP= cmp
+ MV= mv
+ SED= sed
+ RM= rm
+
+ # Commands that are specific to pkgsrc
+ RUN= @set -e;
+ STEP_MSG= echo '=>'
+ INFO_MSG= echo 'info:'
+ WARNING_MSG= echo 'warning:'
+
+ # Dummy interpreters
+ PERL5= $tmpdir/bin/perl5
+
+ WRKDIR= $tmpdir/wrkdir
+ WRKSRC= .
+ EOF
+}
+
+
+if test_case_begin 'regular file'; then
+
+ create_file 'test.mk' <<-EOF
+ REPLACE_PERL+= perl-program
+
+ .include "setup.mk"
+ .include "mk/configure/replace-interpreter.mk"
+ EOF
+
+ create_file_lines 'perl-program' \
+ '#! /any/path/perl'
+
+ run_bmake 'test.mk' 'replace-interpreter' 1> "$tmpdir/output" 2>&1 \
+ && exitcode=0 || exitcode=$?
+
+ assert_that "$tmpdir/output" --file-is-lines \
+ '=> Replacing Perl interpreter in perl-program.'
+ assert_that 'perl-program' --file-is-lines \
+ "#!$tmpdir/bin/perl5"
+
+ test_case_end
+fi
+
+
+if test_case_begin 'valid symlink'; then
+
+ # Valid symlinks are followed, even though they might point
+ # anywhere, even outside WRKSRC.
+ # This has "forever" been the behavior.
+ # It may make sense to change this, but that requires testing
+ # to see whether any packages rely on this behavior.
+
+ # Ouch, this replaces the symlink with a regular file,
+ # which is probably unexpected to the upstream author.
+
+ create_file 'test.mk' <<-EOF
+ REPLACE_PERL+= perl-symlink
+
+ .include "setup.mk"
+ .include "mk/configure/replace-interpreter.mk"
+ EOF
+ create_file_lines 'perl-program' \
+ '#! /any/path/perl'
+ ln -s 'perl-program' 'perl-symlink'
+
+ run_bmake 'test.mk' 'replace-interpreter' 1> "$tmpdir/output" 2>&1 \
+ && exitcode=0 || exitcode=$?
+
+ assert_that "$tmpdir/output" --file-is-lines \
+ '=> Replacing Perl interpreter in perl-symlink.'
+ # This should most probably still be a symlink.
+ [ -f 'perl-symlink' ] || assert_fail 'still a symlink\n'
+ # This file should be left unmodified since it is not mentioned
+ # in REPLACE_PERL.
+ assert_that 'perl-program' --file-is-lines \
+ "#! /any/path/perl"
+ assert_that 'perl-symlink' --file-is-lines \
+ "#!$tmpdir/bin/perl5"
+
+ test_case_end
+fi
+
+
+if test_case_begin 'broken symlink'; then
+
+ # Broken symlinks are skipped silently, just like directories.
+
+ create_file 'test.mk' <<-EOF
+ REPLACE_PERL+= perl-symlink
+
+ .include "setup.mk"
+ .include "mk/configure/replace-interpreter.mk"
+ EOF
+
+ ln -s 'does-not-exist' 'perl-symlink'
+
+ run_bmake 'test.mk' 'replace-interpreter' 1> "$tmpdir/output" 2>&1 \
+ && exitcode=0 || exitcode=$?
+
+ assert_that "$tmpdir/output" --file-is-lines \
+ '=> Replacing Perl interpreter in perl-symlink.'
+ [ -h 'perl-symlink' ] || assert_fail 'not a symlink anymore'
+
+ test_case_end
+fi
Home |
Main Index |
Thread Index |
Old Index