[PATCH i-g-t v3 8/8] scripts/igt_doc.py: use an ancillary function to simplify the code

Kamil Konieczny kamil.konieczny at linux.intel.com
Fri Feb 9 13:21:15 UTC 2024


Hi Mauro,
On 2024-02-09 at 13:34:47 +0100, Mauro Carvalho Chehab wrote:
> From: Mauro Carvalho Chehab <mchehab at kernel.org>
> 
> The code inside gen_intelci_testlist() is too complex, and currently
> buggy.
> 
> Basically, if we have two testlists with driver name + name, like
> "Xe BAT" and "i915 BAT", the current logic picks just one
> (randomly), which produce different results on each run.
> 
> Simplify the logic by moving the routine which fills the run_type
> set to a separate function, fixing the bug.
> 
> Signed-off-by: Mauro Carvalho Chehab <mchehab at kernel.org>

Reviewed-by: Kamil Konieczny <kamil.konieczny at linux.intel.com>

> ---
>  scripts/igt_doc.py | 72 ++++++++++++++++++++++++++++------------------
>  1 file changed, 44 insertions(+), 28 deletions(-)
> 
> diff --git a/scripts/igt_doc.py b/scripts/igt_doc.py
> index 1b4f7eafd135..3a45371a27e7 100755
> --- a/scripts/igt_doc.py
> +++ b/scripts/igt_doc.py
> @@ -18,6 +18,40 @@ import sys
>  from test_list import TestList
>  
>  class IgtTestList(TestList):
> +    def __init__(self, *args, **kwargs):
> +        self.split_regex = re.compile(r",\s*")
> +
> +        super().__init__(*args, **kwargs)
> +
> +    def _get_run_type_drivers(self, run_types):
> +        """
> +            Ancillary routine to return drivers and run type set from
> +            a run type string.
> +        """
> +
> +        run_type_dict = {}
> +        for run_type in set(self.split_regex.split(run_types)):
> +            driver_set = set()
> +            if not run_type:
> +                run_type = "other"
> +            else:
> +                for driver in self.drivers:
> +                    result = re.sub(r"^" + driver + r"[\W_]*", "", run_type, re.IGNORECASE)
> +                    if result != run_type:
> +                        driver_set = set([driver])
> +                        run_type = result
> +                        break
> +
> +            if not driver_set:
> +                driver_set = set(self.drivers)
> +
> +            if run_type in run_type_dict:
> +                run_type_dict[run_type].update(driver_set)
> +            else:
> +                run_type_dict[run_type] = driver_set
> +
> +        return run_type_dict
> +
>      """
>          This class implements testlist generation as expected by Intel CI.
>          It does that by handling test lists split by "Run type" and
> @@ -50,7 +84,7 @@ class IgtTestList(TestList):
>          - if "GPU excluded platform" exists, for each GPU listed on
>            the list, it will block the test.
>      """
> -    def gen_intelci_testlist(self): #pylint: disable=R0912
> +    def gen_intelci_testlist(self):
>          """Return a list of gpu configs and testlists."""
>  
>          subtest_dict = self.expand_dictionary(True)
> @@ -58,48 +92,30 @@ class IgtTestList(TestList):
>          # Create a tests_per_list dict
>          gpu_set = set()
>          tests_per_list = {}
> -        split_regex = re.compile(r",\s*")
> +
> +        for driver in set(self.drivers):
> +            tests_per_list[driver] = {}
>  
>          for subname, subtest in subtest_dict.items():
>              run_types = subtest.get("Run type", "other").lower()
> -            drivers = set()
> -            run_type_set = set()
> -            for run_type in set(split_regex.split(run_types)):
>  
> -                for driver in self.drivers:
> -                    if run_type.startswith(driver):
> -                        run_type = re.sub(r"^" + driver + r"[\W_]*", "", run_type)
> -                        drivers = set([driver])
> -                        break
> +            run_type_dict = self._get_run_type_drivers(run_types)
>  
> -                if not drivers:
> -                    drivers.update(self.drivers)
> -
> -                if not run_type:
> -                    run_type = "other"
> -
> -                run_type_set.add(run_type)
> -
> -            if not drivers:
> -                drivers = set(self.drivers)
> -
> -            for driver in drivers:
> -                if driver not in tests_per_list:
> -                    tests_per_list[driver] = {}
> -
> -                for run_type in run_type_set:
> +            for run_type, drivers in run_type_dict.items():
> +                for driver in drivers:
>                      if run_type not in tests_per_list[driver]:
>                          tests_per_list[driver][run_type] = {}
> +
>                      if subname not in tests_per_list[driver][run_type]:
>                          tests_per_list[driver][run_type][subname] = {}
>  
>                      if "GPU" in subtest:
> -                        for gpu in split_regex.split(subtest["GPU"]):
> +                        for gpu in self.split_regex.split(subtest["GPU"]):
>                              gpu_set.add(gpu)
>                              tests_per_list[driver][run_type][subname][gpu] = True
>  
>                      if "GPU excluded platform" in subtest:
> -                        for gpu in split_regex.split(subtest["GPU excluded platform"]):
> +                        for gpu in self.split_regex.split(subtest["GPU excluded platform"]):
>                              gpu_set.add(gpu)
>                              tests_per_list[driver][run_type][subname][gpu] = False
>  
> -- 
> 2.43.0
> 


More information about the igt-dev mailing list