Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3097 - (hide 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 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}