summaryrefslogtreecommitdiff
path: root/examples/repo2solv.sh
diff options
context:
space:
mode:
Diffstat (limited to 'examples/repo2solv.sh')
-rwxr-xr-xexamples/repo2solv.sh303
1 files changed, 303 insertions, 0 deletions
diff --git a/examples/repo2solv.sh b/examples/repo2solv.sh
new file mode 100755
index 0000000..450b7fa
--- /dev/null
+++ b/examples/repo2solv.sh
@@ -0,0 +1,303 @@
+#! /bin/sh
+# repo2solv
+#
+# this is a shell implementation of repo2solv that makes use of
+# the different parser utilities
+#
+# 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
+
+get_DESCRDIR () {
+ local d=$(grep '^DESCRDIR' content | sed 's/^DESCRDIR[[:space:]]\+\(.*[^[:space:]]\)[[:space:]]*$/\1/')
+ if test -z "$d"; then
+ echo suse/setup/descr
+ else
+ echo ${d}
+ fi
+}
+
+test_susetags() {
+ if test -s content; then
+ DESCR=$(get_DESCRDIR)
+ test -d $DESCR
+ return $?
+ else
+ return 1
+ fi
+}
+
+repomd_findfile() {
+ local t=$1
+ local p=$2
+ local f
+ if test -n "$t" -a -s repomd.xml ; then
+ f=`repomdxml2solv -q "$t:location" < repomd.xml 2>/dev/null`
+ f=${f##*/}
+ if test -f "$f" ; then
+ echo "$f"
+ return
+ fi
+ fi
+ if test -f "$p.bz2" ; then
+ echo "$p.bz2"
+ elif test -f "$p.gz" ; then
+ echo "$p.gz"
+ elif test -f "$p" ; then
+ echo "$p"
+ fi
+}
+
+repomd_types() {
+ test -s repomd.xml && repomdxml2solv -q type < repomd.xml
+}
+
+repomd_decompress() {
+ case $1 in
+ *.gz) gzip -dc "$1" ;;
+ *.bz2) bzip2 -dc "$1" ;;
+ *.lzma) lzma -dc "$1" ;;
+ *.xz) xz -dc "$1" ;;
+ *) cat "$1" ;;
+ esac
+}
+
+susetags_findfile() {
+ if test -s "$1.xz" ; then
+ echo "$1.xz"
+ elif test -s "$1.lzma" ; then
+ echo "$1.lzma"
+ elif test -s "$1.bz2" ; then
+ echo "$1.bz2"
+ elif test -s "$1.gz" ; then
+ echo "$1.gz"
+ fi
+}
+
+susetags_findfile_cat() {
+ if test -s "$1.xz" ; then
+ xz -dc "$1.xz"
+ elif test -s "$1.lzma" ; then
+ lzma -dc "$1.lzma"
+ elif test -s "$1.bz2" ; then
+ bzip2 -dc "$1.bz2"
+ elif test -s "$1.gz" ; then
+ gzip -dc "$1.gz"
+ elif test -s "$1" ; then
+ cat "$1"
+ fi
+}
+
+# signal an error if there is a problem
+set -e
+
+LANG=C
+unset CDPATH
+parser_options=${PARSER_OPTIONS:-}
+
+findopt="-prune"
+repotype=
+addautooption=
+
+while true ; do
+ if test "$1" = "-o" ; then
+ exec > "$2"
+ shift
+ shift
+ elif test "$1" = "-R" ; then
+ # recursive
+ findopt=
+ repotype=plaindir
+ shift
+ elif test "$1" = "-X" ; then
+ addautooption=-X
+ shift
+ elif test "$1" = "-A" ; then
+ shift
+ else
+ break
+ fi
+done
+
+dir="$1"
+cd "$dir" || exit 1
+
+if test -z "$repotype" ; then
+ # autodetect repository type
+ if test -d repodata -o -f repomd.xml; then
+ repotype=rpmmd
+ elif test_susetags ; then
+ repotype=susetags
+ else
+ repotype=plaindir
+ fi
+fi
+
+if test "$repotype" = rpmmd ; then
+ test -d repodata && {
+ cd repodata || exit 2
+ }
+
+ primfile=
+ primxml=`repomd_findfile primary primary.xml`
+ if test -n "$primxml" -a -s "$primxml" ; then
+ primfile=`mktemp` || exit 3
+ (
+ # fake tag to combine primary.xml and extensions
+ # like susedata.xml, other.xml, filelists.xml
+ echo '<rpmmd>'
+ if test -f $primxml ; then
+ repomd_decompress $primxml
+ # add a newline
+ echo
+ fi
+ susedataxml=`repomd_findfile susedata susedata.xml`
+ if test -f "$susedataxml" ; then
+ repomd_decompress "$susedataxml"
+ fi
+ # all the languages as well
+ for t in `repomd_types` ; do
+ case "$t" in
+ susedata.*)
+ susedataxml=`repomd_findfile "$t" "$t.xml"`
+ if test -f "$susedataxml" ; then
+ repomd_decompress "$susedataxml"
+ fi
+ ;;
+ esac
+ done
+ echo '</rpmmd>'
+ ) | sed 's/<?xml[^>]*>//g' | sed '1i\<?xml version="1.0" encoding="UTF-8"?>' | rpmmd2solv $parser_options > $primfile || exit 4
+ fi
+
+ prodfile=
+ prodxml=`repomd_findfile products products.xml`
+ if test -z "$prodxml" ; then
+ prodxml=`repomd_findfile product product.xml`
+ fi
+ if test -n "$prodxml" -a -s "$prodxml" ; then
+ prodfile=`mktemp` || exit 3
+ repomd_decompress "$prodxml" | rpmmd2solv $parser_options > $prodfile || exit 4
+ fi
+
+ patternfile=
+ patternxml=`repomd_findfile 'patterns' patterns.xml`
+ if test -n "$patternxml" -a -s "$patternxml" ; then
+ patternfile=`mktemp` || exit 3
+ repomd_decompress "$patternxml" | rpmmd2solv $parser_options > $patternfile || exit 4
+ fi
+
+ # This contains repomd.xml
+ # for now we only read some keys like timestamp
+ repomdfile=
+ repomdxml=`repomd_findfile '' repomd.xml`
+ if test -n "$repomdxml" -a -s "$repomdxml" ; then
+ repomdfile=`mktemp` || exit 3
+ repomd_decompress "$repomdxml" | repomdxml2solv $parser_options > $repomdfile || exit 4
+ fi
+
+ # This contains suseinfo.xml, which is an extension to repomd.xml
+ # for now we only read some keys like expiration and products
+ suseinfofile=
+ suseinfoxml=`repomd_findfile suseinfo suseinfo.xml`
+ if test -n "$suseinfoxml" -a -s "$suseinfoxml" ; then
+ suseinfofile=`mktemp` || exit 3
+ repomd_decompress "$suseinfoxml" | repomdxml2solv $parser_options > $suseinfofile || exit 4
+ fi
+
+ # This contains a updateinfo.xml* and maybe patches
+ updateinfofile=
+ updateinfoxml=`repomd_findfile updateinfo updateinfo.xml`
+ if test -n "$updateinfoxml" -a -s "$updateinfoxml" ; then
+ updateinfofile=`mktemp` || exit 3
+ repomd_decompress "$updateinfoxml" | updateinfoxml2solv $parser_options > $updateinfofile || exit 4
+ fi
+
+ # This contains a deltainfo.xml*
+ deltainfofile=
+ deltainfoxml=`repomd_findfile deltainfo deltainfo.xml`
+ if test -z "$deltainfoxml"; then
+ deltainfoxml=`repomd_findfile prestodelta prestodelta.xml`
+ fi
+ if test -n "$deltainfoxml" -a -s "$deltainfoxml" ; then
+ deltainfofile=`mktemp` || exit 3
+ repomd_decompress "$deltainfoxml" | deltainfoxml2solv $parser_options > $deltainfofile || exit 4
+ fi
+
+ # This contains appdata
+ appdataxml=
+ appdatafile=
+ if test -x /usr/bin/appdata2solv ; then
+ appdataxml=`repomd_findfile appdata appdata.xml`
+ fi
+ if test -n "$appdataxml" -a -s "$appdataxml" ; then
+ appdatafile=`mktemp` || exit 3
+ repomd_decompress "$appdataxml" | appdata2solv $parser_options > $appdatafile || exit 4
+ fi
+
+ # Now merge primary, patches, updateinfo, and deltainfo
+ mergesolv $addautooption $repomdfile $suseinfofile $primfile $prodfile $patternfile $updateinfofile $deltainfofile $appdatafile
+ rm -f $repomdfile $suseinfofile $primfile $patternfile $prodfile $updateinfofile $deltainfofile $appdatafile
+
+elif test "$repotype" = susetags ; then
+ olddir=`pwd`
+ DESCR=$(get_DESCRDIR)
+ cd ${DESCR} || exit 2
+ appdataxml=
+ appdatafile=
+ if test -x /usr/bin/appdata2solv ; then
+ appdataxml=`susetags_findfile appdata.xml`
+ fi
+ if test -n "$appdataxml" ; then
+ appdatafile=`mktemp` || exit 3
+ repomd_decompress "$appdataxml" | appdata2solv $parser_options > $appdatafile || exit 4
+ parser_options="-M $appdatafile $parser_options"
+ fi
+ (
+ # First packages
+ susetags_findfile_cat packages
+
+ # DU
+ susetags_findfile_cat packages.DU
+
+ # Now default language
+ susetags_findfile_cat packages.en
+
+ # DL (delta rpms)
+ susetags_findfile_cat packages.DL
+
+ # Now patterns. Not simply those files matching *.pat{,.gz,bz2},
+ # but only those mentioned in the file 'patterns'
+ if test -f patterns ; then
+ for i in `cat patterns`; do
+ if test -s "$i" ; then
+ repomd_decompress "$i"
+ fi
+ done
+ fi
+
+ # 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|*.bz2|*.xz|*.lzma) name="${i%.*}" ;;
+ *) name="$i" ;;
+ esac
+ case $name in
+ # ignore files we handled already
+ *.DU | *.en | *.FL | *.DL | packages ) continue ;;
+ *)
+ suff=${name#packages.}
+ echo "=Lan: $suff"
+ repomd_decompress "$i"
+ esac
+ done
+
+ ) | susetags2solv $addautooption -c "${olddir}/content" $parser_options || exit 4
+ test -n "$appdatafile" && rm -f "$appdatafile"
+ cd "$olddir"
+elif test "$repotype" = plaindir ; then
+ find * -name .\* -prune -o $findopt -name \*.delta.rpm -o -name \*.patch.rpm -o -name \*.rpm -a -type f -print0 | rpms2solv $addautooption -0 -m -
+else
+ echo "unknown repository type '$repotype'" >&2
+ exit 1
+fi