From 27447a971dfdd1a7175d734300b283ebb082abc8 Mon Sep 17 00:00:00 2001 From: Adam Simpkins Date: Fri, 9 Aug 2019 11:17:35 -0700 Subject: [PATCH] getdeps: make sure ManifestLoader never reloads manifests Summary: In response to review feedback for D16477400 and D16477401, update `ManifestLoader.load_all_manifests()` to only update its data for projects that have not previously been loaded. This helps ensure that code using a single `ManifestLoader` object cannot have two in-memory `Manifest` objects for the same project, and that existing data (such as project hashes) can't be invalidated if a manifest is later loaded from updated on-disk data. Reviewed By: pkaush Differential Revision: D16586682 fbshipit-source-id: 50b1979ec55f2ad6901629cd852293a8f6ca903f --- build/fbcode_builder/getdeps/load.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/build/fbcode_builder/getdeps/load.py b/build/fbcode_builder/getdeps/load.py index 9f0759c56..17dc1c6d4 100644 --- a/build/fbcode_builder/getdeps/load.py +++ b/build/fbcode_builder/getdeps/load.py @@ -115,7 +115,15 @@ class ManifestLoader(object): def load_all_manifests(self): if not self._loaded_all: - self.manifests_by_name = self._loader.load_all(self.build_opts) + all_manifests_by_name = self._loader.load_all(self.build_opts) + if self.manifests_by_name: + # To help ensure that we only ever have a single manifest object for a + # given project, and that it can't change once we have loaded it, + # only update our mapping for projects that weren't already loaded. + for name, manifest in all_manifests_by_name.items(): + self.manifests_by_name.setdefault(name, manifest) + else: + self.manifests_by_name = all_manifests_by_name self._loaded_all = True return self.manifests_by_name