summaryrefslogtreecommitdiff
path: root/regress
diff options
context:
space:
mode:
authorrillig <rillig@pkgsrc.org>2020-05-18 06:06:34 +0000
committerrillig <rillig@pkgsrc.org>2020-05-18 06:06:34 +0000
commite5ad0a31b104baec0252e0c53fc6d99709772ad9 (patch)
tree92c6bbd56e8ad70d0d45ec30947add1b8fa3eb9d /regress
parent77cf6868f90a94b2906c3c88c35165bb0e6f9a1a (diff)
downloadpkgsrc-e5ad0a31b104baec0252e0c53fc6d99709772ad9.tar.gz
mk/configure/replace-interpreter.mk: silently skip broken symlinks
Like directories, they probably come from shell globs. Seen in misc/byobu.
Diffstat (limited to 'regress')
-rw-r--r--regress/infra-unittests/replace-interpreter.sh119
1 files changed, 119 insertions, 0 deletions
diff --git a/regress/infra-unittests/replace-interpreter.sh b/regress/infra-unittests/replace-interpreter.sh
new file mode 100644
index 00000000000..fb2c041bf3d
--- /dev/null
+++ b/regress/infra-unittests/replace-interpreter.sh
@@ -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