diff -Nru net-retriever-1.18ubuntu4/Makefile net-retriever-1.18ubuntu5/Makefile --- net-retriever-1.18ubuntu4/Makefile 1970-01-01 01:00:00.000000000 +0100 +++ net-retriever-1.18ubuntu5/Makefile 2008-05-30 12:02:52.000000000 +0100 @@ -0,0 +1,7 @@ +CFLAGS := -Os -fomit-frame-pointer -g -Wall +LDFLAGS := -ldebian-installer + +all: vergt + +clean: + rm -f vergt diff -Nru net-retriever-1.18ubuntu4/debian/control net-retriever-1.18ubuntu5/debian/control --- net-retriever-1.18ubuntu4/debian/control 2007-12-11 15:58:29.000000000 +0000 +++ net-retriever-1.18ubuntu5/debian/control 2008-05-30 12:02:52.000000000 +0100 @@ -11,7 +11,7 @@ Package: net-retriever XC-Package-Type: udeb -Architecture: all +Architecture: any Depends: ${misc:Depends}, choose-mirror, configured-network, di-utils (>= 1.16), gpgv-udeb, ubuntu-keyring-udeb Provides: retriever Description: Fetch modules from the Internet diff -Nru net-retriever-1.18ubuntu4/debian/rules net-retriever-1.18ubuntu5/debian/rules --- net-retriever-1.18ubuntu4/debian/rules 2007-02-15 12:19:10.000000000 +0000 +++ net-retriever-1.18ubuntu5/debian/rules 2008-05-30 12:02:52.000000000 +0100 @@ -2,10 +2,12 @@ build: dh_testdir + $(MAKE) clean: dh_testdir dh_testroot + $(MAKE) clean dh_clean install: build @@ -14,10 +16,9 @@ dh_clean -k chmod +x net-retriever dh_install net-retriever usr/lib/debian-installer/retriever + dh_install vergt usr/lib/net-retriever binary-arch: build install - -binary-indep: build install dh_testdir dh_testroot dh_installdebconf @@ -29,5 +30,7 @@ dh_gencontrol dh_builddeb +binary-indep: build install + binary: binary-indep binary-arch .PHONY: build clean binary-indep binary-arch binary install diff -Nru net-retriever-1.18ubuntu4/net-retriever net-retriever-1.18ubuntu5/net-retriever --- net-retriever-1.18ubuntu4/net-retriever 2008-03-31 05:34:34.000000000 +0100 +++ net-retriever-1.18ubuntu5/net-retriever 2008-05-30 12:02:52.000000000 +0100 @@ -101,6 +101,44 @@ exit 1 } +# Nasty hack to remove duplicates in Packages file. +deduplicate () { + packages="$1" + outdir="/tmp/net-retriever-$$-deduplicate" + + mkdir -p "$outdir" + + while [ -s "$packages" ]; do + entry="$(sed '/^$/q' "$packages")" + package="$(echo "$entry" | sed -n 's/Package:[[:space:]][[:space:]]*//pI' | head -n 1)" + case $package in + ''|*/*) + continue + ;; + *) + if [ -f "$outdir/$package" ]; then + newver="$(echo "$entry" | sed -n 's/Version:[[:space:]][[:space:]]*//pI' | head -n 1)" + [ "$newver" ] || continue + oldver="$(sed -n 's/Version:[[:space:]][[:space:]]*//pI' "$outdir/$package" | head -n 1)" + if /usr/lib/net-retriever/vergt "$newver" "$oldver"; then + echo "$entry" > "$outdir/$package" + echo >> "$outdir/$package" + fi + else + echo "$entry" > "$outdir/$package" + echo >> "$outdir/$package" + fi + ;; + esac + sed -n '/^$/,$p' "$packages" | tail -n +2 > "$packages.new" + mv "$packages.new" "$packages" + done + + cat "$outdir"/* > "$packages.new" + mv "$packages.new" "$packages" + rm -rf "$outdir" +} + cmd="$1" shift @@ -143,6 +181,7 @@ else ret=$? if [ "$codename_extra" = "$codename" ]; then + deduplicate "$1" exit $ret else # ignore errors from secondary suites @@ -150,6 +189,7 @@ fi fi done + deduplicate "$1" exit 0 ;; diff -Nru net-retriever-1.18ubuntu4/vergt.c net-retriever-1.18ubuntu5/vergt.c --- net-retriever-1.18ubuntu4/vergt.c 1970-01-01 01:00:00.000000000 +0100 +++ net-retriever-1.18ubuntu5/vergt.c 2008-05-30 12:02:52.000000000 +0100 @@ -0,0 +1,40 @@ +#include +#include + +/* This program is a nasty hack around udpkg not having --compare-versions. + * Furthermore, doing this in net-retriever at all is a nasty hack around + * libdebian-installer not deduplicating Packages files. Don't even think + * about relying on this program ANYWHERE else. + */ +int main(int argc, char **argv) +{ + di_package dummyleft, dummyright; + di_package_version *left, *right; + + if (argc != 3) { + fprintf(stderr, "usage: vergt VER1 VER2\n"); + return 2; + } + + /* libdebian-installer has a crazy interface that won't let me parse + * raw strings, so I need this dance. + */ + dummyleft.version = argv[1]; + dummyright.version = argv[2]; + + left = di_package_version_parse(&dummyleft); + if (!left) { + fprintf(stderr, "failed to parse version %s\n", argv[1]); + return 2; + } + right = di_package_version_parse(&dummyright); + if (!right) { + fprintf(stderr, "failed to parse version %s\n", argv[2]); + return 2; + } + + if (di_package_version_compare(left, right) > 0) + return 0; + else + return 1; +}