/[gentoo-x86]/eclass/alternatives.eclass
Gentoo

Contents of /eclass/alternatives.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.2 - (show annotations) (download)
Tue Oct 7 20:26:50 2003 UTC (10 years, 9 months ago) by liquidx
Branch: MAIN
Changes since 1.1: +6 -3 lines
fixed issues with ${ROOT} on auto_makesym

1 # Copyright 1999-2003 Gentoo Technologies, Inc.
2 # Distributed under the terms of the GNU General Public License v2
3 # $Header: /home/cvsroot/gentoo-x86/eclass/alternatives.eclass,v 1.1 2003/10/07 17:21:40 liquidx Exp $
4
5 # Author : Alastair Tse <liquidx@gentoo.org> (03 Oct 2003)
6 # Short Desc: Creates symlink to the latest version of multiple slotted
7 # packages.
8 #
9 # Long Desc:
10 #
11 # When a package is SLOT'ed, very often we need to have a symlink to the
12 # latest version. However, depending on the order the user has merged them,
13 # more often than not, the symlink maybe clobbered by the older versions.
14 #
15 # This eclass provides a convenience function that needs to be given a
16 # list of alternatives (descending order of recent-ness) and the symlink.
17 # It will choose the latest version if can find installed and create
18 # the desired symlink.
19 #
20 # There are two ways to use this eclass. First is by declaring two variables
21 # $SOURCE and $ALTERNATIVES where $SOURCE is the symlink to be created and
22 # $ALTERNATIVES is a list of alternatives. Second way is the use the function
23 # alternatives_makesym() like the example below.
24 #
25 # Example:
26 #
27 # pkg_postinst() {
28 # alternatives_makesym "/usr/bin/python" "/usr/bin/python2.3" "/usr/bin/python2.2"
29 # }
30 #
31 # The above example will create a symlink at /usr/bin/python to either
32 # /usr/bin/python2.3 or /usr/bin/python2.2. It will choose python2.3 over
33 # python2.2 if both exist.
34 #
35 # Alternatively, you can use this function:
36 #
37 # pkg_postinst() {
38 # alternatives_auto_makesym "/usr/bin/python" "/usr/bin/python[0-9].[0-9]"
39 # }
40 #
41 # This will use bash pathname expansion to fill a list of alternatives it can
42 # link to. It is probably more robust against version upgrades. You should
43 # consider using this unless you are want to do something special.
44 #
45 ECLASS="alternatives"
46 INHERITED="$INHERITED $ECLASS"
47
48 # automatic deduction based on a symlink and a regex mask
49 alternatives_auto_makesym() {
50 local SOURCE REGEX ALT
51 local unsorted
52 SOURCE=$1
53 REGEX=$2
54
55 ALT="`ls -1 --color=never ${ROOT}${REGEX} | sed -e "s:^${ROOT}::" | sort -r | xargs`"
56 einfo "alternatives: $ROOT $REGEX $ALT"
57 if [ -n "${ALT}" ]; then
58 alternatives_makesym ${SOURCE} ${ALT}
59 else
60 eerror "regex ${REGEX} doesn't match any files."
61 fi
62 }
63
64 alternatives_makesym() {
65 local ALTERNATIVES=""
66 local SOURCE=""
67
68 # usage: alternatives_makesym <resulting symlink> [alternative targets..]
69 SOURCE=$1
70 shift
71 ALTERNATIVES=$@
72
73 # step through given alternatives from first to last
74 # and if one exists, link it and finish.
75
76 for alt in ${ALTERNATIVES}; do
77 if [ -f "${ROOT}${alt}" ]; then
78 if [ -L "${ROOT}${SOURCE}" ]; then
79 rm -f ${ROOT}${SOURCE}
80 fi
81 einfo "Linking ${alt} to ${SOURCE}"
82 # we do this instead of ${ROOT}${SOURCE} because if
83 # ROOT=/, then a symlink to //usr/bin/python confuses distutils
84 cd ${ROOT}; ln -s ${alt} ${SOURCE}
85 break
86 fi
87 done
88
89 # report any errors
90 if [ ! -L ${ROOT}${SOURCE} ]; then
91 ewarn "Unable to establish ${SOURCE} symlink"
92 elif [ ! -f "`readlink ${ROOT}${SOURCE}`" -a ! -f "${ROOT}`readlink ${ROOT}${SOURE}`" ]; then
93 ewarn "${SOURCE} is a dead symlink."
94 fi
95 }
96
97 alternatives_pkg_postinst() {
98 if [ -n "${ALTERNATIVES}" -a -n "${SOURCE}" ]; then
99 alternatives_makesym ${SOURCE} ${ALTERNATIVES}
100 fi
101 }
102
103 alternatives_pkg_postrm() {
104 if [ -n "${ALTERNATIVES}" -a -n "${SOURCE}" ]; then
105 alternatives_makesym ${SOURCE} ${ALTERNATIVES}
106 fi
107 }
108
109 EXPORT_FUNCTIONS pkg_postinst pkg_postrm

  ViewVC Help
Powered by ViewVC 1.1.20