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