mirror of
				https://git.launchpad.net/~ubuntu-release/britney/+git/britney2-ubuntu
				synced 2025-11-03 18:14:11 +00:00 
			
		
		
		
	Teach excuse_unsat_deps() about components ogre model
This commit is contained in:
		
							parent
							
								
									158d7ca479
								
							
						
					
					
						commit
						d2cde7de2b
					
				
							
								
								
									
										11
									
								
								britney.py
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								britney.py
									
									
									
									
									
								
							@ -213,7 +213,7 @@ from britney2.utils import (old_libraries_format, undo_changes,
 | 
			
		||||
                            create_provides_map, read_release_file,
 | 
			
		||||
                            read_sources_file, get_dependency_solvers,
 | 
			
		||||
                            invalidate_excuses, compile_nuninst,
 | 
			
		||||
                            ensuredir,
 | 
			
		||||
                            ensuredir, get_component, allowed_component,
 | 
			
		||||
                            )
 | 
			
		||||
 | 
			
		||||
__author__ = 'Fabio Tranchitella and the Debian Release Team'
 | 
			
		||||
@ -1102,11 +1102,16 @@ class Britney(object):
 | 
			
		||||
            return True
 | 
			
		||||
        is_all_ok = True
 | 
			
		||||
 | 
			
		||||
        # Don't check components when testing PPAs, as they do not have this concept
 | 
			
		||||
        if self.options.adt_ppas:
 | 
			
		||||
            component = None
 | 
			
		||||
        else:
 | 
			
		||||
            component = get_component(binary_u.section)
 | 
			
		||||
 | 
			
		||||
        # for every dependency block (formed as conjunction of disjunction)
 | 
			
		||||
        for block, block_txt in zip(parse_depends(deps), deps.split(',')):
 | 
			
		||||
            # if the block is satisfied in testing, then skip the block
 | 
			
		||||
            packages = get_dependency_solvers(block, binaries_t_a, provides_t_a)
 | 
			
		||||
            packages = get_dependency_solvers(block, binaries_t_a, provides_t_a, component=component)
 | 
			
		||||
            if packages:
 | 
			
		||||
                for p in packages:
 | 
			
		||||
                    if p not in binaries_s_a:
 | 
			
		||||
@ -1115,7 +1120,7 @@ class Britney(object):
 | 
			
		||||
                continue
 | 
			
		||||
 | 
			
		||||
            # check if the block can be satisfied in the source suite, and list the solving packages
 | 
			
		||||
            packages = get_dependency_solvers(block, binaries_s_a, provides_s_a)
 | 
			
		||||
            packages = get_dependency_solvers(block, binaries_s_a, provides_s_a, component=component)
 | 
			
		||||
            packages = [binaries_s_a[p].source for p in packages]
 | 
			
		||||
 | 
			
		||||
            # if the dependency can be satisfied by the same source package, skip the block:
 | 
			
		||||
 | 
			
		||||
@ -34,3 +34,9 @@ DEPENDS = 6
 | 
			
		||||
CONFLICTS = 7
 | 
			
		||||
PROVIDES = 8
 | 
			
		||||
ESSENTIAL = 9
 | 
			
		||||
 | 
			
		||||
# components
 | 
			
		||||
MAIN = 0
 | 
			
		||||
RESTRICTED = 1
 | 
			
		||||
UNIVERSE = 2
 | 
			
		||||
MULTIVERSE = 3
 | 
			
		||||
 | 
			
		||||
@ -38,6 +38,7 @@ from britney2.consts import (VERSION, PROVIDES, DEPENDS, CONFLICTS,
 | 
			
		||||
                             ARCHITECTURE, SECTION,
 | 
			
		||||
                             SOURCE, MAINTAINER, MULTIARCH,
 | 
			
		||||
                             ESSENTIAL)
 | 
			
		||||
from britney2.consts import (MAIN, RESTRICTED, UNIVERSE, MULTIVERSE)
 | 
			
		||||
from britney2.migrationitem import MigrationItem, UnversionnedMigrationItem
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -745,13 +746,17 @@ def read_sources_file(filename, sources=None, intern=sys.intern):
 | 
			
		||||
    return sources
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_dependency_solvers(block, binaries_s_a, provides_s_a, *, empty_set=frozenset()):
 | 
			
		||||
