Merged from trunk -r14896:14906
authorFabian Groffen <grobian@gentoo.org>
Sun, 6 Dec 2009 10:30:18 +0000 (10:30 -0000)
committerFabian Groffen <grobian@gentoo.org>
Sun, 6 Dec 2009 10:30:18 +0000 (10:30 -0000)
   | 14897   | In movefile(), skip os.utime() when os.rename() succeeds, in |
   | zmedico | order to completely preserve mtime resolution.               |

   | 14898   | Fix logic from previous commit so it only applies when a     |
   | zmedico | 'newmtime' parameter has not been specified (this is always  |
   |         | the case when called by portage).                            |

   | 14899   | In calc_depclean(), load the FakeVartree before using it.    |
   | zmedico | This fixes a regression which causes incomplete graph        |
   |         | creation (since r14773). Thanks to Vlastimil Babka           |
   |         | <caster@g.o> for reporting.                                  |

   | 14900   | Add a note about lack of nanosecond precision in movefile(). |
   | zmedico |                                                              |

   | 14901   | Handle a KeyError in depgraph._ordered_tree_display(),       |
   | zmedico | reported on irc by romildo.                                  |

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

pym/_emerge/actions.py
pym/_emerge/depgraph.py
pym/portage/__init__.py

index 5f3d388ff94d5dd38b11290be8fe6ecf506eb559..4846930733d4f321d374f393bc5dd1a0c7ba4e6c 100644 (file)
@@ -595,7 +595,6 @@ def calc_depclean(settings, trees, ldpath_mtimes,
        myroot = settings["ROOT"]
        root_config = trees[myroot]["root_config"]
        psets = root_config.setconfig.psets
-       vardb = trees[myroot]["vartree"].dbapi
        deselect = myopts.get('--deselect') != 'n'
 
        required_set_stack = ["world"]
@@ -647,6 +646,7 @@ def calc_depclean(settings, trees, ldpath_mtimes,
        writemsg_level("\nCalculating dependencies  ")
        resolver_params = create_depgraph_params(myopts, "remove")
        resolver = depgraph(settings, trees, myopts, resolver_params, spinner)
+       resolver._load_vdb()
        vardb = resolver._frozen_config.trees[myroot]["vartree"].dbapi
 
        if action == "depclean":
index 93beb83b248b63c713c69e65f1582d5395bc95d1..eb8121053c7a51ce0b8a7d0191f7e70d13f0269f 100644 (file)
@@ -4691,7 +4691,11 @@ class depgraph(object):
                                        # an argument or a direct member of a set that has
                                        # been specified as an argument (system or world).
                                        if current_node not in self._dynamic_config._set_nodes:
-                                               parent_nodes = mygraph.parent_nodes(current_node)
+                                               try:
+                                                       parent_nodes = mygraph.parent_nodes(current_node)
+                                               except KeyError:
+                                                       # This can happen sometimes for blockers.
+                                                       pass
                                        if parent_nodes:
                                                child_nodes = set(mygraph.child_nodes(current_node))
                                                selected_parent = None
index 03247b46ed758d51ef4773705adde5bb7d990764..58d1bd6741589692e4ee88b2918374e247a72d6b 100644 (file)
@@ -7600,10 +7600,17 @@ def movefile(src, dest, newmtime=None, sstat=None, mysettings=None,
                if hardlinked:
                        newmtime = long(os.stat(dest).st_mtime)
                else:
+                       # Note: It is not possible to preserve nanosecond precision
+                       # (supported in POSIX.1-2008 via utimensat) with the IEEE 754
+                       # double precision float which only has a 53 bit significand.
                        if newmtime is not None:
                                os.utime(dest, (newmtime, newmtime))
                        else:
-                               os.utime(dest, (sstat.st_atime, sstat.st_mtime))
+                               if renamefailed:
+                                       # If rename succeeded then this is not necessary, since
+                                       # rename automatically preserves timestamps with complete
+                                       # precision.
+                                       os.utime(dest, (sstat.st_atime, sstat.st_mtime))
                                newmtime = long(sstat.st_mtime)
        except OSError:
                # The utime can fail here with EPERM even though the move succeeded.