- add two missing test statements
[platform/upstream/libsolv.git] / tools / repo2solv.sh
1 #! /bin/sh
2 # repo2solv
3 #
4 # give it a directory of a local mirror of a repo and this
5 # tries to detect the repo type and generate one SOLV file on stdout
6
7 test_susetags() {
8   if test -s content; then
9     DESCR=`grep DESCRDIR content | cut -d ' ' -f 2`
10     if test -z $DESCR; then
11       DESCR=suse/setup/descr
12     fi
13     test -d $DESCR
14     return $?
15   else
16     return 1
17   fi
18 }
19
20 # signal an error if there is a problem
21 set -e 
22
23 LANG=C
24 unset CDPATH
25 parser_options=${PARSER_OPTIONS:-}
26
27 if test "$1" = "-o" ; then
28   exec > "$2"
29   shift
30   shift
31 fi
32
33 dir="$1"
34 cd "$dir" || exit 1
35 if test -d repodata ; then
36   cd repodata || exit 2
37
38   primfile="/nonexist"
39   if test -f primary.xml || test -f primary.xml.gz || test -f primary.xml.bz2 ; then
40     primfile=`mktemp` || exit 3
41     (
42      # fake tag to combine primary.xml and extensions
43      # like susedata.xml, other.xml, filelists.xml
44      echo '<rpmmd>'
45      for i in primary.xml* susedata.xml*; do
46        test -s "$i" || continue
47        case $i in
48          *.gz) gzip -dc "$i";;
49          *.bz2) bzip2 -dc "$i";;
50          *) cat "$i";;
51        esac
52        # add a newline
53        echo
54        # only the first
55        break
56      done
57      for i in susedata.xml*; do
58        test -s "$i" || continue
59        case $i in
60          *.gz) gzip -dc "$i";;
61          *.bz2) bzip2 -dc "$i";;
62          *) cat "$i";;
63        esac
64        # only the first
65        break
66      done
67      echo '</rpmmd>'
68     ) | grep -v '\?xml' |  sed '1i\<?xml version="1.0" encoding="UTF-8"?>' | rpmmd2solv $parser_options > $primfile || exit 4
69   fi
70
71   prodfile="/nonexist"
72   if test -f product.xml; then
73     prodfile=`mktemp` || exit 3
74     (
75      echo '<products>'
76      for i in product*.xml*; do
77        case $i in
78          *.gz) gzip -dc "$i" ;;
79          *.bz2) bzip2 -dc "$i" ;;
80          *) cat "$i" ;;
81        esac
82      done
83      echo '</products>'
84     ) | grep -v '\?xml' | rpmmd2solv $parser_options > $prodfile || exit 4
85   fi
86
87   cmd=
88   patternfile="/nonexist"
89   for i in patterns.xml*; do
90     test -s "$i" || continue
91     case $i in
92       *.gz) cmd='gzip -dc' ;;
93       *.bz2) cmd='bzip2 -dc' ;;
94       *) cmd='cat' ;;
95     esac
96     break
97   done
98   if test -n "$cmd" ; then
99     patternfile=`mktemp` || exit 3
100     $cmd "$i" | rpmmd2solv $parser_options > $patternfile || exit 4
101   fi
102
103   # This contains repomd.xml
104   # for now we only read some keys like timestamp
105   cmd=
106   for i in repomd.xml*; do
107       test -s "$i" || continue
108       case $i in
109           *.gz) cmd="gzip -dc" ;;
110           *.bz2) cmd="bzip2 -dc" ;;
111           *) cmd="cat" ;;
112       esac
113       # only check the first repomd.xml*, in case there are more
114       break
115   done
116   repomdfile="/nonexist"
117   if test -n "$cmd"; then
118       # we have some repomd.xml*
119       repomdfile=`mktemp` || exit 3
120       $cmd "$i" | repomdxml2solv $parser_options > $repomdfile || exit 4
121   fi
122
123   # This contains suseinfo.xml, which is extensions to repomd.xml
124   # for now we only read some keys like expiration and products
125   cmd=
126   for i in suseinfo.xml*; do
127       test -s "$i" || continue
128       case $i in
129           *.gz) cmd="gzip -dc" ;;
130           *.bz2) cmd="bzip2 -dc" ;;
131           *) cmd="cat" ;;
132       esac
133       # only check the first suseinfo.xml*, in case there are more
134       break
135   done
136   suseinfofile="/nonexist"
137   if test -n "$cmd"; then
138       # we have some suseinfo.xml*
139       suseinfofile=`mktemp` || exit 3
140       $cmd "$i" | repomdxml2solv $parser_options > $suseinfofile || exit 4
141   fi
142
143   # This contains a updateinfo.xml* and maybe patches
144   cmd=
145   for i in updateinfo.xml*; do
146       test -s "$i" || continue
147       case $i in
148           *.gz) cmd="gzip -dc" ;;
149           *.bz2) cmd="bzip2 -dc" ;;
150           *) cmd="cat" ;;
151       esac
152       # only check the first updateinfo.xml*, in case there are more
153       break
154   done
155   updateinfofile="/nonexist"
156   if test -n "$cmd"; then
157       # we have some updateinfo.xml*
158       updateinfofile=`mktemp` || exit 3
159       $cmd "$i" | updateinfoxml2solv $parser_options > $updateinfofile || exit 4
160   fi
161
162   patchfile="/nonexist"
163   if test -f patches.xml; then
164     patchfile=`mktemp` || exit 3
165     (
166      echo '<patches>'
167      for i in patch-*.xml*; do
168        case $i in
169          *.gz) gzip -dc "$i" ;;
170          *.bz2) bzip2 -dc "$i" ;;
171          *) cat "$i" ;;
172        esac
173      done
174      echo '</patches>'
175     ) | grep -v '\?xml' | patchxml2solv $parser_options > $patchfile || exit 4
176   fi
177
178   # This contains a deltainfo.xml*
179   cmd=
180   for i in deltainfo.xml*; do
181       test -s "$i" || continue
182       case $i in
183           *.gz) cmd="gzip -dc" ;;
184           *.bz2) cmd="bzip2 -dc" ;;
185           *) cmd="cat" ;;
186       esac
187       # only check the first deltainfo.xml*, in case there are more
188       break
189   done
190   deltainfofile="/nonexist"
191   if test -n "$cmd"; then
192       # we have some deltainfo.xml*
193       deltainfofile=`mktemp` || exit 3
194       $cmd "$i" | deltainfoxml2solv $parser_options > $deltainfofile || exit 4
195   fi
196
197   # Now merge primary, patches, updateinfo, and deltainfo
198   if test -s $repomdfile; then
199     m_repomdfile=$repomdfile
200   fi
201   if test -s $suseinfofile; then
202     m_suseinfofile=$suseinfofile
203   fi
204   if test -s $primfile; then
205     m_primfile=$primfile
206   fi
207   if test -s $patternfile; then
208     m_patternfile=$patternfile
209   fi
210   if test -s $prodfile; then
211     m_prodfile=$prodfile
212   fi
213   if test -s $patchfile; then
214     m_patchfile=$patchfile
215   fi
216   if test -s $updateinfofile; then
217     m_updateinfofile=$updateinfofile
218   fi
219   if test -s $deltainfofile; then
220     m_deltainfofile=$deltainfofile
221   fi
222   mergesolv $m_repomdfile $m_suseinfofile $m_primfile $m_prodfile $m_patternfile $m_patchfile $m_updateinfofile $m_deltainfofile
223   rm -f $repomdfile $suseinfofile $primfile $patternfile $prodfile $patchfile $updateinfofile $deltainfofile
224
225 elif test_susetags; then
226   olddir=`pwd`
227   DESCR=`grep DESCRDIR content | cut -d ' ' -f 2`
228   if test -z $DESCR; then
229     DESCR=suse/setup/descr
230   fi
231   cd ${DESCR} || exit 2
232   (
233     # First packages
234     if test -s packages.gz; then
235       gzip -dc packages.gz
236     elif test -s packages.bz2; then
237       bzip2 -dc packages.bz2
238     elif test -s packages; then
239       cat packages
240     fi
241
242     # DU
243     if test -s packages.DU.gz; then
244       gzip -dc packages.DU.gz
245     elif test -s packages.DU.bz2; then
246       bzip2 -dc packages.DU.bz2
247     elif test -s packages.DU; then
248       cat packages.DU
249     fi
250
251     # Now default language
252     if test -s packages.en.gz; then
253       gzip -dc packages.en.gz
254     elif test -s packages.en.bz2; then
255       bzip2 -dc packages.en.bz2
256     elif test -s packages.en; then
257       cat packages.en
258     fi
259
260     # Now patterns.  Not simply those files matching *.pat{,.gz,bz2},
261     # but only those mentioned in the file 'patterns'
262     if test -f patterns; then
263       for i in `cat patterns`; do
264         test -s "$i" || continue
265         case $i in
266           *.gz) gzip -dc "$i" ;;
267           *.bz2) bzip2 -dc "$i" ;;
268           *) cat "$i" ;;
269         esac
270       done
271     fi
272
273     # Now all other packages.{lang}.  Needs to come last as it switches
274     # languages for all following susetags files
275     for i in packages.*; do
276       case $i in
277         *.gz) name="${i%.gz}" ; prog="gzip -dc" ;;
278         *.bz2) name="${i%.bz2}" ; prog="bzip2 -dc" ;;
279         *) name="$i"; prog=cat ;;
280       esac
281       case $name in
282         # ignore files we handled already
283         *.DU | *.en | *.FL | packages ) continue ;;
284         *) 
285           suff=${name#packages.}
286           echo "=Lan: $suff"
287           $prog "$i" ;;
288       esac
289     done
290
291   ) | susetags2solv -c "${olddir}/content" $parser_options || exit 4
292   cd "$olddir"
293 else
294   rpms=''
295   for r in *.rpm ; do
296     test -e "$r" || continue
297     rpms="$rpms
298 $r"
299   done
300   if test -n "$rpms" ; then
301       echo "${rpms#?}" | rpms2solv -m -
302   else
303       exit 1
304   fi
305 fi