Annotation of /branches/mage-next/src/magequery.in
Parent Directory | Revision Log
Revision 3097 -
(hide annotations)
(download)
Mon Jun 4 16:59:42 2018 UTC (6 years, 3 months ago) by niro
File size: 5275 byte(s)
Mon Jun 4 16:59:42 2018 UTC (6 years, 3 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 | niro | 32 | #!/bin/bash |
2 | |||
3 | niro | 1290 | # query mage database for installed packages |
4 | # $Id$ | ||
5 | niro | 32 | |
6 | niro | 1783 | # always export C locale to fix utf-8 issues |
7 | export LC_ALL=C | ||
8 | |||
9 | niro | 32 | 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 | niro | 777 | echo " -c CAT shows all packages of given categorie" |
17 | niro | 210 | echo " -i shows an inventory of all installed packages" |
18 | niro | 1503 | echo " -f PATH searches packages which own given file" |
19 | echo " -e PATH searches the package which owns the exact given filename" | ||
20 | niro | 32 | 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 | niro | 210 | # default args: |
29 | niro | 3097 | GET_INVENTORY=0 |
30 | SEARCH_ONLY_PATH=0 | ||
31 | SEARCH_ONLY_CAT=0 | ||
32 | SEARCH_EXACT_FILENAME=0 | ||
33 | niro | 210 | |
34 | niro | 1290 | # 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 | niro | 1206 | do |
44 | niro | 1290 | case $1 in |
45 | niro | 3097 | -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 | niro | 1290 | -h) print_usage; exit 0 ;; |
53 | -*) print_usage; exit 1 ;; | ||
54 | niro | 32 | esac |
55 | niro | 1290 | shift |
56 | niro | 32 | done |
57 | |||
58 | niro | 304 | source /etc/mage.rc.global |
59 | niro | 1546 | source ${MAGERC} |
60 | niro | 32 | RETVAL=1 |
61 | |||
62 | niro | 3097 | if [[ ${SEARCH_ONLY_PATH} = 1 ]] |
63 | niro | 304 | then |
64 | unset S_PACKAGES | ||
65 | unset i pkg | ||
66 | niro | 3097 | if [[ ${SEARCH_EXACT_FILENAME} = 1 ]] |
67 | niro | 1503 | then |
68 | niro | 1509 | # fix ++, which gets interpreted as a regex |
69 | SEARCH_PATH="${SEARCH_PATH//+/\\+}" | ||
70 | niro | 1540 | # fix [, which gets interpreted as a regex |
71 | SEARCH_PATH="${SEARCH_PATH//[/\\[}" | ||
72 | niro | 1507 | S_CANDIDATES=$(egrep -rl "^${SEARCH_PATH}§" ${INSTALLDB}) |
73 | niro | 1503 | else |
74 | S_CANDIDATES=$(fgrep -rl "${SEARCH_PATH}" ${INSTALLDB}) | ||
75 | fi | ||
76 | for i in ${S_CANDIDATES} | ||
77 | niro | 304 | do |
78 | niro | 1288 | # ignore magefiles! |
79 | case ${i} in | ||
80 | *.mage) continue ;; | ||
81 | esac | ||
82 | |||
83 | niro | 332 | # print categorie and pkgname |
84 | pkg="$(basename ${i%/*/*})/$(basename ${i%/*})" | ||
85 | niro | 304 | 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 | niro | 3097 | if [[ ${SEARCH_ONLY_CAT} = 1 ]] |
101 | niro | 777 | then |
102 | # no packages of SEARCH_CAT are installed | ||
103 | [[ ! -d ${MROOT}${INSTALLDB}/${SEARCH_CAT} ]] && exit 1 | ||
104 | niro | 3097 | find ${MROOT}${INSTALLDB}/${SEARCH_CAT} -maxdepth 1 -mindepth 1 -printf "${SEARCH_CAT}/%P\n" | sort |
105 | niro | 777 | |
106 | exit 0 | ||
107 | fi | ||
108 | |||
109 | niro | 3097 | # 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 | niro | 210 | then |
124 | niro | 3097 | # build the list first |
125 | for ((i=0; i<INSTALL_DATABASE_COUNT; i++)) | ||
126 | niro | 210 | do |
127 | niro | 3097 | echo "${INSTALL_DATABASE_PCAT[${i}]}/${INSTALL_DATABASE_PNAME[${i}]}-${INSTALL_DATABASE_PVER[${i}]}-${INSTALL_DATABASE_PBUILD[${i}]}" |
128 | niro | 210 | done |
129 | |||
130 | exit 0 | ||
131 | fi | ||
132 | |||
133 | niro | 3097 | for ((i=0; i<INSTALL_DATABASE_COUNT; i++)) |
134 | niro | 32 | do |
135 | niro | 3097 | INST_PNAME=0 |
136 | INST_PVER=0 | ||
137 | INST_PBUILD=0 | ||
138 | niro | 32 | |
139 | niro | 3097 | if [[ ${INSTALL_DATABASE_PNAME[${i}]} == ${S_PNAME} ]] |
140 | niro | 32 | then |
141 | niro | 3097 | INST_PNAME=1 |
142 | niro | 32 | |
143 | niro | 1290 | if [[ -n ${S_PVER} ]] |
144 | niro | 32 | then |
145 | niro | 3097 | if [[ ${INSTALL_DATABASE_PVER[${i}]} == ${S_PVER} ]] |
146 | niro | 32 | then |
147 | niro | 3097 | INST_PVER=1 |
148 | niro | 32 | fi |
149 | |||
150 | niro | 1290 | if [[ -n ${S_PBUILD} ]] |
151 | niro | 32 | then |
152 | niro | 3097 | if [[ ${INSTALL_DATABASE_PBUILD[${i}]} == ${S_PBUILD} ]] |
153 | niro | 32 | then |
154 | niro | 3097 | INST_PBUILD=1 |
155 | niro | 32 | fi |
156 | fi | ||
157 | fi | ||
158 | |||
159 | # search for pname only | ||
160 | niro | 1290 | if [[ -n ${S_PNAME} ]] && [[ -z ${S_PVER} ]] && [[ -z ${S_PBUILD} ]] |
161 | niro | 32 | then |
162 | niro | 3097 | if [[ ${INST_PNAME} = 1 ]] |
163 | niro | 32 | then |
164 | niro | 3097 | echo "${S_PNAME} is installed [ ${INSTALL_DATABASE_PCAT[${i}]}/${INSTALL_DATABASE_PNAME[${i}]}-${INSTALL_DATABASE_PVER[${i}]}-${INSTALL_DATABASE_PBUILD[${i}]} ]" |
165 | niro | 32 | RETVAL=0 |
166 | break | ||
167 | fi | ||
168 | fi | ||
169 | |||
170 | # search for pname and pver | ||
171 | niro | 1290 | if [[ -n ${S_PNAME} ]] && [[ -n ${S_PVER} ]] && [[ -z ${S_PBUILD} ]] |
172 | niro | 32 | then |
173 | niro | 3097 | if [[ ${INST_PNAME} = 1 ]] && [[ ${INST_PVER} = 1 ]] |
174 | niro | 32 | then |
175 | niro | 3097 | echo "${S_PNAME}-${S_PVER} is installed [ ${INSTALL_DATABASE_PCAT[${i}]}/${INSTALL_DATABASE_PNAME[${i}]}-${INSTALL_DATABASE_PVER[${i}]}-${INSTALL_DATABASE_PBUILD[${i}]} ]" |
176 | niro | 32 | RETVAL=0 |
177 | break | ||
178 | fi | ||
179 | fi | ||
180 | |||
181 | # search for pname, pver and pbuild | ||
182 | niro | 1290 | if [[ -n ${S_PNAME} ]] && [[ -n ${S_PVER} ]] && [[ -n ${S_PBUILD} ]] |
183 | niro | 32 | then |
184 | niro | 3097 | if [[ ${INST_PNAME} = 1 ]] && [[ ${INST_PVER} = 1 ]] && [[ ${INST_PBUILD} = 1 ]] |
185 | niro | 32 | then |
186 | niro | 3097 | 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 | niro | 32 | RETVAL=0 |
188 | break | ||
189 | fi | ||
190 | fi | ||
191 | fi | ||
192 | done | ||
193 | |||
194 | exit ${RETVAL} |