- implement product handling using buddy packages
[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 # this should 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
28 dir="$1"
29 cd "$dir" || exit 1
30 if test -d repodata; then
31   cd repodata || exit 2
32
33   # This contains a primary.xml* and maybe patches
34   for i in primary.xml*; do
35     case $i in
36       *.gz) cmd="gzip -dc" ;;
37       *.bz2) cmd="bzip2 -dc" ;;
38       *) cmd="cat" ;;
39     esac
40     # only check the first primary.xml*, in case there are more
41     break
42   done
43   primfile="/nonexist"
44   if test -n "$cmd"; then
45     # we have some primary.xml*
46     primfile=`mktemp` || exit 3
47     $cmd $i | rpmmd2solv $parser_options > $primfile || exit 4
48   fi
49
50   prodfile="/nonexist"
51   if test -f product.xml; then
52     prodfile=`mktemp` || exit 3
53     (
54      echo '<products>'
55      for i in product*.xml*; do
56        case $i in
57          *.gz) gzip -dc "$i" ;;
58          *.bz2) bzip2 -dc "$i" ;;
59          *) cat "$i" ;;
60        esac
61      done
62      echo '</products>'
63     ) | grep -v '\?xml' | rpmmd2solv $parser_options > $prodfile || exit 4
64   fi
65
66
67   # This contains repomd.xml
68   # for now we only read some keys like expiration
69   if test -f repomd.xml || test -f repomd.xml.gz || test -f repomd.xml.bz2 ; then
70       for i in repomd.xml*; do
71           case $i in
72               *.gz) cmd="gzip -dc" ;;
73               *.bz2) cmd="bzip2 -dc" ;;
74               *) cmd="cat" ;;
75           esac
76           # only check the first repomd.xml*, in case there are more
77           break
78       done
79
80       repomdfile="/nonexist"
81       if test -n "$cmd"; then
82       # we have some repomd.xml*
83           repomdfile=`mktemp` || exit 3
84           $cmd $i | repomdxml2solv $parser_options > $repomdfile || exit 4
85       fi
86   fi
87
88   # This contains a updateinfo.xml* and maybe patches
89   if test -f updateinfo.xml || test -f updateinfo.xml.gz || test -f updateinfo.xml.bz2 ; then
90       for i in updateinfo.xml*; do
91           case $i in
92               *.gz) cmd="gzip -dc" ;;
93               *.bz2) cmd="bzip2 -dc" ;;
94               *) cmd="cat" ;;
95           esac
96           # only check the first updateinfo.xml*, in case there are more
97           break
98       done
99       updateinfofile="/nonexist"
100       if test -n "$cmd"; then
101       # we have some updateinfo.xml*
102           updateinfofile=`mktemp` || exit 3
103           $cmd $i | updateinfoxml2solv $parser_options > $updateinfofile || exit 4
104       fi
105   fi
106
107   patchfile="/nonexist"
108   if test -f patches.xml; then
109     patchfile=`mktemp` || exit 3
110     (
111      echo '<patches>'
112      for i in patch-*.xml*; do
113        case $i in
114          *.gz) gzip -dc "$i" ;;
115          *.bz2) bzip2 -dc "$i" ;;
116          *) cat "$i" ;;
117        esac
118      done
119      echo '</patches>'
120     ) | grep -v '\?xml' | patchxml2solv $parser_options > $patchfile || exit 4
121   fi
122
123   # This contains a deltainfo.xml*
124   if test -f deltainfo.xml || test -f deltainfo.xml.gz || test -f deltainfo.xml.bz2 ; then
125       for i in deltainfo.xml*; do
126           case $i in
127               *.gz) cmd="gzip -dc" ;;
128               *.bz2) cmd="bzip2 -dc" ;;
129               *) cmd="cat" ;;
130           esac
131           # only check the first deltainfo.xml*, in case there are more
132           break
133       done
134       deltainfofile="/nonexist"
135       if test -n "$cmd"; then
136       # we have some deltainfo.xml*
137           deltainfofile=`mktemp` || exit 3
138           $cmd $i | deltainfoxml2solv $parser_options > $deltainfofile || exit 4
139       fi
140   fi
141
142   # Now merge primary, patches, updateinfo, and deltainfo
143   if test -s $repomdfile; then
144     m_repomdfile=$repomdfile
145   fi
146   if test -s $primfile; then
147     m_primfile=$primfile
148   fi
149   if test -s $prodfile; then
150     m_prodfile=$prodfile
151   fi
152   if test -s $patchfile; then
153     m_patchfile=$patchfile
154   fi
155   if test -s $updateinfofile; then
156     m_updateinfofile=$updateinfofile
157   fi
158   if test -s $deltainfofile; then
159     m_deltainfofile=$deltainfofile
160   fi
161   mergesolv $m_repomdfile $m_primfile $m_prodfile $m_patchfile $m_updateinfofile $m_deltainfofile
162   rm -f $repomdfile $primfile $prodfile $patchfile $updateinfofile $deltainfofile
163
164 elif test_susetags; then
165   olddir=`pwd`
166   DESCR=`grep DESCRDIR content | cut -d ' ' -f 2`
167   if test -z $DESCR; then
168     DESCR=suse/setup/descr
169   fi
170   cd ${DESCR} || exit 2
171   (
172     # First packages
173     if test -s packages.gz; then
174       gzip -dc packages.gz
175     elif test -s packages.bz2; then
176       bzip2 -dc packages.bz2
177     elif test -s packages; then
178       cat packages
179     fi
180
181     # DU
182     if test -s packages.DU.gz; then
183       gzip -dc packages.DU.gz
184     elif test -s packages.DU.bz2; then
185       bzip2 -dc packages.DU.bz2
186     elif test -s packages.DU; then
187       cat packages.DU
188     fi
189
190     # Now default language
191     if test -s packages.en.gz; then
192       gzip -dc packages.en.gz
193     elif test -s packages.en.bz2; then
194       bzip2 -dc packages.en.bz2
195     elif test -s packages.en; then
196       cat packages.en
197     fi
198
199     # Now patterns.  Not simply those files matching *.pat{,.gz,bz2},
200     # but only those mentioned in the file 'patterns'
201     if test -f patterns; then
202       for i in `cat patterns`; do
203         test -s "$i" || continue
204         case $i in
205           *.gz) gzip -dc "$i" ;;
206           *.bz2) bzip2 -dc "$i" ;;
207           *) cat "$i" ;;
208         esac
209       done
210     fi
211
212     # Now all other packages.{lang}.  Needs to come last as it switches
213     # languages for all following susetags files
214     for i in packages.*; do
215       case $i in
216         *.gz) name="${i%.gz}" ; prog="gzip -dc" ;;
217         *.bz2) name="${i%.bz2}" ; prog="bzip2 -dc" ;;
218         *) name="$i"; prog=cat ;;
219       esac
220       case $name in
221         # ignore files we handled already
222         *.DU | *.en | *.FL | packages ) continue ;;
223         *) 
224           suff=${name#packages.}
225           echo "=Lan: $suff"
226           eval "$prog '$i'" ;;
227       esac
228     done
229
230   ) | susetags2solv -c "${olddir}/content" $parser_options || exit 4
231   cd "$olddir"
232 else
233   rpms=''
234   for r in *.rpm ; do
235     rpms="$rpms$r
236 "
237   done
238   if test -n "$rpms" ; then
239       echo "$rpms" | rpms2solv -m -
240   else
241       exit 1
242   fi
243 fi