update-alternatives: Script copied from opkg

The update-alternatives script is being moved from opkg to opkg-utils to break
possible circular dependencies in openembedded. As opkg will depend on
libarchive soon, and may depend on other packages if certain options are
enabled, opkg cannot itself provide update-alternatives if its dependencies
require update-alternatives.

opkg-utils has minimal build-time dependencies and so is a good place to put the
update-alternatives script.

Signed-off-by: Paul Barker <paul@paulbarker.me.uk>
This commit is contained in:
Paul Barker
2013-12-20 19:19:42 +00:00
parent 0f6a67bc15
commit fd4a3a4c20
2 changed files with 191 additions and 1 deletions

View File

@@ -1,6 +1,6 @@
UTILS = opkg-build opkg-unbuild opkg-compare-versions opkg-make-index opkg.py \
opkg-list-fields arfile.py opkg-buildpackage opkg-diff opkg-extract-file opkg-show-deps \
opkg-compare-indexes opkg-compare-versions.sh
opkg-compare-indexes opkg-compare-versions.sh update-alternatives
DESTDIR=
PREFIX=/usr/local

190
update-alternatives Normal file
View File

@@ -0,0 +1,190 @@
#!/bin/sh
# update-alternatives
#
# Copyright (C) 2001 Carl D. Worth
#
# This program was inspired by the Debian update-alternatives program
# which is Copyright (C) 1995 Ian Jackson. This version of
# update-alternatives is command-line compatible with Debian's for a
# subset of the options, (only --install, --remove, and --help)
#
# This program 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, or (at your option)
# any later version.
#
# This program 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.
set -e
# admin dir
ad="$OPKG_OFFLINE_ROOT/usr/lib/opkg/alternatives"
usage() {
echo "update-alternatives: $*
Usage: update-alternatives --install <link> <name> <path> <priority>
update-alternatives --remove <name> <path>
update-alternatives --help
<link> is the link pointing to the provided path (ie. /usr/bin/foo).
<name> is the name in $ad/alternatives (ie. foo)
<path> is the name referred to (ie. /usr/bin/foo-extra-spiffy)
<priority> is an integer; options with higher numbers are chosen.
" >&2
exit 2
}
quit() {
echo "update-alternatives: $*" >&2
exit 2
}
register_alt() {
[ $# -lt 2 ] && return 1
local name="$1"
local link="$2"
if [ ! -d $ad ]; then
mkdir -p $ad
fi
if [ -e "$ad/$name" ]; then
local olink=`head -n 1 $ad/$name`
if [ "$link" != "$olink" ]; then
echo "update-alternatives: Error: cannot register alternative $name to $link since it is already registered to $olink" >&2
return 1
fi
else
echo "$link" > "$ad/$name"
fi
return 0
}
protect_slashes() {
sed -e 's/\//\\\//g'
}
remove_alt() {
[ $# -lt 2 ] && return 1
local name="$1"
local path="$2"
[ ! -f $ad/$name ] && return 0
path=`echo $path | protect_slashes`
sed -ne "/^$path\>.*/!p" $ad/$name > $ad/$name.new
mv $ad/$name.new $ad/$name
}
add_alt() {
[ $# -lt 3 ] && return 1
local name="$1"
local path="$2"
local priority="$3"
remove_alt $name $path
echo "$path $priority" >> $ad/$name
}
find_best_alt() {
[ $# -lt 1 ] && return 1
[ ! -f $ad/$name ] && return 0
link=$OPKG_OFFLINE_ROOT/`head -n 1 $ad/$name`
prio=`sed -ne "1!p" $ad/$name | sed -e "s/\(.*\) \(.*\)/\2 \1/g" | sort -nr | head -n 1 | sed 's/ [^ ]*$//'`
if [ -z "$prio" ]; then
echo "update-alternatives: removing $link as no more alternatives exist for it"
rm $ad/$name
if [ -L $link ]; then
rm $link
fi
return 0
fi
## Find last line with highest priority.
path=`grep "${prio}$" $ad/$name | tail -n 1 | sed 's/ [^ ]*$//'`
if [ ! -e $link -o -L $link ]; then
local link_dir=`dirname $link`
if [ ! -d $link_dir ]; then
mkdir -p $link_dir
fi
ln -snf $path $link
echo "update-alternatives: Linking $link to $path"
else
echo "update-alternatives: Error: not linking $link to $path since $link exists and is not a link"
return 1
fi
return 0
}
do_install() {
if [ $# -lt 4 ]; then
usage "--install needs <link> <name> <path> <priority>"
fi
local link="$1"
local name="$2"
local path="$3"
local priority="$4"
path=`echo $path | sed 's|/\+|/|g'`
# This is a bad hack, but I haven't thought of a cleaner solution yet...
[ -n "$OPKG_OFFLINE_ROOT" ] && path=`echo $path | sed "s|^$OPKG_OFFLINE_ROOT/*|/|"`
register_alt $name $link
add_alt $name $path $priority
find_best_alt $name
}
do_remove() {
if [ $# -lt 2 ]; then
usage "--remove needs <name> <path>"
fi
local name="$1"
local path="$2"
path=`echo $path | sed 's|/\+|/|g'`
# This is a bad hack, but I haven't thought of a cleaner solution yet...
[ -n "$OPKG_OFFLINE_ROOT" ] && path=`echo $path | sed "s|^$OPKG_OFFLINE_ROOT/*|/|"`
remove_alt $name $path
find_best_alt $name
}
###
# update-alternatives "main"
###
while [ $# -gt 0 ]; do
arg="$1"
shift
case $arg in
--help)
usage "help:"
exit 0
;;
--install)
do_install $*
exit $?
;;
--remove)
do_remove $*
exit $?
;;
*)
usage "unknown argument \`$arg'"
;;
esac
done
usage "at least one of --install or --remove must appear"
exit 0