ezbuild/ezsync

262 lines
10 KiB
Plaintext
Raw Normal View History

2012-01-03 14:49:17 +01:00
#!/bin/bash
# Copyright 2010-2012, Asio Software Technologies
# Distributed under the terms of the GNU General Public License v3
# Declare basic system variables
EZNAME=$(basename ${0})
EZROOT=$(dirname $(readlink -ne ${0}))
# Load necessary files
source /etc/profile
source ${EZROOT}/libraries/common
# Load EzBuild libraries & configuration
loadLibraries
loadConfiguration
# Print EzBuild notice and parse arguments
printNotice
2012-01-04 01:28:10 +01:00
until [[ -z "${1}" ]]; do
case "${1}" in
-c|--cleanlog)
2012-01-04 14:02:36 +01:00
EZOPT_CLEANLOG=true
2012-01-04 01:28:10 +01:00
;;
2012-01-26 17:14:56 +01:00
-D|--tarballdate)
shift
if [ -z ${1} ]; then
die "--tarballdate requires an additional argument!"
else
TARBALLDATE="${1}"
fi
;;
2012-01-04 01:28:10 +01:00
-h|--help)
2012-01-04 11:38:55 +01:00
showEzsyncUsage
2012-01-04 01:28:10 +01:00
;;
2012-01-16 11:19:17 +01:00
-l|--listmods)
listModules
;;
2012-01-09 13:02:53 +01:00
-n|--nosync)
shift
if [ -z ${1} ]; then
die "--nosync requires an additional argument!"
else
EZNOSYNC=${EZNOSYNC+"$EZNOSYNC "}"${1}"
fi
;;
2012-01-13 11:32:03 +01:00
-N|--nopush)
EZOPT_NOPUSH=true
;;
2012-01-04 01:28:10 +01:00
-p|--purge)
2012-01-04 14:02:36 +01:00
EZOPT_PURGETMP=true
2012-01-04 01:28:10 +01:00
;;
-P|--purgeonly)
2012-01-04 14:02:36 +01:00
EZOPT_PURGETMP=true
EZOPT_PURGEONLY=true
2012-01-04 01:28:10 +01:00
;;
-s|--syscheck)
2012-01-04 14:02:36 +01:00
EZOPT_SYSCHECKONLY=true
2012-01-04 01:28:10 +01:00
;;
2012-01-20 11:51:33 +01:00
-t|--notrigger)
EZOPT_NOTRIGGER=true
;;
2012-01-04 01:28:10 +01:00
*)
die "Unrecognized option ${1}"
;;
esac
shift
done
2012-01-03 14:49:17 +01:00
# Check system requirements
printInfo "Checking system prerequisites..."
checkPrerequisites
2012-01-04 14:02:36 +01:00
[ ${?} -ne 0 ] && die "Your environment does not meet EzBuild requirements!" 1
2012-01-04 01:28:10 +01:00
if isEnabled ${EZOPT_SYSCHECKONLY}; then
printInfo "Your system meets all EzBuild requirements!"
quit
fi
2012-01-04 14:02:36 +01:00
# Do not allow more than one working copy
PID=$(pidof -s -o '%PPID' -x ${EZNAME})
if [ ${PID} ]; then
printWarn "The ${EZNAME} is already working with PID: ${PID}"
printWarn "You cannot have more than one instancy running"
exit 0
fi
2012-01-04 14:05:45 +01:00
# Optionally purge whole temp directory or log file only
2012-01-04 14:02:36 +01:00
if isEnabled ${EZOPT_PURGETMP}; then
printInfo "Clearing temp directory..."
cleanTemp
if isEnabled ${EZOPT_PURGEONLY}; then
quit
fi
elif isEnabled ${EZOPT_CLEANLOG}; then
printInfo "Clearing log file..."
cleanLog
fi
2012-01-06 12:23:39 +01:00
2012-01-09 13:44:38 +01:00
# Initialize EzBuild environment
makeCoreDirectories || die "EzBuild was unable to create all necessary directories!" 1
EZNOTIFY="yes"
2012-01-17 21:41:18 +01:00
prepareWrappers || die "EzBuild was unable to create a wrapper files!" 1
2012-01-18 10:38:10 +01:00
export LC_ALL="C"
2012-01-09 13:44:38 +01:00
trap 'die "Process killed! This may lead into unexpected problems!"' 1 2 3 9 15 17 18 23
2012-01-09 11:55:39 +01:00
# Load necessary public keys
printInfo "Loading public keys..."
eval `keychain --noask --eval id_dsa id_rsa &> /dev/null`
[ ${?} -ne 0 ] && die "EzBuild was unable to load public keys!" 1
2012-01-10 19:02:24 +01:00
2012-01-16 12:50:04 +01:00
# Execute all 'presync' enabled modules
2012-01-20 11:51:33 +01:00
if ! isEnabled ${EZOPT_NOTRIGGER}; then
for MODULE in ${MODULES_PRESYNC}; do
loadModule ${MODULE} "presync"
RESULT=${?}
if [ ${RESULT} -eq 255 ]; then
printWarn "Trying to load module: ${MODULE}, that is incompatible with event: presync!"
elif [ ${RESULT} -ne 0 ]; then
fail "EzBuild was unable to execute module: ${MODULE}!" 255
fi
unloadModule
done
fi
2012-01-16 12:50:04 +01:00
2012-01-10 19:02:24 +01:00
# Update local copy of Portage that is being built
2012-01-14 13:05:22 +01:00
printInfo "Refreshing constructed Portage tree..."
2012-01-13 11:29:27 +01:00
pullRepository ${PORTAGESDIR}/${PORTAGE_BUILD[0]} ${PORTAGE_BUILD[1]} ${PORTAGE_BUILD[2]} ${PORTAGE_BUILD[3]}
2012-01-14 13:05:22 +01:00
[ ${?} -ne 0 ] && die "EzBuild was unable to refresh local copy of constructed Portage tree!" 2
# Update local copy of mainline Portage
if ! hasElement "mainline" ${EZNOSYNC} && ! hasElement "portage" ${EZNOSYNC}; then
2012-01-13 23:32:03 +01:00
printInfo "Refreshing mainline Portage tree..."
2012-01-13 11:29:27 +01:00
pullRepository ${PORTAGESDIR}/${PORTAGE_MAINLINE[0]} ${PORTAGE_MAINLINE[1]} ${PORTAGE_MAINLINE[2]} ${PORTAGE_MAINLINE[3]}
2012-01-14 13:05:22 +01:00
[ ${?} -ne 0 ] && die "EzBuild was unable to refresh local copy of mainline Portage tree!" 2
[ -e ${PORTAGESDIR}/${PORTAGE_MAINLINE[0]}/metadata/cache ] && rm -rf ${PORTAGESDIR}/${PORTAGE_MAINLINE[0]}/metadata/cache
2012-01-28 15:47:11 +01:00
[ -e ${PORTAGESDIR}/${PORTAGE_MAINLINE[0]}/metadata/md5-cache ] && rm -rf ${PORTAGESDIR}/${PORTAGE_MAINLINE[0]}/metadata/md5-cache
echo "distfiles/*" > ${PORTAGESDIR}/${PORTAGE_MAINLINE[0]}/.gitignore
echo "packages/*" >> ${PORTAGESDIR}/${PORTAGE_MAINLINE[0]}/.gitignore
if [ ! -d ${PORTAGESDIR}/${PORTAGE_MAINLINE[0]}/profiles/package.mask ]; then
mv ${PORTAGESDIR}/${PORTAGE_MAINLINE[0]}/profiles/package.mask ${PORTAGESDIR}/${PORTAGE_MAINLINE[0]}/profiles/package.mask.bak &> /dev/null
makeDirectory ${PORTAGESDIR}/${PORTAGE_MAINLINE[0]}/profiles/package.mask
mv ${PORTAGESDIR}/${PORTAGE_MAINLINE[0]}/profiles/package.mask.bak ${PORTAGESDIR}/${PORTAGE_MAINLINE[0]}/profiles/package.mask/${PORTAGE_MAINLINE[0]%-*} &> /dev/null
fi
if [ ! -d ${PORTAGESDIR}/${PORTAGE_MAINLINE[0]}/profiles/package.unmask ]; then
mv ${PORTAGESDIR}/${PORTAGE_MAINLINE[0]}/profiles/package.unmask ${PORTAGESDIR}/${PORTAGE_MAINLINE[0]}/profiles/package.unmask.bak &> /dev/null
makeDirectory ${PORTAGESDIR}/${PORTAGE_MAINLINE[0]}/profiles/package.unmask
mv ${PORTAGESDIR}/${PORTAGE_MAINLINE[0]}/profiles/package.unmask.bak ${PORTAGESDIR}/${PORTAGE_MAINLINE[0]}/profiles/package.unmask/${PORTAGE_MAINLINE[0]%-*} &> /dev/null
fi
if [ ! -d ${PORTAGESDIR}/${PORTAGE_MAINLINE[0]}/profiles/package.use ]; then
mv ${PORTAGESDIR}/${PORTAGE_MAINLINE[0]}/profiles/package.use ${PORTAGESDIR}/${PORTAGE_MAINLINE[0]}/profiles/package.use.bak &> /dev/null
makeDirectory ${PORTAGESDIR}/${PORTAGE_MAINLINE[0]}/profiles/package.use
mv ${PORTAGESDIR}/${PORTAGE_MAINLINE[0]}/profiles/package.use.bak ${PORTAGESDIR}/${PORTAGE_MAINLINE[0]}/profiles/package.use/${PORTAGE_MAINLINE[0]%-*} &> /dev/null
fi
fi
2012-01-13 11:26:09 +01:00
# Update all overlays (including the one that's optionally going to be built)
SYNC_OVERLAYS=( ${MERGED_OVERLAY[*]} ${MERGED_PORTAGE[*]} )
for OVERLAY in ${SYNC_OVERLAYS[*]}; do
TEMP="\${$OVERLAY[*]}"
CURRENT_OVERLAY=(`eval echo ${TEMP}`)
if ! hasElement "${CURRENT_OVERLAY[0]}" ${EZNOSYNC}; then
2012-01-13 23:32:03 +01:00
printInfo "Refreshing overlay: ${CURRENT_OVERLAY[0]}..."
2012-01-13 11:29:27 +01:00
pullRepository ${OVERLAYSDIR}/${CURRENT_OVERLAY[0]} ${CURRENT_OVERLAY[1]} ${CURRENT_OVERLAY[2]} ${CURRENT_OVERLAY[3]}
2012-01-14 13:05:22 +01:00
[ ${?} -ne 0 ] && fail "EzBuild was unable to refresh local copy of overlay: ${CURRENT_OVERLAY[0]}!" 4
2012-01-13 11:26:09 +01:00
fi
done
2012-01-16 12:50:04 +01:00
# Execute all 'postsync' enabled modules
2012-01-20 11:51:33 +01:00
if ! isEnabled ${EZOPT_NOTRIGGER}; then
for MODULE in ${MODULES_POSTSYNC}; do
loadModule ${MODULE} "postsync"
RESULT=${?}
if [ ${RESULT} -eq 255 ]; then
printWarn "Trying to load module: ${MODULE}, that is incompatible with event: postsync!"
elif [ ${RESULT} -ne 0 ]; then
fail "EzBuild was unable to execute module: ${MODULE}!" 255
fi
unloadModule
done
fi
2012-01-16 12:50:04 +01:00
# Optionally merge data into build overlay
if isSet MERGED_OVERLAY && isSet OVERLAY_BUILD; then
2012-01-16 16:27:14 +01:00
printInfo "Merging ebuilds into Overlay..."
for OVERLAY in ${MERGED_OVERLAY[*]}; do
TEMP="\${$OVERLAY[*]}"
CURRENT_OVERLAY=(`eval echo ${TEMP}`)
mergeOverlay ${OVERLAYSDIR}/${CURRENT_OVERLAY[0]} ${OVERLAYSDIR}/${OVERLAY_BUILD[0]} ${CURRENT_OVERLAY[4]} ${CURRENT_OVERLAY[5]} ${CURRENT_OVERLAY[6]}
[ ${?} -ne 0 ] && fail "EzBuild was unable to merge ebuilds into overlay!" 8
done
if ! isEnabled ${EZOPT_NOPUSH}; then
2012-01-16 13:29:50 +01:00
pushRepository ${OVERLAYSDIR}/${OVERLAY_BUILD[0]} ${OVERLAY_BUILD[1]} "Automatic update [$(date +"${PUSHDATEFORMAT}")]."
[ ${?} -ne 0 ] && die "Ezbuild was unable to record changes to the remote overlay repository!" 8
fi
fi
2012-01-13 15:23:07 +01:00
# Merge data into build portage
2012-01-16 16:27:14 +01:00
printInfo "Merging ebuilds into Portage..."
2012-01-13 16:05:02 +01:00
pullRsync ${PORTAGESDIR}/${PORTAGE_BUILD[0]} ${PORTAGESDIR}/${PORTAGE_MAINLINE[0]}/
2012-01-13 15:23:07 +01:00
[ ${?} -ne 0 ] && die "EzBuild was unable to merge ebuilds into Portage tree!" 16
for OVERLAY in ${MERGED_PORTAGE[*]}; do
TEMP="\${$OVERLAY[*]}"
CURRENT_OVERLAY=(`eval echo ${TEMP}`)
mergeOverlay ${OVERLAYSDIR}/${CURRENT_OVERLAY[0]} ${PORTAGESDIR}/${PORTAGE_BUILD[0]} ${CURRENT_OVERLAY[4]} ${CURRENT_OVERLAY[5]} ${CURRENT_OVERLAY[6]}
[ ${?} -ne 0 ] && die "EzBuild was unable to merge ebuilds into Portage tree!" 16
if [ -f ${OVERLAYSDIR}/${CURRENT_OVERLAY[0]}/profiles/package.mask ]; then
2012-01-18 17:54:53 +01:00
run "cp -apf ${OVERLAYSDIR}/${CURRENT_OVERLAY[0]}/profiles/package.mask ${PORTAGESDIR}/${PORTAGE_BUILD[0]}/profiles/package.mask/${CURRENT_OVERLAY[0]%-*}"
2012-01-13 15:23:07 +01:00
[ ${?} -ne 0 ] && die "EzBuild was unable to merge package.mask file into Portage tree!" 16
fi
if [ -f ${OVERLAYSDIR}/${CURRENT_OVERLAY[0]}/profiles/package.unmask ]; then
run "cp -apf ${OVERLAYSDIR}/${CURRENT_OVERLAY[0]}/profiles/package.unmask ${PORTAGESDIR}/${PORTAGE_BUILD[0]}/profiles/package.unmask/${CURRENT_OVERLAY[0]%-*}"
[ ${?} -ne 0 ] && die "EzBuild was unable to merge package.unmask file into Portage tree!" 16
fi
if [ -f ${OVERLAYSDIR}/${CURRENT_OVERLAY[0]}/profiles/package.use ]; then
run "cp -apf ${OVERLAYSDIR}/${CURRENT_OVERLAY[0]}/profiles/package.use ${PORTAGESDIR}/${PORTAGE_BUILD[0]}/profiles/package.use/${CURRENT_OVERLAY[0]%-*}"
[ ${?} -ne 0 ] && die "EzBuild was unable to merge package.use file into Portage tree!" 16
fi
2012-01-13 15:23:07 +01:00
done
2012-01-15 23:46:29 +01:00
# Execute all 'precommit' enabled modules
2012-01-20 11:51:33 +01:00
if ! isEnabled ${EZOPT_NOTRIGGER}; then
for MODULE in ${MODULES_PRECOMMIT}; do
loadModule ${MODULE} "precommit"
RESULT=${?}
if [ ${RESULT} -eq 255 ]; then
printWarn "Trying to load module: ${MODULE}, that is incompatible with event: precommit!"
elif [ ${RESULT} -ne 0 ]; then
fail "EzBuild was unable to execute module: ${MODULE}!" 255
fi
unloadModule
done
fi
2012-01-16 13:04:02 +01:00
# Regenerate Portage cache
printInfo "Updating constructed Portage cache..."
run "FEATURES="metadata-transfer" PORTDIR="${PORTAGESDIR}/${PORTAGE_BUILD[0]}" egencache --update --portdir=${PORTAGESDIR}/${PORTAGE_BUILD[0]} --jobs=${MAXJOBS} --load-average=${LOADAVERAGE} --tolerant"
2012-01-16 13:33:20 +01:00
[ ${?} -ne 0 ] && die "EzBuild was unable to regenerate cache!" 32
2012-01-16 13:04:02 +01:00
2012-01-16 13:34:31 +01:00
# Optionally commit all changes to remote Portage repository
if ! isEnabled ${EZOPT_NOPUSH}; then
2012-01-18 18:37:39 +01:00
printInfo "Sending constructed Portage update..."
2012-01-16 13:34:31 +01:00
pushRepository ${PORTAGESDIR}/${PORTAGE_BUILD[0]} ${PORTAGE_BUILD[1]} "Automatic update [$(date +"${PUSHDATEFORMAT}")]."
[ ${?} -ne 0 ] && die "Ezbuild was unable to record changes to the remote Portage repository!" 64
fi
# Execute all 'postcommit' enabled modules
2012-01-20 11:51:33 +01:00
if ! isEnabled ${EZOPT_NOTRIGGER}; then
for MODULE in ${MODULES_POSTCOMMIT}; do
loadModule ${MODULE} "postcommit"
RESULT=${?}
if [ ${RESULT} -eq 255 ]; then
printWarn "Trying to load module: ${MODULE}, that is incompatible with event: postcommit!"
elif [ ${RESULT} -ne 0 ]; then
fail "EzBuild was unable to execute module: ${MODULE}!" 255
fi
unloadModule
done
fi
2012-01-15 23:46:29 +01:00
# Finally quit the application
quit