diff options
-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): |