| OLD | NEW | 
|---|
| 1 # Copyright 2010 Gentoo Foundation | 1 # Copyright 2010 Gentoo Foundation | 
| 2 # Distributed under the terms of the GNU General Public License v2 | 2 # Distributed under the terms of the GNU General Public License v2 | 
| 3 | 3 | 
| 4 import copy | 4 import copy | 
| 5 | 5 | 
| 6 class BacktrackParameter(object): | 6 class BacktrackParameter(object): | 
| 7 | 7 | 
| 8         __slots__ = ( | 8         __slots__ = ( | 
| 9                 "needed_unstable_keywords", "runtime_pkg_mask", "needed_use_conf
     ig_changes", "needed_license_changes", | 9                 "needed_unstable_keywords", "runtime_pkg_mask", "needed_use_conf
     ig_changes", "needed_license_changes", | 
|  | 10                 "rebuild_list", "reinstall_list" | 
| 10         ) | 11         ) | 
| 11 | 12 | 
| 12         def __init__(self): | 13         def __init__(self): | 
| 13                 self.needed_unstable_keywords = set() | 14                 self.needed_unstable_keywords = set() | 
| 14                 self.runtime_pkg_mask = {} | 15                 self.runtime_pkg_mask = {} | 
| 15                 self.needed_use_config_changes = {} | 16                 self.needed_use_config_changes = {} | 
| 16                 self.needed_license_changes = {} | 17                 self.needed_license_changes = {} | 
|  | 18                 self.rebuild_list = set() | 
|  | 19                 self.reinstall_list = set() | 
| 17 | 20 | 
| 18         def __deepcopy__(self, memo=None): | 21         def __deepcopy__(self, memo=None): | 
| 19                 if memo is None: | 22                 if memo is None: | 
| 20                         memo = {} | 23                         memo = {} | 
| 21                 result = BacktrackParameter() | 24                 result = BacktrackParameter() | 
| 22                 memo[id(self)] = result | 25                 memo[id(self)] = result | 
| 23 | 26 | 
| 24                 #Shallow copies are enough here, as we only need to ensure that 
     nobody adds stuff | 27                 #Shallow copies are enough here, as we only need to ensure that 
     nobody adds stuff | 
| 25                 #to our sets and dicts. The existing content is immutable. | 28                 #to our sets and dicts. The existing content is immutable. | 
| 26                 result.needed_unstable_keywords = copy.copy(self.needed_unstable
     _keywords) | 29                 result.needed_unstable_keywords = copy.copy(self.needed_unstable
     _keywords) | 
| 27                 result.runtime_pkg_mask = copy.copy(self.runtime_pkg_mask) | 30                 result.runtime_pkg_mask = copy.copy(self.runtime_pkg_mask) | 
| 28                 result.needed_use_config_changes = copy.copy(self.needed_use_con
     fig_changes) | 31                 result.needed_use_config_changes = copy.copy(self.needed_use_con
     fig_changes) | 
| 29                 result.needed_license_changes = copy.copy(self.needed_license_ch
     anges) | 32                 result.needed_license_changes = copy.copy(self.needed_license_ch
     anges) | 
|  | 33                 result.rebuild_list = copy.copy(self.rebuild_list) | 
|  | 34                 result.reinstall_list = copy.copy(self.reinstall_list) | 
| 30 | 35 | 
| 31                 return result | 36                 return result | 
| 32 | 37 | 
| 33         def __eq__(self, other): | 38         def __eq__(self, other): | 
| 34                 return self.needed_unstable_keywords == other.needed_unstable_ke
     ywords and \ | 39                 return self.needed_unstable_keywords == other.needed_unstable_ke
     ywords and \ | 
| 35                         self.runtime_pkg_mask == other.runtime_pkg_mask and \ | 40                         self.runtime_pkg_mask == other.runtime_pkg_mask and \ | 
| 36                         self.needed_use_config_changes == other.needed_use_confi
     g_changes and \ | 41                         self.needed_use_config_changes == other.needed_use_confi
     g_changes and \ | 
| 37 »       »       »       self.needed_license_changes == other.needed_license_chan
     ges | 42 »       »       »       self.needed_license_changes == other.needed_license_chan
     ges and \ | 
