[projects/cleanbuild] split the tool to two parts by engine

glen glen at pld-linux.org
Sun Jun 18 19:49:46 CEST 2017


commit 0fbdd402b915e92bd3d4eebcb8f7c2490729b20a
Author: Elan Ruusamäe <glen at pld-linux.org>
Date:   Sun Jun 18 20:46:43 2017 +0300

    split the tool to two parts by engine
    
    add wrapper to redirect to specific backend engine

 README.docker                             |   4 +
 README => README.vserver                  |  13 +-
 build                                     |   1 -
 clean                                     |   1 -
 cleanbuild                                | 551 +-----------------------------
 docker-builder.sh => cleanbuild-docker.sh |   0
 cleanbuild-vserver.sh                     | 550 +++++++++++++++++++++++++++++
 create                                    |   1 -
 install                                   |   1 -
 9 files changed, 563 insertions(+), 559 deletions(-)
---
diff --git a/README.docker b/README.docker
new file mode 100644
index 0000000..afb7f41
--- /dev/null
+++ b/README.docker
@@ -0,0 +1,4 @@
+cleanbuild docker engine
+
+With docker engine there's nothing needed to configure on local system other
+than access to running docker engine and docker client program.
diff --git a/README b/README.vserver
similarity index 79%
rename from README
rename to README.vserver
index 464ec36..775d3c5 100644
--- a/README
+++ b/README.vserver
@@ -1,3 +1,7 @@
+cleanbuild vserver engine
+
+cleanbuild vserver engine requires vserver with special customizations.
+
 Dependencies:
 
   Missing packages on fresh PLD vserver installation:
@@ -45,12 +49,3 @@ Notes for vserver:
   /etc/vserver/<name>/bcapabilities):
     MKNOD
     SYS_ADMIN
-
-Run cleanbuild:
-
-  cd cleanbuild
-  ./cleanbuild FHS
-
-You can create yourself alias for easier invocation from regular user:
-  alias cleanbuild='_cleanbuild() { sudo -H -u builder sh -c "cd ~/cleanbuild && ./cleanbuild $*"; }; _cleanbuild'
-  cleanbuild somepkg
diff --git a/build b/build
deleted file mode 120000
index d6e1872..0000000
--- a/build
+++ /dev/null
@@ -1 +0,0 @@
-cleanbuild
\ No newline at end of file
diff --git a/clean b/clean
deleted file mode 120000
index d6e1872..0000000
--- a/clean
+++ /dev/null
@@ -1 +0,0 @@
-cleanbuild
\ No newline at end of file
diff --git a/cleanbuild b/cleanbuild
index 3502a74..0e99905 100755
--- a/cleanbuild
+++ b/cleanbuild
@@ -1,550 +1,9 @@
-#!/usr/bin/sudo /bin/sh
-
-RPMS_FROM="$HOME/rpm/cleanRPMS.repo"
-DEST="th"
-SRC="-n th-x86_64-test"
-SUFFIX=""
-CACHEDIR="$PWD/poldekcache"
-RPMMACROS=""
-BUILDERRC=""
-IGNORE=""
-CHROOTSIZE="4G"
-ignore() { IGNORE="$IGNORE $*"; }
-NODEBUG=true
-CLEANAFTER=false
-FORCE_UMOUNT=false
-NOREBUILDDB=true
-MULTILIB=false
-# Whatever you set here as value, consider that it may not be shorter than
-# /usr/lib/debug (or /usr/src/debug) for debuginfo to work.
-# You get "Only dest dir longer than base dir not supported" error otherwise.
-BUILDDIR=/usr/src/BUILD
+#!/bin/sh
+dir=$(dirname "$0")
 
 [ -r .cleanbuildrc ] && . ./.cleanbuildrc
 
