Pass a temporary file name to the package phase in the environment variable PORTAGE_B...
authorZac Medico <zmedico@gentoo.org>
Wed, 23 May 2007 04:47:36 +0000 (04:47 -0000)
committerZac Medico <zmedico@gentoo.org>
Wed, 23 May 2007 04:47:36 +0000 (04:47 -0000)
svn path=/main/trunk/; revision=6591

bin/misc-functions.sh
pym/emerge/__init__.py
pym/portage/dbapi/bintree.py

index 86d13292d9c60247c47915bf4e3fada892a20977..de349e029955642a114f163a449fc1141d0c0264 100755 (executable)
@@ -496,32 +496,21 @@ preinst_selinux_labels() {
 dyn_package() {
        cd "${PORTAGE_BUILDDIR}/image"
        install_mask "${PORTAGE_BUILDDIR}/image" ${PKG_INSTALL_MASK}
-       if [ -d "${PKGDIR}/All" ] ; then
-               local pkg_dest="${PKGDIR}/All/${PF}.tbz2"
-       else
-               local pkg_dest="${PKGDIR}/${CATEGORY}/${PF}.tbz2"
-       fi
-       local pkg_tmp="${pkg_dest}.$$"
        local tar_options=""
        [ "${PORTAGE_QUIET}" == "1" ] ||  tar_options="${tar_options} -v"
        # Sandbox is disabled in case the user wants to use a symlink
        # for $PKGDIR and/or $PKGDIR/All.
        export SANDBOX_ON="0"
-       mkdir -p "${pkg_tmp%/*}" || die "mkdir failed"
-       tar ${tar_options} -cf - . | bzip2 -f > "${pkg_tmp}" || \
+       mkdir -p "${PORTAGE_BINPKG_TMPFILE%/*}" || die "mkdir failed"
+       tar ${tar_options} -cf - . | bzip2 -f > "${PORTAGE_BINPKG_TMPFILE}" || \
                die "Failed to create tarball"
        cd ..
        export PYTHONPATH="${PORTAGE_PYM_PATH:-/usr/lib/portage/pym}:${PYTHONPATH}"
-       python -c "from portage import xpak; t=xpak.tbz2('${pkg_tmp}'); t.recompose('${PORTAGE_BUILDDIR}/build-info')"
+       python -c "from portage import xpak; t=xpak.tbz2('${PORTAGE_BINPKG_TMPFILE}'); t.recompose('${PORTAGE_BUILDDIR}/build-info')"
        if [ $? -ne 0 ]; then
-               rm -f "${pkg_tmp}"
+               rm -f "${PORTAGE_BINPKG_TMPFILE}"
                die "Failed to append metadata to the tbz2 file"
        fi
-       mv -f "${pkg_tmp}" "${pkg_dest}" || die "Failed to move tbz2 to ${pkg_dest}"
-       if [ -d "${PKGDIR}/All" ] ; then
-               ln -sf "../All/${PF}.tbz2" "${PKGDIR}/${CATEGORY}/${PF}.tbz2" || \
-                       die "Failed to create symlink in ${PKGDIR}/${CATEGORY}"
-       fi
        vecho ">>> Done."
        cd "${PORTAGE_BUILDDIR}"
        touch .packaged || die "Failed to 'touch .packaged' in ${PORTAGE_BUILDDIR}"
index 8a8bbfbe8db7126a30193a372d2831d640728167..2cff1ed41162ba491f0afed6f02d183345b3835f 100644 (file)
@@ -3157,13 +3157,18 @@ class MergeTask(object):
                                                        (mergecount, len(mymergelist), pkg_key)
                                                emergelog(xterm_titles, msg, short_msg=short_msg)
                                                self.trees[myroot]["bintree"].prevent_collision(pkg_key)
+                                               binpkg_tmpfile = os.path.join(pkgsettings["PKGDIR"],
+                                                       pkg_key + ".tbz2." + str(os.getpid()))
+                                               pkgsettings["PORTAGE_BINPKG_TMPFILE"] = binpkg_tmpfile
+                                               pkgsettings.backup_changes("PORTAGE_BINPKG_TMPFILE")
                                                retval = portage.doebuild(y, "package", myroot,
                                                        pkgsettings, self.edebug, mydbapi=portdb,
                                                        tree="porttree")
+                                               del pkgsettings["PORTAGE_BINPKG_TMPFILE"]
                                                if retval != os.EX_OK:
                                                        return retval
                                                bintree = self.trees[myroot]["bintree"]
-                                               bintree.inject(pkg_key)
+                                               bintree.inject(pkg_key, filename=binpkg_tmpfile)
                                                if "--buildpkgonly" not in self.myopts:
                                                        msg = " === (%s of %s) Merging (%s::%s)" % \
                                                                (mergecount, len(mymergelist), pkg_key, y)
index dda35ce652c557fee91aa7bf79c2ad9adc6b2ea5..fcceb5e0ddbf0d6f5ff05a21e339ef1f696fdeb3 100644 (file)
@@ -557,16 +557,32 @@ class binarytree(object):
                                        continue
                self.populated=1
 
-       def inject(self, cpv):
+       def inject(self, cpv, filename=None):
                """Add a freshly built package to the database.  This updates
-               $PKGDIR/Packages with the new package metadata (including MD5)."""
+               $PKGDIR/Packages with the new package metadata (including MD5).
+               @param cpv: The cpv of the new package to inject
+               @type cpv: string
+               @param filename: File path of the package to inject, or None if it's
+                       already in the location returned by getname()
+               @type filename: string
+               @rtype: None
+               """
+               mycat, mypkg = catsplit(cpv)
                if not self.populated and self._all_directory:
+                       if filename is not None:
+                               # In order to avoid population, don't call getname() here.
+                               os.rename(filename, os.path.join(
+                                       self.pkgdir, "All", mypkg + ".tbz2"))
+                       self._create_symlink(cpv)
                        # There's nothing to update in this case, since the Packages
                        # index is not created when $PKGDIR/All/ exists.
                        return
                if not self.populated:
                        self.populate()
-               full_path = self.getname(cpv)
+               if filename is None:
+                       full_path = self.getname(cpv)
+               else:
+                       full_path = filename
                try:
                        s = os.stat(full_path)
                except OSError, e:
@@ -589,6 +605,9 @@ class binarytree(object):
                self.dbapi._aux_cache.pop(cpv, None)
 
                if self._all_directory:
+                       if filename is not None:
+                               os.rename(filename, self.getname(cpv))
+                       self._create_symlink(cpv)
                        return
 
                # Reread the Packages index (in case it's been changed by another
@@ -598,6 +617,8 @@ class binarytree(object):
                try:
                        pkgindex_lock = lockfile(self._pkgindex_file,
                                wantnewlockfile=1)
+                       if filename is not None:
+                               os.rename(filename, self.getname(cpv))
                        pkgindex = portage.getbinpkg.PackageIndex()
                        try:
                                f = open(self._pkgindex_file)