#!/bin/bash # Copyright 1999-2007 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 # $Id$ # This script tries to quickly create a Gentoo binary package using the # VDB_PATH/category/pkg/* files # # Resulting tbz2 file will be created in ${PKGDIR} ... # default is /usr/portage/packages/All/ if [[ ${UID} != "0" ]] ; then echo "You must run this as root" exit 1 fi # We need to ensure a sane umask for the packages that will be created. umask 022 # We need this portage cruft to be before --help output because # we utilize some of these vars in the usage info :/ eval $(portageq envvar -v NOCOLOR PKGDIR PORTAGE_BIN_PATH PORTAGE_NICENESS \ PORTAGE_PYM_PATH PORTAGE_TMPDIR ROOT) export PKGDIR PORTAGE_TMPDIR ROOT [[ -n ${PORTAGE_NICENESS} ]] && renice $PORTAGE_NICENESS $$ > /dev/null # Make sure the xpak module is in PYTHONPATH export PYTHONPATH=${PORTAGE_PYM_PATH} export PORTAGE_DB=$(portageq vdb_path) version() { local svnrev='$Rev$' svnrev=${svnrev#* } echo "quickpkg-${svnrev% *}" exit 0 } usage() { cat <<-EOF Usage: quickpkg [options] Options: -C, --nocolor Disable color output -x, --debug Run with shell debug turned on -V, --version Print version and exit -h, --help This cruft output A pkg can be of the form: - ${PORTAGE_DB}/// - single depend-type atom ... if portage can emerge it, quickpkg can make a package for exact definitions of depend atoms, see ebuild(5) Examples: quickpkg ${PORTAGE_DB}/net-www/apache-1.3.27-r1 package up apache, just version 1.3.27-r1 quickpkg apache package up apache, all versions of apache installed quickpkg =apache-1.3.27-r1 quickpkg =apache-1.3.27-r1 EOF if [[ -n $1 ]] ; then echo "" echo "Unknown arguments: $*" 1>&2 exit 1 else exit 0 fi } SET_X="no" while [[ -n $1 ]] ; do case $1 in -C|--nocolor) export NOCOLOR="true";; -x|--debug) SET_X="yes";; -V|--version) version;; -h|--help) usage;; -*) usage "$1";; *) break;; esac shift done [[ ${SET_X} == "yes" ]] && set -x source "${PORTAGE_BIN_PATH}/isolated-functions.sh" # here we make a package given a little info # $1 = package-name w/version # $2 = category do_pkg() { mkdir -p "${PORTAGE_TMPDIR}/binpkgs" || exit 1 chmod 0750 "${PORTAGE_TMPDIR}/binpkgs" MYDIR="${PORTAGE_TMPDIR}/binpkgs/$1" SRCDIR="${PORTAGE_DB}/$2/$1" LOG="${PORTAGE_TMPDIR}/binpkgs/$1-quickpkglog" ebegin "Building package for $1" ( # clean up temp directory rm -rf "${MYDIR}" # get pkg info files mkdir -p "${MYDIR}"/temp cp "${SRCDIR}"/* "${MYDIR}"/temp/ [ -d "${PKGDIR}"/All ] || mkdir -p "${PKGDIR}"/All local pkg_dest="${PKGDIR}/All/${1}.tbz2" local pkg_tmp="${PKGDIR}/All/${1}.tbz2.$$" # create filelist and a basic tbz2 gawk '{ if ($1 != "dir") { if ($1 == "obj") NF=NF-2 else if ($1 == "sym") NF=NF-3 } print }' "${SRCDIR}"/CONTENTS | cut -f2- -d" " - | sed -e 's:^/:./:' | \ while read f; do [ -d "${ROOT}/${f}" ] && [ -h "${ROOT}/${f}" ] && continue echo "$f" done > "${MYDIR}"/filelist tar vjcf "${pkg_tmp}" -C "${ROOT}" --files-from="${MYDIR}"/filelist --no-recursion # join together the basic tbz2 and the pkg info files python -c "import xpak; t=xpak.tbz2('${pkg_tmp}'); t.recompose('${MYDIR}/temp')" # move the final binary package to PKGDIR mv -f "${pkg_tmp}" "${pkg_dest}" [ -d "${PKGDIR}/$2" ] || mkdir -p "${PKGDIR}/$2" ( cd "${PKGDIR}/$2" && ln -s ../All/$1.tbz2 ) # cleanup again rm -rf "${MYDIR}" ) >& "${LOG}" if [ -e "${PKGDIR}/All/$1.tbz2" ] ; then rm -f "${LOG}" PKGSTATS="${PKGSTATS}"$'\n'"$(einfo $1: $(du -h "${PKGDIR}/All/$1.tbz2" | gawk '{print $1}'))" eend 0 else cat ${LOG} PKGSTATS="${PKGSTATS}"$'\n'"$(ewarn $1: not created)" eend 1 fi } # here we parse the parameters given to use on the cmdline export PKGERROR="" export PKGSTATS="" for x in "$@" ; do # they gave us full path if [ -e "${x}"/CONTENTS ] ; then x=$(readlink -f $x) pkg=$(echo ${x} | cut -d/ -f6) cat=$(echo ${x} | cut -d/ -f5) do_pkg "${pkg}" "${cat}" # lets figure out what they want else DIRLIST=$(portageq match "${ROOT}" "${x}") if [ -z "${DIRLIST}" ] ; then eerror "Could not find anything to match '${x}'; skipping" export PKGERROR="${PKGERROR} ${x}" continue fi for d in ${DIRLIST} ; do pkg=$(echo ${d} | cut -d/ -f2) cat=$(echo ${d} | cut -d/ -f1) if [ -f "${PORTAGE_DB}/${cat}/${pkg}/CONTENTS" ] ; then do_pkg ${pkg} ${cat} elif [ -d "${PORTAGE_DB}/${cat}/${pkg}" ] ; then ewarn "Package '${cat}/${pkg}' was injected; skipping" else eerror "Unhandled case (${cat}/${pkg}) !" eerror "Please file a bug at http://bugs.gentoo.org/" exit 10 fi done fi done if [ -z "${PKGSTATS}" ] ; then eerror "No packages found" exit 1 else echo $'\n'"$(einfo Packages now in ${PKGDIR}:)${PKGSTATS}" fi if [ ! -z "${PKGERROR}" ] ; then ewarn "The following packages could not be found:" ewarn "${PKGERROR}" exit 2 fi exit 0