Merged from trunk 11399:11408
authorFabian Groffen <grobian@gentoo.org>
Thu, 14 Aug 2008 19:25:26 +0000 (19:25 -0000)
committerFabian Groffen <grobian@gentoo.org>
Thu, 14 Aug 2008 19:25:26 +0000 (19:25 -0000)
   | 11400   | Disable "waiting for lock" messages when in background mode. |
   | zmedico | Thanks to Thargor for reporting.                             |

   | 11401   | Bug #234478 - Fix config._getMissingLicenses() to only       |
   | zmedico | access USE when LICENSE is conditional since otherwise USE   |
   |         | hasn't necessarily been calculated.                          |

   | 11402   | Create a single EAPI section to contain all of the EAPI      |
   | zmedico | subsections and replace sect[1-3] elements with "section"    |
   |         | elements which have unbounded depth.                         |

   | 11404   | Fix quoting for iteration over PROFILE_PATHS.                |
   | zmedico |                                                              |

   | 11405   | Make Scheduler._choose_pkg() parallelize more aggressively   |
   | zmedico | in cases when it will not result in a less optimal build     |
   |         | order. This works by modifying the behavior of               |
   |         | Scheduler._dependent_on_scheduled_merges() so that two cases |
   |         | of dependence are ignored: * A given dependency will be      |
   |         | merged later anyway (due to dep cycles) and therefore        |
   |         | delaying the merge of the parent package will not result in  |
   |         | a more optimal build order. * A given dependency is an       |
   |         | "uninstall" operation and it also is not a direct            |
   |         | dependency, therefore it should be irrelevant to build order |
   |         | optimization.                                                |

   | 11406   | The fpformat module is deprecated and will be removed in     |
   | zmedico | py3k. The % string interpolation operator should be used     |
   |         | instead. Thanks to Ali Polatel <hawking@g.o> for this patch. |

   | 11407   | * Fix parse_metadata_use() to raise ParseError instead of    |
   | zmedico | the ExpatError that was reported by grobian. * Define        |
   |         | __all__.                                                     |

svn path=/main/branches/prefix/; revision=11409

bin/ebuild.sh
doc/package/ebuild.docbook
doc/package/ebuild/eapi/0.docbook
doc/package/ebuild/eapi/1.docbook
doc/package/ebuild/eapi/2.docbook
doc/package/ebuild/helper_functions.docbook
doc/package/ebuild/phases.docbook
pym/_emerge/__init__.py
pym/portage/__init__.py
pym/portage/locks.py
pym/repoman/utilities.py

