#! /bin/sh # Copyright (C) 2002-2023 Free Software Foundation, Inc. # # 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; either version 2, or (at your option) # any later version. # # 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, see . # Various install-sh checks. am_create_testdir=empty . test-init.sh install_sh_fail () { err_rx=$1; shift ./install-sh ${1+"$@"} 2>stderr && { cat stderr >&2; exit 1; } cat stderr >&2 $EGREP "install-sh:.* $err_rx" stderr || exit 1 } get_shell_script install-sh # Basic errors. install_sh_fail 'no input file specified' install_sh_fail 'no input file specified' dest install_sh_fail 'no input file specified' -m 644 dest install_sh_fail 'no input file specified' -c -t dest # Incorrect usages. : > bar : > baz : > qux install_sh_fail 'target directory not allowed when installing a directory' \ -d -t foo install_sh_fail 'target directory not allowed when installing a directory' \ -d -t foo bar install_sh_fail 'foo: [iI]s not a directory' -t foo bar install_sh_fail 'foo: [iI]s not a directory' bar baz foo mkdir foo install_sh_fail 'target directory not allowed when installing a directory' \ -d -t foo install_sh_fail 'target directory not allowed when installing a directory' \ -d -t foo bar rmdir foo rm -f bar baz qux # Directories. for opts in '-d' '-d -T' '-T -d' '-d -T -d' '-T -d -T -d -T'; do # It should be OK to create no directory. We sometimes need # this when directory are conditionally defined. ./install-sh $opts # One directory. ./install-sh $opts d0 test -d d0 # Multiple directories (for make installdirs). ./install-sh $opts d1 d2 d3 d4 test -d d1 test -d d2 test -d d3 test -d d4 rmdir d[0-9] # Subdirectories. ./install-sh $opts p1/p2/p3 p4//p5//p6// test -d p1/p2/p3 test -d p4/p5/p6 rmdir p[0-9]/p[0-9]/p[0-9] rmdir p[0-9]/p[0-9] rmdir p[0-9] done # Files. mkdir d0 d1 d2 d3 d4 : > x ./install-sh -c -m 644 x y test -f x test -f y ./install-sh -m 644 y z test -f y test -f z # Multiple files. ./install-sh -m 644 -c x z d1 test -f x test -f z test -f d1/x test -f d1/z ./install-sh -m 644 x z d2// test -f x test -f z test -f d2/x test -f d2/z ./install-sh -t d3 -m 644 x z test -f x test -f z test -f d3/x test -f d3/z ./install-sh -t d4// -m 644 x z test -f x test -f z test -f d4/x test -f d4/z ./install-sh -T x d3/y test -f x test -f d3/y install_sh_fail 'd3: [iI]s a directory' -T x d3 install_sh_fail 'd4(//)?: [iI]s a directory' -T x d4// # Ensure that install-sh works with names that include spaces. touch 'a b' mkdir 'x y' ./install-sh 'a b' 'x y' test -f x\ \ y/a\ \ b test -f 'a b' # Ensure we do not run into 'test' operator precedence bugs with Tru64 sh. for c in = '(' ')' '!'; do install_sh_fail 'no input file specified' $c test -f stderr # sanity check grep 'test: ' stderr && exit 1 # Skip tests if the file system is not capable. mkdir ./$c || continue rmdir ./$c ./install-sh -d $c/$c/$c rm -rf ./$c ./install-sh -d $c d5/$c/$c test -d ./$c test -d d5/$c/$c ./install-sh x $c test -f ./$c/x rm -f ./$c/x ./install-sh -t $c x test -f ./$c/x rm -rf ./$c ( : > ./$c ) || continue ./install-sh $c x d5/$c/$c test -f d5/$c/$c/x test -f d5/$c/$c/$c rm -f d5/$c/$c/? ./install-sh -t d5/$c/$c $c x test -f d5/$c/$c/x test -f d5/$c/$c/$c done :