openpkg/openpkg.sh

Sun, 01 Nov 2009 15:44:56 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Sun, 01 Nov 2009 15:44:56 +0100
changeset 228
19b611159e28
child 428
f880f219c566
permissions
-rw-r--r--

Update to new vendor version and adjust patch accordingly.

     1 #!@l_prefix@/lib/openpkg/bash
     2 ##
     3 ##  openpkg -- OpenPKG Tool Chain
     4 ##  Copyright (c) 2000-2007 OpenPKG Foundation e.V. <http://openpkg.net/>
     5 ##  Copyright (c) 2000-2007 Ralf S. Engelschall <http://engelschall.com/>
     6 ##
     7 ##  Permission to use, copy, modify, and distribute this software for
     8 ##  any purpose with or without fee is hereby granted, provided that
     9 ##  the above copyright notice and this permission notice appear in all
    10 ##  copies.
    11 ##
    12 ##  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
    13 ##  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
    14 ##  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
    15 ##  IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
    16 ##  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    17 ##  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    18 ##  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
    19 ##  USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
    20 ##  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
    21 ##  OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
    22 ##  OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    23 ##  SUCH DAMAGE.
    24 ##
    25 ##  openpkg.sh: Execution Frontend (Language: Bourne-Shell)
    26 ##
    28 ##
    29 ##  command line parsing
    30 ##
    32 #   command line options defaults
    33 opt_prefix=""
    34 opt_tools=""
    35 opt_version=no
    36 opt_help=no
    38 #   process command line options by iterating over arguments
    39 for opt
    40 do
    41     case "${opt}" in
    42         -*=*) arg=`echo "${opt}" | sed 's/^[-_a-zA-Z0-9]*=//'` ;;
    43            *) arg='' ;;
    44     esac
    45     case "${opt}" in
    46         -v|--version ) opt_version=yes;     shift ;;
    47         -h|--help    ) opt_help=yes;        shift ;;
    48         --prefix=*   ) opt_prefix="${arg}"; shift ;;
    49         --tools=*    ) opt_tools="${arg}";  shift ;;
    50         -* ) echo "openpkg:ERROR: Invalid command-line option \"${opt}\"." 1>&2
    51              echo "openpkg:ERROR: Run \"${0} --help\" for list of valid options" 1>&2; exit 1 ;;
    52         *  ) break ;;
    53     esac
    54 done
    56 ##
    57 ##  determine OpenPKG locations
    58 ##
    60 #   determine path to OpenPKG instance
    61 openpkg_prefix="@l_prefix@"
    62 if [ ".${OPENPKG_PREFIX}" != . ]; then
    63     openpkg_prefix="${OPENPKG_PREFIX}"
    64 fi
    65 if [ ".${opt_prefix}" != . ]; then
    66     openpkg_prefix="${opt_prefix}"
    67 fi
    68 if [ -x "${openpkg_prefix}/bin/openpkg" -a -x "${openpkg_prefix}/libexec/openpkg/rpm" ]; then
    69     #   OpenPKG 2.0 and higher
    70     true
    71 elif [ -f "${openpkg_prefix}/bin/rpm" -a -x "${openpkg_prefix}/lib/openpkg/rpm" ]; then
    72     #   OpenPKG 1.x
    73     echo "openpkg:ERROR: OpenPKG 1.x instance found under \"${openpkg_prefix}\" (not supported)" 1>&2
    74     exit 1
    75 else
    76     echo "openpkg:ERROR: no OpenPKG instance found under \"${openpkg_prefix}\"" 1>&2
    77     exit 1
    78 fi
    80 #   allow convenient all-in-one specification of OpenPKG Tool Chain locations
    81 #   (assuming the filesystem layout of an uninstalled OpenPKG Tool Chain)
    82 openpkg_tools="${OPENPKG_TOOLS}"
    83 openpkg_tools_cmdpath="${OPENPKG_TOOLS_CMDPATH}"
    84 openpkg_tools_apipath="${OPENPKG_TOOLS_APIPATH}"
    85 if [ ".${opt_tool}" != . ]; then
    86     openpkg_tools="${opt_tools}"
    87 fi
    88 if [ ".${openpkg_tools}" != . -a ".${openpkg_tools_cmdpath}" = . ]; then
    89     openpkg_tools_cmdpath="${openpkg_tools}/cmd:@"
    90 fi
    91 if [ ".${openpkg_tools}" != . -a ".${openpkg_tools_apipath}" = . ]; then
    92     openpkg_tools_apipath="${openpkg_tools}/api:@"
    93 fi
    95 #   determine path to OpenPKG Tool Chain commands
    96 cmdpath="${openpkg_prefix}/libexec/openpkg"
    97 if [ -d "${openpkg_prefix}/libexec/openpkg-tools" ]; then
    98     #   openpkg-tools package overrides
    99     cmdpath="${openpkg_prefix}/libexec/openpkg-tools:${cmdpath}"
   100 fi
   101 if [ -d "${openpkg_prefix}/libexec/openpkg-audit" ]; then
   102     #   openpkg-audit package overrides
   103     cmdpath="${openpkg_prefix}/libexec/openpkg-audit:${cmdpath}"
   104 fi
   105 if [ ".${openpkg_tools_cmdpath}" != . ]; then
   106     #   user supplied path overrides
   107     cmdpath=`echo "${openpkg_tools_cmdpath}" | sed -e "s;@;${cmdpath};"`
   108 fi
   109 openpkg_tools_cmdpath=`echo "${cmdpath}" | sed -e 's/::/:/g' -e 's/^://' -e 's/:$//'`
   111 #   determine path to OpenPKG Tool Chain API
   112 apipath=""
   113 if [ -d "${openpkg_prefix}/lib/openpkg-tools" ]; then
   114     #   openpkg-tools package overrides
   115     apipath="${openpkg_prefix}/lib/openpkg-tools:${apipath}"
   116 fi
   117 if [ ".${openpkg_tools_apipath}" != . ]; then
   118     #   user supplied path overrides
   119     apipath=`echo "${openpkg_tools_apipath}" | sed -e "s;@;${apipath};"`
   120 fi
   121 openpkg_tools_apipath=`echo "${apipath}" | sed -e 's/::/:/g' -e 's/^://' -e 's/:$//'`
   123 ##
   124 ##  execute stand-alone option commands in advance
   125 ##
   127 #   implement stand-alone "--help" option
   128 if [ ".${opt_help}" = .yes ]; then
   129     release=`${openpkg_prefix}/libexec/openpkg/rpm --eval '%{l_openpkg_release}'`
   130     echo ""
   131     echo "This is ${release} <http://www.openpkg.org/>"
   132     echo "Cross-Platform Unix Software Packaging Facility"
   133     echo ""
   134     echo "Copyright (c) 2000-2007 OpenPKG Foundation e.V. <http://openpkg.net/>"
   135     echo "Copyright (c) 2000-2007 Ralf S. Engelschall <http://engelschall.com/>"
   136     echo ""
   137     echo "The command \"${openpkg_prefix}/bin/openpkg\" is the official command-line"
   138     echo "execution frontend of the OpenPKG tool chain. Its usage is:"
   139     echo ""
   140     echo "  \$ ${openpkg_prefix}/bin/openpkg [<option> ...] \\"
   141     echo "     <command> [<command-option> ...] [<command-argument> ...]"
   142     echo ""
   143     echo "where <option> is one of the following global options:"
   144     echo "  -p, --prefix    sets the OpenPKG instance prefix   (also: \${OPENPKG_PREFIX})"
   145     echo "  -t, --tools     sets the OpenPKG tool chain prefix (also: \${OPENPKG_TOOLS})"
   146     echo "  -v, --version   display OpenPKG version/release"
   147     echo "  -h, --help      display this usage help message"
   148     echo ""
   149     echo "where <command> is one of the following commands:"
   150     echo "  rpm             (provided by bootstrap package)"
   151     echo "  rpmbuild        (provided by bootstrap package)"
   152     echo "  rpm2cpio        (provided by bootstrap package)"
   153     echo "  rpm-config      (provided by bootstrap package)"
   154     echo "  uuid            (provided by bootstrap package)"
   155     echo "  rc              (provided by bootstrap package)"
   156     echo "  lsync           (provided by bootstrap package)"
   157     echo "  man             (provided by bootstrap package)"
   158     #   install command intentionally left out in above display!
   160     #   dynamically figure out add-on commands
   161     for cmd in rpm rpmbuild rpm2cpio rpm-config uuid rc lsync man install; do
   162         id=`echo "${cmd}" | sed -e 's/-/_/g'`
   163         eval "__cmd_seen_${id}=yes"
   164     done
   165     OIFS="${IFS}"; IFS=":"
   166     for dir in ${openpkg_tools_cmdpath}; do
   167         IFS="${OIFS}"
   168         if [ ! -d ${dir} ]; then
   169             continue
   170         fi
   171         for cmd in `cd ${dir} 2>/dev/null && echo *`; do
   172             name=`echo "${cmd}" | sed -e 's/\.sh$//' -e 's/\.pl$//' \
   173                  -e 's/^/X/' -e 's/^X\([a-z][a-zA-Z0-9_-]*\)$/\1/' -e 's/^X.*$//'`
   174             if [ ".${name}" != . ]; then
   175                 if [ -f ${dir}/${cmd} ]; then
   176                     id=`echo "${name}" | sed -e 's/-/_/g'`
   177                     eval "seen=\$__cmd_seen_${id}"
   178                     if [ ".${seen}" != .yes ]; then
   179                         echo "${name}" | awk '{ printf("  %-15s (provided by add-on package)\n", $0); }'
   180                         eval "__cmd_seen_${id}=yes"
   181                     fi
   182                 fi
   183             fi
   184         done
   185     done
   186     IFS="${OIFS}"
   187     echo ""
   188     echo "where <command-option> and <command-argument> are <command> specific"
   189     echo "options and arguments. Run \"${openpkg_prefix}/bin/openpkg <command> --help\""
   190     echo "and \"${openpkg_prefix}/bin/openpkg man <command>\" for more details."
   191     echo ""
   192     exit 0
   193 fi
   195 #   implement stand-alone "--version" option
   196 if [ ".${opt_version}" = .yes ]; then
   197     release=`${openpkg_prefix}/libexec/openpkg/rpm --eval '%{l_openpkg_release}'`
   198     version=`${openpkg_prefix}/libexec/openpkg/rpm -q --qf '%{version}' openpkg`
   199     echo "${release} (${version})"
   200     exit 0
   201 fi
   203 ##
   204 ##  determine command details and execute command appropriately
   205 ##
   207 #   command line sanity check
   208 if [ ${#} -eq 0 ]; then
   209     echo "openpkg:ERROR: Invalid command-line arguments." 1>&2
   210     echo "openpkg:ERROR: Run \"${openpkg_prefix}/bin/openpkg --help\" for list of valid arguments." 1>&2
   211     exit 1
   212 fi
   214 #   search command by iterating over all command directories
   215 cmd="${1}"
   216 shift
   217 cmd_path=""
   218 cmd_shell=""
   219 cmd_stack="${OPENPKG_TOOLS_CMDSTACK}"
   220 OIFS="${IFS}"; IFS=":"
   221 for dir in ${openpkg_tools_cmdpath}; do
   222     IFS="${OIFS}"
   224     #   skip (currently) not existing directory
   225     if [ ! -d ${dir} ]; then
   226         continue
   227     fi
   229     #   check for various command implementations
   230     if [ -x ${dir}/${cmd} ]; then
   231         #   found executable stand-alone binary
   232         cmd_path="${dir}/${cmd}"
   233         cmd_shell=""
   234     elif [ -f ${dir}/${cmd}.sh ]; then
   235         #   found non-executable Bourne-Shell script
   236         cmd_path="${dir}/${cmd}.sh"
   237         cmd_shell="${openpkg_prefix}/lib/openpkg/bash"
   238     elif [ -f ${dir}/${cmd}.pl ]; then
   239         #   found non-executable Perl script
   240         cmd_path="${dir}/${cmd}.pl"
   241         if [ -x ${openpkg_prefix}/bin/perl ]; then
   242             cmd_shell="${openpkg_prefix}/bin/perl"
   243         else
   244             cmd_shell=`${openpkg_prefix}/lib/openpkg/shtool path -p "$PATH:$openpkg_prefix/lib/openpkg" -m perl 2>&1`
   245             if [ ".${cmd_shell}" = . ]; then
   246                 echo "openpkg:ERROR: No Perl interpreter found in \${PATH}" 1>&2
   247                 exit 1
   248             fi
   249         fi
   250         #   provide Perl module include path(s) to API
   251         OIFS="${IFS}"; IFS=":"
   252         for dir2 in ${openpkg_tools_apipath}; do
   253             IFS="${OIFS}"
   254             if [ ! -d ${dir2} ]; then
   255                 continue
   256             fi
   257             cmd_shell="${cmd_shell} -I${dir2}"
   258         done
   259         IFS="${OIFS}"
   260     else
   261         #   command not found, continue searching
   262         continue
   263     fi
   265     #   check whether to use this found command or to continue searching
   266     #   for next command implementation in sequence (in order to support
   267     #   flexible nested command wrapping)
   268     cmd_last=`echo "${cmd_stack}" | sed -e 's;:.*$;;'`
   269     if [ ".${cmd_last}" = ".${cmd}" ]; then
   270         #   we were last command on stack, so pop us from call
   271         #   stack and continue searching for next implementation
   272         cmd_stack=`echo "${cmd_stack}" | sed -e 's;^[^:][^:]*:*;;'`
   273         continue
   274     else
   275         #   last command on stack was different, so stop
   276         #   searching because we found the implementation
   277         break
   278     fi
   279 done
   280 IFS="${OIFS}"
   282 #   sanity check search result
   283 if [ ".${cmd_path}" = . ]; then
   284     echo "openpkg:ERROR: No such command \"${cmd}\" found in command path" 1>&2
   285     echo "openpkg:ERROR: (${openpkg_tools_cmdpath})." 1>&2
   286     echo "openpkg:ERROR: Set \${OPENPKG_TOOLS_CMDPATH} appropriately." 1>&2
   287     echo "openpkg:ERROR: Run \"${openpkg_prefix}/bin/openpkg --help\" for list of valid commands." 1>&2
   288     exit 1
   289 fi
   291 #   export essential run-time information to command
   292 export OPENPKG_PREFIX="$openpkg_prefix"
   293 export OPENPKG_TOOLS_CMDPROG="${0}"
   294 export OPENPKG_TOOLS_CMDNAME="${cmd}"
   295 export OPENPKG_TOOLS_CMDSTACK=`echo "${OPENPKG_TOOLS_CMDSTACK}" | sed -e 's;^\(.\);:\1;' -e "s;^;${cmd};"`
   297 #   execute command
   298 eval "exec ${cmd_shell} ${cmd_path} \${1+\"\$@\"}"

mercurial