kconfig/annotations.py: support older way of merging dicts
authorAndrea Righi <andrea.righi@canonical.com>
Tue, 23 May 2023 06:28:41 +0000 (08:28 +0200)
committerAndrea Righi <andrea.righi@canonical.com>
Tue, 23 May 2023 06:28:41 +0000 (08:28 +0200)
The '|=' update operator for merging dicts is available starting in
python 3.9 however in focal we have python 3.8, which causes the
annotation parsing script to crash.

Support also the old way of merging dicts available since python 3.5
that uses dict unpacking, e.g. dict1 = {**dict1, **dict2}

Signed-off-by: Luke Nowakowski-Krijger <luke.nowakowskikrijger@canonical.com>
Signed-off-by: Andrea Righi <andrea.righi@canonical.com>
kconfig/annotations.py

index dcc133dbbf621b809413b3307f59463afff3e8c5..b521bd0c71359c08b73973f3c089dc632be51380 100644 (file)
@@ -105,7 +105,10 @@ class Annotation(Config):
                     m = re.match(r'.* policy<(.*?)>', line)
                     if m:
                         match = True
-                        entry['policy'] |= literal_eval(m.group(1))
+                        try:
+                            entry['policy'] |= literal_eval(m.group(1))
+                        except TypeError:
+                            entry['policy'] = {**entry['policy'], **literal_eval(m.group(1))}
 
                     m = re.match(r'.* note<(.*?)>', line)
                     if m:
@@ -204,7 +207,10 @@ class Annotation(Config):
         # Determine if we need to import all configs or a single config
         if not configs:
             configs = c.config.keys()
-            configs |= self.search_config(arch=arch, flavour=flavour).keys()
+            try:
+                configs |= self.search_config(arch=arch, flavour=flavour).keys()
+            except TypeError:
+                configs = {**configs, **self.search_config(arch=arch, flavour=flavour).keys()}
 
         # Import configs from the Kconfig object into Annotations
         if flavour is not None:
@@ -335,8 +341,12 @@ class Annotation(Config):
                 # If new_val is a subset of old_val, skip it
                 old_val = tmp_a.config.get(conf)
                 if old_val and 'policy' in old_val:
-                    if old_val['policy'] == old_val['policy'] | new_val['policy']:
-                        continue
+                    try:
+                        if old_val['policy'] == old_val['policy'] | new_val['policy']:
+                            continue
+                    except TypeError:
+                        if old_val['policy'] == {**old_val['policy'], **new_val['policy']}:
+                            continue
 
                 # Write out the policy (and note) line(s)
                 val = dict(sorted(new_val['policy'].items()))