@ -17,6 +17,7 @@
from collections import defaultdict
from collections import defaultdict
import re
import re
from britney2 import DependencyType
from britney2 . policies . policy import PolicyVerdict
from britney2 . policies . policy import PolicyVerdict
VERDICT2DESC = {
VERDICT2DESC = {
@ -74,11 +75,8 @@ class Excuse(object):
self . forced = False
self . forced = False
self . _policy_verdict = PolicyVerdict . REJECTED_PERMANENTLY
self . _policy_verdict = PolicyVerdict . REJECTED_PERMANENTLY
self . invalid_deps = set ( )
self . all_invalid_deps = set ( )
self . invalid_build_deps = set ( )
self . all_deps = { }
self . deps = { }
self . arch_build_deps = { }
self . indep_build_deps = { }
self . sane_deps = [ ]
self . sane_deps = [ ]
self . break_deps = [ ]
self . break_deps = [ ]
self . unsatisfiable_on_archs = [ ]
self . unsatisfiable_on_archs = [ ]
@ -133,11 +131,24 @@ class Excuse(object):
""" Set the section of the package """
""" Set the section of the package """
self . section = section
self . section = section
def add_dep ( self , name , arch ) :
def add_dependency ( self , deptype , name , arch ) :
""" Add a dependency """
""" Add a dependency of type deptype """
if name not in self . deps :
if name not in self . all_deps :
self . deps [ name ] = [ ]
self . all_deps [ name ] = { }
self . deps [ name ] . append ( arch )
if deptype not in self . all_deps [ name ] :
self . all_deps [ name ] [ deptype ] = [ ]
self . all_deps [ name ] [ deptype ] . append ( arch )
def get_deps ( self ) :
# the autohinter uses the excuses data to query dependencies between
# excuses. For now, we keep the current behaviour by just returning
# the data that was in the old deps set
""" Get the dependencies of type DEPENDS """
deps = set ( )
for dep in self . all_deps :
if DependencyType . DEPENDS in self . all_deps [ dep ] :
deps . add ( dep )
return deps
def add_sane_dep ( self , name ) :
def add_sane_dep ( self , name ) :
""" Add a sane dependency """
""" Add a sane dependency """
@ -153,27 +164,13 @@ class Excuse(object):
if arch not in self . unsatisfiable_on_archs :
if arch not in self . unsatisfiable_on_archs :
self . unsatisfiable_on_archs . append ( arch )
self . unsatisfiable_on_archs . append ( arch )
def add_arch_build_dep ( self , name , arch ) :
if name not in self . arch_build_deps :
self . arch_build_deps [ name ] = [ ]
self . arch_build_deps [ name ] . append ( arch )
def add_indep_build_dep ( self , name , arch ) :
if name not in self . indep_build_deps :
self . indep_build_deps [ name ] = [ ]
self . indep_build_deps [ name ] . append ( arch )
def add_unsatisfiable_dep ( self , signature , arch ) :
def add_unsatisfiable_dep ( self , signature , arch ) :
""" Add an unsatisfiable dependency """
""" Add an unsatisfiable dependency """
self . unsat_deps [ arch ] . add ( signature )
self . unsat_deps [ arch ] . add ( signature )
def invalidate_dep ( self , name ) :
def invalidate_dependency ( self , name ) :
""" Invalidate dependency """
""" Invalidate dependency """
self . invalid_deps . add ( name )
self . all_invalid_deps . add ( name )
def invalidate_build_dep ( self , name ) :
""" Invalidate build-dependency """
self . invalid_build_deps . add ( name )
def setdaysold ( self , daysold , mindays ) :
def setdaysold ( self , daysold , mindays ) :
""" Set the number of days from the upload and the minimum number of days for the update """
""" Set the number of days from the upload and the minimum number of days for the update """
@ -213,18 +210,23 @@ class Excuse(object):
return VERDICT2DESC [ verdict ]
return VERDICT2DESC [ verdict ]
return " UNKNOWN: Missing description for {0} - Please file a bug against Britney " . format ( verdict . name )
return " UNKNOWN: Missing description for {0} - Please file a bug against Britney " . format ( verdict . name )
def _render_dep_issue ( self , dep_issues , invalid_deps , field ) :
def _render_dep_issue s ( self , dep_issues , invalid_deps ) :
lastdep = " "
lastdep = " "
res = [ ]
res = [ ]
for x in sorted ( dep_issues , key = lambda x : x . split ( ' / ' ) [ 0 ] ) :
for x in sorted ( dep_issues , key = lambda x : x . split ( ' / ' ) [ 0 ] ) :
dep = x . split ( ' / ' ) [ 0 ]
dep = x . split ( ' / ' ) [ 0 ]
if dep = = lastdep :
if dep ! = lastdep :
continue
seen = { }
lastdep = dep
lastdep = dep
if x in invalid_deps :
for deptype in sorted ( dep_issues [ x ] , key = lambda y : str ( y ) ) :
res . append ( " <li> %s : %s <a href= \" # %s \" > %s </a> (not considered) \n " % ( field , self . name , dep , dep ) )
field = deptype
else :
if deptype in seen :
res . append ( " <li> %s : %s <a href= \" # %s \" > %s </a> \n " % ( field , self . name , dep , dep ) )
continue
seen [ deptype ] = True
if x in invalid_deps :
res . append ( " <li> %s : %s <a href= \" # %s \" > %s </a> (not considered) \n " % ( field , self . name , dep , dep ) )
else :
res . append ( " <li> %s : %s <a href= \" # %s \" > %s </a> \n " % ( field , self . name , dep , dep ) )
return " " . join ( res )
return " " . join ( res )
@ -248,15 +250,12 @@ class Excuse(object):
( self . daysold , self . mindays ) )
( self . daysold , self . mindays ) )
for x in self . htmlline :
for x in self . htmlline :
res = res + " <li> " + x + " \n "
res = res + " <li> " + x + " \n "
res + = self . _render_dep_issue ( self . deps, self . invalid_deps, ' Depends ' )
res + = self . _render_dep_issue s ( self . all_ deps, self . all_ invalid_deps)
for ( n , a ) in self . break_deps :
for ( n , a ) in self . break_deps :
if n not in self . deps:
if n not in self . all_ deps:
res + = " <li>Ignoring %s depends: <a href= \" # %s \" > %s </a> \n " % ( a , n , n )
res + = " <li>Ignoring %s depends: <a href= \" # %s \" > %s </a> \n " % ( a , n , n )
res + = self . _render_dep_issue ( self . arch_build_deps , self . invalid_build_deps , ' Build-Depends(-Arch) ' )
res + = self . _render_dep_issue ( self . indep_build_deps , self . invalid_build_deps , ' Build-Depends-Indep ' )
res = res + " </ul> \n "
res = res + " </ul> \n "
return res
return res
@ -304,17 +303,16 @@ class Excuse(object):
' on-architectures ' : sorted ( self . missing_builds ) ,
' on-architectures ' : sorted ( self . missing_builds ) ,
' on-unimportant-architectures ' : sorted ( self . missing_builds_ood_arch ) ,
' on-unimportant-architectures ' : sorted ( self . missing_builds_ood_arch ) ,
}
}
if self . invalid_deps or self . invalid_buil d_deps:
if self . all_invali d_deps:
excusedata [ ' invalidated-by-other-package ' ] = True
excusedata [ ' invalidated-by-other-package ' ] = True
if self . deps or self . invalid_deps or self . arch_build_deps or self . indep_buil d_deps \
if self . all_deps or self . all_invali d_deps \
or self . invalid_build_deps or self . break_deps or self . unsat_deps :
or self . break_deps or self . unsat_deps :
excusedata [ ' dependencies ' ] = dep_data = { }
excusedata [ ' dependencies ' ] = dep_data = { }
migrate_after_bd = ( self . arch_build_deps . keys ( ) | self . indep_build_deps . keys ( ) ) - self . invalid_build_deps
migrate_after = sorted ( self . all_deps . keys ( ) - self . all_invalid_deps )
migrate_after = sorted ( ( self . deps . keys ( ) - self . invalid_deps ) | migrate_after_bd )
break_deps = [ x for x , _ in self . break_deps if x not in self . all_deps ]
break_deps = [ x for x , _ in self . break_deps if x not in self . deps ]
if self . invalid_deps or self . invalid_buil d_deps:
if self . all_invali d_deps:
dep_data [ ' blocked-by ' ] = sorted ( self . invalid_deps | self . invalid_buil d_deps)
dep_data [ ' blocked-by ' ] = sorted ( self . all_invali d_deps)
if migrate_after :
if migrate_after :
dep_data [ ' migrate-after ' ] = migrate_after
dep_data [ ' migrate-after ' ] = migrate_after
if break_deps :
if break_deps :