blob: 7121d65d08bcaaf986a61ecb08e942a7d26cca43 [file] [log] [blame]
#!/bin/bash
# Copyright 1999-2006 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
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)
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
source "${PORTAGE_BIN_PATH}/isolated-functions.sh"
case "${NOCOLOR:-false}" in
yes|true)
unset_colors
;;
no|false)
set_colors
;;
esac
# 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