Magellan Linux

Contents of /branches/mage-next/src/magequery.in

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3097 - (show annotations) (download)
Mon Jun 4 16:59:42 2018 UTC (5 years, 10 months ago) by niro
File size: 5275 byte(s)
-speed up search logic via find and an array instead of just ls'ing 
through the directories and fail if no arguments are given to options 
which require them
-always use integers for booleans
-initialize INST_* bools properly


1 #!/bin/bash
2
3 # query mage database for installed packages
4 # $Id$
5
6 # always export C locale to fix utf-8 issues
7 export LC_ALL=C
8
9 print_usage()
10 {
11 echo "$(basename $0 .sh) querys the mage database for installed packages."
12 echo
13 echo " -n NAME searches for name NAME"
14 echo " -v VER searches for version VER, needs -n"
15 echo " -b BUILD searches for build number BUILD, needs -n -v"
16 echo " -c CAT shows all packages of given categorie"
17 echo " -i shows an inventory of all installed packages"
18 echo " -f PATH searches packages which own given file"
19 echo " -e PATH searches the package which owns the exact given filename"
20 echo
21 echo " Examples:"
22 echo
23 echo " $(basename $0 .sh) -n xorg -v 6.8.0 -b r1"
24 echo " searches for package xorg-6.8.0-r1"
25 echo
26 }
27
28 # default args:
29 GET_INVENTORY=0
30 SEARCH_ONLY_PATH=0
31 SEARCH_ONLY_CAT=0
32 SEARCH_EXACT_FILENAME=0
33
34 # no params given, or is only an arg not ar param, exit
35 if [[ $# -lt 1 ]] || [[ ${1:0:1} != - ]]
36 then
37 print_usage
38 exit 1
39 fi
40
41 # very basic getops
42 for i in $*
43 do
44 case $1 in
45 -n) shift; S_PNAME="$1"; if [[ -z ${S_PNAME} ]]; then print_usage; exit 1; fi ;;
46 -v) shift; S_PVER="$1"; if [[ -z ${S_PVER} ]]; then print_usage; exit 1; fi ;;
47 -b) shift; S_PBUILD="$1"; if [[ -z ${S_PBUILD} ]]; then print_usage; exit 1; fi ;;
48 -i) GET_INVENTORY="1" ;;
49 -f) SEARCH_ONLY_PATH="1"; shift; SEARCH_PATH="$1"; if [[ -z ${SEARCH_PATH} ]]; then print_usage; exit 1; fi ;;
50 -e) SEARCH_ONLY_PATH="1"; SEARCH_EXACT_FILENAME="1"; shift; SEARCH_PATH="$1"; if [[ -z ${SEARCH_PATH} ]]; then print_usage; exit 1; fi ;;
51 -c) SEARCH_ONLY_CAT="1"; shift; SEARCH_CAT="$1"; if [[ -z ${SEARCH_CAT} ]]; then print_usage; exit 1; fi ;;
52 -h) print_usage; exit 0 ;;
53 -*) print_usage; exit 1 ;;
54 esac
55 shift
56 done
57
58 source /etc/mage.rc.global
59 source ${MAGERC}
60 RETVAL=1
61
62 if [[ ${SEARCH_ONLY_PATH} = 1 ]]
63 then
64 unset S_PACKAGES
65 unset i pkg
66 if [[ ${SEARCH_EXACT_FILENAME} = 1 ]]
67 then
68 # fix ++, which gets interpreted as a regex
69 SEARCH_PATH="${SEARCH_PATH//+/\\+}"
70 # fix [, which gets interpreted as a regex
71 SEARCH_PATH="${SEARCH_PATH//[/\\[}"
72 S_CANDIDATES=$(egrep -rl "^${SEARCH_PATH}§" ${INSTALLDB})
73 else
74 S_CANDIDATES=$(fgrep -rl "${SEARCH_PATH}" ${INSTALLDB})
75 fi
76 for i in ${S_CANDIDATES}
77 do
78 # ignore magefiles!
79 case ${i} in
80 *.mage) continue ;;
81 esac
82
83 # print categorie and pkgname
84 pkg="$(basename ${i%/*/*})/$(basename ${i%/*})"
85 if [[ -z $(echo ${S_PACKAGES} | grep ${pkg}) ]]
86 then
87 S_PACKAGES="${S_PACKAGES} ${pkg}"
88 fi
89 done
90
91 # show packages
92 for pkg in ${S_PACKAGES}
93 do
94 echo "${pkg}"
95 done
96
97 exit 0
98 fi
99
100 if [[ ${SEARCH_ONLY_CAT} = 1 ]]
101 then
102 # no packages of SEARCH_CAT are installed
103 [[ ! -d ${MROOT}${INSTALLDB}/${SEARCH_CAT} ]] && exit 1
104 find ${MROOT}${INSTALLDB}/${SEARCH_CAT} -maxdepth 1 -mindepth 1 -printf "${SEARCH_CAT}/%P\n" | sort
105
106 exit 0
107 fi
108
109 # generate multidim array
110 declare -i INSTALL_DATABASE_COUNT=0
111 for line in $(find ${MROOT}${INSTALLDB} -maxdepth 2 -mindepth 2 -printf '%P\n' | sort)
112 do
113 INSTALL_DATABASE_PCAT[${INSTALL_DATABASE_COUNT}]="${line%/*}"
114 pkgname="${line#*/}"
115 INSTALL_DATABASE_PNAME[${INSTALL_DATABASE_COUNT}]="${pkgname%-*-*}"
116 pkgversion="${pkgname//${pkgname%-*-*}-}"
117 INSTALL_DATABASE_PVER[${INSTALL_DATABASE_COUNT}]="${pkgversion%-*}"
118 INSTALL_DATABASE_PBUILD[${INSTALL_DATABASE_COUNT}]="${pkgname##*-}"
119 (( INSTALL_DATABASE_COUNT++ ))
120 done
121
122 if [[ ${GET_INVENTORY} = 1 ]]
123 then
124 # build the list first
125 for ((i=0; i<INSTALL_DATABASE_COUNT; i++))
126 do
127 echo "${INSTALL_DATABASE_PCAT[${i}]}/${INSTALL_DATABASE_PNAME[${i}]}-${INSTALL_DATABASE_PVER[${i}]}-${INSTALL_DATABASE_PBUILD[${i}]}"
128 done
129
130 exit 0
131 fi
132
133 for ((i=0; i<INSTALL_DATABASE_COUNT; i++))
134 do
135 INST_PNAME=0
136 INST_PVER=0
137 INST_PBUILD=0
138
139 if [[ ${INSTALL_DATABASE_PNAME[${i}]} == ${S_PNAME} ]]
140 then
141 INST_PNAME=1
142
143 if [[ -n ${S_PVER} ]]
144 then
145 if [[ ${INSTALL_DATABASE_PVER[${i}]} == ${S_PVER} ]]
146 then
147 INST_PVER=1
148 fi
149
150 if [[ -n ${S_PBUILD} ]]
151 then
152 if [[ ${INSTALL_DATABASE_PBUILD[${i}]} == ${S_PBUILD} ]]
153 then
154 INST_PBUILD=1
155 fi
156 fi
157 fi
158
159 # search for pname only
160 if [[ -n ${S_PNAME} ]] && [[ -z ${S_PVER} ]] && [[ -z ${S_PBUILD} ]]
161 then
162 if [[ ${INST_PNAME} = 1 ]]
163 then
164 echo "${S_PNAME} is installed [ ${INSTALL_DATABASE_PCAT[${i}]}/${INSTALL_DATABASE_PNAME[${i}]}-${INSTALL_DATABASE_PVER[${i}]}-${INSTALL_DATABASE_PBUILD[${i}]} ]"
165 RETVAL=0
166 break
167 fi
168 fi
169
170 # search for pname and pver
171 if [[ -n ${S_PNAME} ]] && [[ -n ${S_PVER} ]] && [[ -z ${S_PBUILD} ]]
172 then
173 if [[ ${INST_PNAME} = 1 ]] && [[ ${INST_PVER} = 1 ]]
174 then
175 echo "${S_PNAME}-${S_PVER} is installed [ ${INSTALL_DATABASE_PCAT[${i}]}/${INSTALL_DATABASE_PNAME[${i}]}-${INSTALL_DATABASE_PVER[${i}]}-${INSTALL_DATABASE_PBUILD[${i}]} ]"
176 RETVAL=0
177 break
178 fi
179 fi
180
181 # search for pname, pver and pbuild
182 if [[ -n ${S_PNAME} ]] && [[ -n ${S_PVER} ]] && [[ -n ${S_PBUILD} ]]
183 then
184 if [[ ${INST_PNAME} = 1 ]] && [[ ${INST_PVER} = 1 ]] && [[ ${INST_PBUILD} = 1 ]]
185 then
186 echo "${S_PNAME}-${S_PVER}-${S_PBUILD} is installed [ ${INSTALL_DATABASE_PCAT[${i}]}/${INSTALL_DATABASE_PNAME[${i}]}-${INSTALL_DATABASE_PVER[${i}]}-${INSTALL_DATABASE_PBUILD[${i}]} ]"
187 RETVAL=0
188 break
189 fi
190 fi
191 fi
192 done
193
194 exit ${RETVAL}