mirror of
				https://git.launchpad.net/~ubuntu-release/britney/+git/britney2-ubuntu
				synced 2025-10-31 08:34:04 +00:00 
			
		
		
		
	Make "Keep-installable" constraints overrule nuninst counters
If there is a regression in "present-and-installable" constraints (on non-break architectures), then discard the item even if the nuninst counters have improved. Signed-off-by: Niels Thykier <niels@thykier.net>
This commit is contained in:
		
							parent
							
								
									f3e37faf7e
								
							
						
					
					
						commit
						7ccbfe2fdf
					
				
							
								
								
									
										24
									
								
								britney.py
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								britney.py
									
									
									
									
									
								
							| @ -506,6 +506,10 @@ class Britney(object): | |||||||
|         no = 0 |         no = 0 | ||||||
|         faux_version = sys.intern('1') |         faux_version = sys.intern('1') | ||||||
|         faux_section = sys.intern('faux') |         faux_section = sys.intern('faux') | ||||||
|  |         keep_installable = [] | ||||||
|  |         constraints = { | ||||||
|  |             'keep-installable': keep_installable | ||||||
|  |         } | ||||||
| 
 | 
 | ||||||
|         while step(): |         while step(): | ||||||
|             no += 1 |             no += 1 | ||||||
| @ -535,6 +539,7 @@ class Britney(object): | |||||||
|                         ] |                         ] | ||||||
|             self.sources['testing'][pkg_name] = src_data |             self.sources['testing'][pkg_name] = src_data | ||||||
|             self.sources['unstable'][pkg_name] = src_data |             self.sources['unstable'][pkg_name] = src_data | ||||||
|  |             keep_installable.append(pkg_name) | ||||||
|             for arch in self.options.architectures: |             for arch in self.options.architectures: | ||||||
|                 deps = [] |                 deps = [] | ||||||
|                 for pkg_spec in pkg_list: |                 for pkg_spec in pkg_list: | ||||||
| @ -573,6 +578,8 @@ class Britney(object): | |||||||
|                 self.binaries['unstable'][arch][0][pkg_name] = bin_data |                 self.binaries['unstable'][arch][0][pkg_name] = bin_data | ||||||
|                 self.all_binaries[pkg_id] = bin_data |                 self.all_binaries[pkg_id] = bin_data | ||||||
| 
 | 
 | ||||||
|  |         return constraints | ||||||
|  | 
 | ||||||
|     def _build_installability_tester(self, archs): |     def _build_installability_tester(self, archs): | ||||||
|         """Create the installability tester""" |         """Create the installability tester""" | ||||||
| 
 | 
 | ||||||
| @ -2258,6 +2265,7 @@ class Britney(object): | |||||||
|         # removed by the item would still be counted. |         # removed by the item would still be counted. | ||||||
| 
 | 
 | ||||||
|         nuninst_after = clone_nuninst(nuninst_now, packages_t, affected_architectures) |         nuninst_after = clone_nuninst(nuninst_now, packages_t, affected_architectures) | ||||||
|  |         must_be_installable = self.constraints['keep-installable'] | ||||||
| 
 | 
 | ||||||
|         # check the affected packages on all the architectures |         # check the affected packages on all the architectures | ||||||
|         for arch in affected_architectures: |         for arch in affected_architectures: | ||||||
| @ -2267,10 +2275,17 @@ class Britney(object): | |||||||
|                                  check_archall, nuninst_after) |                                  check_archall, nuninst_after) | ||||||
| 
 | 
 | ||||||
