[disco/master-next 1/2] UBUNTU: [Packaging] getabis -- handle all known package combinations

Andy Whitcroft apw at canonical.com
Tue Dec 4 21:32:01 UTC 2018


Traditionally we have tried to download all and any packages we can
find.  If we have any packages we just assume that what we got is a
consistent set and use it.  This leads to incomplete sets being
committed on network failure.

Firstly detect and differentiate transport errors and valid missing
packages.  Secondly switch to analysing known good package set
combinations; this relies on the presumption that the publisher
only publishes all or none of a binary package set.  This lets us
throw errors when we are unable to find an internally consistent
set of packages.

BugLink: http://bugs.launchpad.net/bugs/1806380
Signed-off-by: Andy Whitcroft <apw at canonical.com>
---
 debian/scripts/misc/getabis | 155 +++++++++++++++++++++---------------
 1 file changed, 91 insertions(+), 64 deletions(-)

diff --git a/debian/scripts/misc/getabis b/debian/scripts/misc/getabis
index 42690b0311e2..edba4b078867 100755
--- a/debian/scripts/misc/getabis
+++ b/debian/scripts/misc/getabis
@@ -28,7 +28,7 @@ fwinfo=$abidir/fwinfo
 test -d $tmpdir || mkdir $tmpdir
 
 package_prefixes() {
-	__package_prefixes="$@"
+	: # no longer used ...
 }
 
 getall() {
@@ -39,89 +39,118 @@ getall() {
 
 	for sub in $@; do
 		if [ -f $abidir/$arch/$sub ]; then
-			echo "Exists: $sub"
+			echo "Existing $sub($arch)..."
 			continue
 		fi
-		echo -n "Fetching $sub($arch)..."
-		prefixes=""
+		echo "Fetching $sub($arch)..."
+		getall_set "linux-buildinfo" "$arch" "$sub" || \
+		getall_set "linux-image-unsigned linux-modules linux-modules-extra" "$arch" "$sub" || \
+		getall_set "linux-image-unsigned linux-modules" "$arch" "$sub" || \
+		getall_set "linux-image linux-modules linux-modules-extra" "$arch" "$sub" || \
+		getall_set "linux-image linux-modules" "$arch" "$sub" || \
+		getall_set "linux-image linux-image-extra" "$arch" "$sub" || \
+		getall_set "linux-image" "$arch" "$sub" || \
+		{ echo "FAILED"; exit 1; }
+	done
+}
+getall_set()
+{
+	prefixes="$1"
+	arch="$2"
+	sub="$3"
+	(
+		echo -n "  set:"
 		filenames=""
 		cd $tmpdir
-		for prefix in $__package_prefixes
+		found=1
+		for prefix in $prefixes
 		do
+			echo -n " $prefix="
+			if [ "$found" = 0 ]; then
+				echo -n "-"
+				continue
+			fi
 			filename=${prefix}-${verabi}-${sub}_${verfull}_${arch}.deb
 			for r in "${repo_list[@]}"
 			do
 				if ! [ -f $filename ]; then
 					$WGET $r/$filename
+					rc="$?"
+					# If this was not successful or a valid error
+					# return from the server all bets are off, bail.
+					[ "$rc" != 0 -a "$rc" != 8 ] && return 1
 				fi
 				if [ -f $filename ]; then
-					prefixes="$prefixes $prefix"
+					echo -n "y"
 					filenames="$filenames $filename"
 					break
 				fi
 			done
+			if [ ! -f "$filename" ]; then
+				echo -n "n"
+				found=0
+			fi
 		done
-		if [ "$filenames" != "" ]; then
-			echo -n "extracting$prefixes..."
-			for filename in $filenames
-			do
-				dpkg-deb --extract $filename tmp
+		echo ""
+		if [ "$found" = 0 ]; then
+			return 1
+		fi
+		echo "  extracting..."
+		for filename in $filenames
+		do
+			dpkg-deb --extract $filename tmp
+		done
+		# FORM 1: linux-image et al extracted here.
+		if [ -d tmp/boot ]; then
+			echo "  images..."
+			find tmp -name "*.ko" | while read f; do
+				modinfo $f | grep ^firmware >> $fwinfo
 			done
-			# FORM 1: linux-image et al extracted here.
-			if [ -d tmp/boot ]; then
-				echo -n "images..."
-				find tmp -name "*.ko" | while read f; do
-					modinfo $f | grep ^firmware >> $fwinfo
-				done
-				if [ -f tmp/boot/abi-* ]; then
-					mv tmp/boot/abi-* $abidir/$arch/$sub
-				else
-					echo -n "NO ABI FILE..."
-				fi
-				if [ -f tmp/boot/retpoline-* ]; then
-					mv tmp/boot/retpoline-* $abidir/$arch/$sub.retpoline
-				else
-					echo -n "NO RETPOLINE FILE..."
-				fi
-				(cd tmp; find lib/modules/$verabi-$sub/kernel -name '*.ko') | \
-					sed -e 's/.*\/\([^\/]*\)\.ko/\1/' | sort > \
-					$abidir/$arch/$sub.modules
-				(
-					cd tmp;
-					# Prevent exposing some errors when called by python scripts. SIGPIPE seems to get
-					# exposed when using the `find ...` form of the command.
-					ko=$(find lib/modules/$verabi-$sub/kernel \
-						-name '*.ko' | head -1)
-					readelf -p .comment "$ko" | gawk '
-						($1 == "[") {
-							printf("%s", $3);
-							for (n=4; n<=NF; n++) {
-								printf(" %s", $n);
-							}
-							print ""
-						}' | sort -u >$abidir/$arch/$sub.compiler
-					version=`cat $abidir/$arch/$sub.compiler`
-					echo -n "$version..."
-				)
-			# FORM 2: moduleinfo packages
-			# cranky-fix -- modinfo supported
+			if [ -f tmp/boot/abi-* ]; then
+				mv tmp/boot/abi-* $abidir/$arch/$sub
+			else
+				echo "    NO ABI FILE"
+			fi
+			if [ -f tmp/boot/retpoline-* ]; then
+				mv tmp/boot/retpoline-* $abidir/$arch/$sub.retpoline
 			else
-				echo -n "buildinfo..."
-				base="tmp/usr/lib/linux/${verabi}-${sub}"
-				mv "$base/abi" "$abidir/$arch/$sub"
-				for comp in 'modules' 'retpoline' 'compiler'
-				do
-					mv "$base/$comp" "$abidir/$arch/$sub.$comp"
-				done
-				cat "$base/fwinfo" >>"$fwinfo"
+				echo "    NO RETPOLINE FILE"
 			fi
-			rm -rf tmp $filenames
-			echo "done."
+			(cd tmp; find lib/modules/$verabi-$sub/kernel -name '*.ko') | \
+				sed -e 's/.*\/\([^\/]*\)\.ko/\1/' | sort > \
+				$abidir/$arch/$sub.modules
+			(
+				cd tmp;
+				# Prevent exposing some errors when called by python scripts. SIGPIPE seems to get
+				# exposed when using the `find ...` form of the command.
+				ko=$(find lib/modules/$verabi-$sub/kernel \
+					-name '*.ko' | head -1)
+				readelf -p .comment "$ko" | gawk '
+					($1 == "[") {
+						printf("%s", $3);
+						for (n=4; n<=NF; n++) {
+							printf(" %s", $n);
+						}
+						print ""
+					}' | sort -u >$abidir/$arch/$sub.compiler
+				version=`cat $abidir/$arch/$sub.compiler`
+				echo "    $version"
+			)
+		# FORM 2: moduleinfo packages
+		# cranky-fix -- modinfo supported
 		else
-			echo "FAILED."
+			echo "  buildinfo..."
+			base="tmp/usr/lib/linux/${verabi}-${sub}"
+			mv "$base/abi" "$abidir/$arch/$sub"
+			for comp in 'modules' 'retpoline' 'compiler'
+			do
+				mv "$base/$comp" "$abidir/$arch/$sub.$comp"
+			done
+			cat "$base/fwinfo" >>"$fwinfo"
 		fi
-		cd $origdir
-	done
+		rm -rf tmp $filenames
+		echo "  done"
+	)
 }
 
 # MAIN
@@ -133,8 +162,6 @@ echo $abi > $abidir/abiname
 # NOTE: The flavours are hardcoded, because they may have changed from the
 # current build.
 
-__package_prefixes="linux-image"
-
 . $DEBIAN/etc/getabis
 
 # Extract compiler source package version from e.g.:
-- 
2.19.1




More information about the kernel-team mailing list