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

Diff of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

Revision 1.362 Revision 1.373
1# Copyright 1999-2011 Gentoo Foundation 1# Copyright 1999-2011 Gentoo Foundation
2# Distributed under the terms of the GNU General Public License v2 2# Distributed under the terms of the GNU General Public License v2
3# $Header: /var/cvsroot/gentoo-x86/eclass/eutils.eclass,v 1.362 2011/08/09 00:43:48 vapier Exp $ 3# $Header: /var/cvsroot/gentoo-x86/eclass/eutils.eclass,v 1.373 2011/12/16 23:38:41 vapier Exp $
4 4
5# @ECLASS: eutils.eclass 5# @ECLASS: eutils.eclass
6# @MAINTAINER: 6# @MAINTAINER:
7# base-system@gentoo.org 7# base-system@gentoo.org
8# @BLURB: many extra (but common) functions that are used in ebuilds 8# @BLURB: many extra (but common) functions that are used in ebuilds
13# home rather than having multiple ebuilds implementing the same thing. 13# home rather than having multiple ebuilds implementing the same thing.
14# 14#
15# Due to the nature of this eclass, some functions may have maintainers 15# Due to the nature of this eclass, some functions may have maintainers
16# different from the overall eclass! 16# different from the overall eclass!
17 17
18if [[ ${___ECLASS_ONCE_EUTILS} != "recur -_+^+_- spank" ]] ; then
19___ECLASS_ONCE_EUTILS="recur -_+^+_- spank"
20
18inherit multilib portability 21inherit multilib portability user
19 22
20DESCRIPTION="Based on the ${ECLASS} eclass" 23DESCRIPTION="Based on the ${ECLASS} eclass"
21 24
22if has "${EAPI:-0}" 0 1 2; then 25if has "${EAPI:-0}" 0 1 2; then
23 26
64fi 67fi
65 68
66# @FUNCTION: eqawarn 69# @FUNCTION: eqawarn
67# @USAGE: [message] 70# @USAGE: [message]
68# @DESCRIPTION: 71# @DESCRIPTION:
69# Proxy to einfo for package managers that don't provide eqawarn and use the PM 72# Proxy to ewarn for package managers that don't provide eqawarn and use the PM
70# implementation if available. 73# implementation if available. Reuses PORTAGE_ELOG_CLASSES as set by the dev
74# profile.
71if ! declare -F eqawarn >/dev/null ; then 75if ! declare -F eqawarn >/dev/null ; then
72 eqawarn() { 76 eqawarn() {
73 einfo "$@" 77 has qa ${PORTAGE_ELOG_CLASSES} && ewarn "$@"
78 :
74 } 79 }
75fi 80fi
76 81
77# @FUNCTION: ecvs_clean 82# @FUNCTION: ecvs_clean
78# @USAGE: [list of dirs] 83# @USAGE: [list of dirs]
91# Remove .svn directories recursiveley. Useful when a source tarball contains 96# Remove .svn directories recursiveley. Useful when a source tarball contains
92# internal Subversion directories. Defaults to $PWD. 97# internal Subversion directories. Defaults to $PWD.
93esvn_clean() { 98esvn_clean() {
94 [[ -z $* ]] && set -- . 99 [[ -z $* ]] && set -- .
95 find "$@" -type d -name '.svn' -prune -print0 | xargs -0 rm -rf 100 find "$@" -type d -name '.svn' -prune -print0 | xargs -0 rm -rf
101}
102
103# @FUNCTION: estack_push
104# @USAGE: <stack> [items to push]
105# @DESCRIPTION:
106# Push any number of items onto the specified stack. Pick a name that
107# is a valid variable (i.e. stick to alphanumerics), and push as many
108# items as you like onto the stack at once.
109#
110# The following code snippet will echo 5, then 4, then 3, then ...
111# @CODE
112# estack_push mystack 1 2 3 4 5
113# while estack_pop mystack i ; do
114# echo "${i}"
115# done
116# @CODE
117estack_push() {
118 [[ $# -eq 0 ]] && die "estack_push: incorrect # of arguments"
119 local stack_name="__ESTACK_$1__" ; shift
120 eval ${stack_name}+=\( \"\$@\" \)
121}
122
123# @FUNCTION: estack_pop
124# @USAGE: <stack> [variable]
125# @DESCRIPTION:
126# Pop a single item off the specified stack. If a variable is specified,
127# the popped item is stored there. If no more items are available, return
128# 1, else return 0. See estack_push for more info.
129estack_pop() {
130 [[ $# -eq 0 || $# -gt 2 ]] && die "estack_pop: incorrect # of arguments"
131
132 # We use the fugly __estack_xxx var names to avoid collision with
133 # passing back the return value. If we used "local i" and the
134 # caller ran `estack_pop ... i`, we'd end up setting the local
135 # copy of "i" rather than the caller's copy. The __estack_xxx
136 # garbage is preferable to using $1/$2 everywhere as that is a
137 # bit harder to read.
138 local __estack_name="__ESTACK_$1__" ; shift
139 local __estack_retvar=$1 ; shift
140 eval local __estack_i=\${#${__estack_name}[@]}
141 # Don't warn -- let the caller interpret this as a failure
142 # or as normal behavior (akin to `shift`)
143 [[ $(( --__estack_i )) -eq -1 ]] && return 1
144
145 if [[ -n ${__estack_retvar} ]] ; then
146 eval ${__estack_retvar}=\"\${${__estack_name}[${__estack_i}]}\"
147 fi
148 eval unset ${__estack_name}[${__estack_i}]
96} 149}
97 150
98# @FUNCTION: eshopts_push 151# @FUNCTION: eshopts_push
99# @USAGE: [options to `set` or `shopt`] 152# @USAGE: [options to `set` or `shopt`]
100# @DESCRIPTION: 153# @DESCRIPTION:
119# eshopts_pop 172# eshopts_pop
120# @CODE 173# @CODE
121eshopts_push() { 174eshopts_push() {
122 # have to assume __ESHOPTS_SAVE__ isn't screwed with 175 # have to assume __ESHOPTS_SAVE__ isn't screwed with
123 # as a `declare -a` here will reset its value 176 # as a `declare -a` here will reset its value
124 local i=${#__ESHOPTS_SAVE__[@]}
125 if [[ $1 == -[su] ]] ; then 177 if [[ $1 == -[su] ]] ; then
126 __ESHOPTS_SAVE__[$i]=$(shopt -p) 178 estack_push eshopts "$(shopt -p)"
127 [[ $# -eq 0 ]] && return 0 179 [[ $# -eq 0 ]] && return 0
128 shopt "$@" || die "eshopts_push: bad options to shopt: $*" 180 shopt "$@" || die "${FUNCNAME}: bad options to shopt: $*"
129 else 181 else
130 __ESHOPTS_SAVE__[$i]=$- 182 estack_push eshopts $-
131 [[ $# -eq 0 ]] && return 0 183 [[ $# -eq 0 ]] && return 0
132 set "$@" || die "eshopts_push: bad options to set: $*" 184 set "$@" || die "${FUNCNAME}: bad options to set: $*"
133 fi 185 fi
134} 186}
135 187
136# @FUNCTION: eshopts_pop 188# @FUNCTION: eshopts_pop
137# @USAGE: 189# @USAGE:
138# @DESCRIPTION: 190# @DESCRIPTION:
139# Restore the shell options to the state saved with the corresponding 191# Restore the shell options to the state saved with the corresponding
140# eshopts_push call. See that function for more details. 192# eshopts_push call. See that function for more details.
141eshopts_pop() { 193eshopts_pop() {
142 [[ $# -ne 0 ]] && die "eshopts_pop takes no arguments" 194 local s
143 local i=$(( ${#__ESHOPTS_SAVE__[@]} - 1 )) 195 estack_pop eshopts s || die "${FUNCNAME}: unbalanced push"
144 [[ ${i} -eq -1 ]] && die "eshopts_{push,pop}: unbalanced pair"
145 local s=${__ESHOPTS_SAVE__[$i]}
146 unset __ESHOPTS_SAVE__[$i]
147 if [[ ${s} == "shopt -"* ]] ; then 196 if [[ ${s} == "shopt -"* ]] ; then
148 eval "${s}" || die "eshopts_pop: sanity: invalid shopt options: ${s}" 197 eval "${s}" || die "${FUNCNAME}: sanity: invalid shopt options: ${s}"
149 else 198 else
150 set +$- || die "eshopts_pop: sanity: invalid shell settings: $-" 199 set +$- || die "${FUNCNAME}: sanity: invalid shell settings: $-"
151 set -${s} || die "eshopts_pop: sanity: unable to restore saved shell settings: ${s}" 200 set -${s} || die "${FUNCNAME}: sanity: unable to restore saved shell settings: ${s}"
152 fi 201 fi
202}
203
204# @FUNCTION: eumask_push
205# @USAGE: <new umask>
206# @DESCRIPTION:
207# Set the umask to the new value specified while saving the previous
208# value onto a stack. Useful for temporarily changing the umask.
209eumask_push() {
210 estack_push eumask "$(umask)"
211 umask "$@" || die "${FUNCNAME}: bad options to umask: $*"
212}
213
214# @FUNCTION: eumask_pop
215# @USAGE:
216# @DESCRIPTION:
217# Restore the previous umask state.
218eumask_pop() {
219 local s
220 estack_pop eumask s || die "${FUNCNAME}: unbalanced push"
221 umask ${s} || die "${FUNCNAME}: sanity: could not restore umask: ${s}"
153} 222}
154 223
155# @VARIABLE: EPATCH_SOURCE 224# @VARIABLE: EPATCH_SOURCE
156# @DESCRIPTION: 225# @DESCRIPTION:
157# Default directory to search for patches. 226# Default directory to search for patches.
334 local STDERR_TARGET="${T}/${patchname}.out" 403 local STDERR_TARGET="${T}/${patchname}.out"
335 if [[ -e ${STDERR_TARGET} ]] ; then 404 if [[ -e ${STDERR_TARGET} ]] ; then
336 STDERR_TARGET="${T}/${patchname}-$$.out" 405 STDERR_TARGET="${T}/${patchname}-$$.out"
337 fi 406 fi
338 407
339 printf "***** %s *****\n\n" "${patchname}" > "${STDERR_TARGET}" 408 printf "***** %s *****\nPWD: %s\n\n" "${patchname}" "${PWD}" > "${STDERR_TARGET}"
340 409
341 # Decompress the patch if need be 410 # Decompress the patch if need be
342 local count=0 411 local count=0
343 local PATCH_TARGET 412 local PATCH_TARGET
344 if [[ -n ${PIPE_CMD} ]] ; then 413 if [[ -n ${PIPE_CMD} ]] ; then
528 TMPDIR="${topdir}" mktemp -dt tmp.XXXXXXXXXX 597 TMPDIR="${topdir}" mktemp -dt tmp.XXXXXXXXXX
529 fi 598 fi
530 fi 599 fi
531} 600}
532 601
533# @FUNCTION: egetent
534# @USAGE: <database> <key>
535# @MAINTAINER:
536# base-system@gentoo.org (Linux)
537# Joe Jezak <josejx@gmail.com> (OS X)
538# usata@gentoo.org (OS X)
539# Aaron Walker <ka0ttic@gentoo.org> (FreeBSD)
540# @DESCRIPTION:
541# Small wrapper for getent (Linux),
542# nidump (< Mac OS X 10.5), dscl (Mac OS X 10.5),
543# and pw (FreeBSD) used in enewuser()/enewgroup()
544egetent() {
545 case ${CHOST} in
546 *-darwin[678])
547 case "$2" in
548 *[!0-9]*) # Non numeric
549 nidump $1 . | awk -F":" "{ if (\$1 ~ /^$2\$/) {print \$0;exit;} }"
550 ;;
551 *) # Numeric
552 nidump $1 . | awk -F":" "{ if (\$3 == $2) {print \$0;exit;} }"
553 ;;
554 esac
555 ;;
556 *-darwin*)
557 local mytype=$1
558 [[ "passwd" == $mytype ]] && mytype="Users"
559 [[ "group" == $mytype ]] && mytype="Groups"
560 case "$2" in
561 *[!0-9]*) # Non numeric
562 dscl . -read /$mytype/$2 2>/dev/null |grep RecordName
563 ;;
564 *) # Numeric
565 local mykey="UniqueID"
566 [[ $mytype == "Groups" ]] && mykey="PrimaryGroupID"
567 dscl . -search /$mytype $mykey $2 2>/dev/null
568 ;;
569 esac
570 ;;
571 *-freebsd*|*-dragonfly*)
572 local opts action="user"
573 [[ $1 == "passwd" ]] || action="group"
574
575 # lookup by uid/gid
576 if [[ $2 == [[:digit:]]* ]] ; then
577 [[ ${action} == "user" ]] && opts="-u" || opts="-g"
578 fi
579
580 pw show ${action} ${opts} "$2" -q
581 ;;
582 *-netbsd*|*-openbsd*)
583 grep "$2:\*:" /etc/$1
584 ;;
585 *)
586 type -p nscd >& /dev/null && nscd -i "$1"
587 getent "$1" "$2"
588 ;;
589 esac
590}
591
592# @FUNCTION: enewuser
593# @USAGE: <user> [uid] [shell] [homedir] [groups] [params]
594# @DESCRIPTION:
595# Same as enewgroup, you are not required to understand how to properly add
596# a user to the system. The only required parameter is the username.
597# Default uid is (pass -1 for this) next available, default shell is
598# /bin/false, default homedir is /dev/null, there are no default groups,
599# and default params sets the comment as 'added by portage for ${PN}'.
600enewuser() {
601 case ${EBUILD_PHASE} in
602 unpack|compile|test|install)
603 eerror "'enewuser()' called from '${EBUILD_PHASE}()' which is not a pkg_* function."
604 eerror "Package fails at QA and at life. Please file a bug."
605 die "Bad package! enewuser is only for use in pkg_* functions!"
606 esac
607
608 # get the username
609 local euser=$1; shift
610 if [[ -z ${euser} ]] ; then
611 eerror "No username specified !"
612 die "Cannot call enewuser without a username"
613 fi
614
615 # lets see if the username already exists
616 if [[ -n $(egetent passwd "${euser}") ]] ; then
617 return 0
618 fi
619 einfo "Adding user '${euser}' to your system ..."
620
621 # options to pass to useradd
622 local opts=
623
624 # handle uid
625 local euid=$1; shift
626 if [[ -n ${euid} && ${euid} != -1 ]] ; then
627 if [[ ${euid} -gt 0 ]] ; then
628 if [[ -n $(egetent passwd ${euid}) ]] ; then
629 euid="next"
630 fi
631 else
632 eerror "Userid given but is not greater than 0 !"
633 die "${euid} is not a valid UID"
634 fi
635 else
636 euid="next"
637 fi
638 if [[ ${euid} == "next" ]] ; then
639 for ((euid = 101; euid <= 999; euid++)); do
640 [[ -z $(egetent passwd ${euid}) ]] && break
641 done
642 fi
643 opts="${opts} -u ${euid}"
644 einfo " - Userid: ${euid}"
645
646 # handle shell
647 local eshell=$1; shift
648 if [[ ! -z ${eshell} ]] && [[ ${eshell} != "-1" ]] ; then
649 if [[ ! -e ${ROOT}${eshell} ]] ; then
650 eerror "A shell was specified but it does not exist !"
651 die "${eshell} does not exist in ${ROOT}"
652 fi
653 if [[ ${eshell} == */false || ${eshell} == */nologin ]] ; then
654 eerror "Do not specify ${eshell} yourself, use -1"
655 die "Pass '-1' as the shell parameter"
656 fi
657 else
658 for shell in /sbin/nologin /usr/sbin/nologin /bin/false /usr/bin/false /dev/null ; do
659 [[ -x ${ROOT}${shell} ]] && break
660 done
661
662 if [[ ${shell} == "/dev/null" ]] ; then
663 eerror "Unable to identify the shell to use, proceeding with userland default."
664 case ${USERLAND} in
665 GNU) shell="/bin/false" ;;
666 BSD) shell="/sbin/nologin" ;;
667 Darwin) shell="/usr/sbin/nologin" ;;
668 *) die "Unable to identify the default shell for userland ${USERLAND}"
669 esac
670 fi
671
672 eshell=${shell}
673 fi
674 einfo " - Shell: ${eshell}"
675 opts="${opts} -s ${eshell}"
676
677 # handle homedir
678 local ehome=$1; shift
679 if [[ -z ${ehome} ]] || [[ ${ehome} == "-1" ]] ; then
680 ehome="/dev/null"
681 fi
682 einfo " - Home: ${ehome}"
683 opts="${opts} -d ${ehome}"
684
685 # handle groups
686 local egroups=$1; shift
687 if [[ ! -z ${egroups} ]] ; then
688 local oldifs=${IFS}
689 local defgroup="" exgroups=""
690
691 export IFS=","
692 for g in ${egroups} ; do
693 export IFS=${oldifs}
694 if [[ -z $(egetent group "${g}") ]] ; then
695 eerror "You must add group ${g} to the system first"
696 die "${g} is not a valid GID"
697 fi
698 if [[ -z ${defgroup} ]] ; then
699 defgroup=${g}
700 else
701 exgroups="${exgroups},${g}"
702 fi
703 export IFS=","
704 done
705 export IFS=${oldifs}
706
707 opts="${opts} -g ${defgroup}"
708 if [[ ! -z ${exgroups} ]] ; then
709 opts="${opts} -G ${exgroups:1}"
710 fi
711 else
712 egroups="(none)"
713 fi
714 einfo " - Groups: ${egroups}"
715
716 # handle extra and add the user
717 local oldsandbox=${SANDBOX_ON}
718 export SANDBOX_ON="0"
719 case ${CHOST} in
720 *-darwin*)
721 ### Make the user
722 if [[ -z $@ ]] ; then
723 dscl . create /users/${euser} uid ${euid}
724 dscl . create /users/${euser} shell ${eshell}
725 dscl . create /users/${euser} home ${ehome}
726 dscl . create /users/${euser} realname "added by portage for ${PN}"
727 ### Add the user to the groups specified
728 local oldifs=${IFS}
729 export IFS=","
730 for g in ${egroups} ; do
731 dscl . merge /groups/${g} users ${euser}
732 done
733 export IFS=${oldifs}
734 else
735 einfo "Extra options are not supported on Darwin yet"
736 einfo "Please report the ebuild along with the info below"
737 einfo "eextra: $@"
738 die "Required function missing"
739 fi
740 ;;
741 *-freebsd*|*-dragonfly*)
742 if [[ -z $@ ]] ; then
743 pw useradd ${euser} ${opts} \
744 -c "added by portage for ${PN}" \
745 die "enewuser failed"
746 else
747 einfo " - Extra: $@"
748 pw useradd ${euser} ${opts} \
749 "$@" || die "enewuser failed"
750 fi
751 ;;
752
753 *-netbsd*)
754 if [[ -z $@ ]] ; then
755 useradd ${opts} ${euser} || die "enewuser failed"
756 else
757 einfo " - Extra: $@"
758 useradd ${opts} ${euser} "$@" || die "enewuser failed"
759 fi
760 ;;
761
762 *-openbsd*)
763 if [[ -z $@ ]] ; then
764 useradd -u ${euid} -s ${eshell} \
765 -d ${ehome} -c "Added by portage for ${PN}" \
766 -g ${egroups} ${euser} || die "enewuser failed"
767 else
768 einfo " - Extra: $@"
769 useradd -u ${euid} -s ${eshell} \
770 -d ${ehome} -c "Added by portage for ${PN}" \
771 -g ${egroups} ${euser} "$@" || die "enewuser failed"
772 fi
773 ;;
774
775 *)
776 if [[ -z $@ ]] ; then
777 useradd -r ${opts} \
778 -c "added by portage for ${PN}" \
779 ${euser} \
780 || die "enewuser failed"
781 else
782 einfo " - Extra: $@"
783 useradd -r ${opts} "$@" \
784 ${euser} \
785 || die "enewuser failed"
786 fi
787 ;;
788 esac
789
790 if [[ ! -e ${ROOT}/${ehome} ]] ; then
791 einfo " - Creating ${ehome} in ${ROOT}"
792 mkdir -p "${ROOT}/${ehome}"
793 chown ${euser} "${ROOT}/${ehome}"
794 chmod 755 "${ROOT}/${ehome}"
795 fi
796
797 export SANDBOX_ON=${oldsandbox}
798}
799
800# @FUNCTION: enewgroup
801# @USAGE: <group> [gid]
802# @DESCRIPTION:
803# This function does not require you to understand how to properly add a
804# group to the system. Just give it a group name to add and enewgroup will
805# do the rest. You may specify the gid for the group or allow the group to
806# allocate the next available one.
807enewgroup() {
808 case ${EBUILD_PHASE} in
809 unpack|compile|test|install)
810 eerror "'enewgroup()' called from '${EBUILD_PHASE}()' which is not a pkg_* function."
811 eerror "Package fails at QA and at life. Please file a bug."
812 die "Bad package! enewgroup is only for use in pkg_* functions!"
813 esac
814
815 # get the group
816 local egroup="$1"; shift
817 if [ -z "${egroup}" ]
818 then
819 eerror "No group specified !"
820 die "Cannot call enewgroup without a group"
821 fi
822
823 # see if group already exists
824 if [[ -n $(egetent group "${egroup}") ]]; then
825 return 0
826 fi
827 einfo "Adding group '${egroup}' to your system ..."
828
829 # options to pass to useradd
830 local opts=
831
832 # handle gid
833 local egid="$1"; shift
834 if [ ! -z "${egid}" ]
835 then
836 if [ "${egid}" -gt 0 ]
837 then
838 if [ -z "`egetent group ${egid}`" ]
839 then
840 if [[ "${CHOST}" == *-darwin* ]]; then
841 opts="${opts} ${egid}"
842 else
843 opts="${opts} -g ${egid}"
844 fi
845 else
846 egid="next available; requested gid taken"
847 fi
848 else
849 eerror "Groupid given but is not greater than 0 !"
850 die "${egid} is not a valid GID"
851 fi
852 else
853 egid="next available"
854 fi
855 einfo " - Groupid: ${egid}"
856
857 # handle extra
858 local eextra="$@"
859 opts="${opts} ${eextra}"
860
861 # add the group
862 local oldsandbox="${SANDBOX_ON}"
863 export SANDBOX_ON="0"
864 case ${CHOST} in
865 *-darwin*)
866 if [ ! -z "${eextra}" ];
867 then
868 einfo "Extra options are not supported on Darwin/OS X yet"
869 einfo "Please report the ebuild along with the info below"
870 einfo "eextra: ${eextra}"
871 die "Required function missing"
872 fi
873
874 # If we need the next available
875 case ${egid} in
876 *[!0-9]*) # Non numeric
877 for ((egid = 101; egid <= 999; egid++)); do
878 [[ -z $(egetent group ${egid}) ]] && break
879 done
880 esac
881 dscl . create /groups/${egroup} gid ${egid}
882 dscl . create /groups/${egroup} passwd '*'
883 ;;
884
885 *-freebsd*|*-dragonfly*)
886 case ${egid} in
887 *[!0-9]*) # Non numeric
888 for ((egid = 101; egid <= 999; egid++)); do
889 [[ -z $(egetent group ${egid}) ]] && break
890 done
891 esac
892 pw groupadd ${egroup} -g ${egid} || die "enewgroup failed"
893 ;;
894
895 *-netbsd*)
896 case ${egid} in
897 *[!0-9]*) # Non numeric
898 for ((egid = 101; egid <= 999; egid++)); do
899 [[ -z $(egetent group ${egid}) ]] && break
900 done
901 esac
902 groupadd -g ${egid} ${egroup} || die "enewgroup failed"
903 ;;
904
905 *)
906 # We specify -r so that we get a GID in the system range from login.defs
907 groupadd -r ${opts} ${egroup} || die "enewgroup failed"
908 ;;
909 esac
910 export SANDBOX_ON="${oldsandbox}"
911}
912
913# @FUNCTION: edos2unix 602# @FUNCTION: edos2unix
914# @USAGE: <file> [more files ...] 603# @USAGE: <file> [more files ...]
915# @DESCRIPTION: 604# @DESCRIPTION:
916# A handy replacement for dos2unix, recode, fixdos, etc... This allows you 605# A handy replacement for dos2unix, recode, fixdos, etc... This allows you
917# to remove all of these text utilities from DEPEND variables because this 606# to remove all of these text utilities from DEPEND variables because this
918# is a script based solution. Just give it a list of files to convert and 607# is a script based solution. Just give it a list of files to convert and
919# they will all be changed from the DOS CRLF format to the UNIX LF format. 608# they will all be changed from the DOS CRLF format to the UNIX LF format.
920edos2unix() { 609edos2unix() {
921 echo "$@" | xargs sed -i 's/\r$//' 610 [[ $# -eq 0 ]] && return 0
611 sed -i 's/\r$//' -- "$@" || die
922} 612}
923 613
924# Make a desktop file ! 614# Make a desktop file !
925# Great for making those icons in kde/gnome startmenu ! 615# Great for making those icons in kde/gnome startmenu !
926# Amaze your friends ! Get the women ! Join today ! 616# Amaze your friends ! Get the women ! Join today !
1460 eerror "Unknown filetype \"${filetype}\" ?" 1150 eerror "Unknown filetype \"${filetype}\" ?"
1461 false 1151 false
1462 ;; 1152 ;;
1463 esac 1153 esac
1464 assert "failure unpacking (${filetype}) makeself ${shrtsrc} ('${ver}' +${skip})" 1154 assert "failure unpacking (${filetype}) makeself ${shrtsrc} ('${ver}' +${skip})"
1465}
1466
1467# @FUNCTION: check_license
1468# @USAGE: [license]
1469# @DESCRIPTION:
1470# Display a license for user to accept. If no license is
1471# specified, then ${LICENSE} is used.
1472check_license() {
1473 local lic=$1
1474 if [ -z "${lic}" ] ; then
1475 lic="${PORTDIR}/licenses/${LICENSE}"
1476 else
1477 if [ -e "${PORTDIR}/licenses/${lic}" ] ; then
1478 lic="${PORTDIR}/licenses/${lic}"
1479 elif [ -e "${PWD}/${lic}" ] ; then
1480 lic="${PWD}/${lic}"
1481 elif [ -e "${lic}" ] ; then
1482 lic="${lic}"
1483 fi
1484 fi
1485 local l="`basename ${lic}`"
1486
1487 # here is where we check for the licenses the user already
1488 # accepted ... if we don't find a match, we make the user accept
1489 local alic
1490 eshopts_push -o noglob # so that bash doesn't expand "*"
1491 for alic in ${ACCEPT_LICENSE} ; do
1492 if [[ ${alic} == ${l} ]]; then
1493 eshopts_pop
1494 return 0
1495 fi
1496 done
1497 eshopts_pop
1498 [ ! -f "${lic}" ] && die "Could not find requested license ${lic}"
1499
1500 local licmsg=$(emktemp)
1501 cat <<-EOF > ${licmsg}
1502 **********************************************************
1503 The following license outlines the terms of use of this
1504 package. You MUST accept this license for installation to
1505 continue. When you are done viewing, hit 'q'. If you
1506 CTRL+C out of this, the install will not run!
1507 **********************************************************
1508
1509 EOF
1510 cat ${lic} >> ${licmsg}
1511 ${PAGER:-less} ${licmsg} || die "Could not execute pager (${PAGER}) to accept ${lic}"
1512 einfon "Do you accept the terms of this license (${l})? [yes/no] "
1513 read alic
1514 case ${alic} in
1515 yes|Yes|y|Y)
1516 return 0
1517 ;;
1518 *)
1519 echo;echo;echo
1520 eerror "You MUST accept the license to continue! Exiting!"
1521 die "Failed to accept license"
1522 ;;
1523 esac
1524} 1155}
1525 1156
1526# @FUNCTION: cdrom_get_cds 1157# @FUNCTION: cdrom_get_cds
1527# @USAGE: <file on cd1> [file on cd2] [file on cd3] [...] 1158# @USAGE: <file on cd1> [file on cd2] [file on cd3] [...]
1528# @DESCRIPTION: 1159# @DESCRIPTION:
2025 case ${opt} in 1656 case ${opt} in
2026 -a) return $(( r != 0 )) ;; 1657 -a) return $(( r != 0 )) ;;
2027 -o) return $(( r == $# )) ;; 1658 -o) return $(( r == $# )) ;;
2028 esac 1659 esac
2029} 1660}
1661
1662# @FUNCTION: in_iuse
1663# @USAGE: <flag>
1664# @DESCRIPTION:
1665# Determines whether the given flag is in IUSE. Strips IUSE default prefixes
1666# as necessary.
1667#
1668# Note that this function should not be used in the global scope.
1669in_iuse() {
1670 debug-print-function ${FUNCNAME} "${@}"
1671 [[ ${#} -eq 1 ]] || die "Invalid args to ${FUNCNAME}()"
1672
1673 local flag=${1}
1674 local liuse=( ${IUSE} )
1675
1676 has "${flag}" "${liuse[@]#[+-]}"
1677}
1678
1679# @FUNCTION: use_if_iuse
1680# @USAGE: <flag>
1681# @DESCRIPTION:
1682# Return true if the given flag is in USE and IUSE.
1683#
1684# Note that this function should not be used in the global scope.
1685use_if_iuse() {
1686 in_iuse $1 || return 1
1687 use $1
1688}
1689
1690# @FUNCTION: usex
1691# @USAGE: <USE flag> [true output] [false output] [true suffix] [false suffix]
1692# @DESCRIPTION:
1693# If USE flag is set, echo [true output][true suffix] (defaults to "yes"),
1694# otherwise echo [false output][false suffix] (defaults to "no").
1695usex() { use "$1" && echo "${2-yes}$4" || echo "${3-no}$5" ; } #382963
1696
1697check_license() { die "you no longer need this as portage supports ACCEPT_LICENSE itself"; }
1698
1699fi

Legend:
Removed from v.1.362  
changed lines
  Added in v.1.373

  ViewVC Help
Powered by ViewVC 1.1.20