diff options
Diffstat (limited to 'scripts/lib/compatlayer/cases/common.py')
-rw-r--r-- | scripts/lib/compatlayer/cases/common.py | 54 |
1 files changed, 41 insertions, 13 deletions
diff --git a/scripts/lib/compatlayer/cases/common.py b/scripts/lib/compatlayer/cases/common.py index 9cc682e2c1..b91da9bb14 100644 --- a/scripts/lib/compatlayer/cases/common.py +++ b/scripts/lib/compatlayer/cases/common.py | |||
@@ -3,7 +3,7 @@ | |||
3 | 3 | ||
4 | import os | 4 | import os |
5 | import unittest | 5 | import unittest |
6 | from compatlayer import get_signatures, LayerType, check_command | 6 | from compatlayer import get_signatures, LayerType, check_command, get_depgraph |
7 | from compatlayer.case import OECompatLayerTestCase | 7 | from compatlayer.case import OECompatLayerTestCase |
8 | 8 | ||
9 | class CommonCompatLayer(OECompatLayerTestCase): | 9 | class CommonCompatLayer(OECompatLayerTestCase): |
@@ -31,21 +31,49 @@ class CommonCompatLayer(OECompatLayerTestCase): | |||
31 | raise unittest.SkipTest("Layer %s isn't BSP or DISTRO one." \ | 31 | raise unittest.SkipTest("Layer %s isn't BSP or DISTRO one." \ |
32 | % self.tc.layer['name']) | 32 | % self.tc.layer['name']) |
33 | 33 | ||
34 | # task -> (old signature, new signature) | ||
34 | sig_diff = {} | 35 | sig_diff = {} |
35 | |||
36 | curr_sigs = get_signatures(self.td['builddir'], failsafe=True) | 36 | curr_sigs = get_signatures(self.td['builddir'], failsafe=True) |
37 | for task in self.td['sigs']: | 37 | for task in self.td['sigs']: |
38 | if task not in curr_sigs: | 38 | if task in curr_sigs and \ |
39 | continue | 39 | self.td['sigs'][task] != curr_sigs[task]: |
40 | 40 | sig_diff[task] = (self.td['sigs'][task], curr_sigs[task]) | |
41 | if self.td['sigs'][task] != curr_sigs[task]: | ||
42 | sig_diff[task] = '%s -> %s' % \ | ||
43 | (self.td['sigs'][task], curr_sigs[task]) | ||
44 | 41 | ||
45 | detail = '' | ||
46 | if sig_diff: | 42 | if sig_diff: |
47 | for task in sig_diff: | 43 | # Beware, depgraph uses task=<pn>.<taskname> whereas get_signatures() |
48 | detail += "%s changed %s\n" % (task, sig_diff[task]) | 44 | # uses <pn>:<taskname>. Need to convert sometimes. The output follows |
49 | self.assertFalse(bool(sig_diff), "Layer %s changed signatures.\n%s" % \ | 45 | # the convention from get_signatures() because that seems closer to |
50 | (self.tc.layer['name'], detail)) | 46 | # normal bitbake output. |
47 | def sig2graph(task): | ||
48 | pn, taskname = task.rsplit(':', 1) | ||
49 | return pn + '.' + taskname | ||
50 | def graph2sig(task): | ||
51 | pn, taskname = task.rsplit('.', 1) | ||
52 | return pn + ':' + taskname | ||
53 | depgraph = get_depgraph() | ||
54 | depends = depgraph['tdepends'] | ||
55 | |||
56 | # If a task A has a changed signature, but none of its | ||
57 | # dependencies, then we need to report it because it is | ||
58 | # the one which introduces a change. Any task depending on | ||
59 | # A (directly or indirectly) will also have a changed | ||
60 | # signature, but we don't need to report it. It might have | ||
61 | # its own changes, which will become apparent once the | ||
62 | # issues that we do report are fixed and the test gets run | ||
63 | # again. | ||
64 | sig_diff_filtered = [] | ||
65 | for task, (old_sig, new_sig) in sig_diff.items(): | ||
66 | deps_tainted = False | ||
67 | for dep in depends.get(sig2graph(task), ()): | ||
68 | if graph2sig(dep) in sig_diff: | ||
69 | deps_tainted = True | ||
70 | break | ||
71 | if not deps_tainted: | ||
72 | sig_diff_filtered.append((task, old_sig, new_sig)) | ||
51 | 73 | ||
74 | msg = [] | ||
75 | msg.append('Layer %s changed %d signatures, initial differences (first hash without, second with layer):' % | ||
76 | (self.tc.layer['name'], len(sig_diff))) | ||
77 | for diff in sorted(sig_diff_filtered): | ||
78 | msg.append(' %s: %s -> %s' % diff) | ||
79 | self.assertTrue(False, '\n'.join(msg)) | ||