From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from lists.gentoo.org (pigeon.gentoo.org [208.92.234.80]) by finch.gentoo.org (Postfix) with ESMTP id B0978198005 for ; Sat, 23 Mar 2013 16:26:04 +0000 (UTC) Received: from pigeon.gentoo.org (localhost [127.0.0.1]) by pigeon.gentoo.org (Postfix) with SMTP id F1EB1E06BA; Sat, 23 Mar 2013 16:25:57 +0000 (UTC) Received: from smtp.gentoo.org (smtp.gentoo.org [140.211.166.183]) (using TLSv1 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by pigeon.gentoo.org (Postfix) with ESMTPS id EB66EE066A for ; Sat, 23 Mar 2013 16:25:56 +0000 (UTC) Received: from localhost.localdomain (unknown [83.238.59.230]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) (Authenticated sender: mgorny) by smtp.gentoo.org (Postfix) with ESMTPSA id A4E2E33D3D7; Sat, 23 Mar 2013 16:25:53 +0000 (UTC) From: =?UTF-8?q?Micha=C5=82=20G=C3=B3rny?= To: gentoo-dev@lists.gentoo.org Cc: =?UTF-8?q?Micha=C5=82=20G=C3=B3rny?= Subject: [gentoo-dev] [PATCH 1/2] Introduce multibuild_merge_root() to merge interim installs. Date: Sat, 23 Mar 2013 17:26:37 +0100 Message-Id: <1364055998-23674-1-git-send-email-mgorny@gentoo.org> X-Mailer: git-send-email 1.8.1.5 In-Reply-To: <20130323172532.1b1100e2@pomiocik.lan> References: <20130323172532.1b1100e2@pomiocik.lan> Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-Id: Gentoo Linux mail X-BeenThere: gentoo-dev@lists.gentoo.org Reply-to: gentoo-dev@lists.gentoo.org X-Archives-Salt: a2500b65-b836-4b1d-b520-189e808d2ade X-Archives-Hash: a30c3c00407272246e1197fd530e6348 This is mostly a copy from distutils-r1. The function does copy all the files from one location onto another, preserving whatever possible. It can be run in parallel too without the risk of race conditions. --- gx86/eclass/distutils-r1.eclass | 41 +------------------------------------ gx86/eclass/multibuild.eclass | 45 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 40 deletions(-) diff --git a/gx86/eclass/distutils-r1.eclass b/gx86/eclass/distutils-r1.eclass index 0982e6c..3c21741 100644 --- a/gx86/eclass/distutils-r1.eclass +++ b/gx86/eclass/distutils-r1.eclass @@ -449,49 +449,10 @@ distutils-r1_python_install() { if [[ ! ${DISTUTILS_SINGLE_IMPL} ]]; then _distutils-r1_rename_scripts "${root}" - _distutils-r1_merge_root "${root}" "${D}" + multibuild_merge_root "${root}" "${D}" fi } -# @FUNCTION: distutils-r1_merge_root -# @USAGE: -# @INTERNAL -# @DESCRIPTION: -# Merge the directory tree from to , removing -# the in the process. -_distutils-r1_merge_root() { - local src=${1} - local dest=${2} - - local lockfile=${T}/distutils-r1-merge-lock - - if type -P lockf &>/dev/null; then - # On BSD, we have 'lockf' wrapper. - tar -C "${src}" -f - -c . \ - | lockf "${lockfile}" tar -x -f - -C "${dest}" - else - local lock_fd - if type -P flock &>/dev/null; then - # On Linux, we have 'flock' which can lock fd. - redirect_alloc_fd lock_fd "${lockfile}" '>>' - flock ${lock_fd} - else - ewarn "distutils-r1: no locking service found, please report." - fi - - cp -a -l -n "${src}"/. "${dest}"/ - - if [[ ${lock_fd} ]]; then - # Close the lock file when we are done with it. - # Prevents deadlock if we aren't in a subshell. - eval "exec ${lock_fd}>&-" - fi - fi - [[ ${?} == 0 ]] || die "Merging ${EPYTHON} image failed." - - rm -rf "${src}" -} - # @FUNCTION: distutils-r1_python_install_all # @DESCRIPTION: # The default python_install_all(). It installs the documentation. diff --git a/gx86/eclass/multibuild.eclass b/gx86/eclass/multibuild.eclass index a3f1402..ed837d3 100644 --- a/gx86/eclass/multibuild.eclass +++ b/gx86/eclass/multibuild.eclass @@ -238,5 +238,50 @@ run_in_build_dir() { return ${ret} } +# @FUNCTION: multibuild_merge_root +# @USAGE: +# @DESCRIPTION: +# Merge the directory tree (fake root) from to +# (the real root). Both directories have to be real, absolute paths +# (i.e. including ${D}). Source root will be removed. +# +# This functions uses locking to support merging during parallel +# installs. +multibuild_merge_root() { + local src=${1} + local dest=${2} + + local lockfile=${T}/multibuild_merge_lock + + if type -P lockf &>/dev/null; then + # On BSD, we have 'lockf' wrapper. + tar -C "${src}" -f - -c . \ + | lockf "${lockfile}" tar -x -f - -C "${dest}" + else + local lock_fd + if type -P flock &>/dev/null; then + # On Linux, we have 'flock' which can lock fd. + redirect_alloc_fd lock_fd "${lockfile}" '>>' + flock ${lock_fd} + else + ewarn "multibuild: no locking service found, please report." + fi + + cp -a -l -n "${src}"/. "${dest}"/ + + if [[ ${lock_fd} ]]; then + # Close the lock file when we are done with it. + # Prevents deadlock if we aren't in a subshell. + eval "exec ${lock_fd}>&-" + fi + fi + + if [[ ${?} -ne 0 ]]; then + die "${MULTIBUILD_VARIANT:-(unknown)}: merging image failed." + fi + + rm -rf "${src}" +} + _MULTIBUILD=1 fi -- 1.8.1.5