oeaudit: Print a friendly message when the bitbake module can not be found
[openembedded.git] / contrib / oeaudit / oe_audit.py
1 #!/usr/bin/env python
2
3 import freebsd, oe
4
5 try:
6     import bb
7 except Exception, e:
8     import sys
9     sys.stderr.write("Set PYTHONPATH to bitbake/lib and restart.\n")
10     sys.stderr.write("The backtrace can be seen below.\n")
11     raise e
12     
13
14 def strip_oe_version(oe_version):
15     """
16     We need to strip the package epoch... and the PR to compare
17     it to the FreeBSD versions. Also FreeBSD seems to use _N as
18     PR so we might need to do more..
19     """
20     split = oe_version.split(':', 1)
21     ver = split[1]
22
23     split = ver.rsplit('-r', 1)
24     ver = split[0]
25     return ver
26
27 def strip_bsd_version(bsd_version):
28     """
29     FreeBSD is adding ,1 for revisions.. remove that
30     """
31     # FIXME return a tuple with a revision...
32     split = bsd_version.rsplit(',', 1)
33     split = split[0]
34     split = split.rsplit('_', 1)
35     return split[0]
36
37 def compare_versions(oe, freebsd, not_known):
38     def handle_package(oe_name, bsd_name):
39         if not oe_name in oe:
40             if oe_name == bsd_name:
41                 print >> not_known, "%s is not in OE" % oe_name
42             return
43
44         oe_version = strip_oe_version(oe[oe_name])
45         for ver in freebsd[bsd_name]:
46             affected = True
47             str = []
48             for (cmp, vers) in ver.versions:
49                 bsd_ver = strip_bsd_version(vers)
50                 cmp_res = bb.utils.vercmp(('0', oe_version, 'r0'), ('0', bsd_ver, 'r0'))
51                 if cmp == '<':
52                     if cmp_res >= 0:
53                         affected = False
54                     pass
55                 elif cmp == '<=':
56                     if cmp_res > 0:
57                         affected = False
58                     pass
59                 elif cmp == '>':
60                     if cmp_res <= 0:
61                         affected = False
62                     pass
63                 elif cmp == '>=':
64                     if cmp_res < 0:
65                         affected = False
66                     pass
67                 elif cmp == '=':
68                     if cmp_res > 0:
69                         affected = False
70                 else:
71                     print cmp
72                     assert True
73
74                 str.append("%s %s %s %s" % (oe_name, oe_version, cmp, bsd_ver))
75             if affected:
76                 print " && ".join(str), ver.link
77
78     for package in freebsd.keys():
79         # handle the various versions of OE packages
80         handle_package(package, package)
81         handle_package("%s-native" % package, package)
82         handle_package("%s-full-native" % package, package)
83         handle_package("%s-sdk" % package, package)
84
85
86 # read the input data
87 oe_packages = oe.read_available("available")
88 freebsd_vuln = freebsd.read_auditfile("auditfile")
89 buggy = open("not_in_oe.bugs", "w+")
90
91 compare_versions(oe=oe_packages, freebsd=freebsd_vuln, not_known=buggy)