def get_dependency_solvers(block, binaries_s_a, provides_s_a, *, empty_set=frozenset(), component=None):
 | 
			
		||||
    """Find the packages which satisfy a dependency block
 | 
			
		||||
 | 
			
		||||
    This method returns the list of packages which satisfy a dependency
 | 
			
		||||
    block (as returned by apt_pkg.parse_depends) in a package table
 | 
			
		||||
    for a given suite and architecture (a la self.binaries[suite][arch])
 | 
			
		||||
 | 
			
		||||
    If component was not specified, use all available (multiverse). This is to
 | 
			
		||||
    avoid britney pretending that a bunch of things are non-installable in
 | 
			
		||||
    release pocket, and start trading components-mismatches things.
 | 
			
		||||
 | 
			
		||||
    :param block: The dependency block as parsed by apt_pkg.parse_depends
 | 
			
		||||
    :param binaries_s_a: A dict mapping package names to the relevant BinaryPackage
 | 
			
		||||
    :param provides_s_a: A dict mapping package names to their providers (as generated by parse_provides)
 | 
			
		||||
@ -774,7 +779,8 @@ def get_dependency_solvers(block, binaries_s_a, provides_s_a, *, empty_set=froze
 | 
			
		||||
            # (if present)
 | 
			
		||||
            if (op == '' and version == '') or apt_pkg.check_dep(package.version, op, version):
 | 
			
		||||
                if archqual is None or (archqual == 'any' and package.multi_arch == 'allowed'):
 | 
			
		||||
                    packages.append(name)
 | 
			
		||||
                    if component is None or allowed_component(component, get_component(package.section)):
 | 
			
		||||
                        packages.append(name)
 | 
			
		||||
 | 
			
		||||
        # look for the package in the virtual packages list and loop on them
 | 
			
		||||
        for prov, prov_version in provides_s_a.get(name, empty_set):
 | 
			
		||||
@ -865,3 +871,34 @@ def compile_nuninst(binaries_t, inst_tester, architectures, nobreakall_arches):
 | 
			
		||||
                    nuninst[arch].remove(pkg_name)
 | 
			
		||||
 | 
			
		||||
    return nuninst
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_component(section):
 | 
			
		||||
    """Parse section and return component
 | 
			
		||||
 | 
			
		||||
    Given a section, return component. Packages in MAIN have no
 | 
			
		||||
    prefix, all others have <component>/ prefix.
 | 
			
		||||
    """
 | 
			
		||||
    name2component = {
 | 
			
		||||
        "restricted": RESTRICTED,
 | 
			
		||||
        "universe": UNIVERSE,
 | 
			
		||||
        "multiverse": MULTIVERSE
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if '/' in section:
 | 
			
		||||
        return name2component[section.split('/', 1)[0]]
 | 
			
		||||
 | 
			
		||||
    return MAIN
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def allowed_component(me, dep):
 | 
			
		||||
    """Check if I can depend on the other component"""
 | 
			
		||||
 | 
			
		||||
    component_dependencies = {
 | 
			
		||||
        MAIN: [MAIN],
 | 
			
		||||
        RESTRICTED: [MAIN, RESTRICTED],
 | 
			
		||||
        UNIVERSE: [MAIN, UNIVERSE],
 | 
			
		||||
        MULTIVERSE: [MAIN, RESTRICTED, UNIVERSE, MULTIVERSE],
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return dep in component_dependencies[me]
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										52
									
								
								tests/test_util.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										52
									
								
								tests/test_util.py
									
									
									
									
									
										Executable file
									
								
							@ -0,0 +1,52 @@
 | 
			
		||||
#!/usr/bin/python3
 | 
			
		||||
# (C) 2014 - 2016 Canonical Ltd.
 | 
			
		||||
#
 | 
			
		||||
# This program is free software; you can redistribute it and/or modify
 | 
			
		||||
# it under the terms of the GNU General Public License as published by
 | 
			
		||||
# the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
# (at your option) any later version.
 | 
			
		||||
 | 
			
		||||
import os
 | 
			
		||||
import sys
 | 
			
		||||
import unittest
 | 
			
		||||
 | 
			
		||||
PROJECT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
 | 
			
		||||
sys.path.insert(0, PROJECT_DIR)
 | 
			
		||||
 | 
			
		||||
from britney2.utils import get_component, allowed_component
 | 
			
		||||
from britney2.consts import MAIN, RESTRICTED, UNIVERSE, MULTIVERSE
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class UtilTests(unittest.TestCase):
 | 
			
		||||
 | 
			
		||||
    def test_get_component(self):
 | 
			
		||||
        self.assertEqual(get_component('utils'), MAIN)
 | 
			
		||||
        self.assertEqual(get_component('utils'), MAIN)
 | 
			
		||||
        self.assertEqual(get_component('restricted/admin'), RESTRICTED)
 | 
			
		||||
        self.assertEqual(get_component('universe/web'), UNIVERSE)
 | 
			
		||||
        self.assertEqual(get_component('multiverse/libs'), MULTIVERSE)
 | 
			
		||||
 | 
			
		||||
    def test_allowed_component(self):
 | 
			
		||||
        self.assertTrue(allowed_component(MAIN, MAIN))
 | 
			
		||||
        self.assertFalse(allowed_component(MAIN, UNIVERSE))
 | 
			
		||||
        self.assertFalse(allowed_component(MAIN, MULTIVERSE))
 | 
			
		||||
        self.assertFalse(allowed_component(MAIN, RESTRICTED))
 | 
			
		||||
 | 
			
		||||
        self.assertTrue(allowed_component(RESTRICTED, MAIN))
 | 
			
		||||
        self.assertFalse(allowed_component(RESTRICTED, UNIVERSE))
 | 
			
		||||
        self.assertFalse(allowed_component(RESTRICTED, MULTIVERSE))
 | 
			
		||||
        self.assertTrue(allowed_component(RESTRICTED, RESTRICTED))
 | 
			
		||||
 | 
			
		||||
        self.assertTrue(allowed_component(UNIVERSE, MAIN))
 | 
			
		||||
        self.assertTrue(allowed_component(UNIVERSE, UNIVERSE))
 | 
			
		||||
        self.assertFalse(allowed_component(UNIVERSE, MULTIVERSE))
 | 
			
		||||
        self.assertFalse(allowed_component(UNIVERSE, RESTRICTED))
 | 
			
		||||
 | 
			
		||||
        self.assertTrue(allowed_component(MULTIVERSE, MAIN))
 | 
			
		||||
        self.assertTrue(allowed_component(MULTIVERSE, UNIVERSE))
 | 
			
		||||
        self.assertTrue(allowed_component(MULTIVERSE, MULTIVERSE))
 | 
			
		||||
        self.assertTrue(allowed_component(MULTIVERSE, RESTRICTED))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
if __name__ == '__main__':
 | 
			
		||||
    unittest.main()
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user