1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161
|
#!/bin/bash
# Copyright 2016 Matthew Thode
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
if [[ "${DIB_DEBUG_TRACE:-0}" -gt 0 ]]; then
set -x
fi
set -eu
set -o pipefail
# note(JayF): YACC and LEX are both set by gentoo alternatives handling if you want to
# use alternative implementations of them. Since whatever alternative
# implementation is opted-for may not availabe inside the image, we need to
# unset the environment to ensure default behavior.
unset YACC LEX
# env is not sourced with user specified package inclusions
# set the default bash array if GENTOO_EMERGE_ENV is not defined as an array
if ! declare -p GENTOO_EMERGE_ENV 2> /dev/null | grep -q '^declare \-a'; then
declare -a GENTOO_EMERGE_ENV
GENTOO_EMERGE_ENV+=("USE=\"-build\"")
GENTOO_EMERGE_ENV+=("FEATURES=\"binpkg-multi-instance buildpkg parallel-fetch parallel-install\"")
GENTOO_EMERGE_ENV+=("PKGDIR=\"/tmp/portage-pkgdir\"")
GENTOO_EMERGE_ENV+=("DISTDIR=\"/tmp/portage-distdir\"")
GENTOO_EMERGE_ENV+=("PORTDIR=\"/tmp/portage-portdir\"")
export GENTOO_EMERGE_ENV
fi
# iterate over the array, exporting each 'line'
for (( i=0; i<${#GENTOO_EMERGE_ENV[@]}; i++ )); do
eval export "${GENTOO_EMERGE_ENV[i]}"
done
# set default opts
GENTOO_EMERGE_DEFAULT_OPTS=${GENTOO_EMERGE_DEFAULT_OPTS:-"--binpkg-respect-use --rebuilt-binaries=y --usepkg=y --with-bdeps=y --binpkg-changed-deps=y --jobs=2 --verbose --autounmask=n"}
ACTION='install'
SCRIPTNAME="$(basename $0)"
function show_options {
echo "Usage: ${SCRIPTNAME} [package ...]"
echo
echo 'Options:'
echo ' -u -- update all packages'
echo ' -e -- erase/remove packages'
exit 0
}
function install_gentoo_packages {
RUN_ONCE_SHM='1'
if mountpoint -q /dev/shm; then
emerge ${GENTOO_EMERGE_DEFAULT_OPTS} $@
elif [[ -k /dev/shm ]]; then
emerge ${GENTOO_EMERGE_DEFAULT_OPTS} $@
else
fix_shm
emerge ${GENTOO_EMERGE_DEFAULT_OPTS} $@
unfix_shm
fi
}
TEMP="$(getopt -o huem: -n ${SCRIPTNAME} -- ${@})"
if [[ "${?}" != 0 ]]; then
echo 'Terminating...' >&2
exit 1
fi
eval set -- "${TEMP}"
while true; do
case "${1}" in
-u )
if [[ ! -f ${PORTDIR}/profiles ]]; then
emerge-webrsync -q
fi
install_gentoo_packages --update --deep --changed-use @world
install_gentoo_packages --verbose=n --depclean
install_gentoo_packages --usepkg=n @preserved-rebuild
etc-update --automode -5
eselect news read new
exit 0
;;
-e )
ACTION='remove'
shift
;;
-m )
MAP_ELEMENT="${2}"
shift 2
;;
-h )
show_options
;;
-- )
shift
break
;;
* )
echo "Error: unsupported option ${1}."
exit 1
;;
esac
done
PKGS="${@}"
if [[ -n "${MAP_ELEMENT:-}" ]]; then
PKGS="$(pkg-map --element ${MAP_ELEMENT} ${@})"
if [[ "${?}" != 0 ]]; then
echo "bin/pkg-map error. ${PKGS}"
exit 1
fi
fi
if [[ -z "${PKGS}" ]]; then
echo "Not running install-packages ${ACTION} with empty packages list"
else
if [[ "${ACTION}" == 'install' ]]; then
if [[ ! -f ${PORTDIR}/profiles ]]; then
emerge-webrsync -q
fi
# --noreplace prevents us from rebuilding a package already installed
# --changed-use means that package will be rebuilt *if* USE flags for
# it (configuration) has changed
install_gentoo_packages --noreplace --changed-use "${PKGS}"
elif [[ "${ACTION}" == 'remove' ]]; then
if [[ ! -f ${PORTDIR}/profiles ]]; then
emerge-webrsync -q
fi
# A good practice for removing packages in gentoo is to deselect them,
# removing them from "world" set -- the equivalent of "unmark" in dnf.
# This tells portage we no longer care if the package is installed,
# and it can be removed if depedancies allow.
# This means a removal is two steps:
# - emerge --deselect $pkg
# - emerge --depclean
#
# The depclean step removes all packages that are not in the "world"
# set and are not in the dependency graph for any packages in "world"
# set.
#
# Other methods of removal may work; but this method sets us up to
# calculate the dependency graph exactly once and prevents portage
# from erroring if any of the packages were not already selected.
for PKG in ${PKGS}; do
install_gentoo_packages --deselect $PKG
done
install_gentoo_packages --depclean
else
echo 'something went really wrong, install action is not install or remove'
fi
fi
|