#!/bin/bash
-# Copyright 1999-2006 Gentoo Foundation
+# Copyright 1999-2007 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
-# $Id: /var/cvsroot/gentoo-src/portage/bin/quickpkg,v 1.13.2.6 2005/08/10 22:08:48 vapier Exp $
+# $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
+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)
-export ROOT=$(portageq envvar ROOT)
-export ROOT=${ROOT%/}/
-
-if [ -z "$1" ] || [ $1 == "-h" ] || [ $1 == "--help" ] ; then
- echo "QUICKPKG ver 1.2"
- echo "USAGE: quickpkg <list of pkgs>"
- echo " a pkg can be of the form:"
- echo " - ${PORTAGE_DB}/<CATEGORY>/<PKG-VERSION>/"
- echo " - single depend-type atom ..."
- echo " if portage can emerge it, quickpkg can make a package"
- echo " for exact definitions of depend atoms, see ebuild(5)"
- echo
- echo "EXAMPLE:"
- echo " quickpkg ${PORTAGE_DB}/net-www/apache-1.3.27-r1"
- echo " package up apache, just version 1.3.27-r1"
- echo " quickpkg apache"
- echo " package up apache, all versions of apache installed"
- echo " quickpkg =apache-1.3.27-r1"
- echo " package up apache, just version 1.3.27-r1"
- exit 1
-fi
-export PKGDIR=$(portageq envvar PKGDIR)
-export PORTAGE_TMPDIR=$(portageq envvar PORTAGE_TMPDIR)
+version() {
+ local svnrev='$Rev$'
+ svnrev=${svnrev#* }
+ echo "quickpkg-${svnrev% *}"
+ exit 0
+}
+usage() {
+ cat <<-EOF
+ Usage: quickpkg [options] <list of pkgs>
+
+ 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}/<CATEGORY>/<PKG-VERSION>/
+ - 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 /sbin/functions.sh
+source "${PORTAGE_BIN_PATH}/isolated-functions.sh"
# here we make a package given a little info
# $1 = package-name w/version
# 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 '{
NF=NF-2
else if ($1 == "sym")
NF=NF-3
- print
}
- }' "${SRCDIR}"/CONTENTS | cut -f2- -d" " - | sed -e 's:^/:./:' > "${MYDIR}"/filelist
- tar vjcf "${MYDIR}"/bin.tar.bz2 -C "${ROOT}" --files-from="${MYDIR}"/filelist --no-recursion
+ 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
- xpak "${MYDIR}"/temp "${MYDIR}"/inf.xpak
- tbz2tool join "${MYDIR}"/bin.tar.bz2 "${MYDIR}"/inf.xpak "${MYDIR}"/$1.tbz2
+ python -c "import xpak; t=xpak.tbz2('${pkg_tmp}'); t.recompose('${MYDIR}/temp')"
# move the final binary package to PKGDIR
- [ -d "${PKGDIR}"/All ] || mkdir -p "${PKGDIR}"/All
+ mv -f "${pkg_tmp}" "${pkg_dest}"
[ -d "${PKGDIR}/$2" ] || mkdir -p "${PKGDIR}/$2"
- mv "${MYDIR}"/$1.tbz2 "${PKGDIR}"/All
( cd "${PKGDIR}/$2" && ln -s ../All/$1.tbz2 )
# cleanup again