# give it a directory of a local mirror of a repo and this
# tries to detect the repo type and generate one SOLV file on stdout
+test_susetags() {
+ if test -s content; then
+ DESCR=`grep DESCRDIR content | cut -d ' ' -f 2`
+ if test -z $DESCR; then
+ DESCR=suse/setup/descr
+ fi
+ test -d $DESCR
+ return $?
+ else
+ return 1
+ fi
+}
+
+# signal an error if there is a problem
+set -e
+
LANG=C
+unset CDPATH
+parser_options=${PARSER_OPTIONS:-}
+
+if test "$1" = "-o" ; then
+ exec > "$2"
+ shift
+ shift
+fi
dir="$1"
cd "$dir" || exit 1
-if test -d repodata; then
+if test -d repodata ; then
cd repodata || exit 2
- # This contains a primary.xml* and maybe patches
- for i in primary.xml*; do
+ primfile="/nonexist"
+ if test -f primary.xml || test -f primary.xml.gz || test -f primary.xml.bz2 ; then
+ primfile=`mktemp` || exit 3
+ (
+ # fake tag to combine primary.xml and extensions
+ # like susedata.xml, other.xml, filelists.xml
+ echo '<rpmmd>'
+ for i in primary.xml* susedata.xml*; do
+ test -s "$i" || continue
+ case $i in
+ *.gz) gzip -dc "$i";;
+ *.bz2) bzip2 -dc "$i";;
+ *) cat "$i";;
+ esac
+ # add a newline
+ echo
+ # only the first
+ break
+ done
+ for i in susedata.xml*; do
+ test -s "$i" || continue
+ case $i in
+ *.gz) gzip -dc "$i";;
+ *.bz2) bzip2 -dc "$i";;
+ *) cat "$i";;
+ esac
+ # only the first
+ break
+ done
+ echo '</rpmmd>'
+ ) | grep -v '\?xml' | sed '1i\<?xml version="1.0" encoding="UTF-8"?>' | rpmmd2solv $parser_options > $primfile || exit 4
+ fi
+
+ prodfile="/nonexist"
+ if test -f product.xml; then
+ prodfile=`mktemp` || exit 3
+ (
+ echo '<products>'
+ for i in product*.xml*; do
+ case $i in
+ *.gz) gzip -dc "$i" ;;
+ *.bz2) bzip2 -dc "$i" ;;
+ *) cat "$i" ;;
+ esac
+ done
+ echo '</products>'
+ ) | grep -v '\?xml' | rpmmd2solv $parser_options > $prodfile || exit 4
+ fi
+
+ cmd=
+ patternfile="/nonexist"
+ for i in patterns.xml*; do
+ test -s "$i" || continue
case $i in
- *.gz) cmd="gzip -dc" ;;
- *.bz2) cmd="bzip2 -dc" ;;
- *) cmd="cat" ;;
+ *.gz) cmd='gzip -dc' ;;
+ *.bz2) cmd='bzip2 -dc' ;;
+ *) cmd='cat' ;;
esac
- # only check the first primary.xml*, in case there are more
break
done
- primfile="/nonexist"
+ if test -n "$cmd" ; then
+ patternfile=`mktemp` || exit 3
+ $cmd "$i" | rpmmd2solv $parser_options > $patternfile || exit 4
+ fi
+
+ # This contains repomd.xml
+ # for now we only read some keys like timestamp
+ cmd=
+ for i in repomd.xml*; do
+ test -s "$i" || continue
+ case $i in
+ *.gz) cmd="gzip -dc" ;;
+ *.bz2) cmd="bzip2 -dc" ;;
+ *) cmd="cat" ;;
+ esac
+ # only check the first repomd.xml*, in case there are more
+ break
+ done
+ repomdfile="/nonexist"
if test -n "$cmd"; then
- # we have some primary.xml*
- primfile=`mktemp` || exit 3
- $cmd $i | rpmmd2solv > $primfile
+ # we have some repomd.xml*
+ repomdfile=`mktemp` || exit 3
+ $cmd "$i" | repomdxml2solv $parser_options > $repomdfile || exit 4
+ fi
+
+ # This contains suseinfo.xml, which is extensions to repomd.xml
+ # for now we only read some keys like expiration and products
+ cmd=
+ for i in suseinfo.xml*; do
+ test -s "$i" || continue
+ case $i in
+ *.gz) cmd="gzip -dc" ;;
+ *.bz2) cmd="bzip2 -dc" ;;
+ *) cmd="cat" ;;
+ esac
+ # only check the first suseinfo.xml*, in case there are more
+ break
+ done
+ suseinfofile="/nonexist"
+ if test -n "$cmd"; then
+ # we have some suseinfo.xml*
+ suseinfofile=`mktemp` || exit 3
+ $cmd "$i" | repomdxml2solv $parser_options > $suseinfofile || exit 4
+ fi
+
+ # This contains a updateinfo.xml* and maybe patches
+ cmd=
+ for i in updateinfo.xml*; do
+ test -s "$i" || continue
+ case $i in
+ *.gz) cmd="gzip -dc" ;;
+ *.bz2) cmd="bzip2 -dc" ;;
+ *) cmd="cat" ;;
+ esac
+ # only check the first updateinfo.xml*, in case there are more
+ break
+ done
+ updateinfofile="/nonexist"
+ if test -n "$cmd"; then
+ # we have some updateinfo.xml*
+ updateinfofile=`mktemp` || exit 3
+ $cmd "$i" | updateinfoxml2solv $parser_options > $updateinfofile || exit 4
fi
patchfile="/nonexist"
esac
done
echo '</patches>'
- ) | grep -v '\?xml' | patchxml2solv > $patchfile
+ ) | grep -v '\?xml' | patchxml2solv $parser_options > $patchfile || exit 4
fi
- # Now merge primary and patches
- if test -s $primfile && test -s $patchfile; then
- mergesolv $primfile $patchfile
- elif test -s $primfile; then
- cat $primfile
- elif test -s $patchfile; then
- cat $patchfile
+ # This contains a deltainfo.xml*
+ cmd=
+ for i in deltainfo.xml*; do
+ test -s "$i" || continue
+ case $i in
+ *.gz) cmd="gzip -dc" ;;
+ *.bz2) cmd="bzip2 -dc" ;;
+ *) cmd="cat" ;;
+ esac
+ # only check the first deltainfo.xml*, in case there are more
+ break
+ done
+ deltainfofile="/nonexist"
+ if test -n "$cmd"; then
+ # we have some deltainfo.xml*
+ deltainfofile=`mktemp` || exit 3
+ $cmd "$i" | deltainfoxml2solv $parser_options > $deltainfofile || exit 4
+ fi
+
+ # Now merge primary, patches, updateinfo, and deltainfo
+ if test -s $repomdfile; then
+ m_repomdfile=$repomdfile
+ fi
+ if test -s $suseinfofile; then
+ m_suseinfofile=$suseinfofile
+ fi
+ if test -s $primfile; then
+ m_primfile=$primfile
fi
- rm -f $primfile $patchfile
-elif test -d suse/setup/descr && test -s content; then
+ if test -s $patternfile; then
+ m_patternfile=$patternfile
+ fi
+ if test -s $prodfile; then
+ m_prodfile=$prodfile
+ fi
+ if test -s $patchfile; then
+ m_patchfile=$patchfile
+ fi
+ if test -s $updateinfofile; then
+ m_updateinfofile=$updateinfofile
+ fi
+ if test -s $deltainfofile; then
+ m_deltainfofile=$deltainfofile
+ fi
+ mergesolv $m_repomdfile $m_suseinfofile $m_primfile $m_prodfile $m_patternfile $m_patchfile $m_updateinfofile $m_deltainfofile
+ rm -f $repomdfile $suseinfofile $primfile $patternfile $prodfile $patchfile $updateinfofile $deltainfofile
+
+elif test_susetags; then
olddir=`pwd`
- cd suse/setup/descr || exit 2
- filepack=`mktemp` || exit 3
- filecont=`mktemp` || exit 3
+ DESCR=`grep DESCRDIR content | cut -d ' ' -f 2`
+ if test -z $DESCR; then
+ DESCR=suse/setup/descr
+ fi
+ cd ${DESCR} || exit 2
(
# First packages
if test -s packages.gz; then
cat packages
fi
- # XXX need to do something with packages.DU and packages.{lang}
+ # DU
+ if test -s packages.DU.gz; then
+ gzip -dc packages.DU.gz
+ elif test -s packages.DU.bz2; then
+ bzip2 -dc packages.DU.bz2
+ elif test -s packages.DU; then
+ cat packages.DU
+ fi
+
+ # Now default language
+ if test -s packages.en.gz; then
+ gzip -dc packages.en.gz
+ elif test -s packages.en.bz2; then
+ bzip2 -dc packages.en.bz2
+ elif test -s packages.en; then
+ cat packages.en
+ fi
# Now patterns. Not simply those files matching *.pat{,.gz,bz2},
# but only those mentioned in the file 'patterns'
esac
done
fi
- ) | susetags2solv > $filepack
+
+ # Now all other packages.{lang}. Needs to come last as it switches
+ # languages for all following susetags files
+ for i in packages.*; do
+ case $i in
+ *.gz) name="${i%.gz}" ; prog="gzip -dc" ;;
+ *.bz2) name="${i%.bz2}" ; prog="bzip2 -dc" ;;
+ *) name="$i"; prog=cat ;;
+ esac
+ case $name in
+ # ignore files we handled already
+ *.DU | *.en | *.FL | packages ) continue ;;
+ *)
+ suff=${name#packages.}
+ echo "=Lan: $suff"
+ $prog "$i" ;;
+ esac
+ done
+
+ ) | susetags2solv -c "${olddir}/content" $parser_options || exit 4
cd "$olddir"
- content2solv < content > $filecont
- mergesolv $filecont $filepack
- rm -f $filepack $filecont
+else
+ rpms=''
+ for r in *.rpm ; do
+ test -e "$r" || continue
+ rpms="$rpms
+$r"
+ done
+ if test -n "$rpms" ; then
+ echo "${rpms#?}" | rpms2solv -m -
+ else
+ exit 1
+ fi
fi