diff options
author | Zac Medico <zmedico@gentoo.org> | 2010-03-02 20:26:08 +0000 |
---|---|---|
committer | Zac Medico <zmedico@gentoo.org> | 2010-03-02 20:26:08 +0000 |
commit | 16891c2aee866c2074198cc50b12254f040e9be1 (patch) | |
tree | 20501d5b33595cef4818ef14a135a907a19289cd /pym/_emerge/depgraph.py | |
parent | 6cc62aaae04c5032fcfe06b87b96d6e94228a982 (diff) | |
download | portage-16891c2aee866c2074198cc50b12254f040e9be1.tar.gz portage-16891c2aee866c2074198cc50b12254f040e9be1.tar.bz2 portage-16891c2aee866c2074198cc50b12254f040e9be1.zip |
Add a --rebuilt-binaries[=n] option, causing automatic replacement of
installed packages with binary packages that have been rebuilt. Rebuilds
are detected by comparison of BUILD_TIME package metadata. This option is
enabled automatically when using binary packages, so rebuilt binaries are
installed with a user's typical update command. This isn't possible with
the existing @rebuild-binaries package set since that only works with
--selective=n and therefore can't be used with a typical world update.
The package set framework should support this type of behavior sometime
in the future. (trunk r15364)
svn path=/main/branches/2.1.7/; revision=15591
Diffstat (limited to 'pym/_emerge/depgraph.py')
-rw-r--r-- | pym/_emerge/depgraph.py | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/pym/_emerge/depgraph.py b/pym/_emerge/depgraph.py index c53abb87a..d297986ab 100644 --- a/pym/_emerge/depgraph.py +++ b/pym/_emerge/depgraph.py @@ -2396,6 +2396,9 @@ class depgraph(object): atom_set = InternalPackageSet(initial_atoms=(atom,)) existing_node = None myeb = None + usepkg = "--usepkg" in self._frozen_config.myopts + rebuilt_binaries = usepkg and \ + self._frozen_config.myopts.get('--rebuilt-binaries') != 'n' usepkgonly = "--usepkgonly" in self._frozen_config.myopts empty = "empty" in self._dynamic_config.myparams selective = "selective" in self._dynamic_config.myparams @@ -2615,10 +2618,26 @@ class depgraph(object): if pkg.cp == cp] break + if existing_node is not None and \ + existing_node in matched_packages: + return existing_node, existing_node + if len(matched_packages) > 1: + if rebuilt_binaries: + inst_pkg = None + built_pkg = None + for pkg in matched_packages: + if pkg.installed: + inst_pkg = pkg + elif pkg.built: + built_pkg = pkg + if built_pkg is not None and inst_pkg is not None: + if built_pkg >= inst_pkg and \ + built_pkg.metadata['BUILD_TIME'] != \ + inst_pkg.metadata['BUILD_TIME']: + return built_pkg, built_pkg + if avoid_update: - if existing_node is not None: - return existing_node, existing_node for pkg in matched_packages: if pkg.installed: return pkg, existing_node |