#!/bin/bash PSI_ROOT=$(pwd) ERROR="\033[0;31m" INFO="\033[0;34m" PASS="\033[0;32m" NEUTRAL="\033[0;33m" RESET="\033[0m" MAKEFLAGS="-j11" alias make="make $MAKEFLAGS" usage () { cat << EOF usage: $0 PSIBUILD EOF } psibuild () { BUILD_FILE=${@: -1} cd $PSI_ROOT [[ $# = 0 ]] && usage && exit 1 [ ! -f "$BUILD_FILE" ] && echo "$BUILD_FILE not found" && exit 1 clean () { # clean up rm -rf $PKG_BUILD_DIR rmdir $PSI_ROOT/tmp > /dev/null 2>&1 } build () { printf "\tpassing missing build stage..." } package () { echo "Passing missing package stage" } source $BUILD_FILE PKG_NAME=$(basename $BUILD_FILE .psibuild) LOGFILE=$PSI_ROOT/logs/$PKG_NAME.log PKGS_OUTPUT=$PSI_ROOT/ppkgs PKG_FILE=$PKGS_OUTPUT/$PKG_NAME.ppkg PKG_BUILD_DIR=$PSI_ROOT/tmp/$PKG_NAME PKG_DEST=$PKG_PSI_ROOT/tmp/$PKG_NAME.package # make sure build dir is clean before starting rm -rf $PKG_BUILD_DIR # make the directories mkdir -p $PKG_BUILD_DIR mkdir -p $PKG_DEST mkdir -p $PKGS_OUTPUT mkdir -p $PSI_ROOT/logs date > $LOGFILE echo "Build log for $PKG_NAME from $BUILD_FILE\n" >> $LOGFILE printf "\033[0;36m====> $PKG_NAME.ppkg\n" | tee -a $LOGFILE cd $PKG_BUILD_DIR # fetch, build then package the package ############ # try get the commit hash for the package VER_HASH=$(git ls-remote $SOURCE HEAD | awk '{ print $1 }') # If we already have this package, don't waste our time if [ -f "$PKG_FILE.info" ] && [ -f "$PKG_FILE" ]; then EXISTING_HASH=$(grep -a "VER_HASH" $PKG_FILE.info | sed "s/VER_HASH=//") echo "Comparing $EXISTING_HASH to $VER_HASH" >> $LOGFILE printf "$INFO\tvalidating commit hash..."; if [ "$EXISTING_HASH" == "$VER_HASH" ]; then printf "$NEUTRAL package exists\n" return 0; else printf "$NEUTRAL package outdated\n" fi fi printf "$INFO\tfetching package..."; git clone $SOURCE . >> $LOGFILE 2>&1 && printf "$PASS fetched $(du -sh $PKG_BUILD_DIR | awk '{ print $1 }') source\n" || printf "$ERROR error! See log\n" printf "$INFO\tbuilding package..."; build >> $LOGFILE 2>&1 && printf "$PASS built\n" || printf "$ERROR error! See log\n"; printf "\033[0;34m\tpackaging package...\033[0m"; package >> $LOGFILE 2>&1 && printf "$PASS packaged\n" || printf "$ERROR error! See log\n" # go back to root, make things easier cd $PSI_ROOT printf "$INFO\tarchiving package..."; tar -C $PKG_DEST -czf $PKG_FILE ./ >> $LOGFILE 2>&1 && printf "$PASS archived to $(du -sh $PKG_FILE | awk '{ print $1 }')\n" || printf "$ERROR error! See log\n" # create info file printf "$INFO\tcreating ppkg.info..."; PKG_INFO=$PKGS_OUTPUT/$PKG_NAME.ppkg.info echo "" > $PKG_INFO echo "NAME=$PKG_NAME" >> $PKG_INFO echo "PKG_FILE=$PKG_NAME.ppkg" >> $PKG_INFO echo "CHECKSUM=$(md5sum $PKG_FILE | awk '{ print $1 }')" >> $PKG_INFO echo "VER_HASH=$VER_HASH" >> $PKG_INFO echo "SOURCE=$SOURCE" >> $PKG_INFO echo "DATE=$(date)" >> $PKG_INFO echo "DEPS=(${DEPS[*]})" >> $PKG_INFO printf "$INFOsigning..."; # sign the package PRIV_KEY=$PSI_ROOT/keychain/psi.pem PUB_KEY=$PSI_ROOT/keychain/psi.pub if [ -f "$PRIV_KEY" ]; then echo "SIGNATURE=" >> $PKG_INFO openssl dgst -sign $PRIV_KEY $PKG_FILE >> $PKG_INFO else echo "SIGNATURE=">> $PKG_INFO echo "unsigned">> $PKG_INFO >&2 printf "$ERROR WARNING! No private key: unsigned packages!\n" fi printf "$PASS signed\n"; printf "$PASS successfully built $PKG_NAME to $(basename $PKG_FILE)$RESET\n\n" clean } FILES=$@ for BUILD_FILE in $FILES; do psibuild $BUILD_FILE done