diff --git a/sysutils/sysbuild/Makefile b/sysutils/sysbuild/Makefile index 014992df77f3..22173716da37 100644 --- a/sysutils/sysbuild/Makefile +++ b/sysutils/sysbuild/Makefile @@ -1,6 +1,6 @@ -# $NetBSD: Makefile,v 1.18 2012/07/25 12:18:22 jmmv Exp $ +# $NetBSD: Makefile,v 1.19 2012/08/15 21:20:14 jmmv Exp $ -DISTNAME= sysbuild-2.0 +DISTNAME= sysbuild-2.1 CATEGORIES= sysutils MASTER_SITES= # empty DISTFILES= # empty @@ -30,20 +30,19 @@ PKG_SUGGESTED_OPTIONS= tests .include "../../mk/bsd.options.mk" .if $(PKG_OPTIONS:Mtests) -TEST_PROGS= config_test cvs_test sysbuild_test sysbuild4cron_test utils_test +TEST_PROGS= sysbuild_test sysbuild4cron_test PLIST_SUBST+= TESTS= . include "../../devel/atf-libs/buildlink3.mk" +BUILD_SUBST+= -e 's,@ATF_SH@,${BUILDLINK_PREFIX.atf-libs}/bin/atf-sh,g' + do-build: build-tests build-tests: cp ${FILESDIR}/Kyuafile ${WRKSRC} .for file in ${TEST_PROGS} - ${ECHO} '#! ${BUILDLINK_PREFIX.atf-libs}/bin/atf-sh' \ - >${WRKSRC}/${file} - ${CAT} ${FILESDIR}/*.subr ${FILESDIR}/${file}.sh \ - | ${SED} ${BUILD_SUBST} >>${WRKSRC}/${file} - ${CHMOD} +x ${WRKSRC}/${file} + sed ${BUILD_SUBST} <${FILESDIR}/${file}.sh >${WRKSRC}/${file} + chmod +x ${WRKSRC}/${file} .endfor INSTALLATION_DIRS+= tests/sysbuild @@ -63,12 +62,9 @@ PLIST_SUBST+= TESTS=@comment do-build: .for file in sysbuild sysbuild4cron - ${ECHO} '#! ${SH}' >${WRKSRC}/${file} - ${ECHO} 'set -e' >>${WRKSRC}/${file} - ${CAT} ${FILESDIR}/*.subr ${FILESDIR}/${file}.sh \ - | ${SED} ${BUILD_SUBST} >>${WRKSRC}/${file} - ${ECHO} '${file}_main "$${@}"' >>${WRKSRC}/${file} - ${CHMOD} +x ${WRKSRC}/${file} + sed ${BUILD_SUBST} ${FILESDIR}/${file}.sh \ + | ${BUILDLINK_PREFIX.shtk}/bin/shtk build \ + -s ${SH} -m ${file}_main -o ${WRKSRC}/${file} - .endfor .for file in sysbuild.1 sysbuild4cron.1 default.conf sed ${BUILD_SUBST} <${FILESDIR}/${file} >${WRKSRC}/${file} @@ -87,4 +83,5 @@ do-install: ${INSTALL_DATA} ${WRKSRC}/${file} ${DESTDIR}${EGDIR} .endfor +.include "../../devel/shtk/buildlink3.mk" .include "../../mk/bsd.pkg.mk" diff --git a/sysutils/sysbuild/PLIST b/sysutils/sysbuild/PLIST index 506efc426f28..942d44b7df8e 100644 --- a/sysutils/sysbuild/PLIST +++ b/sysutils/sysbuild/PLIST @@ -1,12 +1,9 @@ -@comment $NetBSD: PLIST,v 1.4 2012/07/25 12:18:22 jmmv Exp $ +@comment $NetBSD: PLIST,v 1.5 2012/08/15 21:20:14 jmmv Exp $ bin/sysbuild bin/sysbuild4cron man/man1/sysbuild.1 man/man1/sysbuild4cron.1 share/examples/sysbuild/default.conf ${TESTS}tests/sysbuild/Kyuafile -${TESTS}tests/sysbuild/config_test -${TESTS}tests/sysbuild/cvs_test ${TESTS}tests/sysbuild/sysbuild_test ${TESTS}tests/sysbuild/sysbuild4cron_test -${TESTS}tests/sysbuild/utils_test diff --git a/sysutils/sysbuild/files/Kyuafile b/sysutils/sysbuild/files/Kyuafile index 7bf365d34e29..a6456c745e82 100644 --- a/sysutils/sysbuild/files/Kyuafile +++ b/sysutils/sysbuild/files/Kyuafile @@ -2,8 +2,5 @@ syntax("kyuafile", 1) test_suite("sysbuild") -atf_test_program{name="config_test"} -atf_test_program{name="cvs_test"} atf_test_program{name="sysbuild_test"} atf_test_program{name="sysbuild4cron_test"} -atf_test_program{name="utils_test"} diff --git a/sysutils/sysbuild/files/config.subr b/sysutils/sysbuild/files/config.subr deleted file mode 100644 index 741d311a750c..000000000000 --- a/sysutils/sysbuild/files/config.subr +++ /dev/null @@ -1,287 +0,0 @@ -# Copyright 2012 Google Inc. -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# * Neither the name of Google Inc. nor the names of its contributors -# may be used to endorse or promote products derived from this software -# without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -# \file config.subr -# Configuration file processing and queries. - - -# List of valid configuration variables. -# -# This is initialized by config_init and should remain unchanged thorough the -# execution of the program. -CONFIG_VARS= - - -# List of overrides to apply by config_apply_overrides. -# -# The overrides are recorded and applied separately because they need to happen -# after a configuration file has been loaded. The contents of this list are -# words of the form: set: or unset:. For those variables -# listed in set:, there is a corresponding config_override_var_ -# variable containing the new value. -CONFIG_OVERRIDES= - - -# Initializes the configuration module. -# -# \param ... List of configuration variables to recognize in configuration files -# and user overrides. -config_init() { - CONFIG_VARS="${@}" -} - - -# Checks if a configuration variable is known. -# -# \param var Name of the variable to check. -# -# \return True if the variable was registered by config_init, false otherwise. -config_is_valid() { - local var="${1}"; shift - - local known_var - for known_var in ${CONFIG_VARS}; do - if [ "${known_var}" = "${var}" ]; then - return 0 - fi - done - return 1 -} - - -# Checks if a configuration variable is defined. -# -# \param var The name of the variable to check. -# -# \return True if the variable is defined (even if empty), false otherwise. -config_has() { - local var="${1}"; shift - - local is_unset - eval is_unset="\${config_var_${var}-yes_this_is_unset}" - if [ "${is_unset}" = yes_this_is_unset ]; then - return 1 - else - return 0 - fi -} - - -# Gets the value of a defined configuration variable. -# -# \post The value of the variable is printed to stdout, if any. -# -# \post If the variable is not defined, this terminates execution with an error. -# -# \param var Name of the configuration variable to query. -config_get() { - local var="${1}"; shift - - if config_has "${var}"; then - eval echo "\${config_var_${var}}" - else - utils_error "Required configuration variable ${var} not set" - fi -} - - -# Gets the value of configuration variable interpreting it as a boolean. -# -# \param var The variable to query. -# -# \return True if the variable is set to a truth value, false if its value is -# false or if it is not defined. -config_get_bool() { - local var="${1}"; shift - - if config_has "${var}"; then - case "$(config_get "${var}")" in - [Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]) - return 0 - ;; - [Nn][Oo]|[Ff][Aa][Ll][Ss][Ee]) - return 1 - ;; - *) - utils_error "Invalid boolean value in variable ${var}" - ;; - esac - else - return 1 - fi -} - - -# Gets the value of a configuration variable with a default fallback. -# -# \post The value of the variable is printed to stdout, if any. -# -# \param var Name of the configuration variable to query. -# \param default Default value to return if the variable is not defined. -config_get_default() { - local var="${1}"; shift - local default="${1}"; shift - - if config_has "${var}"; then - config_get "${var}" - else - echo "${default}" - fi -} - - -# Sets a configuration variable. -# -# \post Execution terminates if the variable is not valid. -# -# \param var The name of the configuration variable to set. -# \param value The value to set. -config_set() { - local var="${1}"; shift - local value="${1}"; shift - - config_is_valid "${var}" \ - || utils_usage_error "Unknown configuration variable ${var}" - eval "config_var_${var}=\"\${value}\"" -} - - -# Loads a configuration file. -# -# \pre config_init should have been called to register the valid configuration -# variables. Any non-registered configuration variable found in the file will -# not be available through any of the functions in this module. -# -# \post The configuration module is updated with the values defined in the -# configuration file. -# -# \post Any errors in the processing of the configuration file terminate the -# execution of the script. -# -# \param config_file Path to the file to load. -config_load() { - local config_file="${1}"; shift - - [ -e "${config_file}" ] || utils_error "Configuration file ${config_file}" \ - "does not exist" - - # User-facing variables. - local var - for var in ${CONFIG_VARS}; do - unset "${var}" || true - eval local "${var}" - done - - local real_config_file - case "${config_file}" in - */*) real_config_file="${config_file}" ;; - *) real_config_file="./${config_file}" ;; - esac - ( . "${real_config_file}" ) || utils_error "Failed to load configuration" \ - "file ${config_file}" - . "${real_config_file}" - - for var in ${CONFIG_VARS}; do - local value - eval value="\${${var}-unset}" - [ "${value-unset}" != unset ] || continue - - if [ -n "${value}" ]; then - config_set "${var}" "${value}" - else - unset "config_var_${var}" || true - fi - done - - config_apply_overrides -} - - -# Applies recorded overrides to the current configuration. -# -# This is just a helper function for config_load and should not be used -# directly. -# -# \post The configuration data in memory is modified according to the data -# recorded in the overrides. -# -# \post The contents of CONFIG_OVERRIDES is cleared. -config_apply_overrides() { - for override in ${CONFIG_OVERRIDES}; do - case "${override}" in - set:*) - local var="$(echo ${override} | cut -d : -f 2)" - local value - eval value="\"\${config_override_var_${var}}\"" - config_set "${var}" "${value}" - ;; - unset:*) - local var="$(echo ${override} | cut -d : -f 2)" - unset "config_var_${var}" || true - ;; - esac - done - CONFIG_OVERRIDES= -} - - -# Records an override to be applied to the configuration. -# -# Overrides are configuration variables set through the command line. These can -# be set before loading the configuration file with config_load. -# -# \post Any errors in the processing of the configuration override terminate the -# execution of the script. -# -# \param arg An override of the form variable=value. -config_override() { - local arg="${1}"; shift - - case "${arg}" in - *=*) - ;; - *) - utils_usage_error "Invalid configuration override" \ - "${arg}; must be of the form variable=value" - ;; - esac - local var="$(echo "${arg}" | cut -d = -f 1)" - local value="$(echo "${arg}" | cut -d = -f 2-)" - - [ -n "${var}" ] || utils_usage_error "Invalid configuration override" \ - "${arg}; must be of the form variable=value" - config_is_valid "${var}" \ - || utils_usage_error "Unknown configuration variable ${var}" - - if [ -n "${value}" ]; then - eval "config_override_var_${var}=\"${value}\"" - CONFIG_OVERRIDES="${CONFIG_OVERRIDES} set:${var}" - else - CONFIG_OVERRIDES="${CONFIG_OVERRIDES} unset:${var}" - fi -} diff --git a/sysutils/sysbuild/files/config_test.sh b/sysutils/sysbuild/files/config_test.sh deleted file mode 100644 index 4d650becc0cd..000000000000 --- a/sysutils/sysbuild/files/config_test.sh +++ /dev/null @@ -1,395 +0,0 @@ -# Copyright 2012 Google Inc. -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# * Neither the name of Google Inc. nor the names of its contributors -# may be used to endorse or promote products derived from this software -# without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -atf_test_case is_valid__true -is_valid__true_body() { - config_init VAR1 VAR3 - for var in VAR1 VAR3; do - config_is_valid "${var}" || atf_fail "${var} not found" - done -} - - -atf_test_case is_valid__false -is_valid__false_body() { - config_init VAR1 VAR3 - for var in VAR11 VAR2 VAR; do - if config_is_valid "${var}"; then - atf_fail "${var} found but was not registered" - fi - done -} - - -atf_test_case has__true__empty -has__true__empty_body() { - config_init TESTVAR - config_set TESTVAR "" - config_has TESTVAR || atf_fail "Expected variable not found" -} - - -atf_test_case has__true__not_empty -has__true__not_empty_body() { - config_init TESTVAR - config_set TESTVAR "foo" - config_has TESTVAR || atf_fail "Expected variable not found" -} - - -atf_test_case has__false -has__false_body() { - config_init TESTVAR - if config_has TESTVAR; then - atf_fail "Unexpected variable found" - fi -} - - -atf_test_case get__ok__empty -get__ok__empty_body() { - config_init TESTVAR - - config_set TESTVAR "" - [ -z "$(config_get TESTVAR)" ] || atf_fail "Failed to query value" -} - - -atf_test_case get__ok__not_empty -get__ok__not_empty_body() { - config_init TESTVAR - - config_set TESTVAR some-value - [ "$(config_get TESTVAR)" = some-value ] || atf_fail "Failed to query value" -} - - -atf_test_case get__undefined_variable -get__undefined_variable_body() { - config_init TESTVAR - - if ( config_get TESTVAR ) >out 2>err; then - atf_fail "Got unset variable successfully" - else - grep "Required configuration variable TESTVAR not set" err >/dev/null \ - || atf_fail "Expected error message not found" - fi -} - - -atf_test_case get_bool__true -get_bool__true_body() { - config_init TESTVAR - - for value in yes Yes true True; do - config_set TESTVAR "${value}" - config_get_bool TESTVAR || atf_fail "Expected true, but got false" - done -} - - -atf_test_case get_bool__false -get_bool__false_body() { - config_init TESTVAR - - for value in no No false False; do - config_set TESTVAR "${value}" - if config_get_bool TESTVAR; then - atf_fail "Expected false, but got true" - fi - done -} - - -atf_test_case get_bool__undefined_variable -get_bool__undefined_variable_body() { - config_init TESTVAR - - if config_get_bool TESTVAR; then - atf_fail "Expected false, but got true" - fi -} - - -atf_test_case get_bool__invalid_value -get_bool__invalid_value_body() { - config_init TESTVAR - - config_set TESTVAR not-a-boolean - if ( config_get_bool TESTVAR ) >out 2>err; then - atf_fail "Got invalid boolean value successfully" - else - grep "Invalid boolean value in variable TESTVAR" err >/dev/null \ - || atf_fail "Expected error message not found" - fi -} - - -atf_test_case get_default__defined__empty -get_default__defined__empty_body() { - config_init TESTVAR - config_set TESTVAR "" - [ "$(config_get_default TESTVAR 'foo')" = "" ] \ - || atf_fail "Did not fetch defined value" -} - - -atf_test_case get_default__defined__not_empty -get_default__defined__not_empty_body() { - config_init TESTVAR - config_set TESTVAR "bar" - [ "$(config_get_default TESTVAR 'foo')" = "bar" ] \ - || atf_fail "Did not fetch defined value" -} - - -atf_test_case get_default__default__empty -get_default__default__empty_body() { - config_init TESTVAR - [ "$(config_get_default TESTVAR '')" = "" ] \ - || atf_fail "Did not fetch default value" -} - - -atf_test_case get_default__default__not_empty -get_default__default__not_empty_body() { - config_init TESTVAR - [ "$(config_get_default TESTVAR 'foo')" = "foo" ] \ - || atf_fail "Did not fetch default value" -} - - -atf_test_case set__ok -set__ok_body() { - config_init TESTVAR - - config_set TESTVAR some-value - [ "${config_var_TESTVAR}" = some-value ] || atf_fail "Failed to set value" -} - - -atf_test_case set__unknown_variable -set__unknown_variable_body() { - config_init TESTVAR - - if ( config_set TESTVAR2 some-value ) >out 2>err; then - atf_fail "Set unknown variable successfully" - else - grep "Unknown configuration variable TESTVAR2" err >/dev/null \ - || atf_fail "Expected error message not found" - fi -} - - -atf_test_case load__filter_variables -load__filter_variables_body() { - config_init Z VAR1 EMPTY - - cat >test.conf <test.conf <test.conf <out 2>err; then - atf_fail "Missing configuration file load succeeded" - else - grep "Configuration file missing.conf does not exist" err >/dev/null \ - || atf_fail "Expected error message not found" - fi -} - - -atf_test_case load__invalid_file -load__invalid_file_body() { - echo "this file is invalid" >invalid.conf - - if ( config_load invalid.conf ) >out 2>err; then - atf_fail "Invalid configuration file load succeeded" - else - cat err - grep "Failed to load configuration file invalid.conf" err >/dev/null \ - || atf_fail "Expected error message not found" - fi -} - - -atf_test_case override__ok_before_load -override__ok_before_load_body() { - config_init VAR1 VAR2 - - cat >test.conf <test.conf <out 2>err; then - atf_fail "Invalid configuration override ${arg} succeeded" - else - cat err - grep "Invalid configuration override ${arg}" err >/dev/null \ - || atf_fail "Expected error message not found" - fi - done -} - - -atf_test_case override__unknown_variable -override__unknown_variable_body() { - config_init Z VAR1 - for arg in A=b VAR2=d; do - if ( config_override "${arg}" ) >out 2>err; then - atf_fail "Invalid configuration override ${arg} succeeded" - else - cat err - grep "Unknown configuration variable ${var}" err >/dev/null \ - || atf_fail "Expected error message not found" - fi - done -} - - -atf_init_test_cases() { - atf_add_test_case is_valid__true - atf_add_test_case is_valid__false - - atf_add_test_case has__true__empty - atf_add_test_case has__true__not_empty - atf_add_test_case has__false - - atf_add_test_case get__ok__empty - atf_add_test_case get__ok__not_empty - atf_add_test_case get__undefined_variable - - atf_add_test_case get_bool__true - atf_add_test_case get_bool__false - atf_add_test_case get_bool__undefined_variable - atf_add_test_case get_bool__invalid_value - - atf_add_test_case get_default__defined__empty - atf_add_test_case get_default__defined__not_empty - atf_add_test_case get_default__default__empty - atf_add_test_case get_default__default__not_empty - - atf_add_test_case set__ok - atf_add_test_case set__unknown_variable - - atf_add_test_case load__filter_variables - atf_add_test_case load__allow_undefine - atf_add_test_case load__current_directory - atf_add_test_case load__missing_file - atf_add_test_case load__invalid_file - - atf_add_test_case override__ok_before_load - atf_add_test_case override__not_ok_after_load - atf_add_test_case override__invalid_format - atf_add_test_case override__unknown_variable -} diff --git a/sysutils/sysbuild/files/cvs.subr b/sysutils/sysbuild/files/cvs.subr deleted file mode 100644 index da8faa5f76e1..000000000000 --- a/sysutils/sysbuild/files/cvs.subr +++ /dev/null @@ -1,107 +0,0 @@ -# Copyright 2012 Google Inc. -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# * Neither the name of Google Inc. nor the names of its contributors -# may be used to endorse or promote products derived from this software -# without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -# \file cvs.subr -# Utilities to invoke CVS and wrappers to simplify its operation. - - -# Checks out or updates a working copy. -# -# \param cvsroot Location of the CVS repository. -# \param module Module to check out, when the working copy does not exist yet. -# \param tag CVS tag to use, if any; may be empty. -# \param directory Target directory in which to store the checked out files or -# the updated files. -cvs_fetch() { - local cvsroot="${1}"; shift - local module="${1}"; shift - local tag="${1}"; shift - local directory="${1}"; shift - - if [ -d "${directory}" ]; then - cvs_update "${cvsroot}" "${tag}" "${directory}" - else - cvs_checkout "${cvsroot}" "${module}" "${tag}" "${directory}" - fi -} - - -# Checks out a new directory from CVS. -# -# \param cvsroot Location of the CVS repository. -# \param module The name of the module to check out. -# \param tag CVS tag to use, if any; may be empty. -# \param directory The directory in which to perform the checkout. -cvs_checkout() { - local cvsroot="${1}"; shift - local module="${1}"; shift - local tag="${1}"; shift - local directory="${1}"; shift - - local rflag= - [ -z "${tag}" ] || rflag="-r${tag}" - - [ ! -d "${directory}" ] || utils_error "Cannot checkout into" \ - "${directory}; directory already exists" - mkdir -p "${directory}" - mkdir "${directory}"/.cvs-checkout \ - || utils_error "Failed to create ${directory}" - ( cd "${directory}"/.cvs-checkout && - utils_run cvs -d"${cvsroot}" -q checkout -P ${rflag} "${module}" ) - mv "${directory}"/.cvs-checkout/"${module}"/* "${directory}"/ \ - || true # Maybe the checkout yielded no files... - rm -rf "${directory}"/.cvs-checkout -} - - -# Updates an existing directory from CVS. -# -# \param cvsroot Location of the CVS repository. -# \param tag CVS tag to use, if any; may be empty. -# \param directory The directory in which to perform the update. -cvs_update() { - local cvsroot="${1}"; shift - local tag="${1}"; shift - local directory="${1}"; shift - - local rflag= - [ -z "${tag}" ] || rflag="-r${tag}" - - [ -d "${directory}" ] || utils_error "Cannot update ${directory};" \ - "directory does not exist" - - if [ -d "${directory}/.cvs-checkout" ]; then - # Attempt to resume a previously aborted cvs_checkout. - mv "${directory}"/.cvs-checkout/*/* "${directory}"/ \ - || true # Maybe the checkout yielded no files... - rm -rf "${directory}"/.cvs-checkout - fi - - ( cd "${directory}" && \ - utils_run cvs -d"${cvsroot}" -q update -d -P ${rflag} ) -} diff --git a/sysutils/sysbuild/files/cvs_test.sh b/sysutils/sysbuild/files/cvs_test.sh deleted file mode 100644 index d7fea271097b..000000000000 --- a/sysutils/sysbuild/files/cvs_test.sh +++ /dev/null @@ -1,180 +0,0 @@ -# Copyright 2012 Google Inc. -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# * Neither the name of Google Inc. nor the names of its contributors -# may be used to endorse or promote products derived from this software -# without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -MOCK_CVSROOT=":local:$(pwd)/cvsroot" - - -# Creates a local CVS repository with a variety of modules. -# -# \param repository Path to the repository to create. -# \param ... Modules to create. -init_cvsroot() { - local repository="${1}"; shift - - atf_check -o ignore -e ignore cvs -d "${repository}" init - - for module in "${@}"; do - mkdir module - cd module - echo "first revision" >"file-in-${module}" - cvs -d "${repository}" import -m "Import." "${module}" VENDOR_TAG \ - release_tag - cd - - rm -rf module - done -} - - -atf_test_case fetch -fetch_body() { - init_cvsroot "${MOCK_CVSROOT}" src - - cvs_fetch "${MOCK_CVSROOT}" src "" first - grep "first revision" first/file-in-src >/dev/null \ - || atf_fail "Unexpected version found" - - cp -rf first second - echo "second revision" >second/file-in-src - ( cd second && cvs commit -m "Second commit." ) - - cvs_fetch "${MOCK_CVSROOT}" src "" first - grep "second revision" first/file-in-src >/dev/null \ - || atf_fail "Unexpected version found" -} - - -atf_test_case checkout__same_name -checkout__same_name_body() { - init_cvsroot "${MOCK_CVSROOT}" first second - cvs_checkout "${MOCK_CVSROOT}" first "" $(pwd)/a/b/c/first - [ -f a/b/c/first/file-in-first ] || atf_fail "Files not checked out" - if [ -f a/b/c/second/file-in-second ]; then - atf_fail "Unexpected module checked out" - fi -} - - -atf_test_case checkout__different_name -checkout__different_name_body() { - init_cvsroot "${MOCK_CVSROOT}" first second - cvs_checkout "${MOCK_CVSROOT}" first "" $(pwd)/a/b/c/second - [ -f a/b/c/second/file-in-first ] || atf_fail "Files not checked out" -} - - -atf_test_case checkout__already_exists -checkout__already_exists_body() { - mkdir usr/src - if ( cvs_checkout "${MOCK_CVSROOT}" src "" $(pwd)/usr/src ) >out 2>err; then - atf_fail "Checkout succeeded, but should not" - else - grep "Cannot checkout into $(pwd)/usr/src.*exists" err >/dev/null \ - || atf_fail "Expected error message not found" - fi -} - - -atf_test_case checkout__permission_denied -checkout__permission_denied_head() { - atf_set "require.user" "unprivileged" -} -checkout__permission_denied_body() { - init_cvsroot "${MOCK_CVSROOT}" src - mkdir usr - chmod 555 usr - if ( cvs_checkout "${MOCK_CVSROOT}" src "" $(pwd)/usr/src ) >out 2>err; then - atf_fail "Checkout succeeded, but should not" - else - grep "Failed to create $(pwd)/usr/src" err >/dev/null \ - || atf_fail "Expected error message not found" - fi -} - - -atf_test_case update__ok -update__ok_body() { - init_cvsroot "${MOCK_CVSROOT}" first second - - cvs -d "${MOCK_CVSROOT}" checkout first - mv first copy - cvs -d "${MOCK_CVSROOT}" checkout first - - cvs_update "${MOCK_CVSROOT}" "" first - grep "first revision" first/file-in-first >/dev/null \ - || atf_fail "Unexpected version found" - - echo "second revision" >copy/file-in-first - ( cd copy && cvs commit -m "Second commit." ) - - cvs_update "${MOCK_CVSROOT}" "" first - grep "second revision" first/file-in-first >/dev/null \ - || atf_fail "Unexpected version found" -} - - -atf_test_case update__resume_checkout -update__resume_checkout_body() { - init_cvsroot "${MOCK_CVSROOT}" first - - cvs -d "${MOCK_CVSROOT}" checkout first - mv first copy - - mkdir -p first/.cvs-checkout/first - mv copy/CVS first/.cvs-checkout/first - rm -rf copy - - cvs_update "${MOCK_CVSROOT}" "" first - grep "first revision" first/file-in-first >/dev/null \ - || atf_fail "Unexpected version found" -} - - -atf_test_case update__does_not_exist -update__does_not_exist_body() { - if ( cvs_update "${MOCK_CVSROOT}" "" src ) >out 2>err; then - atf_fail "Update succeeded, but should not" - else - grep "Cannot update src; .*not exist" err >/dev/null \ - || atf_fail "Expected error message not found" - fi -} - - -atf_init_test_cases() { - atf_add_test_case fetch - - atf_add_test_case checkout__same_name - atf_add_test_case checkout__different_name - atf_add_test_case checkout__already_exists - atf_add_test_case checkout__permission_denied - - atf_add_test_case update__ok - atf_add_test_case update__resume_checkout - atf_add_test_case update__does_not_exist -} diff --git a/sysutils/sysbuild/files/sysbuild.sh b/sysutils/sysbuild/files/sysbuild.sh index 777b334bd22c..8560c0b7136b 100644 --- a/sysutils/sysbuild/files/sysbuild.sh +++ b/sysutils/sysbuild/files/sysbuild.sh @@ -29,6 +29,11 @@ # \file sysbuild.sh # Entry point and main program logic. +shtk_import cli +shtk_import config +shtk_import cvs +shtk_import process + # List of valid configuration variables. # @@ -50,14 +55,14 @@ SYSBUILD_CONFIG_VARS="BUILD_ROOT BUILD_TARGETS CVSROOT CVSTAG INCREMENTAL_BUILD # him shoot himself in the foot if he so desires. sysbuild_set_defaults() { # Please remember to update sysbuild(1) if you change any default values. - config_set BUILD_ROOT "${HOME}/sysbuild" - config_set BUILD_TARGETS "release" - config_set CVSROOT ":ext:anoncvs@anoncvs.NetBSD.org:/cvsroot" - config_set INCREMENTAL_BUILD "false" - config_set MACHINES "$(uname -m)" - config_set RELEASEDIR "${HOME}/sysbuild/release" - config_set SRCDIR "${HOME}/sysbuild/src" - config_set UPDATE_SOURCES "true" + shtk_config_set BUILD_ROOT "${HOME}/sysbuild" + shtk_config_set BUILD_TARGETS "release" + shtk_config_set CVSROOT ":ext:anoncvs@anoncvs.NetBSD.org:/cvsroot" + shtk_config_set INCREMENTAL_BUILD "false" + shtk_config_set MACHINES "$(uname -m)" + shtk_config_set RELEASEDIR "${HOME}/sysbuild/release" + shtk_config_set SRCDIR "${HOME}/sysbuild/src" + shtk_config_set UPDATE_SOURCES "true" } @@ -67,22 +72,22 @@ sysbuild_set_defaults() { do_one_build() { local machine="${1}"; shift - local basedir="$(config_get BUILD_ROOT)/${machine}" + local basedir="$(shtk_config_get BUILD_ROOT)/${machine}" local jflag= - if config_has NJOBS; then - jflag="-j$(config_get NJOBS)" + if shtk_config_has NJOBS; then + jflag="-j$(shtk_config_get NJOBS)" fi local uflag= - if config_get_bool INCREMENTAL_BUILD; then + if shtk_config_get_bool INCREMENTAL_BUILD; then uflag=-u # Get rid of any possibly-old modules; they are a constant source of # update-build problems. rm -rf "${basedir}/destdir/stand"/* else - utils_info "Cleaning up previous build files" + shtk_cli_info "Cleaning up previous build files" rm -rf "${basedir}/destdir" rm -rf "${basedir}/obj" rm -rf "${basedir}/tools" @@ -90,16 +95,16 @@ do_one_build() { local xflag= local Xflag= - if config_has XSRCDIR; then + if shtk_config_has XSRCDIR; then xflag=-x - Xflag="-X$(config_get XSRCDIR)" + Xflag="-X$(shtk_config_get XSRCDIR)" fi - ( cd "$(config_get SRCDIR)" && utils_run ./build.sh \ + ( cd "$(shtk_config_get SRCDIR)" && shtk_process_run ./build.sh \ -D"${basedir}/destdir" \ -M"${basedir}/obj" \ -N2 \ - -R"$(config_get RELEASEDIR)" \ + -R"$(shtk_config_get RELEASEDIR)" \ -T"${basedir}/tools" \ -U \ ${Xflag} \ @@ -107,7 +112,7 @@ do_one_build() { -m"${machine}" \ ${uflag} \ ${xflag} \ - $(config_get BUILD_TARGETS) ) + $(shtk_config_get BUILD_TARGETS) ) } @@ -118,24 +123,24 @@ sysbuild_build() { while getopts ':f' arg "${@}"; do case "${arg}" in f) # Convenience flag for a "fast mode". - config_set "INCREMENTAL_BUILD" "true" - config_set "UPDATE_SOURCES" "false" + shtk_config_set "INCREMENTAL_BUILD" "true" + shtk_config_set "UPDATE_SOURCES" "false" ;; \?) - utils_usage_error "Unknown option -${OPTARG}" + shtk_cli_usage_error "Unknown option -${OPTARG}" ;; esac done shift $((${OPTIND} - 1)) - [ ${#} -eq 0 ] || config_set BUILD_TARGETS "${*}" + [ ${#} -eq 0 ] || shtk_config_set BUILD_TARGETS "${*}" - if config_get_bool UPDATE_SOURCES; then + if shtk_config_get_bool UPDATE_SOURCES; then sysbuild_fetch fi - for machine in $(config_get MACHINES); do + for machine in $(shtk_config_get MACHINES); do do_one_build "${machine}" done } @@ -145,11 +150,11 @@ sysbuild_build() { # # \params ... The options and arguments to the command. sysbuild_config() { - [ ${#} -eq 0 ] || utils_usage_error "config does not take any arguments" + [ ${#} -eq 0 ] || shtk_cli_usage_error "config does not take any arguments" for var in ${SYSBUILD_CONFIG_VARS}; do - if config_has "${var}"; then - echo "${var} = $(config_get "${var}")" + if shtk_config_has "${var}"; then + echo "${var} = $(shtk_config_get "${var}")" else echo "${var} is undefined" fi @@ -161,18 +166,18 @@ sysbuild_config() { # # \params ... The options and arguments to the command. sysbuild_fetch() { - [ ${#} -eq 0 ] || utils_usage_error "fetch does not take any arguments" + [ ${#} -eq 0 ] || shtk_cli_usage_error "fetch does not take any arguments" - local cvsroot="$(config_get CVSROOT)" + local cvsroot="$(shtk_config_get CVSROOT)" - utils_info "Updating base source tree" - cvs_fetch "${cvsroot}" src "$(config_get_default CVSTAG '')" \ - "$(config_get SRCDIR)" + shtk_cli_info "Updating base source tree" + shtk_cvs_fetch "${cvsroot}" src "$(shtk_config_get_default CVSTAG '')" \ + "$(shtk_config_get SRCDIR)" - if config_has XSRCDIR; then - utils_info "Updating X11 source tree" - cvs_fetch "${cvsroot}" xsrc "$(config_get_default CVSTAG '')" \ - "$(config_get XSRCDIR)" + if shtk_config_has XSRCDIR; then + shtk_cli_info "Updating X11 source tree" + shtk_cvs_fetch "${cvsroot}" xsrc \ + "$(shtk_config_get_default CVSTAG '')" "$(shtk_config_get XSRCDIR)" fi } @@ -201,11 +206,11 @@ sysbuild_config_load() { fi done [ -n "${config_file}" ] \ - || utils_usage_error "Cannot locate configuration named" \ + || shtk_cli_usage_error "Cannot locate configuration named" \ "'${config_name}'" ;; esac - config_load "${config_file}" + shtk_config_load "${config_file}" } @@ -217,7 +222,7 @@ sysbuild_config_load() { sysbuild_main() { local config_name="default" - config_init ${SYSBUILD_CONFIG_VARS} + shtk_config_init ${SYSBUILD_CONFIG_VARS} while getopts ':c:o:' arg "${@}"; do case "${arg}" in @@ -226,17 +231,17 @@ sysbuild_main() { ;; o) # Override for a particular configuration variable. - config_override "${OPTARG}" + shtk_config_override "${OPTARG}" ;; \?) - utils_usage_error "Unknown option -${OPTARG}" + shtk_cli_usage_error "Unknown option -${OPTARG}" ;; esac done shift $((${OPTIND} - 1)) - [ ${#} -ge 1 ] || utils_usage_error "No command specified" + [ ${#} -ge 1 ] || shtk_cli_usage_error "No command specified" local exit_code=0 @@ -249,7 +254,7 @@ sysbuild_main() { ;; *) - utils_usage_error "Unknown command ${command}" + shtk_cli_usage_error "Unknown command ${command}" ;; esac diff --git a/sysutils/sysbuild/files/sysbuild4cron.sh b/sysutils/sysbuild/files/sysbuild4cron.sh index 68353b03e357..bdb0924bcb0c 100644 --- a/sysutils/sysbuild/files/sysbuild4cron.sh +++ b/sysutils/sysbuild/files/sysbuild4cron.sh @@ -29,6 +29,8 @@ # \file sysbuild4cron.sh # Entry point and main program logic. +shtk_import cli + # Paths to installed files. # @@ -85,7 +87,7 @@ sysbuild4cron_main() { ;; \?) - utils_usage_error "Unknown option -${OPTARG}" + shtk_cli_usage_error "Unknown option -${OPTARG}" ;; esac done @@ -96,11 +98,11 @@ sysbuild4cron_main() { if [ ! -d "${logdir}" ]; then mkdir -p "$(dirname "${logdir}")" >/dev/null 2>/dev/null || true mkdir "${logdir}" \ - || utils_error "Failed to create directory '${logdir}'" + || shtk_cli_error "Failed to create directory '${logdir}'" fi local exit_code=0 - local logfile="${logdir}/${Utils_ProgName}.$(date +%Y%m%d%H%M%S).log" + local logfile="${logdir}/$(shtk_cli_progname).$(date +%Y%m%d%H%M%S).log" "${@}" >"${logfile}" 2>&1 \ || sysbuild4cron_email "${logfile}" "${recipient}" "${@}" } diff --git a/sysutils/sysbuild/files/sysbuild4cron_test.sh b/sysutils/sysbuild/files/sysbuild4cron_test.sh index 39ae0161394a..fca4b0b3174e 100644 --- a/sysutils/sysbuild/files/sysbuild4cron_test.sh +++ b/sysutils/sysbuild/files/sysbuild4cron_test.sh @@ -1,3 +1,4 @@ +#! @ATF_SH@ # Copyright 2012 Google Inc. # All rights reserved. # diff --git a/sysutils/sysbuild/files/sysbuild_test.sh b/sysutils/sysbuild/files/sysbuild_test.sh index a29f2f37b7c6..c06bd39111b1 100644 --- a/sysutils/sysbuild/files/sysbuild_test.sh +++ b/sysutils/sysbuild/files/sysbuild_test.sh @@ -1,3 +1,4 @@ +#! @ATF_SH@ # Copyright 2012 Google Inc. # All rights reserved. # @@ -91,21 +92,6 @@ create_mock_cvsroot() { } -# Creates a fake id(1) binary for use by the "unprivileged-user" tests. -create_mock_id() { - [ -n "@SYSBUILD_USER@" ] \ - || atf_skip "Package built without unprivileged-user" - - cat >id <&2 - exit 1 -} - - -# Prints an informational message. -# -# \param ... The message to print. Can be provided as multiple words and, in -# that case, they are joined together by a single whitespace. -utils_info() { - echo "${Utils_ProgName}: I: $*" 1>&2 -} - - -# Prints a runtime warning. -# -# \param ... The message to print. Can be provided as multiple words and, in -# that case, they are joined together by a single whitespace. -utils_warning() { - echo "${Utils_ProgName}: W: $*" 1>&2 -} - - -# Prints an usage error and exits. -# -# \param ... The message to print. Can be provided as multiple words and, in -# that case, they are joined together by a single whitespace. -utils_usage_error() { - echo "${Utils_ProgName}: E: $*" 1>&2 - echo "Type 'man ${Utils_ProgName}' for help" 1>&2 - exit 1 -} - - -# Executes a command with logging. -# -# \param ... The command to execute. -# -# \return The exit code of the executed command. -utils_run() { - utils_info "Running '${@}' in $(pwd)" - local ret=0 - "${@}" || ret="${?}" - if [ ${ret} -eq 0 ]; then - utils_info "Command finished successfully" - else - utils_warning "Command failed with code ${ret}" - fi - return "${ret}" -} diff --git a/sysutils/sysbuild/files/utils_test.sh b/sysutils/sysbuild/files/utils_test.sh deleted file mode 100644 index 9534cd8f777a..000000000000 --- a/sysutils/sysbuild/files/utils_test.sh +++ /dev/null @@ -1,145 +0,0 @@ -# Copyright 2012 Google Inc. -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# * Neither the name of Google Inc. nor the names of its contributors -# may be used to endorse or promote products derived from this software -# without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -atf_test_case global_progname -global_progname_body() { - [ "${Utils_ProgName}" = utils_test ] \ - || atf_fail "Invalid value in Utils_ProgName" -} - - -atf_test_case error -error_body() { - if ( utils_error "This is" "a message"; echo "not seen" ) >out 2>err; then - atf_fail "utils_error did not exit with an error" - else - grep "utils_test: E: This is a message" err >/dev/null \ - || atf_fail "Expected error message not found" - [ ! -s out ] || atf_fail "Unexpected output in stdout" - fi -} - - -atf_test_case info -info_body() { - ( utils_info "This is" "a message"; echo "continuing" ) >out 2>err - grep "utils_test: I: This is a message" err >/dev/null \ - || atf_fail "Expected info message not found" - grep "continuing" out >/dev/null || atf_fail "Execution aborted" -} - - -atf_test_case usage_error -usage_error_body() { - if ( utils_usage_error "This is" "a message"; echo "not seen" ) >out 2>err - then - atf_fail "utils_usage_error did not exit with an error" - else - grep "utils_test: E: This is a message" err >/dev/null \ - || atf_fail "Expected error message not found" - grep "Type 'man utils_test' for help" err >/dev/null \ - || atf_fail "Expected instructional message not found" - [ ! -s out ] || atf_fail "Unexpected output in stdout" - fi -} - - -atf_test_case warning -warning_body() { - ( utils_warning "This is" "a message"; echo "continuing" ) >out 2>err - grep "utils_test: W: This is a message" err >/dev/null \ - || atf_fail "Expected info message not found" - grep "continuing" out >/dev/null || atf_fail "Execution aborted" -} - - -atf_test_case run__ok -run__ok_body() { - cat >helper.sh <out 2>err \ - || atf_fail "Got an unexpected error code" - - cat >expout <experr <helper.sh <out 2>err || code="${?}" - [ ${code} -eq 42 ] \ - || atf_fail "Did not get the expected error code; got ${code}" - - cat >expout <experr <