diff options
Diffstat (limited to 'src/createpkg')
-rw-r--r-- | src/createpkg | 1096 |
1 files changed, 1096 insertions, 0 deletions
diff --git a/src/createpkg b/src/createpkg new file mode 100644 index 0000000..10daf0b --- /dev/null +++ b/src/createpkg @@ -0,0 +1,1096 @@ +#!/bin/bash +# +# createpkg: package builder using http://slack.sarava.org/slackbuilds scripts +# feedback: rhatto at riseup.net / rudsonalves at yahoo.com.br +# +# createpkg is free software; you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free Software +# Foundation; either version 2 of the License, or any later version. +# +# createpkg is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, write to the Free Software Foundation, Inc., 59 Temple +# Place - Suite 330, Boston, MA 02111-1307, USA +# +# Version $Rev$ - $Author$ +# + +#--------------------------------------------------- +# Createpkg functions +#--------------------------------------------------- + +function usage { + + # Help message + echo -e "${red}NAME${normal} + createpkg - create Slackware packages from SlackBuilds in Sarava repository + +${red}SYNOPSIS + createpkg${normal} [${green}OPTIONS${normal}] [${green}program1${normal} ... ${green}programN${normal}] + +${red}DESCRIPTION${normal} + [${green}program${normal}] name to build/search (some options support more than one program) + + Input ${green}OPTIONS${normal}: + ${red}-i${normal}, ${red}--install${normal} ${green}<program1>${normal} + create the package ${green}<program>${normal} and install + ${red}-a${normal}, ${red}--all${normal} + create all packages and install + ${red}-np${normal}, ${red}--no-deps${normal} + does not solve dependences + ${red}-d${normal}, ${red}--debug${normal} ${green}<program>${normal} + enable SlackBuild debug (sh -x ...) + ${red}-s${normal}, ${red}--search${normal} ${green}<program${normal}> + search for a ${green}<program>${normal} + ${red}-f${normal}, ${red}--info${normal} ${green}<program>${normal} + show description and dependences of the program + ${red}-l${normal}, ${red}--list${normal} + list all the SlackBuilds + ${red}--list-packages ${green}[repository]${normal} + list all packages in binary repositories + ${red}--sign${green}<package_name>${normal} + sign a binary package + ${red}--remove${green}<package_name>${normal} + remove a binary package + ${red}--sync${normal} + synchronize SlackBuilds repository + ${red}--update${normal} + synchronize packages repository + ${red}--commit${normal} ${green}["message"]${normal} + commit changes to binary packages' repository + ${red}--status${normal} + check binary packages' svn repository status + ${red}--import${normal} + import packages into a svn repository + ${red}--checkout${normal} + checkout binary packages from a svn repository + ${red}--update-keyring${normal} + update GPG-KEY from binary repositories + ${red}-h${normal}, ${red}--help${normal} + show this help + +${red}EXAMPLES${normal} + ${red}createpkg -i scilab${normal} + build and install scilab package + ${red}createpkg -s at*${normal} + search for all at* SlackBuilds scripts (at-spi, atk, ...) + ${red}createpkg --info pyrex${normal} + show pyrex description and dependences + $SYNC=yes {red}createpkg -i scilab${normal} + sync repository first, then build and install scilab package + +${red}AUTHOR${normal} + Written by ${blue}Rudson R. Alves${normal} and ${blue}Silvio Rhatto${normal} + +${red}AVAILABILITY${normal} + by svn: ${yellow}svn checkout http://slack.sarava.org/simplepkg${normal} + +${red}REPORTING BUGS${normal} + Report bugs to <${blue}rudsonalves[at]rra.etc.br${normal}> + +${red}COPYRIGHT${normal} + Copyright © 2006 Free Software Foundation, Inc. + This is free software. You may redistribute copies of it under the + terms of the GNU General Public License + <${yellow}http://www.gnu.org/licenses/gpl.html${normal}>. There is NO WARRANTY, + to the extent permitted by law." +} + +function build_all_slackbuilds { + + # Build all SlackBuilds in repository + createpkg --sync + + cd $SLACKBUILDS_DIR + LIST=`find . -name *.SlackBuild | sed 's/.*\/\(.*\)\.SlackBuild$/\1/' | sort | uniq` + for i in $LIST; do + [ ! lspkg $i >/dev/null ] && createpkg -i $i + done + +} + +function check_config { + + # Check the configuration + TMP=${TMP:=/tmp} + + if [ ! -z "$REPOS" ]; then + PACKAGES_DIR="$REPOS" + else + REPOS=$PACKAGES_DIR + fi + + # Nested folders, if configured + if [ ! -z "$PACKAGES_REPOS_STYLE" ]; then + PACKAGES_REPOS_STYLE=$(echo $PACKAGES_REPOS_STYLE | sed -e "s/none//g" -e "s/distro/`default_distro`/g" \ + -e "s/arch/`default_arch`/g" -e "s/version/`default_version`/g") + PACKAGES_DIR="$PACKAGES_DIR/$PACKAGES_REPOS_STYLE" + REPOS="$REPOS/$PACKAGES_REPOS_STYLE" + fi + + # Create $TMP and $REPOS if need + [ ! -e $TMP ] && mkdir -p $TMP + [ ! -e $PACKAGES_DIR ] && create_repo_folder $PACKAGES_DIR + # + SLACKBUILDS_DIR=${SLACKBUILDS_DIR:=/var/simplepkg/slackbuilds} + # + SYNC=${SYNC:=$no} + SYNC=`convert_boolean $SYNC` + BASEDIR="`dirname $SLACKBUILDS_DIR`" + +} + +function solve_dep { + + # Solve dependency + [ $# -ne 3 ] && handle_error $ERROR_PAR_NUMBER + local PACK="$1" + local COND="$2" + local VER="$3" + + # Check package in local system + PACK="`echo $PACK | sed -e 's/\+/\\\+/'`" + INSTALLED="`check_installed $PACK`" + CHECK=$? + + # TODO: check dependency versions + if [ -z "$INSTALLED" ]; then + if [ $CHECK -ne 0 ]; then + # Check package in SlackBuilds tree + eecho $messag "$BASENAME: processing $PACKAGE dependency $PACK" + SYNC=$no CREATEPKG_CHILD=$CREATEPKG_CHILD createpkg --install $PACK + + # Check if the package was built and installed + EXIT_CODE=$? + + if [ $EXIT_CODE -eq $ERROR_CREATEPKG_SLACKBUILD_NOTFOUND ]; then + # Try to use simplaret + ARCH=$CREATEPKG_ARCH simplaret --update + ARCH=$CREATEPKG_ARCH simplaret --install $PACK + [ $? -ne 0 ] && handle_error $ERROR_CREATEPKG_SLACKBUILD_NOTFOUND $PACK + elif [ $EXIT_CODE -ne 0 ]; then + handle_error $EXIT_CODE $PACK + fi + + fi + fi + +} + +function find_slackbuild { + + # Find SlackBuild script in the repository + [ $# -ne 1 ] && handle_error $ERROR_PAR_NUMBER + OUTPUT=`find $SLACKBUILDS_DIR -iname $1.SlackBuild` + [ "$OUTPUT" != "" ] && EXIT_CODE=0 || EXIT_CODE=1 + echo $OUTPUT + +} + +function info_builds { + + # Show packages info + if [ "$PKG_PATH" != "" ]; then + for i in $PKG_PATH; do + PACKAGE=`basename $i .SlackBuild` + NAME_UP=`echo $PACKAGE | tr [a-z] [A-Z]` + ID_VERSION=`grep '^SRC_VERSION' $i | cut -f2- -d":" | cut -f2 -d= | cut -f1 -d}` + eecho $commun "$NAME_UP: " + eecho Version: "$ID_VERSION" + eecho + + PKG_DIR=`dirname $i` + if [ -e $PKG_DIR/slack-desc ]; then + eval "cat $PKG_DIR/slack-desc | grep '^$PACKAGE:' | cut -f2- -d:" + eecho $normal + else + eval "cat $i | grep '^$PACKAGE:' | cut -f2- -d:" + eecho $normal + fi + + if [ -e $PKG_DIR/slack-required ]; then + eecho $commun "slack-required" + cat $PKG_DIR/slack-required | sed 's/^/ /' + fi + done + fi + +} + +function list_slackbuilds { + + # list all available slackbuilds + # usage: list_slackbuilds + + list_builds $SLACKBUILDS_DIR SlackBuild + +} + +function load_parameters { + + # Load Createpkg parameters + PACKAGES_DIR="`eval_parameter PACKAGES_DIR /var/simplepkg/repos`" + PACKAGES_SVN="`eval_parameter PACKAGES_SVN http://slack.sarava.org/packages`" + PACKAGES_REPOS_STYLE="`eval_parameter PACKAGES_REPOS_STYLE none`" + NOARCH_DIR="`eval_parameter PACKAGES_DIR /var/simplepkg/repos`/noarch" + SOURCE_DIR="`eval_parameter SOURCE_DIR /var/simplepkg/sources`" + SLACKBUILDS_DIR="`eval_parameter SLACKBUILDS_DIR /var/simplepkg/slackbuilds`" + SLACKBUILDS_SVN="`eval_parameter SLACKBUILDS_SVN http://slack.sarava.org/slackbuilds`" + SVN_USER="`eval_parameter PACKAGES_SVN_USER`" + SVN_GROUP="`eval_parameter PACKAGES_SVN_GROUP`" + SOURCE_DIR_USER="`eval_parameter SOURCE_DIR_USER`" + SOURCE_DIR_GROUP="`eval_parameter SOURCE_DIR_GROUP`" + + COLOR_MODE="`eval_parameter COLOR_MODE none`" + CREATEPKG_ARCH="`eval_parameter CREATEPKG_ARCH $(default_arch)`" + CREATEPKG_CLEANUP="`eval_parameter CREATEPKG_CLEANUP yes`" + CREATEPKG_AUTHOR="`eval_parameter CREATEPKG_AUTHOR`" + + TMP="`eval_parameter TMP /tmp`" + TMP_USER="`eval_parameter TMP_USER`" + TMP_GROUP="`eval_parameter TMP_GROUP`" + + SIGN_PACKAGES="`eval_boolean_parameter SIGN_PACKAGES $off`" + SIGN_PACKAGES_USER="`eval_parameter SIGN_PACKAGES_USER`" + SIGN_PACKAGES_KEYID="`eval_parameter SIGN_PACKAGES_KEYID`" + SIGN_PACKAGES_WITH_GPG_AGENT="`eval_boolean_parameter SIGN_PACKAGES_WITH_GPG_AGENT $off`" + + if [ ! -z "$SIGN_PACKAGES_KEYID" ]; then + SIGN_PACKAGES_KEYID="`echo $SIGN_PACKAGES_KEYID | tr '[:lower:]' '[:upper:]'`" + fi + + if [ "$SIGN_PACKAGES_WITH_GPG_AGENT" -eq $on ]; then + GPG_AGENT_OPTION="--use-agent" + else + GPG_AGENT_OPTION="" + fi + + # For use at common.sh functions + SIGN="$SIGN_PACKAGES" + SIGN_KEYID="$SIGN_PACKAGES_KEYID" + SIGN_USER="$SIGN_PACKAGES_USER" + + REMOVE_OLD_PACKAGE="`eval_boolean_parameter REMOVE_OLD_PACKAGE $off`" + MOVE_BIN_PACKAGE="`eval_boolean_parameter MOVE_BIN_PACKAGE $off`" + MOVE_SLACK_REQUIRED="`eval_boolean_parameter MOVE_SLACK_REQUIRED $off`" + PACKAGES_REPOS_NOARCH="`eval_boolean_parameter PACKAGES_REPOS_NOARCH $on`" + FORCE_MANIFEST_CHECK="`eval_boolean_parameter FORCE_MANIFEST_CHECK $off`" + FORCE_MANIFEST_CHECK_SIGNATURE="`eval_boolean_parameter FORCE_MANIFEST_CHECK_SIGNATURE $off`" + +} + +function repository_checkout { + + # checkout a binary repository + # usage: repository_checkout [repository-adress] + + local svn oldfolder + + if [ -d "$PACKAGES_DIR" ]; then + oldfolder="$(mktemp -d $(echo $PACKAGES_DIR | sed -e 's/\/*$//g').XXXXXX)" + echo "Backing up old $folder at $oldfolder..." + mv $PACKAGES_DIR $oldfolder + fi + + if [ -z "$1" ]; then + svn="$1" + else + svn="$PACKAGES_SVN" + fi + + if valid_svn_repo $svn; then + svn checkout $svn $PACKAGES_DIR + chown_svn $PACKAGES_DIR && chgrp_svn $PACKAGES_DIR + if [ "$svn" != "$PACKAGES_SVN" ]; then + echo "Using svn repository different from the one pointed at $CONF." + fi + else + echo "Invalid repository $repository, aborting." + EXIT_CODE="1" + fi + +} + +function repository_update { + + if [ ! -z "$1" ] && svn_folder $1; then + echo "Fetching changes from svn repository for $1..." + cwd="`pwd`" + chown_svn $1 && chgrp_svn $1 + cd $1 && su_svn update + cd $cwd + fi + +} + +function repository_status { + + local cwd + + if svn_folder $PACKAGES_DIR; then + echo "Status of $PACKAGES_DIR." + cwd="`pwd`" + cd $PACKAGES_DIR && su_svn status + cd $cwd + fi + + if svn_folder $NOARCH_DIR; then + cwd="`pwd`" + echo "Status of $NOARCH_DIR." + cd $NOARCH_DIR && su_svn status + cd $cwd + fi + + exit 0 + +} + +function binary_repository_import { + + # import packages into a subversion repository + # usage: binary_repository_import [repository] + + local repository="$1" folder + + if [ -z "$repository" ]; then + repository="file:////var/svn/packages" + fi + + # eval again so it doesn't include repository style information + folder="`eval_parameter PACKAGES_DIR /var/simplepkg/repos`" + + repository_import $folder $repository + +} + +function create_repo_folder { + + # Create repository directory + # usage: create_repo_folder <repository_folder> + + local folder="$1" basedir + + if [ ! -d "$folder" ]; then + echo "Creating packages folder $folder..." + basedir="`dirname $folder`" + if svn_folder $basedir && ! svn_check $folder; then + ( + cd $basedir + chown_svn $basedir && chgrp_svn $basedir + svn_mkdir `basename $folder`/$SUBFOLDER + ) + else + mkdir -p $folder/$SUBFOLDER + fi + elif [ ! -e $folder/$SUBFOLDER ]; then + if svn_folder $folder && ! svn_check $folder/$SUBFOLDER; then + ( + cd $folder + chown_svn $folder && chgrp_svn $folder + svn_mkdir $SUBFOLDER + ) + else + mkdir -p $folder/$SUBFOLDER + fi + fi + +} + +function remove_old_package_data { + + # Remove old packages from repository tree + # usage: remove_old_package_data <repository_folder> + + if [ ! -d "$1" ]; then + return 1 + fi + + local makepkg_repos="$1" + + # Remove old PACKAGEs from repository tree + if [ $REMOVE_OLD_PACKAGE -eq $on ]; then + + # first remove entries from CHECKSUMS.md5 + if [ -f "$makepkg_repos/CHECKSUMS.md5" ]; then + sed -i "/$PACKAGE-.*-.*-.*.*$/d" $makepkg_repos/CHECKSUMS.md5 + fi + + # then remove entries from patches/CHECKSUMS.md5 + if [ -f "$makepkg_repos/patches/CHECKSUMS.md5" ]; then + sed -i "/$PACKAGE-.*-.*-.*.*$/d" $makepkg_repos/patches/CHECKSUMS.md5 + fi + + # Using subversion + if svn_folder $makepkg_repos; then + + ( + + cd $makepkg_repos + + # Using -mindepth 2 so it doesn't delete the new PACKAGE + for file in `find . -mindepth 2 -name "$PACKAGE-*-*-*.*"`; do + candidate="`echo $file | sed -e 's/\.meta$/\.tgz/'`" # otherwise PACKAGE info functions can fail + candidate="`echo $candidate | sed -e 's/\.asc$//'`" # otherwise PACKAGE info functions can fail + # Just delete packages with different arch, version, build number or folder + if [ "`package_name $candidate`" == "$PACKAGE" ]; then + if [ "`package_version $candidate`" != "$PACKAGE_VERSION" ] || \ + [ "`package_arch $candidate`" != "$PACKAGE_ARCH" ] || \ + [ "`package_build $candidate`" != "$PACKAGE_BUILD" ] || \ + [ "`package_ext $candidate`" != "$PACKAGE_EXT" ] || \ + [ "`dirname $candidate | sed -e 's/^\.\///'`" != "`dirname $SUBFOLDER/$PKG_NAME | sed -e 's/^\.\///'`" ]; then + svn_del $file + fi + fi + done + + for file in `find $makepkg_repos -name "$PACKAGE.slack-required"`; do + if [ $MOVE_SLACK_REQUIRED -eq $off ]; then + svn_del $file + elif [ ! -z "$SLACK_REQUIRED" ] && [ "$makepkg_repos/$SUBFOLDER/$PACKAGE.slack-required" != "$file" ]; then + svn_del $file + fi + done + + ) + + else + # Using -mindepth 2 so it doesn't delete the new package + eval find $makepkg_repos -mindepth 2 $(pkg_ext_find $PACKAGE-*-*-*) -exec rm {} 2>/dev/null \; + find $makepkg_repos -mindepth 2 -name "$PACKAGE-*-*-*.meta" -exec rm {} 2>/dev/null \; + find $makepkg_repos -mindepth 2 -name "$PACKAGE-*-*-*.*.asc" -exec rm {} 2>/dev/null \; + find $makepkg_repos -name "$PACKAGE.slack-required" -exec rm {} 2>/dev/null \; + fi + fi + +} + +function update_metadata { + + # Update repository metadata + # usage: update_metadata <repository_folder> + + if [ ! -d "$1" ]; then + return 1 + fi + + local makepkg_repos="$1" + + ( + + cd $makepkg_repos + + get_sign_user + repo_gpg_key $makepkg_repos + gen_meta $SUBFOLDER/$PKG_NAME + gen_filelist + update_md5_checksum $makepkg_repos $SUBFOLDER/$PKG_NAME + + # update md5 file from patches/ folder if needed + if [ -d "patches/" ]; then + + found_patch="no" + + for file in `eval find patches/ $(pkg_ext_find $PACKAGE-*-*-*)`; do + found_patch="yes" + update_md5_checksum $makepkg_repos/patches patches/$SUBFOLDER/$PKG_NAME + done + + if [ "$found_patch" == "yes" ]; then + gen_patches_filelist patches + fi + fi + + ) + +} + +function list_packages { + + # list packages in repositories + # usage: list_packages [repository_list] + + local repository repositories="$*" + + if [ -z "$repositories" ]; then + repositories="$PACKAGES_DIR $NOARCH_DIR" + fi + + for repository in $repositories; do + echo "Packages from $repository..." + eval find $repository $(pkg_ext_find) + done + +} + +function remove_package { + + # delete a package from repositories + # usage: remove_packages <package> [repository_list] + + local package="$1" repository repositories="$2" + + if [ -z "$package" ]; then + return 1 + fi + + if [ -z "$repositories" ]; then + repositories="$PACKAGES_DIR $NOARCH_DIR" + fi + + for repository in $repositories; do + + ( + + cd $repository + + for file in `eval find . $(pkg_ext_find $package-*-*-*) -o -name "$package-*-*-*.meta" -o -name "$package-*-*-*.*.asc"`; do + svn_del $file + if [ -e "CHECKSUMS.md5" ] && echo $file | grep -q -E -e "$(pkg_ext_grep)$"; then + # remove md5 information + sed -i "/ \.*\/*$(regexp_slash $file)$/d" CHECKSUMS.md5 + cat CHECKSUMS.md5 | gzip -9 -c - > CHECKSUMS.md5.gz + fi + done + + for file in `find $repository -name "$package.slack-required"`; do + svn_del $file + done + + ) + + update_metadata $repository + done + +} + +function sign_package { + + # sign a package from repositories + # usage: sign_package <package> [repository_list] + + local package="$1" repository repositories="$2" + + if [ -z "$package" ]; then + return 1 + fi + + if [ -z "$repositories" ]; then + repositories="$PACKAGES_DIR $NOARCH_DIR" + fi + + for repository in $repositories; do + + ( + + cd $repository + + for file in `eval find . $(pkg_ext_find $package-*-*-*)`; do + + echo "Signing package..." + + get_sign_user + + if [ ! -z "$SIGN_PACKAGES_USER" ] && [ "`whoami`" != "$SIGN_PACKAGES_USER" ]; then + tmp_sign_folder="`mktemp -d $TMP/createpkg_sign.XXXXXX`" + chown $SIGN_PACKAGES_USER $tmp_sign_folder + su $SIGN_PACKAGES_USER -c "gpg $GPG_AGENT_OPTION --armor -sb -u $SIGN_KEYID -o $tmp_sign_folder/`basename $file`.asc $repository/$file" + cp $tmp_sign_folder/`basename $file`.asc $repository/$file.asc + rm -rf $tmp_sign_folder + else + tmp_sign_folder="`mktemp -d $TMP/createpkg_sign.XXXXXX`" + gpg $GPG_AGENT_OPTION --armor -sb -u $SIGN_KEYID -o $tmp_sign_folder/`basename $file`.asc $repository/$file + cp $tmp_sign_folder/`basename $file`.asc $repository/$file.asc + rm -rf $tmp_sign_folder + fi + + done + + ) + + update_metadata $repository + done + +} + +function create_package { + + # Synchronize repository + [ $SYNC -eq $yes ] && sync_svn_repo $SLACKBUILDS_DIR $SLACKBUILDS_SVN + + # Update keyring + update_keyring $SLACKBUILDS_DIR/GPG-KEY + + # Get SlackBuild script + BUILD_SCRIPT="`find_slackbuild $PACKAGE`" + + # Check SlackBuild script found + if [ -z "$BUILD_SCRIPT" ]; then + handle_error $ERROR_CREATEPKG_SLACKBUILD_NOTFOUND $PACKAGE + fi + + # Select one SlackBuild + if [ "`echo $BUILD_SCRIPT | wc -w`" -gt 1 ]; then + AUX="$PS3" + PS3="Choice: " + LIST=`echo $BUILD_SCRIPT | sed 's/ /\n/g' | sed -r 's/.*\/(.*)\.SlackBuild$/\1/'`" EXIT" + + select PACKAGE in `echo $LIST`; do + break + done + + if [ "$PACKAGE" = "EXIT" ]; then + eecho $error "error: no package selected" + return 1 + fi + + # Select only one SlackBuild in BUILD_SCRIPT + BUILD_SCRIPT=`echo $BUILD_SCRIPT | sed 's/ /\n/g' | grep "/$PACKAGE.SlackBuild"` + PS3="$AUX" + else + PACKAGE=`basename $BUILD_SCRIPT .SlackBuild` + fi + + # Get dirname and script name from slackbuild + SCRIPT_BASE="`dirname $BUILD_SCRIPT`" + SCRIPT_NAME="`basename $BUILD_SCRIPT`" + eecho $messag "$BASENAME: found script $PACKAGE.SlackBuild, now checking for dependencies" + + # Sets the package's slack-required + if [ -f "$SCRIPT_BASE/$PACKAGE.slack-required" ]; then + SLACK_REQUIRED="$SCRIPT_BASE/$PACKAGE.slack-required" + elif [ -f "$SCRIPT_BASE/slack-required" ]; then + SLACK_REQUIRED="$SCRIPT_BASE/slack-required" + fi + + if [ ! -z "$SLACK_REQUIRED" -a $NO_DEPS -ne $on ]; then + # This routine checks for dependencies in package's slack-required + ( + grep '^[^#]' $SLACK_REQUIRED | while read dep; do + if [ ! -z "$dep" ]; then + PROGRAM="`echo $dep | awk '{ print $1 }'`" + CONDITION="`echo $dep | awk '{ print $2 }' | tr [=\>\<] [egl]`" + VERSION="`echo $dep | awk '{ print $3 }' | tr -dc '[:digit:]'`" + solve_dep "$PROGRAM" "$CONDITION" "$VERSION" + fi + true + done + ) + [ $? -ne 0 ] && handle_error $error $ERROR_CREATEPKG_DEPENDENCY + + eecho $messag "$BASENAME: done checking for $PACKAGE dependencies" + else + eecho $messag "$BASENAME: no unmet dependencies for $PACKAGE" + fi + + eecho $messag "$BASENAME: processing $SCRIPT_NAME" + + # Change to script base directory + cd $SCRIPT_BASE + + # Use fakeroot if needed and available + if [ "`whoami`" != "root" ]; then + FAKEROOT="`which fakeroot`" + if [ "$?" == "0" ]; then + eecho $messag "$BASENAME: running SlackBuild with fakeroot." + FAKEROOT="$FAKEROOT --" + else + eecho $messag "$BASENAME: WARNING: not running as root and no fakeroot found." + eecho $messag "$BASENAME: WARNING: your build might not be successful." + FAKEROOT="" + fi + else + FAKEROOT="" + fi + + # Manifest checking + if [ $FORCE_MANIFEST_CHECK -eq $on ] || [ $FORCE_MANIFEST_CHECK_SIGNATURE -eq $on ]; then + if [ ! -e "`dirname $SCRIPT_NAME`/Manifest" ]; then + eecho $messag "$BASENAME: ERROR: no Manifest file for $PACKAGE." + return 1 + fi + fi + + # Manifest signature checking + if [ $FORCE_MANIFEST_CHECK_SIGNATURE -eq $on ]; then + if grep -q -- "-----BEGIN PGP SIGNED MESSAGE-----" `dirname $SCRIPT_NAME`/Manifest; then + gpg --verify `dirname $SCRIPT_NAME`/Manifest &> /dev/null + if [ "$?" != "0" ]; then + eecho $messag "$BASENAME: ERROR: invalid signature for $PACKAGES's Manifest file." + return 1 + fi + else + eecho $messag "$BASENAME: ERROR: no signed Manifest file for $PACKAGE." + return 1 + fi + fi + + # Run SlackBuild script + [ $DEBUG -eq $off ] && SHELL_FLAG="+x" || SHELL_FLAG="-x" + ( + LANG=en_US \ + TMP=$TMP \ + SRC_DIR=${SRC_DIR:=$SOURCE_DIR} \ + SRC=${SRC_DIR:=$SOURCE_DIR} \ + ARCH=${ARCH:=$CREATEPKG_ARCH} \ + COLOR=${COLOR:=$COLOR_MODE} \ + REPOS=${REPOS:=$PACKAGES_DIR} \ + CLEANUP=${CLEANUP:=$CREATEPKG_CLEANUP} \ + SLACKBUILD_PATH="/" \ + INTERACT=no $FAKEROOT sh $SHELL_FLAG ./$SCRIPT_NAME + ) + + # Check if package was built + handle_error $? $PACKAGE + + # Fix source folder user + if [ ! -z "$SOURCE_DIR_USER" ]; then + chown -R $SOURCE_DIR_USER $SOURCE_DIR + fi + + # Fix source folder group + if [ ! -z "$SOURCE_DIR_GROUP" ]; then + chgrp -R $SOURCE_DIR_GROUP $SOURCE_DIR + fi + + # Get package name, arch, version and build number + PKG_NAME="`ls -1 -c $PACKAGES_DIR/$PACKAGE-*-*-*.* | grep -E -e "$(pkg_ext_grep)$" | head -n 1 | xargs basename`" + PACKAGE_NAME="`package_name $PKG_NAME`" + PACKAGE_VERSION="`package_version $PKG_NAME`" + PACKAGE_ARCH="`package_arch $PKG_NAME`" + PACKAGE_BUILD="`package_build $PKG_NAME`" + PACKAGE_EXT="`package_ext $PKG_NAME`" + + # Update package author + if [ ! -z "$CREATEPKG_AUTHOR" ]; then + AUTHOR="`echo $PACKAGE_BUILD | sed -e 's/^[0-9]*//'`" + if [ "$AUTHOR" != "$CREATEPKG_AUTHOR" ]; then + echo "Changing package build author..." + BUILD_NUMBER="`echo $PACKAGE_BUILD | sed -e "s/$AUTHOR$//"`" + NEW_BUILD="$BUILD_NUMBER""$CREATEPKG_AUTHOR" + mv $PACKAGES_DIR/$PKG_NAME $PACKAGES_DIR/$PACKAGE_NAME-$PACKAGE_VERSION-$PACKAGE_ARCH-$NEW_BUILD.$PACKAGE_EXT + PKG_NAME="$PACKAGE_NAME-$PACKAGE_VERSION-$PACKAGE_ARCH-$NEW_BUILD.$PACKAGE_EXT" + PACKAGE_BUILD="$NEW_BUILD" + AUTHOR="$CREATEPKG_AUTHOR" + echo "New package name is $PKG_NAME." + fi + fi + + # Sign package + if [ $SIGN_PACKAGES -eq $on ]; then + + echo "Signing package..." + + get_sign_user + + if [ ! -z "$SIGN_PACKAGES_USER" ] && [ "`whoami`" != "$SIGN_PACKAGES_USER" ]; then + tmp_sign_folder="`mktemp -d $TMP/createpkg_sign.XXXXXX`" + chown $SIGN_PACKAGES_USER $tmp_sign_folder + su $SIGN_PACKAGES_USER -c "gpg $GPG_AGENT_OPTION --armor -sb -u $SIGN_KEYID -o $tmp_sign_folder/$PKG_NAME.asc $PACKAGES_DIR/$PKG_NAME" + cp $tmp_sign_folder/$PKG_NAME.asc $PACKAGES_DIR/$PKG_NAME.asc + rm -rf $tmp_sign_folder + else + tmp_sign_folder="`mktemp -d $TMP/createpkg_sign.XXXXXX`" + gpg $GPG_AGENT_OPTION --armor -sb -u $SIGN_KEYID -o $tmp_sign_folder/$PKG_NAME.asc $PACKAGES_DIR/$PKG_NAME + cp $tmp_sign_folder/$PKG_NAME.asc $PACKAGES_DIR/$PKG_NAME.asc + rm -rf $tmp_sign_folder + fi + + fi + + # Select repository directory + if [ $MOVE_BIN_PACKAGE -eq $on ]; then + SUBFOLDER="$( echo ${SCRIPT_BASE#$SLACKBUILDS_DIR/} )" + NEW_REPOS=$PACKAGES_DIR/$SUBFOLDER + else + SUBFOLDER="." + NEW_REPOS=$PACKAGES_DIR + fi + + # Update information from remote repository + repository_update $PACKAGES_DIR + + # Create the repository folders + create_repo_folder $PACKAGES_DIR + + # Remove old packages from repository tree + remove_old_package_data $PACKAGES_DIR + + # Move package to SlackBuilds-like tree + if [ $MOVE_BIN_PACKAGE -eq $on ]; then + + mv $PACKAGES_DIR/$PKG_NAME $NEW_REPOS/ + if [ -e "$PACKAGES_DIR/$PKG_NAME.asc" ]; then + mv $PACKAGES_DIR/$PKG_NAME.asc $NEW_REPOS/ + fi + + if svn_folder $NEW_REPOS; then + ( + cd $NEW_REPOS + chown_svn $PACKAGES_DIR && chgrp_svn $PACKAGES_DIR + svn_add $PKG_NAME + svn_add $PKG_NAME.asc + ) + fi + + # Move package's slack-required to binary repository + if [ $MOVE_SLACK_REQUIRED -eq $on ]; then + if [ ! -z "$SLACK_REQUIRED" ]; then + svn_copy $SLACK_REQUIRED $NEW_REPOS/$PACKAGE.slack-required + fi + fi + + fi + + # Update repository metadata + update_metadata $PACKAGES_DIR + + # General cleanup + echo Cleaning up the repository... + svn_remove_empty_folders $PACKAGES_DIR + + # Update noarch repository + if [ $PACKAGES_REPOS_NOARCH -eq $on ] && [ "`package_arch $PKG_NAME`" == "noarch" ]; then + repository_update $NOARCH_DIR + echo Copying package to noarch repository... + create_repo_folder $NOARCH_DIR + remove_old_package_data $NOARCH_DIR + svn_copy $NEW_REPOS/$PKG_NAME $NOARCH_DIR/$SUBFOLDER/ + svn_copy $NEW_REPOS/`strip_pkg_ext $PKG_NAME`.meta $NOARCH_DIR/$SUBFOLDER/ + svn_copy $NEW_REPOS/`basename $PKG_NAME`.asc $NOARCH_DIR/$SUBFOLDER/ + svn_copy $NEW_REPOS/$PACKAGE.slack-required $NOARCH_DIR/$SUBFOLDER/ + update_metadata $NOARCH_DIR + svn_remove_empty_folders $NOARCH_DIR + fi + + # Install package + if [ "$INSTALL" -eq $on ]; then + upgradepkg --install-new $NEW_REPOS/$PKG_NAME + fi + + echo "Package saved at $NEW_REPOS/$PKG_NAME" + + if [ $PACKAGES_REPOS_NOARCH -eq $on ] && [ "`package_arch $PKG_NAME`" == "noarch" ]; then + echo "Aditional copy saved at $NOARCH_DIR/$SUBFOLDER/$PKG_NAME" + fi + + return $EXIT_CODE + +} + +function build_queue { + + # createpkg's build queue + # usage: build_queue <package1> ... <packageN> + + local unable_to_install last_status built=0 total=0 + + if [ -z "$1" ]; then + return + fi + + for PACKAGE in $*; do + create_package + last_status="$?" + let total++ + if [ "$last_status" != "0" ]; then + unable_to_install="$unable_to_install\n\t`echo $PACKAGE | sed -e 's/\\\+/\+/'`" + else + let built++ + fi + done + + if [ ! -z "$unable_to_install" ] && [[ $total > 1 ]]; then + eecho $messag "$BASENAME: done building $built of $total requested SlackBuilds." + eecho $messag "$BASENAME: unable to create the following packages:" + echo -e "$unable_to_install" + fi + + # Fix possible $TMP removal + mkdir -p $TMP + + # Fix $TMP user + if [ ! -z "$TMP_USER" ]; then + chown $TMP_USER $TMP + fi + + # Fix $TMP group + if [ ! -z "$TMP_GROUP" ]; then + chgrp $TMP_GROUP $TMP + fi + + # Exit with last build package exit status + exit $last_status + +} + +#--------------------------------------------------- +# Starting createpkg +#--------------------------------------------------- +# Common functions +COMMON="/usr/libexec/simplepkg/common.sh" +SIMPLEPKG_CONF="/etc/simplepkg/simplepkg.conf" +BASENAME="`basename $0`" +EXIT_CODE=0 + +if [ -f "$COMMON" ]; then + source $COMMON +else + echo "error: file $COMMON found, check your $BASENAME installation" + exit 0 +fi + +set_constants + +# Load simplepkg.conf variables +load_parameters + +# Loading error codes +error_codes + +# Load slackbuildrc definitions +if [ -f ~/.slackbuildrc ]; then + source ~/.slackbuildrc +else + source /etc/slackbuildrc 2>/dev/null +fi + +# Select color mode: gray, color or none (*) +color_select $COLOR_MODE + +# This is used to show how many children process we have +if [ -z "$CREATEPKG_CHILD" ]; then + CREATEPKG_CHILD=1 +else + let CREATEPKG_CHILD++ +fi + +BASENAME="`basename $0`[$CREATEPKG_CHILD]" + +check_config +check_svn_repo $SLACKBUILDS_DIR $SLACKBUILDS_SVN + +INSTALL=$off +NO_DEPS=$off +DEBUG=$off + +case $1 in + '--all'|'-a') + # build all SlackBuilds in repository + build_all_slackbuilds + exit $EXIT_CODE + ;; + '--search'|'-s') + if [ $# -ne 2 ]; then + list_slackbuilds + else + LIST=`find_slackbuild $2` + if [ -z $LIST ]; then + EXIT_CODE=1 + else + for i in $LIST; do + echo $i #| sed 's/.*\/\([^\/]\+\)\.[Ss]lack[Bb]uild$/ \1/' + done + fi + fi + exit $EXIT_CODE + ;; + '--info'|'-f') + [ $# -ne 2 ] && usage # two parameters is required + PKG_PATH=`find_slackbuild $2` + info_builds + exit $EXIT_CODE + ;; + '--install'|'-i') + [ $# -ne 2 ] && usage # two parameters is required + shift + PACKAGE="$1" + INSTALL=$on + build_queue $* + ;; + '--no-deps'|'-nd') + [ $# -ne 2 ] && usage # two parameters is required + shift + NO_DEPS=$on + PACKAGE="$1" + build_queue $* + ;; + '--debug'|'-d') + [ $# -ne 2 ] && usage # two parameters is required + shift + PACKAGE="$1" + DEBUG=$on + build_queue $* + ;; + '--sync') + sync_svn_repo $SLACKBUILDS_DIR $SLACKBUILDS_SVN + exit $EXIT_CODE + ;; + '--help'|'-h'|'') + usage + exit $EXIT_CODE + ;; + '--list'|'-l') + list_slackbuilds + exit $EXIT_CODE + ;; + '--update') + repository_update $PACKAGES_DIR + repository_update $NOARCH_DIR + exit $EXIT_CODE + ;; + '--commit') + shift + commit_changes $PACKAGES_DIR "`basename $PACKAGES_DIR:`" $* + if [ $PACKAGES_REPOS_NOARCH -eq $on ]; then + commit_changes $NOARCH_DIR "noarch:" $* + fi + exit $EXIT_CODE + ;; + '--status') + repository_status + exit $EXIT_CODE + ;; + '--import') + shift + binary_repository_import $* + exit $EXIT_CODE + ;; + '--checkout') + shift + repository_checkout $* + exit $EXIT_CODE + ;; + '--update-keyring') + get_sign_user + repo_gpg_key $PACKAGES_DIR --update + if [ $PACKAGES_REPOS_NOARCH -eq $on ]; then + repo_gpg_key $NOARCH_DIR --update + fi + exit $EXIT_CODE + ;; + '--list-packages') + shift + list_packages $* + exit $EXIT_CODE + ;; + '--sign') + shift + sign_package $* + exit $EXIT_CODE + ;; + '--remove') + shift + remove_package $* + exit $EXIT_CODE + ;; + *) + if [ "${1:0:1}" != "-" ]; then + build_queue $* + else + usage + fi + ;; +esac |