Move preinst/postinst_bsdflags from bash to py
authorDavid James <davidjames@google.com>
Thu, 28 Apr 2011 21:22:15 +0000 (14:22 -0700)
committerZac Medico <zmedico@gentoo.org>
Thu, 28 Apr 2011 21:22:15 +0000 (14:22 -0700)
Moving these commands from shell to Python helps avoid an unnecessary
call to misc-functions.sh for the postinst_bsdflags. This improves
performance.

BUG=none
TEST=Run emerge-x86-generic -eg --jobs=16 libchrome

Change-Id: I0c2af50b4d2f7644cabac84fde7fe4d682010c69

Review URL: http://codereview.chromium.org/6676107

bin/misc-functions.sh
pym/_emerge/EbuildPhase.py
pym/portage/package/ebuild/doebuild.py

index 4c5b61a185a42cfc722221cb38288d94cab8b584..af0cc2760a0e5a4a537cc284f16a98a0d340f0a8 100755 (executable)
@@ -723,22 +723,6 @@ install_mask() {
        set -${shopts}
 }
 
-preinst_bsdflags() {
-       hasq chflags $FEATURES || return
-       # Save all the file flags for restoration after installation.
-       mtree -c -p "${D}" -k flags > "${T}/bsdflags.mtree"
-       # Remove all the file flags so that the merge phase can do anything
-       # necessary.
-       chflags -R noschg,nouchg,nosappnd,nouappnd "${D}"
-       chflags -R nosunlnk,nouunlnk "${D}" 2>/dev/null
-}
-
-postinst_bsdflags() {
-       hasq chflags $FEATURES || return
-       # Restore all the file flags that were saved before installation.
-       mtree -e -p "${ROOT}" -U -k flags < "${T}/bsdflags.mtree" &> /dev/null
-}
-
 preinst_mask() {
        if [ -z "${D}" ]; then
                 eerror "${FUNCNAME}: D is unset"
index c9d17474e0ecd5e1c1108ee2e07c38d01e7cb41a..07fb69ca7e03370a9ea5a1bc70e951f17c4d0c4a 100644 (file)
@@ -17,7 +17,8 @@ portage.proxy.lazyimport.lazyimport(globals(),
        'portage.package.ebuild.doebuild:_check_build_log,' + \
                '_post_phase_cmds,_post_phase_userpriv_perms,' + \
                '_post_src_install_chost_fix,' + \
-               '_post_src_install_uid_fix'
+               '_post_src_install_uid_fix,_postinst_bsdflags,' + \
+               '_preinst_bsdflags'
 )
 from portage import os
 from portage import StringIO
@@ -178,6 +179,10 @@ class EbuildPhase(CompositeTask):
                                encoding=_encodings['content'], errors='replace')
                        if msg:
                                self.scheduler.output(msg, log_path=logfile)
+               elif self.phase == "preinst":
+                       _preinst_bsdflags(settings)
+               elif self.phase == "postinst":
+                       _postinst_bsdflags(settings)
 
                post_phase_cmds = _post_phase_cmds.get(self.phase)
                if post_phase_cmds is not None:
index f353166d78775738860595ce955e3012ac04fb13..2a4079109de2ad7c2c183ee32d211cf63184b548 100644 (file)
@@ -1233,14 +1233,10 @@ _post_phase_cmds = {
                "install_symlink_html_docs"],
 
        "preinst" : [
-               "preinst_bsdflags",
                "preinst_sfperms",
                "preinst_selinux_labels",
                "preinst_suid_scan",
-               "preinst_mask"],
-
-       "postinst" : [
-               "postinst_bsdflags"]
+               "preinst_mask"]
 }
 
 def _post_phase_userpriv_perms(mysettings):
@@ -1392,6 +1388,27 @@ _vdb_use_conditional_keys = ('DEPEND', 'LICENSE', 'PDEPEND',
        'PROPERTIES', 'PROVIDE', 'RDEPEND', 'RESTRICT',)
 _vdb_use_conditional_atoms = frozenset(['DEPEND', 'PDEPEND', 'RDEPEND'])
 
+def _preinst_bsdflags(mysettings):
+       if bsd_chflags:
+               # Save all the file flags for restoration later.
+               os.system("mtree -c -p %s -k flags > %s" % \
+                       (_shell_quote(mysettings["D"]),
+                       _shell_quote(os.path.join(mysettings["T"], "bsdflags.mtree"))))
+
+               # Remove all the file flags to avoid EPERM errors.
+               os.system("chflags -R noschg,nouchg,nosappnd,nouappnd %s" % \
+                       (_shell_quote(mysettings["D"]),))
+               os.system("chflags -R nosunlnk,nouunlnk %s 2>/dev/null" % \
+                       (_shell_quote(mysettings["D"]),))
+
+
+def _postinst_bsdflags(mysettings):
+       if bsd_chflags:
+               # Restore all of the flags saved above.
+               os.system("mtree -e -p %s -U -k flags < %s > /dev/null" % \
+                       (_shell_quote(mysettings["D"]),
+                       _shell_quote(os.path.join(mysettings["T"], "bsdflags.mtree"))))
+
 def _post_src_install_uid_fix(mysettings, out):
        """
        Files in $D with user and group bits that match the "portage"
@@ -1406,15 +1423,7 @@ def _post_src_install_uid_fix(mysettings, out):
        inst_uid = int(mysettings["PORTAGE_INST_UID"])
        inst_gid = int(mysettings["PORTAGE_INST_GID"])
 
-       if bsd_chflags:
-               # Temporarily remove all of the flags in order to avoid EPERM errors.
-               os.system("mtree -c -p %s -k flags > %s" % \
-                       (_shell_quote(mysettings["D"]),
-                       _shell_quote(os.path.join(mysettings["T"], "bsdflags.mtree"))))
-               os.system("chflags -R noschg,nouchg,nosappnd,nouappnd %s" % \
-                       (_shell_quote(mysettings["D"]),))
-               os.system("chflags -R nosunlnk,nouunlnk %s 2>/dev/null" % \
-                       (_shell_quote(mysettings["D"]),))
+       _preinst_bsdflags(mysettings)
 
        destdir = mysettings["D"]
        unicode_errors = []