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

Contents of /eclass/alternatives.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.4 - (hide annotations) (download)
Sat Nov 1 17:35:59 2003 UTC (10 years, 10 months ago) by liquidx
Branch: MAIN
Changes since 1.3: +36 -24 lines
added changes by drobbins with makesym() to do relative path targets

1 liquidx 1.1 # Copyright 1999-2003 Gentoo Technologies, Inc.
2     # Distributed under the terms of the GNU General Public License v2
3 liquidx 1.4 # $Header: /home/cvsroot/gentoo-x86/eclass/alternatives.eclass,v 1.3 2003/10/07 20:28:52 liquidx Exp $
4 liquidx 1.1
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 liquidx 1.4 local SYMLINK REGEX ALT myregex
51     SYMLINK=$1
52 liquidx 1.1 REGEX=$2
53 liquidx 1.4 if [ "${REGEX:0:1}" != "/" ]
54     then
55     #not an absolute path:
56     #inherit the root directory of our main link path for our regex search
57     myregex="${SYMLINK%/*}/${REGEX}"
58 liquidx 1.1 else
59 liquidx 1.4 myregex=${REGEX}
60     fi
61     ALT="`echo ${myregex} | sort -r`"
62     alternatives_makesym ${SYMLINK} ${ALT}
63 liquidx 1.1 }
64    
65     alternatives_makesym() {
66     local ALTERNATIVES=""
67 liquidx 1.4 local SYMLINK=""
68     local alt pref
69 liquidx 1.1 # usage: alternatives_makesym <resulting symlink> [alternative targets..]
70 liquidx 1.4 SYMLINK=$1
71     pref=${ROOT:0:${#ROOT}-1}
72 liquidx 1.1 shift
73     ALTERNATIVES=$@
74    
75     # step through given alternatives from first to last
76     # and if one exists, link it and finish.
77    
78     for alt in ${ALTERNATIVES}; do
79 liquidx 1.4 if [ -f "${pref}${alt}" ]; then
80     einfo "Linking ${alt} to ${pref}${SYMLINK}"
81     [ -L "${pref}${SYMLINK}" ] && rm -f ${pref}${SYMLINK}
82     #are files in same directory?
83     if [ "${alt%/*}" = "${SYMLINK%/*}" ]
84     then
85     #yes; strip leading dirname from alt to create relative symlink
86     ln -s ${alt##*/} ${pref}${SYMLINK}
87     else
88     #no; keep absolute path
89     ln -s ${pref}${alt} ${pref}${SYMLINK}
90 liquidx 1.1 fi
91     break
92     fi
93     done
94    
95     # report any errors
96 liquidx 1.4 if [ ! -L ${pref}${SYMLINK} ]; then
97     ewarn "Unable to establish ${pref}${SYMLINK} symlink"
98     else
99     # we need to check for either the target being in relative path form
100     # or absolute path form
101     if [ ! -f "`dirname ${pref}${SYMLINK}`/`readlink ${pref}${SYMLINK}`" -a \
102     ! -f "`readlink ${pref}${SYMLINK}`" ]; then
103     ewarn "${pref}${SYMLINK} is a dead symlink."
104     fi
105 liquidx 1.1 fi
106     }
107    
108     alternatives_pkg_postinst() {
109     if [ -n "${ALTERNATIVES}" -a -n "${SOURCE}" ]; then
110     alternatives_makesym ${SOURCE} ${ALTERNATIVES}
111     fi
112     }
113    
114     alternatives_pkg_postrm() {
115     if [ -n "${ALTERNATIVES}" -a -n "${SOURCE}" ]; then
116     alternatives_makesym ${SOURCE} ${ALTERNATIVES}
117     fi
118     }
119    
120     EXPORT_FUNCTIONS pkg_postinst pkg_postrm

  ViewVC Help
Powered by ViewVC 1.1.20