|  | 43 »       »       »       self.rebuild_list == other.rebuild_list and \ | 
|  | 44 »       »       »       self.reinstall_list == other.reinstall_list | 
| 38 | 45 | 
| 39 | 46 | 
| 40 class _BacktrackNode: | 47 class _BacktrackNode: | 
| 41 | 48 | 
| 42         __slots__ = ( | 49         __slots__ = ( | 
| 43                 "parameter", "depth", "mask_steps", "terminal", | 50                 "parameter", "depth", "mask_steps", "terminal", | 
| 44         ) | 51         ) | 
| 45 | 52 | 
| 46         def __init__(self, parameter=BacktrackParameter(), depth=0, mask_steps=0
     , terminal=True): | 53         def __init__(self, parameter=BacktrackParameter(), depth=0, mask_steps=0
     , terminal=True): | 
| 47                 self.parameter = parameter | 54                 self.parameter = parameter | 
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 130 | 137 | 
| 131                 for change, data in changes.items(): | 138                 for change, data in changes.items(): | 
| 132                         if change == "needed_unstable_keywords": | 139                         if change == "needed_unstable_keywords": | 
| 133                                 para.needed_unstable_keywords.update(data) | 140                                 para.needed_unstable_keywords.update(data) | 
| 134                         elif change == "needed_license_changes": | 141                         elif change == "needed_license_changes": | 
| 135                                 for pkg, missing_licenses in data: | 142                                 for pkg, missing_licenses in data: | 
| 136                                         para.needed_license_changes.setdefault(p
     kg, set()).update(missing_licenses) | 143                                         para.needed_license_changes.setdefault(p
     kg, set()).update(missing_licenses) | 
| 137                         elif change == "needed_use_config_changes": | 144                         elif change == "needed_use_config_changes": | 
| 138                                 for pkg, (new_use, new_changes) in data: | 145                                 for pkg, (new_use, new_changes) in data: | 
| 139                                         para.needed_use_config_changes[pkg] = (n
     ew_use, new_changes) | 146                                         para.needed_use_config_changes[pkg] = (n
     ew_use, new_changes) | 
|  | 147                         elif change == "rebuild_list": | 
|  | 148                                 para.rebuild_list.update(data) | 
|  | 149                         elif change == "reinstall_list": | 
|  | 150                                 para.reinstall_list.update(data) | 
| 140 | 151 | 
| 141                 self._add(new_node, explore=explore) | 152                 self._add(new_node, explore=explore) | 
| 142                 self._current_node = new_node | 153                 self._current_node = new_node | 
| 143 | 154 | 
| 144 | 155 | 
| 145         def feedback(self, infos): | 156         def feedback(self, infos): | 
| 146                 """ | 157                 """ | 
| 147                 Takes information from the depgraph and computes new backtrack p
     arameters to try. | 158                 Takes information from the depgraph and computes new backtrack p
     arameters to try. | 
| 148                 """ | 159                 """ | 
| 149                 assert self._current_node is not None, "call feedback() only aft
     er get() was called" | 160                 assert self._current_node is not None, "call feedback() only aft
     er get() was called" | 
| (...skipping 22 matching lines...) Expand all  Loading... | 
| 172                 Like, get() but returns the backtrack parameter that has as many
      config changes as possible, | 183                 Like, get() but returns the backtrack parameter that has as many
      config changes as possible, | 
| 173                 but has no masks. This makes --autounmask effective, but prevent
     s confusing error messages | 184                 but has no masks. This makes --autounmask effective, but prevent
     s confusing error messages | 
| 174                 with "masked by backtracking". | 185                 with "masked by backtracking". | 
| 175                 """ | 186                 """ | 
| 176                 best_node = self._root | 187                 best_node = self._root | 
| 177                 for node in self._nodes: | 188                 for node in self._nodes: | 
| 178                         if node.terminal and node.depth > best_node.depth: | 189                         if node.terminal and node.depth > best_node.depth: | 
| 179                                 best_node = node | 190                                 best_node = node | 
| 180 | 191 | 
| 181                 return copy.deepcopy(best_node.parameter) | 192                 return copy.deepcopy(best_node.parameter) | 
| OLD | NEW | 
|---|