| OLD | NEW |
| 1 # Copyright (C) 2011 Google Inc. All rights reserved. | 1 # Copyright (C) 2011 Google Inc. All rights reserved. |
| 2 # | 2 # |
| 3 # Redistribution and use in source and binary forms, with or without | 3 # Redistribution and use in source and binary forms, with or without |
| 4 # modification, are permitted provided that the following conditions are | 4 # modification, are permitted provided that the following conditions are |
| 5 # met: | 5 # met: |
| 6 # | 6 # |
| 7 # * Redistributions of source code must retain the above copyright | 7 # * Redistributions of source code must retain the above copyright |
| 8 # notice, this list of conditions and the following disclaimer. | 8 # notice, this list of conditions and the following disclaimer. |
| 9 # * Redistributions in binary form must reproduce the above | 9 # * Redistributions in binary form must reproduce the above |
| 10 # copyright notice, this list of conditions and the following disclaimer | 10 # copyright notice, this list of conditions and the following disclaimer |
| (...skipping 29 matching lines...) Expand all Loading... |
| 40 """The most common human-readable order in which the configuration prope
rties are listed.""" | 40 """The most common human-readable order in which the configuration prope
rties are listed.""" |
| 41 return ['version', 'architecture', 'build_type'] | 41 return ['version', 'architecture', 'build_type'] |
| 42 | 42 |
| 43 def items(self): | 43 def items(self): |
| 44 return self.__dict__.items() | 44 return self.__dict__.items() |
| 45 | 45 |
| 46 def keys(self): | 46 def keys(self): |
| 47 return self.__dict__.keys() | 47 return self.__dict__.keys() |
| 48 | 48 |
| 49 def __str__(self): | 49 def __str__(self): |
| 50 return ("<%(version)s, %(architecture)s, %(build_type)s>" % | 50 return ("<%(version)s, %(architecture)s, %(build_type)s>" % self.__dict_
_) |
| 51 self.__dict__) | |
| 52 | 51 |
| 53 def __repr__(self): | 52 def __repr__(self): |
| 54 return "TestConfig(version='%(version)s', architecture='%(architecture)s
', build_type='%(build_type)s')" % self.__dict__ | 53 return "TestConfig(version='%(version)s', architecture='%(architecture)s
', build_type='%(build_type)s')" % self.__dict__ |
| 55 | 54 |
| 56 def __hash__(self): | 55 def __hash__(self): |
| 57 return hash(self.version + self.architecture + self.build_type) | 56 return hash(self.version + self.architecture + self.build_type) |
| 58 | 57 |
| 59 def __eq__(self, other): | 58 def __eq__(self, other): |
| 60 return self.__hash__() == other.__hash__() | 59 return self.__hash__() == other.__hash__() |
| 61 | 60 |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 126 # FIXME: This seems extra-awful. | 125 # FIXME: This seems extra-awful. |
| 127 for cat2, spec2 in configuration.items(): | 126 for cat2, spec2 in configuration.items(): |
| 128 if category == cat2: | 127 if category == cat2: |
| 129 continue | 128 continue |
| 130 matching_sets_by_category.setdefault(specifier, {}).setdefau
lt(cat2, set()).add(spec2) | 129 matching_sets_by_category.setdefault(specifier, {}).setdefau
lt(cat2, set()).add(spec2) |
| 131 for collapsing_set in self._collapsing_sets_by_category.values(): | 130 for collapsing_set in self._collapsing_sets_by_category.values(): |
| 132 self._collapsing_sets_by_size.setdefault(len(collapsing_set), set())
.add(frozenset(collapsing_set)) | 131 self._collapsing_sets_by_size.setdefault(len(collapsing_set), set())
.add(frozenset(collapsing_set)) |
| 133 | 132 |
| 134 for specifier, sets_by_category in matching_sets_by_category.items(): | 133 for specifier, sets_by_category in matching_sets_by_category.items(): |
| 135 for category, set_by_category in sets_by_category.items(): | 134 for category, set_by_category in sets_by_category.items(): |
| 136 if len(set_by_category) == 1 and self._specifier_sorter.category
_priority(category) > self._specifier_sorter.specifier_priority(specifier): | 135 if len(set_by_category) == 1 and self._specifier_sorter.category
_priority( |
| 136 category) > self._specifier_sorter.specifier_priority(sp
ecifier): |
| 137 self._junk_specifier_combinations[specifier] = set_by_catego
ry | 137 self._junk_specifier_combinations[specifier] = set_by_catego
ry |
| 138 | 138 |
| 139 self._specifier_sorter.add_macros(configuration_macros) | 139 self._specifier_sorter.add_macros(configuration_macros) |
| 140 | 140 |
| 141 def specifier_sorter(self): | 141 def specifier_sorter(self): |
| 142 return self._specifier_sorter | 142 return self._specifier_sorter |
| 143 | 143 |
| 144 def _expand_macros(self, specifier): | 144 def _expand_macros(self, specifier): |
| 145 expanded_specifiers = self._configuration_macros.get(specifier) | 145 expanded_specifiers = self._configuration_macros.get(specifier) |
| 146 return expanded_specifiers or [specifier] | 146 return expanded_specifiers or [specifier] |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 275 specifiers_list.remove(item) | 275 specifiers_list.remove(item) |
| 276 specifiers_list.append(frozenset(common | diff)) | 276 specifiers_list.append(frozenset(common | diff)) |
| 277 return True | 277 return True |
| 278 return False | 278 return False |
| 279 | 279 |
| 280 # 3) Abbreviate specifier sets by combining specifiers across categories
. | 280 # 3) Abbreviate specifier sets by combining specifiers across categories
. |
| 281 # (win7, release), (win10, release) --> (win7, win10, release) | 281 # (win7, release), (win10, release) --> (win7, win10, release) |
| 282 while try_abbreviating(self._collapsing_sets_by_size.values()): | 282 while try_abbreviating(self._collapsing_sets_by_size.values()): |
| 283 pass | 283 pass |
| 284 | 284 |
| 285 | |
| 286 # 4) Substitute specifier subsets that match macros witin each set: | 285 # 4) Substitute specifier subsets that match macros witin each set: |
| 287 # (win7, win10, release) -> (win, release) | 286 # (win7, win10, release) -> (win, release) |
| 288 self.collapse_macros(self._configuration_macros, specifiers_list) | 287 self.collapse_macros(self._configuration_macros, specifiers_list) |
| 289 | 288 |
| 290 macro_keys = set(self._configuration_macros.keys()) | 289 macro_keys = set(self._configuration_macros.keys()) |
| 291 | 290 |
| 292 # 5) Collapsing macros may have created combinations the can now be abbr
eviated. | 291 # 5) Collapsing macros may have created combinations the can now be abbr
eviated. |
| 293 # (win7, release), (linux, x86, release), (linux, x86_64, release) -->
(win7, release), (linux, release) --> (win7, linux, release) | 292 # (win7, release), (linux, x86, release), (linux, x86_64, release) -->
(win7, release), (linux, release) --> (win7, linux, release) |
| 294 while try_abbreviating([self._collapsing_sets_by_category['version'] | m
acro_keys]): | 293 while try_abbreviating([self._collapsing_sets_by_category['version'] | m
acro_keys]): |
| 295 pass | 294 pass |
| 296 | 295 |
| 297 # 6) Remove cases where we have collapsed but have all macros. | 296 # 6) Remove cases where we have collapsed but have all macros. |
| 298 # (android, win, mac, linux, release) --> (release) | 297 # (android, win, mac, linux, release) --> (release) |
| 299 specifiers_to_remove = [] | 298 specifiers_to_remove = [] |
| 300 for specifier_set in specifiers_list: | 299 for specifier_set in specifiers_list: |
| 301 if macro_keys <= specifier_set: | 300 if macro_keys <= specifier_set: |
| 302 specifiers_to_remove.append(specifier_set) | 301 specifiers_to_remove.append(specifier_set) |
| 303 | 302 |
| 304 for specifier_set in specifiers_to_remove: | 303 for specifier_set in specifiers_to_remove: |
| 305 specifiers_list.remove(specifier_set) | 304 specifiers_list.remove(specifier_set) |
| 306 specifiers_list.append(frozenset(specifier_set - macro_keys)) | 305 specifiers_list.append(frozenset(specifier_set - macro_keys)) |
| 307 | 306 |
| 308 return specifiers_list | 307 return specifiers_list |
| OLD | NEW |