@@ -109,6 +109,37 @@ def get_changed_files():
109109 return None
110110
111111
112+ def reverse_map (dict_of_sets ):
113+ """Reverse a map of one-to-many.
114+
115+ So the map::
116+
117+ {
118+ 'A': {'B', 'C'},
119+ 'B': {'C'},
120+ }
121+
122+ becomes
123+
124+ {
125+ 'B': {'A'},
126+ 'C': {'A', 'B'},
127+ }
128+
129+ Args:
130+ dict_of_sets (dict[set]): A dictionary of sets, mapping
131+ one value to many.
132+
133+ Returns:
134+ dict[set]: The reversed map.
135+ """
136+ result = {}
137+ for key , values in dict_of_sets .items ():
138+ for value in values :
139+ result .setdefault (value , set ()).add (key )
140+
141+ return result
142+
112143def get_changed_packages (file_list ):
113144 """Return a list of changed packages based on the provided file list.
114145
@@ -129,6 +160,7 @@ def get_changed_packages(file_list):
129160
130161 # Create a set based on the list of changed files.
131162 answer = set ()
163+ reverse_deps = reverse_map (PKG_DEPENDENCIES )
132164 for file_ in file_list :
133165 # Ignore root directory changes (setup.py, .gitignore, etc.).
134166 if os .path .sep not in file_ :
@@ -147,7 +179,7 @@ def get_changed_packages(file_list):
147179 # Add the package, as well as any dependencies this package has.
148180 # NOTE: For now, dependencies only go down one level.
149181 answer .add (package )
150- answer = answer .union (PKG_DEPENDENCIES .get (package , set ()))
182+ answer = answer .union (reverse_deps .get (package , set ()))
151183
152184 # We got this far without being short-circuited; return the final answer.
153185 return answer
0 commit comments