From bb4abd738a636867870f037abef55dc5d8d63258 Mon Sep 17 00:00:00 2001 From: Fabian Groffen Date: Sun, 6 Dec 2009 10:30:18 +0000 Subject: [PATCH] Merged from trunk -r14896:14906 | 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 | | | 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 | 2 +- pym/_emerge/depgraph.py | 6 +++++- pym/portage/__init__.py | 9 ++++++++- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/pym/_emerge/actions.py b/pym/_emerge/actions.py index 5f3d388ff..484693073 100644 --- a/pym/_emerge/actions.py +++ b/pym/_emerge/actions.py @@ -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": diff --git a/pym/_emerge/depgraph.py b/pym/_emerge/depgraph.py index 93beb83b2..eb8121053 100644 --- a/pym/_emerge/depgraph.py +++ b/pym/_emerge/depgraph.py @@ -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 diff --git a/pym/portage/__init__.py b/pym/portage/__init__.py index 03247b46e..58d1bd674 100644 --- a/pym/portage/__init__.py +++ b/pym/portage/__init__.py @@ -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. -- 2.26.2