File solve_and_install of Package initrd

#!/bin/bash -e
# parameters job_name dest_dir [binary_directory]
# script will look for job_name.t and produce job_name.solv file 
# based on packages in binary_directory

job="${1:?}"
dest="${2:?}"
pkgdir="${3:-/.build.binaries}"

tmpdir=$(mktemp -d -t solv.XXXXXX)
cleanup()
{
	rm -rf "$tmpdir"
}
trap cleanup EXIT
mkdir "$tmpdir/nevra"

is_rpm=
if [ -e "$pkgdir/rpm.rpm" ]; then
	is_rpm=1
	for pkg in "$pkgdir"/*.rpm; do
		ln -s "$pkg" "$tmpdir/nevra/$(rpm -qp --qf '%{nevra}.rpm\n' $pkg)"
	done
	rpms2solv "$pkgdir"/*.rpm > "$job".solv
else
	for pkg in "$pkgdir"/*.deb; do
		ln -s "$pkg" "$tmpdir/nevra/$(dpkg-deb -W --showformat '${Package}-${Version}.${Architecture}.deb\n' $pkg)"
	done
	deb2solv "$pkgdir"/*.deb > "$job".solv
fi
testsolv "$job.t" > "$tmpdir/result"
cat "$tmpdir/result"
if grep -q "Found.*problems" "$tmpdir/result"; then
	exit 1
fi

mkdir "$dest"
cd "$dest"

if [ -n "$is_rpm" ]; then
	extract() {
	  rpm2cpio "$1" | cpio -id
	  find -type d -print0 -not -perm '/0200' | xargs -0 --no-run-if-empty chmod u+w
	  mkdir -p usr/lib/sysimage/rpm-headers
	  dd if="$1" of="usr/lib/sysimage/rpm-headers/${1##*/}" bs=96 count=1
	}
	extract "$pkgdir"/filesystem.rpm
	while read -r dash nevra; do
		[ "$dash" = '-' ] || continue
		extract "$tmpdir/nevra/$nevra.rpm"
	done < "$tmpdir/result"
else
	extract() {
	  dpkg-deb -x "$1" .
	  find -type d -print0 -not -perm '/0200' | xargs -0 --no-run-if-empty chmod u+w
	}
	extract "$pkgdir"/base-files.deb
	while read -r dash nevra; do
		[ "$dash" = '-' ] || continue
		extract "$tmpdir/nevra/$nevra.deb"
	done < "$tmpdir/result"
	for d in bin sbin lib; do
		find "$d" -not -type d -printf "/%P\n" | while read -r f; do
			mkdir -p "usr/$d/${f%/*}"
			mv "$d/$f" "usr/$d/$f"
		done
		rm -rvf "$d"
		ln -s "usr/$d" "$d"
	done
fi
openSUSE Build Service is sponsored by