index 7119fcdd33092af5baa0db665acde97bf790a718..0ff5ab4a10ff03f34612fcd2b0d56559ce1c9017 100755 (executable)
@@ -1527,7 +1527,7 @@ source_all_bashrcs() {
        IFS=$'\n'
        local path_array=($PROFILE_PATHS)
        restore_IFS
-       for x in ${path_array[@]} ; do
+       for x in "${path_array[@]}" ; do
                [ -f "${x}/profile.bashrc" ] && qa_source "${x}/profile.bashrc"
        done
 
index 162b79c53d75ef998724980295d68461cbd5a920..ecd88017ab1907c9971c0c3a24496a4617c50236 100644 (file)
@@ -2,7 +2,10 @@
 <title>Ebuild</title>
 &package_ebuild_phases;
 &package_ebuild_helper_functions;
+<section id='package-ebuild-eapi'>
+<title>EAPI</title>
 &package_ebuild_eapi_0;
 &package_ebuild_eapi_1;
 &package_ebuild_eapi_2;
+</section>
 </chapter>
index 72e998b9c48e2d111bf9d4c3c9db239676bc89bf..d00861ccf1ff92788473149113f81c579cc2e750 100644 (file)
@@ -1,8 +1,8 @@
-<sect1 id='package-ebuild-eapi-0'>
+<section id='package-ebuild-eapi-0'>
        <title>EAPI 0</title>
-       <sect2 id='package-ebuild-eapi-0-phases'>
+       <section id='package-ebuild-eapi-0-phases'>
                <title>Phases</title>
-               <sect3 id='package-ebuild-eapi-0-phases-default-src-compile'>
+               <section id='package-ebuild-eapi-0-phases-default-src-compile'>
                        <title>Default src_compile Phase Function</title>
                        <programlisting>
 src_compile() {
@@ -14,6 +14,6 @@ src_compile() {
        fi
 }
                        </programlisting>
-               </sect3>
-       </sect2>
-</sect1>
+               </section>
+       </section>
+</section>
index ad84ae6f9321f333a75515922370dacb064933b1..ca421352f18088b5022ebcef3296d62949eecd77 100644 (file)
@@ -1,8 +1,8 @@
-<sect1 id='package-ebuild-eapi-1'>
+<section id='package-ebuild-eapi-1'>
        <title>EAPI 1</title>
-       <sect2 id='package-ebuild-eapi-1-phases'>
+       <section id='package-ebuild-eapi-1-phases'>
                <title>Phases</title>
-               <sect3 id='package-ebuild-eapi-1-phases-default-src-compile'>
+               <section id='package-ebuild-eapi-1-phases-default-src-compile'>
                        <title>Default src_compile Phase Function</title>
                        <para>
                        Support for the ECONF_SOURCE variable, which is also supported
@@ -18,9 +18,9 @@ src_compile() {
        fi
 }
                        </programlisting>
-               </sect3>
-       </sect2>
-       <sect2 id='package-ebuild-eapi-1-slot-deps'>
+               </section>
+       </section>
+       <section id='package-ebuild-eapi-1-slot-deps'>
        <title>SLOT Dependencies</title>
        <para>
        Any valid atom can be constrained to match a specific SLOT. This is
@@ -50,5 +50,5 @@ src_compile() {
        </tbody>
        </tgroup>
        </table>
-       </sect2>
-</sect1>
+       </section>
+</section>
index 8e152f21d79de260833b9677af3312603b92b752..1a4073e5eb1c2166bf6b08591e47347291b71eba 100644 (file)
@@ -1,8 +1,8 @@
-<sect1 id='package-ebuild-eapi-2_pre1'>
+<section id='package-ebuild-eapi-2_pre1'>
        <title>EAPI 2_pre1</title>
-       <sect2 id='package-ebuild-eapi-2-helpers'>
+       <section id='package-ebuild-eapi-2-helpers'>
        <title>Helpers</title>
-       <sect3 id='package-ebuild-eapi-2-helpers-doman'>
+       <section id='package-ebuild-eapi-2-helpers-doman'>
        <title>doman</title>
        <para>
        Language codes in file names are now used for path translation.
        </tbody>
        </tgroup>
        </table>
-       </sect3>
-       </sect2>
-       <sect2 id='package-ebuild-eapi-2-use-deps'>
+       </section>
+       </section>
+       <section id='package-ebuild-eapi-2-use-deps'>
        <title>USE Dependencies</title>
-       <sect3 id='package-ebuild-eapi-2-use-deps-unconditional'>
+       <section id='package-ebuild-eapi-2-use-deps-unconditional'>
        <title>Unconditional USE Dependencies</title>
        <table><title>Syntax Examples</title>
        <tgroup cols='2' align='left' >
@@ -61,8 +61,8 @@
        </tbody>
        </tgroup>
        </table>
-       </sect3>
-       <sect3 id='package-ebuild-eapi-2-use-deps-conditional'>
+       </section>
+       <section id='package-ebuild-eapi-2-use-deps-conditional'>
        <title>Conditional USE Dependencies</title>
        <table><title>Syntax Examples</title>
        <tgroup cols='2' align='left' >
        </tbody>
        </tgroup>
        </table>
-       </sect3>
-       </sect2>
-</sect1>
-<sect1 id='package-ebuild-eapi-2_pre2'>
+       </section>
+       </section>
+</section>
+<section id='package-ebuild-eapi-2_pre2'>
        <title>EAPI 2_pre2</title>
-       <sect2 id='package-ebuild-eapi-2-phases'>
+       <section id='package-ebuild-eapi-2-phases'>
                <title>Phases</title>
-               <sect3 id='package-ebuild-eapi-2-phases-src-configure'>
+               <section id='package-ebuild-eapi-2-phases-src-configure'>
                        <title>New src_configure Phase Function</title>
                        <para>
                        The configure portion of the src_compile function has been
@@ -164,8 +164,8 @@ src_compile() {
                                </tbody>
                                </tgroup>
                        </table>
-               </sect3>
-               <sect3 id='package-ebuild-eapi-2-phases-default-functions'>
+               </section>
+               <section id='package-ebuild-eapi-2-phases-default-functions'>
                        <title>Default Phase Functions</title>
                        <para>
                        The default pkg_nofetch and src_* phase functions are now
@@ -261,8 +261,8 @@ src_compile() {
                                </tbody>
                                </tgroup>
                        </table>
-               </sect3>
-               <sect3 id='package-ebuild-eapi-2-phases-default-function-alias'>
+               </section>
+               <section id='package-ebuild-eapi-2-phases-default-function-alias'>
                        <title>Default Phase Function Alias</title>
                        <para>
                        A function named "default" is redefined for each phase so that it
@@ -271,6 +271,6 @@ src_compile() {
                        src_compile phase is equivalent to a call to the function named
                        default_src_compile.
                        </para>
-               </sect3>
-       </sect2>
-</sect1>
+               </section>
+       </section>
+</section>
index 9c417afb90e1162f1383d39e1f28c00e40439dc4..1a4737c5ba265615d5c019bba9e2a942188c9753 100644 (file)
@@ -1,31 +1,31 @@
-<sect1 id='package-ebuild-helper-functions'>
+<section id='package-ebuild-helper-functions'>
        <title>Helper Functions</title>
-       <sect2 id='package-ebuild-helper-functions-output'>
+       <section id='package-ebuild-helper-functions-output'>
        <title>Output</title>
-       <sect3 id='package-ebuild-helper-functions-output-ebegin'>
+       <section id='package-ebuild-helper-functions-output-ebegin'>
        <title>ebegin</title>
        <para>
        Like einfo, we output a helpful message and then hint that the following
        operation may take some time to complete. Once the task is finished, you
        need to call eend.
        </para>
-       </sect3>
-       <sect3 id='package-ebuild-helper-functions-output-eend'>
+       </section>
+       <section id='package-ebuild-helper-functions-output-eend'>
        <title>eend</title>
        <para>
        Followup the ebegin message with an appropriate "OK" or "!!" (for errors)
        marker. If status is non-zero, then the additional error message is
        displayed.
        </para>
-       </sect3>
-       <sect3 id='package-ebuild-helper-functions-output-einfo'>
+       </section>
+       <section id='package-ebuild-helper-functions-output-einfo'>
        <title>einfo</title>
        <para>
        Same as elog, but should be used when the message isn't important
        to the user (like progress or status messages during the build process).
        </para>
-       </sect3>
-       <sect3 id='package-ebuild-helper-functions-output-elog'>
+       </section>
+       <section id='package-ebuild-helper-functions-output-elog'>
        <title>elog</title>
        <para>
        If you need to display a message that you wish the user to read
        but adds a little more to the output so as to catch the user's eye.
        The message will also be logged by portage for later review.
        </para>
-       </sect3>
-       <sect3 id='package-ebuild-helper-functions-output-eqawarn'>
+       </section>
+       <section id='package-ebuild-helper-functions-output-eqawarn'>
        <title>eqawarn</title>
        <para>
        Same as einfo, but should be used when showing a QA warning to the user.
        </para>
-       </sect3>
-       <sect3 id='package-ebuild-helper-functions-output-ewarn'>
+       </section>
+       <section id='package-ebuild-helper-functions-output-ewarn'>
        <title>ewarn</title>
        <para>
        Same as einfo, but should be used when showing a warning to the user.
        </para>
-       </sect3>
-       </sect2>
-</sect1>
+       </section>
+       </section>
+</section>
index 383c605cea2575c9afdf94c8f32c1da3caba0210..2cb1b4447bdda82b2c3113bd969111f6038946e3 100644 (file)
@@ -1,4 +1,4 @@
-<sect1 id='package-ebuild-phases'>
+<section id='package-ebuild-phases'>
        <title>Ebuild Phases</title>
        <para>
        Ebuild execution is divided into a series of phases. In order
        </listitem>
        </itemizedlist>
        </para>
-       <sect2 id='package-ebuild-phases-previous-installed'>
+       <section id='package-ebuild-phases-previous-installed'>
        <title>Interaction with previous installed version</title>
        <para>
        The order for upgrade and downgrade operations changed in
        version 2.1.5, but the order for reinstall operations remained unchanged.
        </para>
-       <sect3 id='package-ebuild-phases-before-2.1.5'>
+       <section id='package-ebuild-phases-before-2.1.5'>
        <title>Upgrade/downgrade order used by versions less than 2.1.5 (deprecated)</title>
        <para>
        <itemizedlist>
@@ -64,8 +64,8 @@
        </listitem>
        </itemizedlist>
        </para>
-       </sect3>
-       <sect3 id='package-ebuild-phases-after-2.1.5'>
+       </section>
+       <section id='package-ebuild-phases-after-2.1.5'>
        <title>Upgrade/downgrade order starting with version 2.1.5</title>
        <para>
        The new order for upgrades and downgrades is identical to the order used
@@ -95,6 +95,6 @@
        pkg_preinst) and store the result in a global variable to be accessed by
        pkg_postinst when it is called.
        </para>
-       </sect3>
-       </sect2>
-</sect1>
+       </section>
+       </section>
+</section>
index e2cc671608c33d58014300756ae19c29dda55c33..f6fa77b4b2036e5ac7451c14da0c8bbf6428e935 100644 (file)
@@ -24,7 +24,6 @@ import array
 from collections import deque
 import fcntl
 import formatter
-import fpformat
 import logging
 import select
 import shlex
@@ -8716,7 +8715,7 @@ class JobStatusDisplay(object):
                        avg = os.getloadavg()
                except OSError, e:
                        return str(e)
-               return ", ".join(fpformat.fix(x, digits) for x in avg)
+               return ", ".join(("%%.%df" % digits ) % x for x in avg)
 
        def display(self):
                """
@@ -9642,6 +9641,7 @@ class Scheduler(PollScheduler):
                self._add_packages()
                pkg_queue = self._pkg_queue
                failed_pkgs = self._failed_pkgs
+               portage.locks._quiet = self._background
                portage.elog._emerge_elog_listener = self._elog_listener
                rval = os.EX_OK
 
@@ -9649,6 +9649,7 @@ class Scheduler(PollScheduler):
                        self._main_loop()
                finally:
                        self._main_loop_cleanup()
+                       portage.locks._quiet = False
                        portage.elog._emerge_elog_listener = None
                        if failed_pkgs:
                                rval = failed_pkgs[-1].returncode
@@ -9683,8 +9684,10 @@ class Scheduler(PollScheduler):
                self._prune_digraph()
 
                chosen_pkg = None
+               later = set(self._pkg_queue)
                for pkg in self._pkg_queue:
-                       if not self._dependent_on_scheduled_merges(pkg):
+                       later.remove(pkg)
+                       if not self._dependent_on_scheduled_merges(pkg, later):
                                chosen_pkg = pkg
                                break
 
@@ -9699,10 +9702,17 @@ class Scheduler(PollScheduler):
 
                return chosen_pkg
 
-       def _dependent_on_scheduled_merges(self, pkg):
+       def _dependent_on_scheduled_merges(self, pkg, later):
                """
                Traverse the subgraph of the given packages deep dependencies
                to see if it contains any scheduled merges.
+               @param pkg: a package to check dependencies for
+               @type pkg: Package
+               @param later: packages for which dependence should be ignored
+                       since they will be merged later than pkg anyway and therefore
+                       delaying the merge of pkg will not result in a more optimal
+                       merge order
+               @type later: set
                @rtype: bool
                @returns: True if the package is dependent, False otherwise.
                """
@@ -9712,14 +9722,19 @@ class Scheduler(PollScheduler):
 
                dependent = False
                traversed_nodes = set([pkg])
-               node_stack = graph.child_nodes(pkg)
+               direct_deps = graph.child_nodes(pkg)
+               node_stack = direct_deps
+               direct_deps = frozenset(direct_deps)
                while node_stack:
                        node = node_stack.pop()
                        if node in traversed_nodes:
                                continue
                        traversed_nodes.add(node)
-                       if not (node.installed and node.operation == "nomerge") and \
-                               node not in completed_tasks:
+                       if not ((node.installed and node.operation == "nomerge") or \
+                               (node.operation == "uninstall" and \
+                               node not in direct_deps) or \
+                               node in completed_tasks or \
+                               node in later):
                                dependent = True
                                break
                        node_stack.extend(graph.child_nodes(node))
index 260f38680fda45eff55afcbd7c7cd500877f6fdd..bc805115d6f3aae4a63f7096c7a20ac7e25d1821 100644 (file)
@@ -2377,9 +2377,15 @@ class config(object):
                        cpv_slot = "%s:%s" % (cpv, metadata["SLOT"])
                        for atom in match_to_list(cpv_slot, cpdict.keys()):
                                acceptable_licenses.update(cpdict[atom])
-               license_struct = portage.dep.paren_reduce(metadata["LICENSE"])
+
+               license_str = metadata["LICENSE"]
+               if "?" in license_str:
+                       use = metadata["USE"].split()
+               else:
+                       use = []
+
                license_struct = portage.dep.use_reduce(
-                       license_struct, uselist=metadata["USE"].split())
+                       portage.dep.paren_reduce(license_str), uselist=use)
                license_struct = portage.dep.dep_opconvert(license_struct)
                return self._getMaskedLicenses(license_struct, acceptable_licenses)
 
index 5c88bfcf6a57973be4051306c40792f8378e124d..10f15998c46d5ad4559bb29fcada80f3962edf05 100644 (file)
@@ -14,6 +14,10 @@ import portage.const
 
 HARDLINK_FD = -2
 
+# Used by emerge in order to disable the "waiting for lock" message
+# so that it doesn't interfere with the status display.
+_quiet = False
+
 def lockdir(mydir):
        return lockfile(mydir,wantnewlockfile=1)
 def unlockdir(mylock):
@@ -84,7 +88,11 @@ def lockfile(mypath, wantnewlockfile=0, unlinkfile=0,
                        # resource temp unavailable; eg, someone beat us to the lock.
                        if flags & os.O_NONBLOCK:
                                raise TryAgain(mypath)
-                       if waiting_msg is None:
+
+                       global _quiet
+                       if _quiet:
+                               pass
+                       elif waiting_msg is None:
                                if isinstance(mypath, int):
                                        print "waiting for lock on fd %i" % myfd
                                else:
index b537536bf38aef7625481519adb2d5510daf37fd..10f26727242f4456eb1cb7bab677f819e2f7c30c 100644 (file)
@@ -6,6 +6,18 @@
 """This module contains utility functions to help repoman find ebuilds to
 scan"""
 
+__all__ = [
+       "detect_vcs_conflicts",
+       "editor_is_executable",
+       "FindPackagesToScan",
+       "FindPortdir",
+       "format_qa_output",
+       "get_commit_message_with_editor",
+       "get_commit_message_with_stdin",
+       "have_profile_dir",
+       "parse_metadata_use"
+]
+
 import commands
 import errno
 import itertools
@@ -15,6 +27,7 @@ import sys
 
 from xml.dom import minidom
 from xml.dom import NotFoundErr
+from xml.parsers.expat import ExpatError
 from portage import output
 from portage.output import red, green
 from portage.process import find_binary
@@ -97,7 +110,10 @@ def parse_metadata_use(mylines, uselist=None):
        returns a dict of the form a list of flags"""
        if uselist is None:
                uselist = []
-       metadatadom = minidom.parse(mylines)
+       try:
+               metadatadom = minidom.parse(mylines)
+       except ExpatError, e:
+               raise exception.ParseError("metadata.xml: %s" % (e,))
 
        try:
                usetag = metadatadom.getElementsByTagName("use")