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