- initial import of revision 374 from cnc
[apt.git] / contrib / apt-groupinstall / groupinstall-backend-suse
1 #!/bin/sh\r
2 ##################################################################\r
3 #\r
4 # Copyright (C) 2004 R Bos\r
5 #\r
6 # File:           $RCSfile: groupinstall-backend-suse,v $\r
7 # Revision:       $Revision: 1.7 $\r
8 # Last change:    $Date: 2004/08/18 19:07:42 $\r
9 #\r
10 # Send suggestions to: apt4rpm-devel@lists.sourceforge.net\r
11 # Homepage: http://apt4rpm.sourceforge.net\r
12 #\r
13 # This program is free software; you can redistribute it and/or\r
14 # modify it under the terms of the GNU General Public License\r
15 # as published by the Free Software Foundation; either version 2\r
16 # of the License, or (at your option) any later version.\r
17 #\r
18 # This program is distributed in the hope that it will be useful,\r
19 # but WITHOUT ANY WARRANTY; without even the implied warranty of\r
20 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
21 # GNU General Public License for more details.\r
22 #\r
23 # For a copy of the GNU General Public License, visit\r
24 # http://www.gnu.org or write to the Free Software Foundation, Inc.,\r
25 # 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\r
26 #\r
27 ##################################################################\r
28 \r
29 # This backend is to be used with apt.  The latter must be configured\r
30 # for the apt options: groupnames, showgroup, groupinstall and groupremove.\r
31 PATH=/bin:/usr/bin\r
32 \r
33 PRGNAME=$(basename $0)\r
34 \r
35 function get_summary\r
36 {\r
37         FILE=$SEL_LOC/$1.sel\r
38         if [ -r $FILE ]; then\r
39                 grep "^=Sum:" $SEL_LOC/$1.sel | cut -d: -f2 | sed 's,^ ,,'\r
40         fi\r
41 }\r
42 \r
43 function get_req\r
44 {\r
45         FILE=$SEL_LOC/$1.sel\r
46         if [ -r $FILE ]; then\r
47                 awk '{\r
48                         if ( $1 == "-Req:" ) prt = "no"\r
49                         if ( prt == "yes" ) print $1\r
50                         if ( $1 == "+Req:" ) prt = "yes"\r
51 \r
52                 }' $FILE\r
53         fi\r
54 }\r
55 \r
56 function get_rec\r
57 {\r
58         FILE=$SEL_LOC/$1.sel\r
59         if [ -r $FILE ]; then\r
60                 awk '{\r
61                         if ( $1 == "-Rec:" ) prt = "no"\r
62                         if ( prt == "yes" ) print $1\r
63                         if ( $1 == "+Rec:" ) prt = "yes"\r
64 \r
65                 }' $FILE\r
66         fi\r
67 }\r
68 \r
69 function get_req_and_rec\r
70 {\r
71         local GRP\r
72 \r
73         for GRP in $@; do\r
74                 FILE=$SEL_LOC/$GRP.sel\r
75                 if [ -r $FILE ]; then\r
76                         awk '{\r
77                                 if ( $1 == "-Req:" || $1 == "-Rec:" ) prt = "no"\r
78                                 if ( prt == "yes" ) print $1\r
79                                 if ( $1 == "+Req:" || $1 == "+Rec:" ) prt = "yes"\r
80 \r
81                         }' $FILE\r
82                 fi\r
83         done\r
84 }\r
85 \r
86 function get_lang\r
87 {\r
88         FILE=$SEL_LOC/$1.sel\r
89         if [ -r $FILE ]; then\r
90                 grep "^+Ins." $FILE | sed s,+Ins.,, | cut -d: -f1\r
91         fi\r
92 }\r
93 \r
94 function get_pkgs\r
95 {\r
96         local GRP\r
97 \r
98         for GRP in $@; do\r
99                 FILE=$SEL_LOC/$GRP.sel\r
100                 if [ -r $FILE ]; then\r
101                         awk '{\r
102                                 if ( $1 == "-Ins:" ) prt = "no"\r
103                                 if ( prt == "yes" ) print $1\r
104                                 if ( $1 == "+Ins:" ) prt = "yes"\r
105 \r
106                         }' $FILE\r
107                 fi\r
108         done\r
109 }\r
110 \r
111 function groupnames\r
112 {\r
113         # Install location.  Selections that have been installed\r
114         # are copied to this location.\r
115         local INSTALL_LOC=/var/adm/YaST/SelDB\r
116 \r
117         if [[ "$OPT_SHOWHIDDEN" == "yes" ]]; then\r
118                 GRPS=$(ls $SEL_LOC/*sel)\r
119         else\r
120                 GRPS=$(grep -l "=Vis: *true" $(grep -l "=Cat: *addon" $SEL_LOC/*sel))\r
121         fi\r
122 \r
123         GRPS=$(echo "$GRPS" | sed 's,^.*/,,;s,\.sel$,,')\r
124 \r
125         if [[ "$OPT_TERM_MODE" == "yes" ]]; then\r
126                 printf "%-18s %s\n" "Group name"  "Description"\r
127                 printf "%-18s %s\n" "-----------" "------------"\r
128         fi\r
129 \r
130         for GRP in $GRPS; do\r
131                 SUMMARY=$(get_summary $GRP)\r
132                 if [[ "$OPT_TERM_MODE" == "yes" ]]; then\r
133                         printf "%-18s %s\n" "$GRP" "$SUMMARY"\r
134                 else\r
135                         # IMODE = installation mode\r
136                         # i = installed, u = uninstalled\r
137                         if [[ -s $INSTALL_LOC/$GRP.sel ]]; then\r
138                                 IMODE="i"\r
139                         else\r
140                                 IMODE="u"\r
141                         fi\r
142 \r
143                         printf "%s %s\t%s\n" "$IMODE" "$GRP" "$SUMMARY"\r
144                 fi\r
145         done\r
146 }\r
147 \r
148 function showgroup\r
149 {\r
150         typeset -i NUM\r
151         GRPS=$@\r
152 \r
153         local GRP\r
154         typeset -i NUM\r
155 \r
156         NUM=1\r
157         for GRP in $GRPS; do\r
158                 [ $NUM -gt 1 ] && echo\r
159                 echo "Group: $GRP"\r
160                 echo "Summary: $(get_summary $GRP)"\r
161                 LANGS="$(get_lang $GRP)"\r
162                 if [[ -n "$LANGS" ]]; then\r
163                         echo "Available languages:"\r
164                         echo "  " $LANGS\r
165                 fi\r
166                 REQ=$(get_req $GRP)\r
167                 if [[ -n "$REQ" ]]; then\r
168                         echo "Required groups:"\r
169                         echo "$REQ" | sed 's/^/  /'\r
170                 fi\r
171                 REC=$(get_rec $GRP)\r
172                 if [[ -n "$REC" ]]; then\r
173                         echo "Recommendend groups:"\r
174                         echo "$REC" | sed 's/^/  /'\r
175                 fi\r
176                 echo "Packages:" \r
177                 get_pkgs $GRP | sed 's/^/  /'\r
178 \r
179                 NUM=$((NUM + 1))\r
180         done\r
181 }\r
182 \r
183 function involved_groups\r
184 {\r
185         ALL_GRPS="$@"\r
186         REQUIRED_GRPS="$(get_req_and_rec $ALL_GRPS)"\r
187 \r
188         ALL_GRPS="$ALL_GRPS $REQUIRED_GRPS"\r
189 \r
190         # Use a recursive method to find all involved groups.\r
191         # NUM is used to prevent a runaway loop.  Normally the most\r
192         # extensive dependencies are resolved in 5 iterations.\r
193         typeset -i NUM=1\r
194         while [[ -n "$REQUIRED_GRPS" && $NUM -lt 7 ]]; do\r
195 \r
196                 unset LOOP_REQS\r
197                 for GRP in $REQUIRED_GRPS; do\r
198                         if [[ -z "$LOOP_REQS" ]]; then\r
199                                 LOOP_REQS="$(get_req_and_rec $GRP)"\r
200                         else\r
201                                 LOOP_REQS="$LOOP_REQS $(get_req_and_rec $GRP)"\r
202                         fi\r
203                 done\r
204 \r
205                 ALL_GRPS="$ALL_GRPS $LOOP_REQS"\r
206                 REQUIRED_GRPS="$LOOP_REQS"\r
207 \r
208                 NUM=$(($NUM + 1))\r
209         done\r
210 \r
211         echo $ALL_GRPS | tr " " "\n" | sort -u\r
212 }\r
213 \r
214 OPT_TERM_MODE=no\r
215 \r
216 while [[ $# -gt 0 ]]; do\r
217 \r
218         case $1 in\r
219         -h)\r
220                 OPT_SHOWHIDDEN=yes\r
221                 ;;\r
222         --list-tasks)\r
223                 cmd=groupnames \r
224                 ;;\r
225         --task-desc)\r
226                 cmd=showgroup\r
227                 OPT_GRPS="$OPT_GRPS $2"\r
228                 shift\r
229                 ;;\r
230         --task-packages)\r
231                 cmd=grouppkgs\r
232                 OPT_GRPS="$OPT_GRPS $2"\r
233                 shift\r
234                 ;;\r
235         -t)\r
236                 OPT_TERM_MODE=yes\r
237                 ;;\r
238         -r|-a|-p)\r
239                 echo "Not supported argument: $1" >&2\r
240                 ;;\r
241         *)\r
242                 echo "Incorrect argument: $1" >&2\r
243                 exit 1\r
244                 ;;\r
245         esac\r
246 \r
247         shift\r
248 done\r
249 \r
250 # Find the first populated selection directory\r
251 # Some more information about the *.sel files directory can be found in \r
252 # the suse package: yast2-packagemanager.\r
253 # The file is src/inst/InstSrcManager.cc\r
254 for DIR in $(ls -d /var/adm/YaST/InstSrcManager/IS_CACHE_0x000000??); do\r
255         if ls -l $DIR/DATA/descr/*.sel >/dev/null 2>&1; then\r
256                 SEL_LOC=$DIR/DATA/descr\r
257                 break\r
258         fi\r
259 done\r
260 \r
261 if [[ -z "$SEL_LOC" ]]; then\r
262         echo "$PRGNAME: no selection files found" >&2\r
263         exit 2\r
264 fi\r
265 \r
266 case $cmd in\r
267 \r
268         groupnames)\r
269                 groupnames\r
270                 ;;\r
271 \r
272         showgroup)\r
273                 showgroup $OPT_GRPS\r
274                 ;;\r
275 \r
276         grouppkgs)\r
277                 get_pkgs $(involved_groups $OPT_GRPS)\r
278                 ;;\r
279 esac\r
280 \r
281 \r