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"]
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":
# 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
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.