|             # if the uninstallability counter is worse than before, break the loop |             # if the uninstallability counter is worse than before, break the loop | ||||||
|             if automatic_revert and len(nuninst_after[arch]) > len(nuninst_now[arch]): |             if automatic_revert: | ||||||
|  |                 worse = False | ||||||
|  |                 if len(nuninst_after[arch]) > len(nuninst_now[arch]): | ||||||
|  |                     worse = True | ||||||
|  |                 else: | ||||||
|  |                     regression = nuninst_after[arch] - nuninst_now[arch] | ||||||
|  |                     if not regression.isdisjoint(must_be_installable): | ||||||
|  |                         worse = True | ||||||
|                 # ... except for a few special cases |                 # ... except for a few special cases | ||||||
|                 if (item.architecture != 'source' and arch not in new_arches) or \ |                 if worse and ((item.architecture != 'source' and arch not in new_arches) or | ||||||
|                    (arch not in break_arches): |                    (arch not in break_arches)): | ||||||
|                     is_accepted = False |                     is_accepted = False | ||||||
|                     break |                     break | ||||||
| 
 | 
 | ||||||
| @ -2446,7 +2461,8 @@ class Britney(object): | |||||||
|                 # do not allow any regressions on these architectures. |                 # do not allow any regressions on these architectures. | ||||||
|                 # This usually only happens with hints |                 # This usually only happens with hints | ||||||
|                 break_arches = set() |                 break_arches = set() | ||||||
|             better = is_nuninst_asgood_generous(self.options.architectures, |             better = is_nuninst_asgood_generous(self.constraints, | ||||||
|  |                                                 self.options.architectures, | ||||||
|                                                 self.nuninst_orig, |                                                 self.nuninst_orig, | ||||||
|                                                 nuninst_end, |                                                 nuninst_end, | ||||||
|                                                 break_arches) |                                                 break_arches) | ||||||
|  | |||||||
| @ -488,17 +488,21 @@ def old_libraries(sources, packages, fucked_arches=frozenset()): | |||||||
|     return removals |     return removals | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def is_nuninst_asgood_generous(architectures, old, new, break_arches=frozenset()): | def is_nuninst_asgood_generous(constraints, architectures, old, new, break_arches=frozenset()): | ||||||
|     """Compares the nuninst counters to see if they improved |     """Compares the nuninst counters and constraints to see if they improved | ||||||
| 
 | 
 | ||||||
|     Given a list of architecters, the previous and the current nuninst |     Given a list of architectures, the previous and the current nuninst | ||||||
|     counters, this function determines if the current nuninst counter |     counters, this function determines if the current nuninst counter | ||||||
|     is better than the previous one.  Optionally it also accepts a set |     is better than the previous one.  Optionally it also accepts a set | ||||||
|     of "break_arches", the nuninst counter for any architecture listed |     of "break_arches", the nuninst counter for any architecture listed | ||||||
|     in this set are completely ignored. |     in this set are completely ignored. | ||||||
| 
 | 
 | ||||||
|  |     If the nuninst counters are equal or better, then the constraints | ||||||
|  |     are checked for regressions (ignoring break_arches). | ||||||
|  | 
 | ||||||
|     Returns True if the new nuninst counter is better than the |     Returns True if the new nuninst counter is better than the | ||||||
|     previous.  Returns False otherwise. |     previous and there are no constraint regressions (ignoring Break-archs). | ||||||
|  |     Returns False otherwise. | ||||||
| 
 | 
 | ||||||
|     """ |     """ | ||||||
|     diff = 0 |     diff = 0 | ||||||
| @ -506,7 +510,16 @@ def is_nuninst_asgood_generous(architectures, old, new, break_arches=frozenset() | |||||||
|         if arch in break_arches: |         if arch in break_arches: | ||||||
|             continue |             continue | ||||||
|         diff = diff + (len(new[arch]) - len(old[arch])) |         diff = diff + (len(new[arch]) - len(old[arch])) | ||||||
|     return diff <= 0 |     if diff > 0: | ||||||
|  |         return False | ||||||
|  |     must_be_installable = constraints['keep-installable'] | ||||||
|  |     for arch in architectures: | ||||||
|  |         if arch in break_arches: | ||||||
|  |             continue | ||||||
|  |         regression = new[arch] - old[arch] | ||||||
|  |         if not regression.isdisjoint(must_be_installable): | ||||||
|  |             return False | ||||||
|  |     return True | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def clone_nuninst(nuninst, packages_s, architectures): | def clone_nuninst(nuninst, packages_s, architectures): | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user