-[ -z "$USER" ] && echo "USER not defined" && exit 1
-[ "$USER" = "root" ] && echo "USER must not be root" && exit 1
-
-export LC_ALL=C
-unset LANGUAGE
-unset LANG
-
-usage() {
-	[ $# -gt 0 ] && echo "$*"
-	echo "Usage:"
-	echo "	./cleanbuild [cleanbuild options] specname [builder options]"
-	echo "	./build [cleanbuild options] specname [builder options]"
-	echo "	./clean [cleanbuild options]"
-	echo "	./create [cleanbuild options]"
-	echo "	./install [cleanbuild options] packages"
-	echo ""
-	echo "cleanbuild options:"
-	echo " -32, -64, -th-i486  - select architecture"
-	echo " --cleanafter | -ca  - clean after build"
-	echo " --forceumount | -fu - force umount tmpfs"
-	echo " --debug             - enable debug"
-	echo " --network           - allow build to use networking"
-	echo " -a, -b, -c, -d, -e  - select alternative chroot directory"
-	exit 1
-}
-
-FETCH=false
-CLEAN=false
-CREATE=false
-BUILD=false
-NETWORK=false
-INSTALL=false
-
-case "$0" in
-	*clean)
-		CLEAN=exit_after
-		;;
-	*cleanbuild)
-		FETCH=true
-		CLEAN=true
-		CREATE=true
-		BUILD=true
-		;;
-	*build)
-		CREATE=true
-		BUILD=true
-		;;
-	*create)
-		CLEAN=true
-		CREATE=exit_after
-		;;
-	*install)
-		CREATE=true
-		INSTALL=exit_after
-		;;
-	*)
-		usage
-		;;
-esac
-
-while [ $# -gt 0 ]; do
-	OPT="${1}"
-	case "$OPT" in
-		-32)	OPT="-th-i686" ;;
-		-64)	OPT="-th-x86_64" ;;
-		-th-32)	OPT="-th-i686" ;;
-		-th-64)	OPT="-th-x86_64" ;;
-		-ti-32)	OPT="-ti-i686" ;;
-		-ti-64)	OPT="-ti-x86_64" ;;
-		-ac)	OPT="-ac-amd64" ;;
-		-ac-32)	OPT="-ac-i586" ;;
-		-ac-64)	OPT="-ac-amd64" ;;
-	esac
-
-	V="${OPT#-}"
-	case "$OPT" in
-		-th-i[46]86 | -th-x86_64)
-			DEST="$V"
-			SRC="-n $V-ready"
-			;;
-		-th-i[46]86-test | -th-x86_64-test)
-			DEST="$V"
-			SRC="-n $V"
-			;;
-		-ti-i[56]86 | -ti-x86_64)
-			DEST="$V"
-			SRC="-n $V-ready"
-			;;
-		-ti-i[56]86-test | -ti-x86_64-test)
-			DEST="$V"
-			SRC="-n $V"
-			;;
-		-ac-amd64 | -ac-i[356]86 | -ac-athlon)
-			DEST="$V"
-			SRC="-n $V-ready"
-			;;
-		-[1-9]G | -[1-9][0-9]G )
-			CHROOTSIZE="$V"
-			;;
-		--cleanafter | -ca)
-			CLEANAFTER=true
-			;;
-		--debug)
-			NODEBUG=false
-			;;
-		--network)
-			NETWORK=true
-			;;
-		--forceumount | -fu)
-			FORCE_UMOUNT=true
-			;;
-		-[a-e])
-			SUFFIX="$OPT"
-			;;
-		-~*)
-			SUFFIX="$V"
-			;;
-		*)
-			break
-			;;
-	esac
-	shift
-done
-
-if $BUILD; then
-	[ $# -ne 0 ] || usage
-	build_pkg="${1}"
-	build_pkg="${build_pkg%/}"
-	build_pkg="${build_pkg%.spec}"
-	build_pkg="${build_pkg#*/}"
-	shift
-
-	builder_options="$*"
-fi
-
-$NODEBUG || set -x
-
-CHNAME="chroot-$DEST$SUFFIX"
-CHDIR="$PWD/$CHNAME"
-CHHOME="/home/users/$USER"
-
-warn()
-{
-	echo -n -e "\033[31;1m" >&2
-	echo -n "$*" >&2
-	echo -e "\033[0m" >&2
-}
-
-die()
-{
-	code=$1
-	shift
-	warn "$*"
-	exit $code
-}
-
-info()
-{
-	echo -n -e "\033[32m"
-	echo -n "$*"
-	echo -e "\033[0m"
-}
-
-title()
-{
-	[ -t 1 ] || return 0
-	local msg="$CHNAME: $build_pkg: $*"
-	case "$TERM" in
-		cygwin|xterm*)
-			echo -ne "\033]1;$msg\007\033]2;$msg\007" >&2
-			;;
-		screen*)
-			echo -ne "\033]0;$msg\007" >&2
-			;;
-	esac
-	return 0
-}
-
-exit_after()
-{
-	return 0;
-}
-
-check_running()
-{
-	[ -r "$CHDIR/.pid" ] || return
-	PID=$(< "$CHDIR/.pid")
-	if [ -d /proc/$PID ]; then
-		die 10 "Another process ($PID) already running in $CHNAME"
-	fi
-}
-
-for D in installed buildlogs $CACHEDIR; do
-	if [ ! -d "$D" ]; then
-		info "mkdir $D"
-		su $USER -c "mkdir -p $D" || die 13 "Cannot create work directories"
-	fi
-done
-
-ignore \
-	upstart\* \
-	upstart \
-	compat-\* \
-	systemd-init \
-	hhvm \
-	vserver-packages \
-	xorg-driver-video-fglrx\* xorg-driver-video-nvidia\* xorg-xserver-xgl-libGL \
-	xorg-driver-video-vboxvideo \
-	xorg-data-xbitmaps \
-	compat-gcc\* \
-	libpng1\* \
-	libjpeg libjpeg-devel \
-	freetype1-devel-* \
-	anacron fcron hc-cron \
-	masqmail msmtp-sendmail omta postfix sendmail ssmtp nail-mail nullmailer \
-	ghostscript-esp \
-	perl-Scalar-List-Utils \
-	perl-ExtUtils-Install \
-	phonon-backend-mplayer phonon-backend-vlc \
-	libgcj libgcj-devel \
-	icedtea6-jre icedtea6-jdk \
-	icedtea7-jre icedtea7-jdk \
-	java-sun-jre java-sun-jdk \
-	java5-sun-jre java5-sun-jdk \
-	oracle-java7-jre oracle-java7-jdk \
-	gnome-menus \
-	gnome-speech-driver-festival gnome-speech-driver-speech-dispatcher
-
-if ! $MULTILIB; then
-	ignore '*-multilib-*'
-fi
-
-rebuilddb()
-{
-	$NOREBUILDDB || rpm --root=$CHDIR --rebuilddb
-}
-
-poldek()
-{
-	$NODEBUG || set -x
-	rebuilddb
-	/usr/bin/poldek $SRC -s "$RPMS_FROM" -r "$CHDIR" "--cachedir=$CACHEDIR" --conf=$PWD/poldekconf/poldek.conf "$@"
-}
-
-
-build_umount()
-{
-	for DIR in $CHHOME/rpm $CHHOME dev proc sys; do
-		[ -d $CHDIR/$DIR ] && umount $CHDIR/$DIR
-	done
-}
-
-build_remove_root()
-{
-	$NODEBUG || set -x
-	if $FORCE_UMOUNT; then
-		# safety checks.
-		[ "$CHDIR" ] || exit 1
-		[ -d "$CHDIR" ] || exit 1
-		rm -rf $CHDIR/*
-		umount -l $CHDIR
-	else
-		umount $CHDIR
-	fi
-	rmdir $CHDIR
-}
-
-clean()
-{
-	info "Cleaning $CHNAME"
-	title "cleaning chroot"
-	build_umount
-	build_remove_root
-}
-
-build_prepare_root()
-{
-	title "preparing chroot"
-	set -e
-	$NODEBUG || set -x
-	mkdir $CHDIR
-	mount -t tmpfs -o size=$CHROOTSIZE,relatime /dev/null $CHDIR
-	echo $$ > $CHDIR/.pid
-
-	rpmversion=$(rpm -E '%(v=%{_rpmversion}; IFS=.; set -- $v; echo $1)')
-	rpmversion=${rpmversion:-4}
-
-	if [ "$rpmversion" -ge 5 ]; then
-		rpm --root=$CHDIR -qa
-	else
-		rpm --root=$CHDIR --initdb
-	fi
-	poldek --up || :
-	poldek -O "ignore=$IGNORE" -u rpm-build pwdutils coreutils time util-linux git-core gawk
-	echo Poldek exit: $?
-
-	for DIR in dev proc sys; do
-		# We need to create these directories manually, because they are marked
-		# as netsharedpath in cleanbuild poldek.conf
-		mkdir $CHDIR/$DIR
-		mount -o bind /$DIR $CHDIR/$DIR
-	done
-
-	# group 'users' may already exist, so ignore errors
-	chroot $CHDIR groupadd $(id $USER -gn) -g$(id $USER -g) || :
-	chroot $CHDIR useradd -m $USER -u$(id $USER -u) -g $(id $USER -gn)
-
-	# replicate files which already belong to $USER
-	# so they will have correct owner and permissions
-	cp -a $CHDIR/$CHHOME/{tmp,rpm}
-	cp -a $CHDIR/$CHHOME/tmp $CHDIR$BUILDDIR
-
-	cp -a $CHDIR/$CHHOME/{.bashrc,.rpmmacros}
-	cat <<-EOM > $CHDIR/$CHHOME/.rpmmacros
-	%_builddir		$BUILDDIR
-	%buildroot		%{_builddir}/%{name}-%{version}-root-%(id -u -n)
-	%_rpmdirname	cleanRPMS
-	%_rpmdir		%{expand:%%global _rpmdir %([ -d %{_topdir}/../%{_rpmdirname} ] && (cd %{_topdir}/../%{_rpmdirname}; pwd) || echo %{_topdir}/%{_rpmdirname})}%_rpmdir
-	%distribution	CleanPLD
-	%_binary_payload	w1.gzdio
-EOM
-	[ -z "$RPMMACROS" ] || echo "$RPMMACROS" >> $CHDIR/$CHHOME/.rpmmacros
-
-	cp -a $CHDIR/$CHHOME/{.bashrc,.builderrc}
-	cat <<-'EORC' > $CHDIR/$CHHOME/.builderrc
-	TITLECHANGE=no
-EORC
-	[ -z "$BUILDERRC" ] || echo "$BUILDERRC" >> $CHDIR/$CHHOME/.builderrc
-
-	set +e
-}
-
-build_mount_home()
-{
-	$NODEBUG || set -x
-	mount -o bind $HOME/rpm $CHDIR/$CHHOME/rpm
-
-	# ensure RPMS dir is available
-	chroot $CHDIR su $USER -c 'mkdir -p $(rpm -E %_rpmdir)'
-}
-
-print_installed()
-{
-	echo=$1
-	if [ -r installed/$build_pkg ]; then
-		$echo "$(cat installed/$build_pkg | awk '{print $1}' | sort -u \
-			| awk '{br=br ", " $1} END{gsub(/^, /, "- BR: ", br ); print br}')"
-		cat installed/$build_pkg
-	fi
-}
-
-addlist()
-{
-	LIST="$1"
-
-	print_installed info
-
-	return
-	echo "*** $build_pkg $(date --rfc-3339=seconds) ***" >> $LIST
-	print_installed echo >> $LIST
-}
-
-builddie()
-{
-	LIST="$1"; shift
-	CODE="$1"; shift
-	MSG="$*"
-
-	rm -f $CHDIR/.pid
-
-	$CLEANAFTER && clean
-	title "failed !"
-
-	addlist "ERROR_$LIST"
-	die $CODE "$MSG"
-}
-
-LAST_INSTALL=""
-poldek_install()
-{
-	local I="$1" ret
-	# Nothing to install
-	[ -n "$I" ] || return 1
-	# Installing same packets second time
-	[ "$LAST_INSTALL" != "$I" ] || return 1
-	LAST_INSTALL="$I"
-
-	info "Installing" $I
-	poldek -O "ignore=$IGNORE" -u $I | tee $$.poldek_install
-	ret=
-	if grep -q "Preparing...                ##################################################" $$.poldek_install \
-			&& ! grep -q "file .* from install of .* conflicts with file from package" $$.poldek_install
-		then
-		info "Poldek:" $I "installed"
-		ret=0
-	elif grep -q "Nothing to do" $$.poldek_install; then
-		warn "Poldek:" $I "installed already"
-		ret=1
-	fi
-	rm $$.poldek_install
-	[ -n "$ret" ] && return $ret
-
-	# try harder
-	info "Poldek install failed, retry without ignore"
-	poldek -u $I && return 0
-	info "Poldek install failed, retry once more without ignore"
-	poldek -u $I && return 0
-	warn "Poldek:" "Could not install" $I
-	return 1
-}
-
-maybe_call()
-{
-	local cond="$1"; shift
-	local func="$1"; shift
-
-	[ $cond = "false" ] && return
-	"$func" "$@"
-	[ $cond = "exit_after" ] && exit
-}
-
-fetch()
-{
-	info "Fetching $build_pkg"
-	title "fetch"
-	$NODEBUG || set -x
-	su $USER -c "$HOME/rpm/packages/builder -g $build_pkg $builder_options" \
-		|| die 11 "Fetch failed"
-}
-
-create()
-{
-	$NODEBUG || set -x
-	su $USER -c "poldek -s $RPMS_FROM --mkidx"
-
-	if [ ! -d $CHDIR ]; then
-		info "Preparing $CHNAME"
-		build_prepare_root
-		build_mount_home
-	fi
-}
-
-
-info "Configured Poldek sources"
-poldek -l
-
-maybe_call $FETCH fetch
-
-check_running
-
-maybe_call $CLEAN clean
-
-maybe_call $CREATE create
-
-echo $$ > $CHDIR/.pid
-
-maybe_call $INSTALL poldek_install "$*"
-
-maybe_call $NETWORK cp -bf /etc/resolv.conf $CHDIR/etc/
-
-$BUILD || exit
-
-if [ -p /tmp/fixfreq ]; then
-	echo $$ > /tmp/fixfreq
-fi
-
-while true; do
-	info "Building $build_pkg in $CHNAME"
-	rebuilddb
-	./cleanup-la $CHDIR
-	buildlog="buildlogs/$build_pkg"
-	if [ -r $buildlog ]; then
-		i=1
-		while [ -r $buildlog.$i ]; do
-			i=$((i+1))
-		done
-		info "moving $buildlog to $buildlog.$i"
-		mv $buildlog $buildlog.$i
-	fi
-	./findunusedbr -c $CHDIR $HOME/rpm/packages/$build_pkg/$build_pkg.spec
-	title "building"
-	./teeboth $buildlog chroot $CHDIR su $USER -c "$CHHOME/rpm/packages/builder -nn --define '_enable_debug_packages 0' -bb $build_pkg $builder_options"
-	ECODE=$?
-
-	if grep -q "error: Failed build dependencies:" $buildlog; then
-		SEARCH=$(cat $buildlog | awk '/^Error:/ { p = 0 }; { if ( p ) { f="p"; if ( $1 ~ /^\// ) f="f"; printf "search -%c %s; ", f, $1; } }; /error: Failed build dependencies:/ { p = 1 }')
-		INSTALL=$(poldek -O "ignore=$IGNORE" --shcmd="$SEARCH" | awk '{ if ( p ) { print; p = 0; } } / package\(s\) found:$/ { p = 1 }' | sed 's/^\(.*\)-.*-.*$/\1/' | sort -u)
-
-		if poldek_install "$INSTALL"; then
-			info "Deps installed"
-			continue
-		else
-			addlist ERROR_BRINSTALL
-			die 4 "Cannot install BRs"
-		fi
-	fi
-
-	./findbr $CHDIR/$BUILDDIR $buildlog > $$.installed
-	installed_something=false
-	while read pkg msg; do
-		if poldek_install $pkg; then
-			info "findbr:" $pkg "installed"
-			echo "$pkg $msg" >> installed/$build_pkg
-			./addbr $build_pkg "$pkg" "$msg"
-			installed_something=true
-		else
-			warn "findbr:" $pkg "not installed"
-		fi
-	done < $$.installed
-	rm -f $$.installed
-	$installed_something && continue
-
-	if [ $ECODE -eq 0 ]; then
-		$CLEANAFTER && clean
-		addlist BUILT_OK
-		./findunusedbr $CHDIR $HOME/rpm/packages/$build_pkg/$build_pkg.spec
-		info "$build_pkg built OK !"
-		title "OK !"
-		exit 0
-	else
-		builddie UNKNOWN 1 "Got error but dunno what to do !"
-	fi
-done
-
+# backend to use: vserver or docker
+BACKEND=${BACKEND:-docker}
 
-# vim: ts=4 sw=4 filetype=sh
+exec $dir/cleanbuild-$BACKEND.sh "$@"
diff --git a/docker-builder.sh b/cleanbuild-docker.sh
similarity index 100%
rename from docker-builder.sh
rename to cleanbuild-docker.sh
diff --git a/cleanbuild-vserver.sh b/cleanbuild-vserver.sh
new file mode 100755
index 0000000..3502a74
--- /dev/null
+++ b/cleanbuild-vserver.sh
@@ -0,0 +1,550 @@
+#!/usr/bin/sudo /bin/sh
+
+RPMS_FROM="$HOME/rpm/cleanRPMS.repo"
+DEST="th"
+SRC="-n th-x86_64-test"
+SUFFIX=""
+CACHEDIR="$PWD/poldekcache"
+RPMMACROS=""
+BUILDERRC=""
+IGNORE=""
+CHROOTSIZE="4G"
+ignore() { IGNORE="$IGNORE $*"; }
+NODEBUG=true
+CLEANAFTER=false
+FORCE_UMOUNT=false
+NOREBUILDDB=true
+MULTILIB=false
+# Whatever you set here as value, consider that it may not be shorter than
+# /usr/lib/debug (or /usr/src/debug) for debuginfo to work.
+# You get "Only dest dir longer than base dir not supported" error otherwise.
+BUILDDIR=/usr/src/BUILD
+
+[ -r .cleanbuildrc ] && . ./.cleanbuildrc
+
+[ -z "$USER" ] && echo "USER not defined" && exit 1
+[ "$USER" = "root" ] && echo "USER must not be root" && exit 1
+
+export LC_ALL=C
+unset LANGUAGE
+unset LANG
+
+usage() {
+	[ $# -gt 0 ] && echo "$*"
+	echo "Usage:"
+	echo "	./cleanbuild [cleanbuild options] specname [builder options]"
+	echo "	./build [cleanbuild options] specname [builder options]"
+	echo "	./clean [cleanbuild options]"
+	echo "	./create [cleanbuild options]"
+	echo "	./install [cleanbuild options] packages"
+	echo ""
+	echo "cleanbuild options:"
+	echo " -32, -64, -th-i486  - select architecture"
+	echo " --cleanafter | -ca  - clean after build"
+	echo " --forceumount | -fu - force umount tmpfs"
+	echo " --debug             - enable debug"
+	echo " --network           - allow build to use networking"
+	echo " -a, -b, -c, -d, -e  - select alternative chroot directory"
+	exit 1
+}
+
+FETCH=false
+CLEAN=false
+CREATE=false
+BUILD=false
+NETWORK=false
+INSTALL=false
+
+case "$0" in
+	*clean)
+		CLEAN=exit_after
+		;;
+	*cleanbuild)
+		FETCH=true
+		CLEAN=true
+		CREATE=true
+		BUILD=true
+		;;
+	*build)
+		CREATE=true
+		BUILD=true
+		;;
+	*create)
+		CLEAN=true
+		CREATE=exit_after
+		;;
+	*install)
+		CREATE=true
+		INSTALL=exit_after
+		;;
+	*)
+		usage
+		;;
+esac
+
+while [ $# -gt 0 ]; do
+	OPT="${1}"
+	case "$OPT" in
+		-32)	OPT="-th-i686" ;;
+		-64)	OPT="-th-x86_64" ;;
+		-th-32)	OPT="-th-i686" ;;
+		-th-64)	OPT="-th-x86_64" ;;
+		-ti-32)	OPT="-ti-i686" ;;
+		-ti-64)	OPT="-ti-x86_64" ;;
+		-ac)	OPT="-ac-amd64" ;;
+		-ac-32)	OPT="-ac-i586" ;;
+		-ac-64)	OPT="-ac-amd64" ;;
+	esac
+
+	V="${OPT#-}"
+	case "$OPT" in
+		-th-i[46]86 | -th-x86_64)
+			DEST="$V"
+			SRC="-n $V-ready"
+			;;
+		-th-i[46]86-test | -th-x86_64-test)
+			DEST="$V"
+			SRC="-n $V"
+			;;
+		-ti-i[56]86 | -ti-x86_64)
+			DEST="$V"
+			SRC="-n $V-ready"
+			;;
+		-ti-i[56]86-test | -ti-x86_64-test)
+			DEST="$V"
+			SRC="-n $V"
+			;;
+		-ac-amd64 | -ac-i[356]86 | -ac-athlon)
+			DEST="$V"
+			SRC="-n $V-ready"
+			;;
+		-[1-9]G | -[1-9][0-9]G )
+			CHROOTSIZE="$V"
+			;;
+		--cleanafter | -ca)
+			CLEANAFTER=true
+			;;
+		--debug)
+			NODEBUG=false
+			;;
+		--network)
+			NETWORK=true
+			;;
+		--forceumount | -fu)
+			FORCE_UMOUNT=true
+			;;
+		-[a-e])
+			SUFFIX="$OPT"
+			;;
+		-~*)
+			SUFFIX="$V"
+			;;
+		*)
+			break
+			;;
+	esac
+	shift
+done
+
+if $BUILD; then
+	[ $# -ne 0 ] || usage
+	build_pkg="${1}"
+	build_pkg="${build_pkg%/}"
+	build_pkg="${build_pkg%.spec}"
+	build_pkg="${build_pkg#*/}"
+	shift
+
+	builder_options="$*"
+fi
+
+$NODEBUG || set -x
+
+CHNAME="chroot-$DEST$SUFFIX"
+CHDIR="$PWD/$CHNAME"
+CHHOME="/home/users/$USER"
+
+warn()
+{
+	echo -n -e "\033[31;1m" >&2
+	echo -n "$*" >&2
+	echo -e "\033[0m" >&2
+}
+
+die()
+{
+	code=$1
+	shift
+	warn "$*"
+	exit $code
+}
+
+info()
+{
+	echo -n -e "\033[32m"
+	echo -n "$*"
+	echo -e "\033[0m"
+}
+
+title()
+{
+	[ -t 1 ] || return 0
+	local msg="$CHNAME: $build_pkg: $*"
+	case "$TERM" in
+		cygwin|xterm*)
+			echo -ne "\033]1;$msg\007\033]2;$msg\007" >&2
+			;;
+		screen*)
+			echo -ne "\033]0;$msg\007" >&2
+			;;
+	esac
+	return 0
+}
+
+exit_after()
+{
+	return 0;
+}
+
+check_running()
+{
+	[ -r "$CHDIR/.pid" ] || return
+	PID=$(< "$CHDIR/.pid")
+	if [ -d /proc/$PID ]; then
+		die 10 "Another process ($PID) already running in $CHNAME"
+	fi
+}
+
+for D in installed buildlogs $CACHEDIR; do
+	if [ ! -d "$D" ]; then
+		info "mkdir $D"
+		su $USER -c "mkdir -p $D" || die 13 "Cannot create work directories"
+	fi
+done
+
+ignore \
+	upstart\* \
+	upstart \
+	compat-\* \
+	systemd-init \
+	hhvm \
+	vserver-packages \
+	xorg-driver-video-fglrx\* xorg-driver-video-nvidia\* xorg-xserver-xgl-libGL \
+	xorg-driver-video-vboxvideo \
+	xorg-data-xbitmaps \
+	compat-gcc\* \
+	libpng1\* \
+	libjpeg libjpeg-devel \
+	freetype1-devel-* \
+	anacron fcron hc-cron \
+	masqmail msmtp-sendmail omta postfix sendmail ssmtp nail-mail nullmailer \
+	ghostscript-esp \
+	perl-Scalar-List-Utils \
+	perl-ExtUtils-Install \
+	phonon-backend-mplayer phonon-backend-vlc \
+	libgcj libgcj-devel \
+	icedtea6-jre icedtea6-jdk \
+	icedtea7-jre icedtea7-jdk \
+	java-sun-jre java-sun-jdk \
+	java5-sun-jre java5-sun-jdk \
+	oracle-java7-jre oracle-java7-jdk \
+	gnome-menus \
+	gnome-speech-driver-festival gnome-speech-driver-speech-dispatcher
+
+if ! $MULTILIB; then
+	ignore '*-multilib-*'
+fi
+
+rebuilddb()
+{
+	$NOREBUILDDB || rpm --root=$CHDIR --rebuilddb
+}
+
+poldek()
+{
+	$NODEBUG || set -x
+	rebuilddb
+	/usr/bin/poldek $SRC -s "$RPMS_FROM" -r "$CHDIR" "--cachedir=$CACHEDIR" --conf=$PWD/poldekconf/poldek.conf "$@"
+}
+
+
+build_umount()
+{
+	for DIR in $CHHOME/rpm $CHHOME dev proc sys; do
+		[ -d $CHDIR/$DIR ] && umount $CHDIR/$DIR
+	done
+}
+
+build_remove_root()
+{
+	$NODEBUG || set -x
+	if $FORCE_UMOUNT; then
+		# safety checks.
+		[ "$CHDIR" ] || exit 1
+		[ -d "$CHDIR" ] || exit 1
+		rm -rf $CHDIR/*
+		umount -l $CHDIR
+	else
+		umount $CHDIR
+	fi
+	rmdir $CHDIR
+}
+
+clean()
+{
+	info "Cleaning $CHNAME"
+	title "cleaning chroot"
+	build_umount
+	build_remove_root
+}
+
+build_prepare_root()
+{
+	title "preparing chroot"
+	set -e
+	$NODEBUG || set -x
+	mkdir $CHDIR
+	mount -t tmpfs -o size=$CHROOTSIZE,relatime /dev/null $CHDIR
+	echo $$ > $CHDIR/.pid
+
+	rpmversion=$(rpm -E '%(v=%{_rpmversion}; IFS=.; set -- $v; echo $1)')
+	rpmversion=${rpmversion:-4}
+
+	if [ "$rpmversion" -ge 5 ]; then
+		rpm --root=$CHDIR -qa
+	else
+		rpm --root=$CHDIR --initdb
+	fi
+	poldek --up || :
+	poldek -O "ignore=$IGNORE" -u rpm-build pwdutils coreutils time util-linux git-core gawk
+	echo Poldek exit: $?
+
+	for DIR in dev proc sys; do
+		# We need to create these directories manually, because they are marked
+		# as netsharedpath in cleanbuild poldek.conf
+		mkdir $CHDIR/$DIR
+		mount -o bind /$DIR $CHDIR/$DIR
+	done
+
+	# group 'users' may already exist, so ignore errors
+	chroot $CHDIR groupadd $(id $USER -gn) -g$(id $USER -g) || :
+	chroot $CHDIR useradd -m $USER -u$(id $USER -u) -g $(id $USER -gn)
+
+	# replicate files which already belong to $USER
+	# so they will have correct owner and permissions
+	cp -a $CHDIR/$CHHOME/{tmp,rpm}
+	cp -a $CHDIR/$CHHOME/tmp $CHDIR$BUILDDIR
+
+	cp -a $CHDIR/$CHHOME/{.bashrc,.rpmmacros}
+	cat <<-EOM > $CHDIR/$CHHOME/.rpmmacros
+	%_builddir		$BUILDDIR
+	%buildroot		%{_builddir}/%{name}-%{version}-root-%(id -u -n)
+	%_rpmdirname	cleanRPMS
+	%_rpmdir		%{expand:%%global _rpmdir %([ -d %{_topdir}/../%{_rpmdirname} ] && (cd %{_topdir}/../%{_rpmdirname}; pwd) || echo %{_topdir}/%{_rpmdirname})}%_rpmdir
+	%distribution	CleanPLD
+	%_binary_payload	w1.gzdio
+EOM
+	[ -z "$RPMMACROS" ] || echo "$RPMMACROS" >> $CHDIR/$CHHOME/.rpmmacros
+
+	cp -a $CHDIR/$CHHOME/{.bashrc,.builderrc}
+	cat <<-'EORC' > $CHDIR/$CHHOME/.builderrc
+	TITLECHANGE=no
+EORC
+	[ -z "$BUILDERRC" ] || echo "$BUILDERRC" >> $CHDIR/$CHHOME/.builderrc
+
+	set +e
+}
+
+build_mount_home()
+{
+	$NODEBUG || set -x
+	mount -o bind $HOME/rpm $CHDIR/$CHHOME/rpm
+
+	# ensure RPMS dir is available
+	chroot $CHDIR su $USER -c 'mkdir -p $(rpm -E %_rpmdir)'
+}
+
+print_installed()
+{
+	echo=$1
+	if [ -r installed/$build_pkg ]; then
+		$echo "$(cat installed/$build_pkg | awk '{print $1}' | sort -u \
+			| awk '{br=br ", " $1} END{gsub(/^, /, "- BR: ", br ); print br}')"
+		cat installed/$build_pkg
+	fi
+}
+
+addlist()
+{
+	LIST="$1"
+
+	print_installed info
+
+	return
+	echo "*** $build_pkg $(date --rfc-3339=seconds) ***" >> $LIST
+	print_installed echo >> $LIST
+}
+
+builddie()
+{
+	LIST="$1"; shift
+	CODE="$1"; shift
+	MSG="$*"
+
+	rm -f $CHDIR/.pid
+
+	$CLEANAFTER && clean
+	title "failed !"
+
+	addlist "ERROR_$LIST"
+	die $CODE "$MSG"
+}
+
+LAST_INSTALL=""
+poldek_install()
+{
+	local I="$1" ret
+	# Nothing to install
+	[ -n "$I" ] || return 1
+	# Installing same packets second time
+	[ "$LAST_INSTALL" != "$I" ] || return 1
+	LAST_INSTALL="$I"
+
+	info "Installing" $I
+	poldek -O "ignore=$IGNORE" -u $I | tee $$.poldek_install
+	ret=
+	if grep -q "Preparing...                ##################################################" $$.poldek_install \
+			&& ! grep -q "file .* from install of .* conflicts with file from package" $$.poldek_install
+		then
+		info "Poldek:" $I "installed"
+		ret=0
+	elif grep -q "Nothing to do" $$.poldek_install; then
+		warn "Poldek:" $I "installed already"
+		ret=1
+	fi
+	rm $$.poldek_install
+	[ -n "$ret" ] && return $ret
+
+	# try harder
+	info "Poldek install failed, retry without ignore"
+	poldek -u $I && return 0
+	info "Poldek install failed, retry once more without ignore"
+	poldek -u $I && return 0
+	warn "Poldek:" "Could not install" $I
+	return 1
+}
+
+maybe_call()
+{
+	local cond="$1"; shift
+	local func="$1"; shift
+
+	[ $cond = "false" ] && return
+	"$func" "$@"
+	[ $cond = "exit_after" ] && exit
+}
+
+fetch()
+{
+	info "Fetching $build_pkg"
+	title "fetch"
+	$NODEBUG || set -x
+	su $USER -c "$HOME/rpm/packages/builder -g $build_pkg $builder_options" \
+		|| die 11 "Fetch failed"
+}
+
+create()
+{
+	$NODEBUG || set -x
+	su $USER -c "poldek -s $RPMS_FROM --mkidx"
+
+	if [ ! -d $CHDIR ]; then
+		info "Preparing $CHNAME"
+		build_prepare_root
+		build_mount_home
+	fi
+}
+
+
+info "Configured Poldek sources"
+poldek -l
+
+maybe_call $FETCH fetch
+
+check_running
+
+maybe_call $CLEAN clean
+
+maybe_call $CREATE create
+
+echo $$ > $CHDIR/.pid
+
+maybe_call $INSTALL poldek_install "$*"
+
+maybe_call $NETWORK cp -bf /etc/resolv.conf $CHDIR/etc/
+
+$BUILD || exit
+
+if [ -p /tmp/fixfreq ]; then
+	echo $$ > /tmp/fixfreq
+fi
+
+while true; do
+	info "Building $build_pkg in $CHNAME"
+	rebuilddb
+	./cleanup-la $CHDIR
+	buildlog="buildlogs/$build_pkg"
+	if [ -r $buildlog ]; then
+		i=1
+		while [ -r $buildlog.$i ]; do
+			i=$((i+1))
+		done
+		info "moving $buildlog to $buildlog.$i"
+		mv $buildlog $buildlog.$i
+	fi
+	./findunusedbr -c $CHDIR $HOME/rpm/packages/$build_pkg/$build_pkg.spec
+	title "building"
+	./teeboth $buildlog chroot $CHDIR su $USER -c "$CHHOME/rpm/packages/builder -nn --define '_enable_debug_packages 0' -bb $build_pkg $builder_options"
+	ECODE=$?
+
+	if grep -q "error: Failed build dependencies:" $buildlog; then
+		SEARCH=$(cat $buildlog | awk '/^Error:/ { p = 0 }; { if ( p ) { f="p"; if ( $1 ~ /^\// ) f="f"; printf "search -%c %s; ", f, $1; } }; /error: Failed build dependencies:/ { p = 1 }')
+		INSTALL=$(poldek -O "ignore=$IGNORE" --shcmd="$SEARCH" | awk '{ if ( p ) { print; p = 0; } } / package\(s\) found:$/ { p = 1 }' | sed 's/^\(.*\)-.*-.*$/\1/' | sort -u)
+
+		if poldek_install "$INSTALL"; then
+			info "Deps installed"
+			continue
+		else
+			addlist ERROR_BRINSTALL
+			die 4 "Cannot install BRs"
+		fi
+	fi
+
+	./findbr $CHDIR/$BUILDDIR $buildlog > $$.installed
+	installed_something=false
+	while read pkg msg; do
+		if poldek_install $pkg; then
+			info "findbr:" $pkg "installed"
+			echo "$pkg $msg" >> installed/$build_pkg
+			./addbr $build_pkg "$pkg" "$msg"
+			installed_something=true
+		else
+			warn "findbr:" $pkg "not installed"
+		fi
+	done < $$.installed
+	rm -f $$.installed
+	$installed_something && continue
+
+	if [ $ECODE -eq 0 ]; then
+		$CLEANAFTER && clean
+		addlist BUILT_OK
+		./findunusedbr $CHDIR $HOME/rpm/packages/$build_pkg/$build_pkg.spec
+		info "$build_pkg built OK !"
+		title "OK !"
+		exit 0
+	else
+		builddie UNKNOWN 1 "Got error but dunno what to do !"
+	fi
+done
+
+
+# vim: ts=4 sw=4 filetype=sh
diff --git a/create b/create
deleted file mode 120000
index d6e1872..0000000
--- a/create
+++ /dev/null
@@ -1 +0,0 @@
-cleanbuild
\ No newline at end of file
diff --git a/install b/install
deleted file mode 120000
index d6e1872..0000000
--- a/install
+++ /dev/null
@@ -1 +0,0 @@
-cleanbuild
\ No newline at end of file
================================================================

---- gitweb:

http://git.pld-linux.org/gitweb.cgi/projects/cleanbuild.git/commitdiff/499402e2ffaebc9ad2ba9c5040e7e2673087d855



More information about the pld-cvs-commit mailing list