diff options
author | Zac Medico <zmedico@gentoo.org> | 2008-11-11 19:59:49 +0000 |
---|---|---|
committer | Zac Medico <zmedico@gentoo.org> | 2008-11-11 19:59:49 +0000 |
commit | c07a9eee5040025d68121e41943929a96e0421c4 (patch) | |
tree | be0ea8ccc79e92ec29d68a0bdcdbbe6d16b1308a | |
parent | 7fda15ffe221c8a4946aba3a10cc3c068616d797 (diff) | |
download | portage-c07a9eee5040025d68121e41943929a96e0421c4.tar.gz portage-c07a9eee5040025d68121e41943929a96e0421c4.tar.bz2 portage-c07a9eee5040025d68121e41943929a96e0421c4.zip |
Make post_emerge() exit early if it detects that the vdb state hasn't changed.v2.2_rc14
This works by comparing a hash of the COUNTER values for all packages in the
vdb.
svn path=/main/trunk/; revision=11859
-rw-r--r-- | pym/_emerge/__init__.py | 9 | ||||
-rw-r--r-- | pym/portage/__init__.py | 1 | ||||
-rw-r--r-- | pym/portage/dbapi/vartree.py | 16 |
3 files changed, 26 insertions, 0 deletions
diff --git a/pym/_emerge/__init__.py b/pym/_emerge/__init__.py index c5084ac7b..14a63a492 100644 --- a/pym/_emerge/__init__.py +++ b/pym/_emerge/__init__.py @@ -11236,6 +11236,12 @@ def post_emerge(root_config, myopts, mtimedb, retval): _flush_elog_mod_echo() + counter_hash = settings.get("PORTAGE_COUNTER_HASH") + if counter_hash is not None and \ + counter_hash == vardbapi._counter_hash(): + # If vdb state has not changed then there's nothing else to do. + sys.exit(retval) + vdb_path = os.path.join(target_root, portage.VDB_PATH) portage.util.ensure_dirs(vdb_path) vdb_lock = None @@ -13830,6 +13836,9 @@ def emerge_main(): mysettings = trees[myroot]["vartree"].settings mysettings.unlock() adjust_config(myopts, mysettings) + mysettings["PORTAGE_COUNTER_HASH"] = \ + trees[myroot]["vartree"].dbapi._counter_hash() + mysettings.backup_changes("PORTAGE_COUNTER_HASH") mysettings.lock() del myroot, mysettings diff --git a/pym/portage/__init__.py b/pym/portage/__init__.py index 485a2d426..8c8c99ebc 100644 --- a/pym/portage/__init__.py +++ b/pym/portage/__init__.py @@ -1002,6 +1002,7 @@ class config(object): "GENTOO_MIRRORS", "NOCONFMEM", "O", "PORTAGE_BACKGROUND", "PORTAGE_BINHOST_CHUNKSIZE", "PORTAGE_CALLER", + "PORTAGE_COUNTER_HASH", "PORTAGE_ECLASS_WARNING_ENABLE", "PORTAGE_ELOG_CLASSES", "PORTAGE_ELOG_MAILFROM", "PORTAGE_ELOG_MAILSUBJECT", "PORTAGE_ELOG_MAILURI", "PORTAGE_ELOG_SYSTEM", diff --git a/pym/portage/dbapi/vartree.py b/pym/portage/dbapi/vartree.py index 1d5c8fe26..c3628491d 100644 --- a/pym/portage/dbapi/vartree.py +++ b/pym/portage/dbapi/vartree.py @@ -773,6 +773,21 @@ class vardbapi(dbapi): level=logging.ERROR, noiselevel=-1) return 0 + def _counter_hash(self): + try: + from hashlib import md5 as new_hash + except ImportError: + from md5 import new as new_hash + h = new_hash() + aux_keys = ["COUNTER"] + for cpv in self.cpv_all(): + try: + counter, = self.aux_get(cpv, aux_keys) + except KeyError: + continue + h.update(counter) + return h.hexdigest() + def cpv_inject(self, mycpv): "injects a real package into our on-disk database; assumes mycpv is valid and doesn't already exist" os.makedirs(self.getpath(mycpv)) @@ -916,6 +931,7 @@ class vardbapi(dbapi): self.invalidentry(self.getpath(subpath)) continue returnme.append(subpath) + returnme.sort() return returnme def cp_all(self, use_cache=1): |