All of lore.kernel.org
 help / color / mirror / Atom feed
* [igt-dev] [PATCH i-g-t] scripts/xls_to_doc.py: add an script to partially import data from a spreadsheet
@ 2023-06-06  9:14 Mauro Carvalho Chehab
  2023-06-06 11:02 ` [igt-dev] ✗ GitLab.Pipeline: warning for " Patchwork
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: Mauro Carvalho Chehab @ 2023-06-06  9:14 UTC (permalink / raw)
  To: igt-dev

From: Mauro Carvalho Chehab <mchehab@kernel.org>

Sometimes, it is interesting to import data from spreadsheets into
the documentation. This is not error-prone, specially when using
wildcards. The logic here does its best to update the data from a
spreadsheet, but manual review is needed.

Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
---
 scripts/test_list.py  |  35 +++--
 scripts/xls_to_doc.py | 347 ++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 368 insertions(+), 14 deletions(-)
 create mode 100755 scripts/xls_to_doc.py

diff --git a/scripts/test_list.py b/scripts/test_list.py
index 2810c23586cb..f676024c9571 100755
--- a/scripts/test_list.py
+++ b/scripts/test_list.py
@@ -412,7 +412,7 @@ class TestList:
         # None of the filtering rules were applied
         return False
 
-    def expand_subtest(self, fname, test_name, test, allow_inherit):
+    def expand_subtest(self, fname, test_name, test, allow_inherit, with_lines = False, with_subtest_nr = False):
 
         """Expand subtest wildcards providing an array with subtests"""
 
@@ -426,6 +426,7 @@ class TestList:
                 continue
 
             num_vars = summary.count('%')
+            file_ln = self.doc[test]["subtest_line"][subtest]
 
             # Handle trivial case: no wildcards
             if num_vars == 0:
@@ -434,9 +435,7 @@ class TestList:
                 subtest_dict["Summary"] = summary
 
                 for k in sorted(self.doc[test]["subtest"][subtest].keys()):
-                    if k == 'Summary':
-                        continue
-                    if k == 'arg':
+                    if k in [ 'Summary', 'arg', 'subtest_line' ]:
                         continue
 
                     if not allow_inherit:
@@ -445,6 +444,12 @@ class TestList:
 
                     subtest_dict[k] = self.doc[test]["subtest"][subtest][k]
 
+                if with_lines:
+                    subtest_dict["line"] = file_ln
+
+                if with_subtest_nr:
+                    subtest_dict["subtest_nr"] = subtest
+
                 subtest_array.append(subtest_dict)
 
                 continue
@@ -499,9 +504,7 @@ class TestList:
                 subtest_dict["Summary"] = arg_summary
 
                 for field in sorted(self.doc[test]["subtest"][subtest].keys()):
-                    if field == 'Summary':
-                        continue
-                    if field == 'arg':
+                    if field in [ 'Summary', 'arg', 'subtest_line' ]:
                         continue
 
                     sub_field = self.doc[test]["subtest"][subtest][field]
@@ -514,6 +517,12 @@ class TestList:
 
                     subtest_dict[field] = sub_field
 
+                if with_lines:
+                    subtest_dict["line"] = file_ln
+
+                if with_subtest_nr:
+                    subtest_dict["subtest_nr"] = subtest
+
                 subtest_array.append(subtest_dict)
 
                 # Increment variable inside the array
@@ -567,9 +576,7 @@ class TestList:
 
                 dic[summary] = {}
                 for field in sorted(subtest.keys()):
-                    if field == 'Summary':
-                        continue
-                    if field == 'arg':
+                    if field in [ 'Summary', 'arg', 'subtest_line' ]:
                         continue
                     dic[summary][field] = subtest[field]
 
@@ -635,9 +642,7 @@ class TestList:
                 print("")
 
                 for field in sorted(subtest.keys()):
-                    if field == 'Summary':
-                        continue
-                    if field == 'arg':
+                    if field in [ 'Summary', 'arg', 'subtest_line' ]:
                         continue
 
                     print(f":{field}:", subtest[field])
@@ -979,7 +984,7 @@ class TestList:
             current_test = ''
             subtest_number = 0
 
-            for file_ln,file_line in enumerate(handle):
+            for file_ln, file_line in enumerate(handle):
                 file_line = file_line.rstrip()
 
                 if re.match(r'^\s*\*$', file_line):
@@ -1021,6 +1026,7 @@ class TestList:
                         self.doc[current_test]["Summary"] = match.group(1)
                         self.doc[current_test]["File"] = fname
                         self.doc[current_test]["subtest"] = {}
+                        self.doc[current_test]["subtest_line"] = {}
 
                         if implemented_class:
                             self.doc[current_test]["Class"] = implemented_class
@@ -1057,6 +1063,7 @@ class TestList:
 
                     self.doc[current_test]["subtest"][current_subtest]["Summary"] = match.group(1)
                     self.doc[current_test]["subtest"][current_subtest]["Description"] = ''
+                    self.doc[current_test]["subtest_line"][current_subtest] = file_ln
 
                     if not arg_ref:
                         arg_ref = arg_number
diff --git a/scripts/xls_to_doc.py b/scripts/xls_to_doc.py
new file mode 100755
index 000000000000..ed56a02bf5ca
--- /dev/null
+++ b/scripts/xls_to_doc.py
@@ -0,0 +1,347 @@
+#!/usr/bin/env python3
+# pylint: disable=C0301,C0302,C0103,C0116,C0114,R0912,R0914,R0915,R1702,C0115,R0913
+# SPDX-License-Identifier: (GPL-2.0 OR MIT)
+
+## Copyright (C) 2023    Intel Corporation                 ##
+## Author: Mauro Carvalho Chehab <mchehab@kernel.org>      ##
+
+import argparse
+import json
+import os
+import re
+import sys
+
+from openpyxl import load_workbook
+
+from test_list import TestList
+
+EPILOG=""
+
+#
+# FillTests class definition
+#
+class FillTests(TestList):
+    def __init__(self, config_path):
+        self.tests = {}
+        self.spreadsheet_data = {}
+
+        TestList.__init__(self, config_path)
+
+        self.testname_regex = re.compile(r'^\s*(igt@[^\n\@]+)\@?(\S*)\s*')
+        self.key_has_wildcard = re.compile(r'\%?arg\[(\d+)\]')
+        self.field_re = re.compile(r"(" + '|'.join(self.field_list.keys()) + r'):\s*(.*)', re.I)
+
+        for test in self.doc:                   # pylint: disable=C0206
+            fname = self.doc[test]["File"]
+
+            name = re.sub(r'.*/', '', fname)
+            name = re.sub(r'\.[\w+]$', '', name)
+            name = "igt@" + name
+
+            subtest_array = self.expand_subtest(fname, name, test, True, True, True)
+            for subtest_dict in subtest_array:
+                name = subtest_dict["Summary"]
+                del subtest_dict["Summary"]
+
+                match = self.testname_regex.match(name)
+                if not match:
+                    sys.exit(f"Error: can't parse {name}")
+
+                testname = match.group(1)
+                if match.group(2):
+                    subtest = match.group(2)
+                else:
+                    subtest = ''
+
+                if testname not in self.tests:
+                    self.tests[testname] = {}
+                    self.tests[testname]["subtests"] = {}
+
+                    self.tests[testname]["Test"] = test
+                    self.tests[testname]["File"] = fname
+
+                self.tests[testname]["subtests"][subtest] = subtest_dict
+
+    def add_field(self, dic, field, value):
+        if field in dic and dic[field] != '':
+            fields = sorted(dic[field].split(", "))
+            fields.append(value)
+            value = ", ".join(sorted(fields))
+
+        dic[field] = value
+
+    def read_testlist(self, filename):
+        if re.match("^xe", filename):
+            return
+        name = re.sub(r"(.*/)?(.*)\.testlist$", r"\2", filename)
+        if name == "fast-feedback":
+            name = "BAT"
+        elif name == "eu-debugger-fast-feedback":
+            name = "BAT eudebugger"
+        elif name == "fast-feedback-extras-for-simulator":
+            name = "BAT simulator"
+        elif name == "fast-feedback_suspend":
+            name = "suspend"
+
+        name = re.sub(r"eu-debugger", "eudebugger ", name)
+        name = re.sub(r"\bbat\b", "BAT", name)
+        name = re.sub(r"[._\-]", " ", name)
+
+        with open(filename, 'r', newline = '', encoding = 'utf8') as fp:
+            for line in fp:
+                match = re.match(r"^\s*(igt@[^\s\@]+)(\S*)\#?", line)
+                if match:
+                    testname = match.group(1)
+                    subtest = match.group(2)
+                    if testname not in self.tests:
+                        self.tests[testname] = {}
+                        self.tests[testname]["properties"] ={}
+                        self.tests[testname]["subtests"] = {}
+                    if subtest not in self.tests[testname]["subtests"]:
+                        self.tests[testname]["subtests"][subtest] = {}
+                    self.add_field(self.tests[testname]["subtests"][subtest], "Run type", name)
+
+    def get_testlists(self, path):
+        # Create a dictionary with filenames
+
+        regex = re.compile(r".*\.testlist")
+
+        for root,d_names,f_names in os.walk(path):          # pylint: disable=W0612
+            for filename in f_names:
+                if regex.match(filename):
+                    self.read_testlist(os.path.join(root, filename))
+
+    def process_spreadsheet_sheet(self, sheet):
+
+        column_list=[]
+        for cell in sheet[1]:
+            column_list.append(cell.value)
+
+        for row in range(2, sheet.max_row):
+            if sheet[row][0].value is None:
+                print(f"Ignoring sheet after A{row} row, as test name is empty")
+                return
+            if not isinstance(sheet[row][0].value, str):
+                print(f"Ignoring A{row} row on {sheet.title}: test name is not a string: {sheet[row][0].value}")
+                continue
+            test_name = sheet[row][0].value.strip()
+            if not re.match(r'^igt\@', test_name):
+                print(f"Ignoring A{row} row on {sheet.title}: not a valid test name: {test_name}")
+                continue
+
+            if test_name not in self.spreadsheet_data:
+                self.spreadsheet_data[test_name] = {}
+
+            i = 1
+            for col in range(2, sheet.max_column + 1):
+                val = sheet.cell(row=row, column=col).value
+                if val:
+                    if isinstance(val, str):
+                        val = val.strip()
+
+                    self.spreadsheet_data[test_name][column_list[i]] = val
+
+                i += 1
+
+    def read_spreadsheet_file(self, fname, sheets):
+
+        # Iterate the loop to read the cell values
+        wb = load_workbook(filename = fname)
+
+        # Handle first "normal" sheets
+        for sheet in wb:
+            if sheets and sheet.title not in sheets:
+                continue
+
+            self.process_spreadsheet_sheet(sheet)
+
+        return dict(sorted(self.spreadsheet_data.items()))
+
+    def change_value(self, content, subtest, line, field, value):
+
+        current_field = None
+        i = line
+        while 1:
+            i += 1
+            if i >= len(content):
+                break
+
+            file_line = content[i]
+
+            if re.match(r'^\s*\*\/\s*$', file_line):
+                break
+
+            file_line = re.sub(r'^\s*\* ?', '', file_line)
+
+            match = re.match(r'^SUBTESTS?:\s*(.*)', file_line)
+            if match and match.group(1) != subtest:
+                break
+
+            match = re.match(r'^TEST:\s*(.*)', file_line)
+            if match and match.group(1) != subtest:
+                break
+
+            match = re.match(r'arg\[(\d+)\]:\s*(.*)', file_line)
+            if match:
+                break
+
+            match = re.match(r'\@(\S+):\s*(.*)', file_line)
+            if match:
+                break
+
+            match = re.match(r'arg\[(\d+)\]\.values:\s*(.*)', file_line)
+            if match:
+                break
+
+            match = re.match(self.field_re, file_line)
+            if match:
+                current_field = self.field_list[match.group(1).lower()]
+                if current_field != field:
+                    continue
+                content[i] = ""
+
+            # Handle continuation lines
+            if current_field:
+                match = re.match(r'\s+(.*)', file_line)
+                if match:
+                    if current_field != field:
+                        continue
+
+                    content[i] = ""
+
+        content.insert(i, f' * {field}: {value}\n')
+
+    def parse_spreadsheet(self, fname, sheets = None):
+        if not os.path.isfile(fname):
+            print(f'Warning: {fname} not found. Skipping spreadsheet parser')
+            return
+
+        data = self.read_spreadsheet_file(fname, sheets)
+
+        for test, row in data.items():
+            match = self.testname_regex.match(test)
+            if not match:
+                sys.exit(f"Error: can't parse {test}")
+
+            testname = match.group(1)
+            if match.group(2):
+                subtest = match.group(2)
+            else:
+                subtest = ''
+
+            if testname not in self.tests:
+                print(f"Ignoring {test}, as test is not documented.")
+                continue
+
+            if subtest not in self.tests[testname]["subtests"]:
+                self.tests[testname]["subtests"][subtest] = {}
+
+            for key, value in row.items():
+                self.tests[testname]["subtests"][subtest][key] = value
+
+    def update_test_file(self, testname):
+        try:
+#            print(f"Updating {testname}")
+
+            sourcename = self.tests[testname]["File"]
+            with open(sourcename, 'r', encoding='utf8') as in_fp:
+                content = in_fp.read().splitlines(True)
+        except EnvironmentError:
+            sys.exit(f'Failed to read {sourcename}')
+
+        try:
+
+            test_nr = self.tests[testname]["Test"]
+
+            for subtest, subtest_content in sorted(self.tests[testname]["subtests"].items()):
+                if "line" not in subtest_content:
+                    print(f"Warning: didn't find where {subtest} is documented.")
+                    continue
+
+                line = subtest_content['line']
+                subtest_nr = subtest_content['subtest_nr']
+
+                if subtest_nr not in self.doc[test_nr]["subtest"]:
+                    print(f"Error: missing subtest {subtest_nr} at {self.doc[test_nr]['subtest']}")
+
+                doc_content = self.doc[test_nr]["subtest"][subtest_nr]
+
+                # Handling wildcards is not easy. Let's just skip those
+                for field, value in sorted(subtest_content.items()):
+                    if field in [ 'line', 'subtest_nr' ]:
+                        continue
+                    doc_value = doc_content.get(field)
+                    if doc_value:
+                        if self.key_has_wildcard.search(doc_value):
+                            print(f"Warning: {subtest} field {field} has wildcards.")
+                            continue
+                        if doc_value == value:
+                            print(f"{testname}@{subtest} field {field}: Value unchanged. Ignoring it")
+                            continue
+
+                    print(f"Update {testname}@{subtest} field {field} on line {line}:")
+                    print(f"  Change from {doc_value} to {value}")
+
+                    # Just in case, handle continuation lines
+                    value = re.sub(r"\n", "\n *   ", value)
+
+                    self.change_value(content, subtest, line, field, value)
+
+                    # Update line numbers after insert
+                    skip = True
+                    for sub, sub_content in sorted(self.tests[testname]["subtests"].items()):
+                        if sub == subtest:
+                            skip = False
+                            continue
+                        if skip:
+                            continue
+                        sub_line = sub_content['line']
+                        if sub_line >= line:
+                            sub_content['line'] += 1
+
+        except EnvironmentError as err:
+            sys.exit(f'Error: {err}')
+
+        # Write changes
+        try:
+            print(f"Writing to {sourcename}")
+            with open(sourcename, 'w', encoding='utf8') as out_fp:
+                out_fp.write("".join(content))
+        except EnvironmentError:
+            print(f'Failed to write to {sourcename}')
+
+    def update_test_files(self):
+
+        """ Populate documentation """
+
+        for testname in self.tests:
+            self.update_test_file(testname)
+
+######
+# Main
+######
+
+parser = argparse.ArgumentParser(description=__doc__,
+                                    formatter_class = argparse.RawDescriptionHelpFormatter,
+                                    epilog = EPILOG)
+parser.add_argument("--config", required = True,
+                    help="JSON file describing the test plan template")
+parser.add_argument("--xls", required = True,
+                    help="Input XLS file.")
+parser.add_argument("--sheets", nargs = "*",
+                    help="Input only some specific sheets from the XLS file.")
+
+parse_args = parser.parse_args()
+
+fill_test = FillTests(parse_args.config)
+
+fill_test.parse_spreadsheet(parse_args.xls, parse_args.sheets)
+
+## DEBUG: remove it later on
+with open("fill_test.json", "w", encoding='utf8') as write_file:
+    json.dump(fill_test.tests, write_file, indent = 4)
+with open("doc.json", "w", encoding='utf8') as write_file:
+    json.dump(fill_test.doc, write_file, indent = 4)
+
+
+fill_test.update_test_files()
-- 
2.40.1

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [igt-dev] ✗ GitLab.Pipeline: warning for scripts/xls_to_doc.py: add an script to partially import data from a spreadsheet
  2023-06-06  9:14 [igt-dev] [PATCH i-g-t] scripts/xls_to_doc.py: add an script to partially import data from a spreadsheet Mauro Carvalho Chehab
@ 2023-06-06 11:02 ` Patchwork
  2023-06-06 11:28 ` [igt-dev] ✓ Fi.CI.BAT: success " Patchwork
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: Patchwork @ 2023-06-06 11:02 UTC (permalink / raw)
  To: Mauro Carvalho Chehab; +Cc: igt-dev

== Series Details ==

Series: scripts/xls_to_doc.py: add an script to partially import data from a spreadsheet
URL   : https://patchwork.freedesktop.org/series/118912/
State : warning

== Summary ==

Pipeline status: FAILED.

see https://gitlab.freedesktop.org/gfx-ci/igt-ci-tags/-/pipelines/901057 for the overview.

build-containers:build-debian has failed (https://gitlab.freedesktop.org/gfx-ci/igt-ci-tags/-/jobs/43183820):
  time="2023-06-06T11:01:39Z" level=fatal msg="Invalid status code returned when fetching blob 500 (Internal Server Error)" 
  Building!
  STEP 1: FROM debian:buster
  Getting image source signatures
  Copying blob sha256:c722db24a050621ee87ea07acd5d066d3d6a94737c32012f27d73a1ad5cc645c
  Copying config sha256:8b5601a5a7f855241ac7f372ec0042e793b0b3eb3f3a601014845f22bd371c90
  Writing manifest to image destination
  Storing signatures
  STEP 2: RUN apt-get update
  error running container: error creating container for [/bin/sh -c apt-get update]: time="2023-06-06T11:01:44Z" level=warning msg="signal: killed"
  time="2023-06-06T11:01:44Z" level=error msg="container_linux.go:346: starting container process caused \"process_linux.go:297: applying cgroup configuration for process caused \\\"mountpoint for cgroup not found\\\"\"\n"
  container_linux.go:346: starting container process caused "process_linux.go:297: applying cgroup configuration for process caused \"mountpoint for cgroup not found\""
  : exit status 1
  Error: error building at STEP "RUN apt-get update": error while running runtime: exit status 1
  section_end:1686049305:step_script
  section_start:1686049305:cleanup_file_variables
  Cleaning up project directory and file based variables
  section_end:1686049307:cleanup_file_variables
  ERROR: Job failed: exit code 1
  

build-containers:build-debian-arm64 has failed (https://gitlab.freedesktop.org/gfx-ci/igt-ci-tags/-/jobs/43183822):
  time="2023-06-06T11:01:39Z" level=fatal msg="Invalid status code returned when fetching blob 500 (Internal Server Error)" 
  Building!
  STEP 1: FROM debian:buster
  Getting image source signatures
  Copying blob sha256:c722db24a050621ee87ea07acd5d066d3d6a94737c32012f27d73a1ad5cc645c
  Copying config sha256:8b5601a5a7f855241ac7f372ec0042e793b0b3eb3f3a601014845f22bd371c90
  Writing manifest to image destination
  Storing signatures
  STEP 2: RUN apt-get update
  error running container: error creating container for [/bin/sh -c apt-get update]: time="2023-06-06T11:01:44Z" level=warning msg="signal: killed"
  time="2023-06-06T11:01:44Z" level=error msg="container_linux.go:346: starting container process caused \"process_linux.go:297: applying cgroup configuration for process caused \\\"mountpoint for cgroup not found\\\"\"\n"
  container_linux.go:346: starting container process caused "process_linux.go:297: applying cgroup configuration for process caused \"mountpoint for cgroup not found\""
  : exit status 1
  Error: error building at STEP "RUN apt-get update": error while running runtime: exit status 1
  section_end:1686049305:step_script
  section_start:1686049305:cleanup_file_variables
  Cleaning up project directory and file based variables
  section_end:1686049307:cleanup_file_variables
  ERROR: Job failed: exit code 1
  

build-containers:build-debian-armhf has failed (https://gitlab.freedesktop.org/gfx-ci/igt-ci-tags/-/jobs/43183821):
  time="2023-06-06T11:01:39Z" level=fatal msg="Invalid status code returned when fetching blob 500 (Internal Server Error)" 
  Building!
  STEP 1: FROM debian:buster
  Getting image source signatures
  Copying blob sha256:c722db24a050621ee87ea07acd5d066d3d6a94737c32012f27d73a1ad5cc645c
  Copying config sha256:8b5601a5a7f855241ac7f372ec0042e793b0b3eb3f3a601014845f22bd371c90
  Writing manifest to image destination
  Storing signatures
  STEP 2: RUN apt-get update
  error running container: error creating container for [/bin/sh -c apt-get update]: time="2023-06-06T11:01:43Z" level=warning msg="signal: killed"
  time="2023-06-06T11:01:43Z" level=error msg="container_linux.go:346: starting container process caused \"process_linux.go:297: applying cgroup configuration for process caused \\\"mountpoint for cgroup not found\\\"\"\n"
  container_linux.go:346: starting container process caused "process_linux.go:297: applying cgroup configuration for process caused \"mountpoint for cgroup not found\""
  : exit status 1
  Error: error building at STEP "RUN apt-get update": error while running runtime: exit status 1
  section_end:1686049304:step_script
  section_start:1686049304:cleanup_file_variables
  Cleaning up project directory and file based variables
  section_end:1686049307:cleanup_file_variables
  ERROR: Job failed: exit code 1
  

build-containers:build-debian-mips has failed (https://gitlab.freedesktop.org/gfx-ci/igt-ci-tags/-/jobs/43183823):
  time="2023-06-06T11:01:36Z" level=fatal msg="Invalid status code returned when fetching blob 500 (Internal Server Error)" 
  Building!
  STEP 1: FROM debian:buster
  Getting image source signatures
  Copying blob sha256:c722db24a050621ee87ea07acd5d066d3d6a94737c32012f27d73a1ad5cc645c
  Copying config sha256:8b5601a5a7f855241ac7f372ec0042e793b0b3eb3f3a601014845f22bd371c90
  Writing manifest to image destination
  Storing signatures
  STEP 2: RUN apt-get update
  error running container: error creating container for [/bin/sh -c apt-get update]: time="2023-06-06T11:01:41Z" level=warning msg="signal: killed"
  time="2023-06-06T11:01:41Z" level=error msg="container_linux.go:346: starting container process caused \"process_linux.go:297: applying cgroup configuration for process caused \\\"mountpoint for cgroup not found\\\"\"\n"
  container_linux.go:346: starting container process caused "process_linux.go:297: applying cgroup configuration for process caused \"mountpoint for cgroup not found\""
  : exit status 1
  Error: error building at STEP "RUN apt-get update": error while running runtime: exit status 1
  section_end:1686049302:step_script
  section_start:1686049302:cleanup_file_variables
  Cleaning up project directory and file based variables
  section_end:1686049303:cleanup_file_variables
  ERROR: Job failed: exit code 1
  

build-containers:build-fedora has failed (https://gitlab.freedesktop.org/gfx-ci/igt-ci-tags/-/jobs/43183824):
          "maintainer": "Clement Verna \u003ccverna@fedoraproject.org\u003e"
      },
      "Architecture": "amd64",
      "Os": "linux",
      "Layers": [
          "sha256:b39735705e69a2516323755ff4698ea5cd86b08b31d8c8287bc83d76d34c3bfc"
      ]
  }
  Skipping, already built
  Getting image source signatures
  Copying blob sha256:b39735705e69a2516323755ff4698ea5cd86b08b31d8c8287bc83d76d34c3bfc
  Copying config sha256:4b3054d89ef79f9be95501786fbbbe22857d02c867fff99693808cd80909939f
  Writing manifest to image destination
  time="2023-06-06T11:02:02Z" level=fatal msg="Error writing manifest: Error uploading manifest commit-0749c84980718dbe8b2dbb331f78ce76766acf8d to registry.freedesktop.org/gfx-ci/igt-ci-tags/build-fedora: received unexpected HTTP status: 500 Internal Server Error" 
  section_end:1686049324:step_script
  section_start:1686049324:cleanup_file_variables
  Cleaning up project directory and file based variables
  section_end:1686049325:cleanup_file_variables
  ERROR: Job failed: exit code 1

== Logs ==

For more details see: https://gitlab.freedesktop.org/gfx-ci/igt-ci-tags/-/pipelines/901057


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [igt-dev] ✓ Fi.CI.BAT: success for scripts/xls_to_doc.py: add an script to partially import data from a spreadsheet
  2023-06-06  9:14 [igt-dev] [PATCH i-g-t] scripts/xls_to_doc.py: add an script to partially import data from a spreadsheet Mauro Carvalho Chehab
  2023-06-06 11:02 ` [igt-dev] ✗ GitLab.Pipeline: warning for " Patchwork
@ 2023-06-06 11:28 ` Patchwork
  2023-06-06 16:16 ` [igt-dev] [PATCH i-g-t] " Kamil Konieczny
  2023-06-07  2:03 ` [igt-dev] ✓ Fi.CI.IGT: success for " Patchwork
  3 siblings, 0 replies; 5+ messages in thread
From: Patchwork @ 2023-06-06 11:28 UTC (permalink / raw)
  To: Mauro Carvalho Chehab; +Cc: igt-dev

[-- Attachment #1: Type: text/plain, Size: 3525 bytes --]

== Series Details ==

Series: scripts/xls_to_doc.py: add an script to partially import data from a spreadsheet
URL   : https://patchwork.freedesktop.org/series/118912/
State : success

== Summary ==

CI Bug Log - changes from IGT_7320 -> IGTPW_9113
====================================================

Summary
-------

  **SUCCESS**

  No regressions found.

  External URL: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9113/index.html

Participating hosts (40 -> 39)
------------------------------

  Missing    (1): fi-snb-2520m 

Known issues
------------

  Here are the changes found in IGTPW_9113 that come from known issues:

### IGT changes ###

#### Issues hit ####

  * igt@gem_exec_suspend@basic-s0@smem:
    - bat-jsl-1:          [PASS][1] -> [ABORT][2] ([i915#5122])
   [1]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_7320/bat-jsl-1/igt@gem_exec_suspend@basic-s0@smem.html
   [2]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9113/bat-jsl-1/igt@gem_exec_suspend@basic-s0@smem.html

  * igt@i915_suspend@basic-s3-without-i915:
    - bat-jsl-1:          [PASS][3] -> [FAIL][4] ([fdo#103375])
   [3]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_7320/bat-jsl-1/igt@i915_suspend@basic-s3-without-i915.html
   [4]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9113/bat-jsl-1/igt@i915_suspend@basic-s3-without-i915.html

  * igt@kms_pipe_crc_basic@suspend-read-crc@pipe-b-dp-3:
    - bat-dg2-9:          [PASS][5] -> [FAIL][6] ([fdo#103375]) +2 similar issues
   [5]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_7320/bat-dg2-9/igt@kms_pipe_crc_basic@suspend-read-crc@pipe-b-dp-3.html
   [6]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9113/bat-dg2-9/igt@kms_pipe_crc_basic@suspend-read-crc@pipe-b-dp-3.html

  * igt@kms_pipe_crc_basic@suspend-read-crc@pipe-c-dp-3:
    - bat-dg2-9:          [PASS][7] -> [FAIL][8] ([fdo#103375] / [i915#7932])
   [7]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_7320/bat-dg2-9/igt@kms_pipe_crc_basic@suspend-read-crc@pipe-c-dp-3.html
   [8]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9113/bat-dg2-9/igt@kms_pipe_crc_basic@suspend-read-crc@pipe-c-dp-3.html

  
#### Warnings ####

  * igt@kms_psr@primary_mmap_gtt:
    - bat-rplp-1:         [SKIP][9] ([i915#1072]) -> [ABORT][10] ([i915#8442])
   [9]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_7320/bat-rplp-1/igt@kms_psr@primary_mmap_gtt.html
   [10]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9113/bat-rplp-1/igt@kms_psr@primary_mmap_gtt.html

  
  {name}: This element is suppressed. This means it is ignored when computing
          the status of the difference (SUCCESS, WARNING, or FAILURE).

  [fdo#103375]: https://bugs.freedesktop.org/show_bug.cgi?id=103375
  [i915#1072]: https://gitlab.freedesktop.org/drm/intel/issues/1072
  [i915#5122]: https://gitlab.freedesktop.org/drm/intel/issues/5122
  [i915#7932]: https://gitlab.freedesktop.org/drm/intel/issues/7932
  [i915#8442]: https://gitlab.freedesktop.org/drm/intel/issues/8442
  [i915#8497]: https://gitlab.freedesktop.org/drm/intel/issues/8497


Build changes
-------------

  * CI: CI-20190529 -> None
  * IGT: IGT_7320 -> IGTPW_9113

  CI-20190529: 20190529
  CI_DRM_13235: 98a84b63adc57ae6500c03f8076f94e5d5a1743b @ git://anongit.freedesktop.org/gfx-ci/linux
  IGTPW_9113: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9113/index.html
  IGT_7320: 1c96b08a4cde6f2d49824a8cc3303bd860617b52 @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9113/index.html

[-- Attachment #2: Type: text/html, Size: 4300 bytes --]

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [igt-dev] [PATCH i-g-t] scripts/xls_to_doc.py: add an script to partially import data from a spreadsheet
  2023-06-06  9:14 [igt-dev] [PATCH i-g-t] scripts/xls_to_doc.py: add an script to partially import data from a spreadsheet Mauro Carvalho Chehab
  2023-06-06 11:02 ` [igt-dev] ✗ GitLab.Pipeline: warning for " Patchwork
  2023-06-06 11:28 ` [igt-dev] ✓ Fi.CI.BAT: success " Patchwork
@ 2023-06-06 16:16 ` Kamil Konieczny
  2023-06-07  2:03 ` [igt-dev] ✓ Fi.CI.IGT: success for " Patchwork
  3 siblings, 0 replies; 5+ messages in thread
From: Kamil Konieczny @ 2023-06-06 16:16 UTC (permalink / raw)
  To: igt-dev

Hi Mauro,

On 2023-06-06 at 11:14:09 +0200, Mauro Carvalho Chehab wrote:
> From: Mauro Carvalho Chehab <mchehab@kernel.org>
> 
> Sometimes, it is interesting to import data from spreadsheets into
> the documentation. This is not error-prone, specially when using
> wildcards. The logic here does its best to update the data from a
> spreadsheet, but manual review is needed.
> 
> Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
> ---
>  scripts/test_list.py  |  35 +++--
>  scripts/xls_to_doc.py | 347 ++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 368 insertions(+), 14 deletions(-)
>  create mode 100755 scripts/xls_to_doc.py
> 
> diff --git a/scripts/test_list.py b/scripts/test_list.py
> index 2810c23586cb..f676024c9571 100755
> --- a/scripts/test_list.py
> +++ b/scripts/test_list.py
> @@ -412,7 +412,7 @@ class TestList:
>          # None of the filtering rules were applied
>          return False
>  
> -    def expand_subtest(self, fname, test_name, test, allow_inherit):
> +    def expand_subtest(self, fname, test_name, test, allow_inherit, with_lines = False, with_subtest_nr = False):
>  
>          """Expand subtest wildcards providing an array with subtests"""
>  
> @@ -426,6 +426,7 @@ class TestList:
>                  continue
>  
>              num_vars = summary.count('%')
> +            file_ln = self.doc[test]["subtest_line"][subtest]
>  
>              # Handle trivial case: no wildcards
>              if num_vars == 0:
> @@ -434,9 +435,7 @@ class TestList:
>                  subtest_dict["Summary"] = summary
>  
>                  for k in sorted(self.doc[test]["subtest"][subtest].keys()):
> -                    if k == 'Summary':
> -                        continue
> -                    if k == 'arg':
> +                    if k in [ 'Summary', 'arg', 'subtest_line' ]:
>                          continue
>  
>                      if not allow_inherit:
> @@ -445,6 +444,12 @@ class TestList:
>  
>                      subtest_dict[k] = self.doc[test]["subtest"][subtest][k]
>  
> +                if with_lines:
> +                    subtest_dict["line"] = file_ln
> +
> +                if with_subtest_nr:
> +                    subtest_dict["subtest_nr"] = subtest
> +
>                  subtest_array.append(subtest_dict)
>  
>                  continue
> @@ -499,9 +504,7 @@ class TestList:
>                  subtest_dict["Summary"] = arg_summary
>  
>                  for field in sorted(self.doc[test]["subtest"][subtest].keys()):
> -                    if field == 'Summary':
> -                        continue
> -                    if field == 'arg':
> +                    if field in [ 'Summary', 'arg', 'subtest_line' ]:
>                          continue
>  
>                      sub_field = self.doc[test]["subtest"][subtest][field]
> @@ -514,6 +517,12 @@ class TestList:
>  
>                      subtest_dict[field] = sub_field
>  
> +                if with_lines:
> +                    subtest_dict["line"] = file_ln
> +
> +                if with_subtest_nr:
> +                    subtest_dict["subtest_nr"] = subtest
> +
>                  subtest_array.append(subtest_dict)
>  
>                  # Increment variable inside the array
> @@ -567,9 +576,7 @@ class TestList:
>  
>                  dic[summary] = {}
>                  for field in sorted(subtest.keys()):
> -                    if field == 'Summary':
> -                        continue
> -                    if field == 'arg':
> +                    if field in [ 'Summary', 'arg', 'subtest_line' ]:
>                          continue
>                      dic[summary][field] = subtest[field]
>  
> @@ -635,9 +642,7 @@ class TestList:
>                  print("")
>  
>                  for field in sorted(subtest.keys()):
> -                    if field == 'Summary':
> -                        continue
> -                    if field == 'arg':
> +                    if field in [ 'Summary', 'arg', 'subtest_line' ]:
>                          continue
>  
>                      print(f":{field}:", subtest[field])
> @@ -979,7 +984,7 @@ class TestList:
>              current_test = ''
>              subtest_number = 0
>  
> -            for file_ln,file_line in enumerate(handle):
> +            for file_ln, file_line in enumerate(handle):
>                  file_line = file_line.rstrip()
>  
>                  if re.match(r'^\s*\*$', file_line):
> @@ -1021,6 +1026,7 @@ class TestList:
>                          self.doc[current_test]["Summary"] = match.group(1)
>                          self.doc[current_test]["File"] = fname
>                          self.doc[current_test]["subtest"] = {}
> +                        self.doc[current_test]["subtest_line"] = {}
>  
>                          if implemented_class:
>                              self.doc[current_test]["Class"] = implemented_class
> @@ -1057,6 +1063,7 @@ class TestList:
>  
>                      self.doc[current_test]["subtest"][current_subtest]["Summary"] = match.group(1)
>                      self.doc[current_test]["subtest"][current_subtest]["Description"] = ''
> +                    self.doc[current_test]["subtest_line"][current_subtest] = file_ln
>  
>                      if not arg_ref:
>                          arg_ref = arg_number
> diff --git a/scripts/xls_to_doc.py b/scripts/xls_to_doc.py
> new file mode 100755
> index 000000000000..ed56a02bf5ca
> --- /dev/null
> +++ b/scripts/xls_to_doc.py
> @@ -0,0 +1,347 @@
> +#!/usr/bin/env python3
> +# pylint: disable=C0301,C0302,C0103,C0116,C0114,R0912,R0914,R0915,R1702,C0115,R0913
> +# SPDX-License-Identifier: (GPL-2.0 OR MIT)
> +
> +## Copyright (C) 2023    Intel Corporation                 ##
> +## Author: Mauro Carvalho Chehab <mchehab@kernel.org>      ##
> +
> +import argparse
> +import json
> +import os
> +import re
> +import sys
> +
> +from openpyxl import load_workbook
> +
> +from test_list import TestList
> +
> +EPILOG=""
> +
> +#
> +# FillTests class definition
> +#
> +class FillTests(TestList):
> +    def __init__(self, config_path):
> +        self.tests = {}
> +        self.spreadsheet_data = {}
> +
> +        TestList.__init__(self, config_path)
> +
> +        self.testname_regex = re.compile(r'^\s*(igt@[^\n\@]+)\@?(\S*)\s*')
> +        self.key_has_wildcard = re.compile(r'\%?arg\[(\d+)\]')
> +        self.field_re = re.compile(r"(" + '|'.join(self.field_list.keys()) + r'):\s*(.*)', re.I)
> +
> +        for test in self.doc:                   # pylint: disable=C0206
> +            fname = self.doc[test]["File"]
> +
> +            name = re.sub(r'.*/', '', fname)
> +            name = re.sub(r'\.[\w+]$', '', name)
> +            name = "igt@" + name
> +
> +            subtest_array = self.expand_subtest(fname, name, test, True, True, True)
> +            for subtest_dict in subtest_array:
> +                name = subtest_dict["Summary"]
> +                del subtest_dict["Summary"]
> +
> +                match = self.testname_regex.match(name)
> +                if not match:
> +                    sys.exit(f"Error: can't parse {name}")
> +
> +                testname = match.group(1)
> +                if match.group(2):
> +                    subtest = match.group(2)
> +                else:
> +                    subtest = ''
> +
> +                if testname not in self.tests:
> +                    self.tests[testname] = {}
> +                    self.tests[testname]["subtests"] = {}
> +
> +                    self.tests[testname]["Test"] = test
> +                    self.tests[testname]["File"] = fname
> +
> +                self.tests[testname]["subtests"][subtest] = subtest_dict
> +
> +    def add_field(self, dic, field, value):
> +        if field in dic and dic[field] != '':
> +            fields = sorted(dic[field].split(", "))
> +            fields.append(value)
> +            value = ", ".join(sorted(fields))
> +
> +        dic[field] = value
> +
> +    def read_testlist(self, filename):
> +        if re.match("^xe", filename):
> +            return
> +        name = re.sub(r"(.*/)?(.*)\.testlist$", r"\2", filename)
> +        if name == "fast-feedback":
> +            name = "BAT"
> +        elif name == "eu-debugger-fast-feedback":
> +            name = "BAT eudebugger"
> +        elif name == "fast-feedback-extras-for-simulator":
> +            name = "BAT simulator"
> +        elif name == "fast-feedback_suspend":
> +            name = "suspend"
> +
> +        name = re.sub(r"eu-debugger", "eudebugger ", name)
> +        name = re.sub(r"\bbat\b", "BAT", name)
> +        name = re.sub(r"[._\-]", " ", name)
> +
> +        with open(filename, 'r', newline = '', encoding = 'utf8') as fp:
> +            for line in fp:
> +                match = re.match(r"^\s*(igt@[^\s\@]+)(\S*)\#?", line)
> +                if match:
> +                    testname = match.group(1)
> +                    subtest = match.group(2)
> +                    if testname not in self.tests:
> +                        self.tests[testname] = {}
> +                        self.tests[testname]["properties"] ={}
> +                        self.tests[testname]["subtests"] = {}
> +                    if subtest not in self.tests[testname]["subtests"]:
> +                        self.tests[testname]["subtests"][subtest] = {}
> +                    self.add_field(self.tests[testname]["subtests"][subtest], "Run type", name)
> +
> +    def get_testlists(self, path):
> +        # Create a dictionary with filenames
> +
> +        regex = re.compile(r".*\.testlist")
> +
> +        for root,d_names,f_names in os.walk(path):          # pylint: disable=W0612
> +            for filename in f_names:
> +                if regex.match(filename):
> +                    self.read_testlist(os.path.join(root, filename))
> +
> +    def process_spreadsheet_sheet(self, sheet):
> +
> +        column_list=[]
> +        for cell in sheet[1]:
> +            column_list.append(cell.value)
> +
> +        for row in range(2, sheet.max_row):
> +            if sheet[row][0].value is None:
> +                print(f"Ignoring sheet after A{row} row, as test name is empty")
> +                return
> +            if not isinstance(sheet[row][0].value, str):
> +                print(f"Ignoring A{row} row on {sheet.title}: test name is not a string: {sheet[row][0].value}")
> +                continue
> +            test_name = sheet[row][0].value.strip()
> +            if not re.match(r'^igt\@', test_name):
> +                print(f"Ignoring A{row} row on {sheet.title}: not a valid test name: {test_name}")
> +                continue
> +
> +            if test_name not in self.spreadsheet_data:
> +                self.spreadsheet_data[test_name] = {}
> +
> +            i = 1
> +            for col in range(2, sheet.max_column + 1):
> +                val = sheet.cell(row=row, column=col).value
> +                if val:
> +                    if isinstance(val, str):
> +                        val = val.strip()
> +
> +                    self.spreadsheet_data[test_name][column_list[i]] = val
> +
> +                i += 1
> +
> +    def read_spreadsheet_file(self, fname, sheets):
> +
> +        # Iterate the loop to read the cell values
> +        wb = load_workbook(filename = fname)
> +
> +        # Handle first "normal" sheets
> +        for sheet in wb:
> +            if sheets and sheet.title not in sheets:
> +                continue
> +
> +            self.process_spreadsheet_sheet(sheet)
> +
> +        return dict(sorted(self.spreadsheet_data.items()))
> +
> +    def change_value(self, content, subtest, line, field, value):
> +
> +        current_field = None
> +        i = line
> +        while 1:
> +            i += 1
> +            if i >= len(content):
> +                break
> +
> +            file_line = content[i]
> +
> +            if re.match(r'^\s*\*\/\s*$', file_line):
> +                break
> +
> +            file_line = re.sub(r'^\s*\* ?', '', file_line)
> +
> +            match = re.match(r'^SUBTESTS?:\s*(.*)', file_line)
> +            if match and match.group(1) != subtest:
> +                break
> +
> +            match = re.match(r'^TEST:\s*(.*)', file_line)
> +            if match and match.group(1) != subtest:
> +                break
> +
> +            match = re.match(r'arg\[(\d+)\]:\s*(.*)', file_line)
> +            if match:
> +                break
> +
> +            match = re.match(r'\@(\S+):\s*(.*)', file_line)
> +            if match:
> +                break
> +
> +            match = re.match(r'arg\[(\d+)\]\.values:\s*(.*)', file_line)
> +            if match:
> +                break
> +
> +            match = re.match(self.field_re, file_line)
> +            if match:
> +                current_field = self.field_list[match.group(1).lower()]
> +                if current_field != field:
> +                    continue
> +                content[i] = ""
> +
> +            # Handle continuation lines
> +            if current_field:
> +                match = re.match(r'\s+(.*)', file_line)
> +                if match:
> +                    if current_field != field:
> +                        continue
> +
> +                    content[i] = ""
> +
> +        content.insert(i, f' * {field}: {value}\n')
> +
> +    def parse_spreadsheet(self, fname, sheets = None):
> +        if not os.path.isfile(fname):
> +            print(f'Warning: {fname} not found. Skipping spreadsheet parser')
> +            return
> +
> +        data = self.read_spreadsheet_file(fname, sheets)
> +
> +        for test, row in data.items():
> +            match = self.testname_regex.match(test)
> +            if not match:
> +                sys.exit(f"Error: can't parse {test}")
> +
> +            testname = match.group(1)
> +            if match.group(2):
> +                subtest = match.group(2)
> +            else:
> +                subtest = ''
> +
> +            if testname not in self.tests:
> +                print(f"Ignoring {test}, as test is not documented.")
> +                continue
> +
> +            if subtest not in self.tests[testname]["subtests"]:
> +                self.tests[testname]["subtests"][subtest] = {}
> +
> +            for key, value in row.items():
> +                self.tests[testname]["subtests"][subtest][key] = value
> +
> +    def update_test_file(self, testname):
> +        try:
> +#            print(f"Updating {testname}")
> +
> +            sourcename = self.tests[testname]["File"]
> +            with open(sourcename, 'r', encoding='utf8') as in_fp:
> +                content = in_fp.read().splitlines(True)
> +        except EnvironmentError:
> +            sys.exit(f'Failed to read {sourcename}')
> +
> +        try:
> +
> +            test_nr = self.tests[testname]["Test"]
> +
> +            for subtest, subtest_content in sorted(self.tests[testname]["subtests"].items()):
> +                if "line" not in subtest_content:
> +                    print(f"Warning: didn't find where {subtest} is documented.")
> +                    continue
> +
> +                line = subtest_content['line']
> +                subtest_nr = subtest_content['subtest_nr']
> +
> +                if subtest_nr not in self.doc[test_nr]["subtest"]:
> +                    print(f"Error: missing subtest {subtest_nr} at {self.doc[test_nr]['subtest']}")
> +
> +                doc_content = self.doc[test_nr]["subtest"][subtest_nr]
> +
> +                # Handling wildcards is not easy. Let's just skip those
> +                for field, value in sorted(subtest_content.items()):
> +                    if field in [ 'line', 'subtest_nr' ]:
> +                        continue
> +                    doc_value = doc_content.get(field)
> +                    if doc_value:
> +                        if self.key_has_wildcard.search(doc_value):
> +                            print(f"Warning: {subtest} field {field} has wildcards.")
> +                            continue
> +                        if doc_value == value:
> +                            print(f"{testname}@{subtest} field {field}: Value unchanged. Ignoring it")
> +                            continue
> +
> +                    print(f"Update {testname}@{subtest} field {field} on line {line}:")
> +                    print(f"  Change from {doc_value} to {value}")
> +
> +                    # Just in case, handle continuation lines
> +                    value = re.sub(r"\n", "\n *   ", value)
> +
> +                    self.change_value(content, subtest, line, field, value)
> +
> +                    # Update line numbers after insert
> +                    skip = True
> +                    for sub, sub_content in sorted(self.tests[testname]["subtests"].items()):
> +                        if sub == subtest:
> +                            skip = False
> +                            continue
> +                        if skip:
> +                            continue
> +                        sub_line = sub_content['line']
> +                        if sub_line >= line:
> +                            sub_content['line'] += 1
> +
> +        except EnvironmentError as err:
> +            sys.exit(f'Error: {err}')
> +
> +        # Write changes
> +        try:
> +            print(f"Writing to {sourcename}")
> +            with open(sourcename, 'w', encoding='utf8') as out_fp:
> +                out_fp.write("".join(content))
> +        except EnvironmentError:
> +            print(f'Failed to write to {sourcename}')
> +
> +    def update_test_files(self):
> +
> +        """ Populate documentation """
> +
> +        for testname in self.tests:
> +            self.update_test_file(testname)
> +
> +######
> +# Main
> +######
> +
> +parser = argparse.ArgumentParser(description=__doc__,
> +                                    formatter_class = argparse.RawDescriptionHelpFormatter,
> +                                    epilog = EPILOG)
> +parser.add_argument("--config", required = True,
> +                    help="JSON file describing the test plan template")
> +parser.add_argument("--xls", required = True,
> +                    help="Input XLS file.")
> +parser.add_argument("--sheets", nargs = "*",
> +                    help="Input only some specific sheets from the XLS file.")
> +
> +parse_args = parser.parse_args()
> +
> +fill_test = FillTests(parse_args.config)
> +
> +fill_test.parse_spreadsheet(parse_args.xls, parse_args.sheets)
> +
> +## DEBUG: remove it later on
> +with open("fill_test.json", "w", encoding='utf8') as write_file:
> +    json.dump(fill_test.tests, write_file, indent = 4)
> +with open("doc.json", "w", encoding='utf8') as write_file:
> +    json.dump(fill_test.doc, write_file, indent = 4)
> +
> +
> +fill_test.update_test_files()

Please add also a few examples for usage.
With that,

Acked-by: Kamil Konieczny <kamil.konieczny@linux.intel.com>

> -- 
> 2.40.1
> 


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [igt-dev] ✓ Fi.CI.IGT: success for scripts/xls_to_doc.py: add an script to partially import data from a spreadsheet
  2023-06-06  9:14 [igt-dev] [PATCH i-g-t] scripts/xls_to_doc.py: add an script to partially import data from a spreadsheet Mauro Carvalho Chehab
                   ` (2 preceding siblings ...)
  2023-06-06 16:16 ` [igt-dev] [PATCH i-g-t] " Kamil Konieczny
@ 2023-06-07  2:03 ` Patchwork
  3 siblings, 0 replies; 5+ messages in thread
From: Patchwork @ 2023-06-07  2:03 UTC (permalink / raw)
  To: Mauro Carvalho Chehab; +Cc: igt-dev

[-- Attachment #1: Type: text/plain, Size: 17655 bytes --]

== Series Details ==

Series: scripts/xls_to_doc.py: add an script to partially import data from a spreadsheet
URL   : https://patchwork.freedesktop.org/series/118912/
State : success

== Summary ==

CI Bug Log - changes from IGT_7320_full -> IGTPW_9113_full
====================================================

Summary
-------

  **SUCCESS**

  No regressions found.

  External URL: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9113/index.html

Participating hosts (7 -> 7)
------------------------------

  No changes in participating hosts

Known issues
------------

  Here are the changes found in IGTPW_9113_full that come from known issues:

### IGT changes ###

#### Issues hit ####

  * igt@gem_exec_fair@basic-none-share@rcs0:
    - shard-glk:          [PASS][1] -> [FAIL][2] ([i915#2842])
   [1]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_7320/shard-glk5/igt@gem_exec_fair@basic-none-share@rcs0.html
   [2]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9113/shard-glk4/igt@gem_exec_fair@basic-none-share@rcs0.html

  * igt@kms_ccs@pipe-a-crc-primary-rotation-180-4_tiled_dg2_rc_ccs:
    - shard-apl:          NOTRUN -> [SKIP][3] ([fdo#109271]) +52 similar issues
   [3]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9113/shard-apl6/igt@kms_ccs@pipe-a-crc-primary-rotation-180-4_tiled_dg2_rc_ccs.html

  * igt@kms_ccs@pipe-a-crc-sprite-planes-basic-y_tiled_gen12_mc_ccs:
    - shard-apl:          NOTRUN -> [SKIP][4] ([fdo#109271] / [i915#3886])
   [4]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9113/shard-apl2/igt@kms_ccs@pipe-a-crc-sprite-planes-basic-y_tiled_gen12_mc_ccs.html

  * igt@kms_ccs@pipe-c-missing-ccs-buffer-4_tiled_mtl_rc_ccs:
    - shard-snb:          NOTRUN -> [SKIP][5] ([fdo#109271]) +27 similar issues
   [5]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9113/shard-snb6/igt@kms_ccs@pipe-c-missing-ccs-buffer-4_tiled_mtl_rc_ccs.html

  * igt@kms_content_protection@uevent@pipe-a-dp-1:
    - shard-apl:          NOTRUN -> [FAIL][6] ([i915#1339])
   [6]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9113/shard-apl1/igt@kms_content_protection@uevent@pipe-a-dp-1.html

  * igt@kms_cursor_crc@cursor-random-32x32:
    - shard-apl:          NOTRUN -> [SKIP][7] ([fdo#109271] / [i915#4579]) +3 similar issues
   [7]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9113/shard-apl7/igt@kms_cursor_crc@cursor-random-32x32.html

  * igt@kms_cursor_legacy@flip-vs-cursor-atomic-transitions:
    - shard-glk:          [PASS][8] -> [FAIL][9] ([i915#2346])
   [8]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_7320/shard-glk1/igt@kms_cursor_legacy@flip-vs-cursor-atomic-transitions.html
   [9]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9113/shard-glk1/igt@kms_cursor_legacy@flip-vs-cursor-atomic-transitions.html

  * igt@kms_flip@flip-vs-expired-vblank@b-hdmi-a2:
    - shard-glk:          [PASS][10] -> [FAIL][11] ([i915#79])
   [10]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_7320/shard-glk9/igt@kms_flip@flip-vs-expired-vblank@b-hdmi-a2.html
   [11]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9113/shard-glk7/igt@kms_flip@flip-vs-expired-vblank@b-hdmi-a2.html

  * igt@kms_plane_scaling@plane-downscale-with-pixel-format-factor-0-5@pipe-b-hdmi-a-1:
    - shard-snb:          NOTRUN -> [SKIP][12] ([fdo#109271] / [i915#4579]) +7 similar issues
   [12]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9113/shard-snb1/igt@kms_plane_scaling@plane-downscale-with-pixel-format-factor-0-5@pipe-b-hdmi-a-1.html

  * igt@kms_psr2_sf@overlay-plane-move-continuous-exceed-sf:
    - shard-apl:          NOTRUN -> [SKIP][13] ([fdo#109271] / [i915#658])
   [13]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9113/shard-apl1/igt@kms_psr2_sf@overlay-plane-move-continuous-exceed-sf.html

  * igt@kms_writeback@writeback-invalid-parameters:
    - shard-apl:          NOTRUN -> [SKIP][14] ([fdo#109271] / [i915#2437])
   [14]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9113/shard-apl4/igt@kms_writeback@writeback-invalid-parameters.html

  * igt@perf_pmu@busy-double-start@bcs0:
    - shard-glk:          [PASS][15] -> [DMESG-WARN][16] ([i915#118])
   [15]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_7320/shard-glk6/igt@perf_pmu@busy-double-start@bcs0.html
   [16]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9113/shard-glk7/igt@perf_pmu@busy-double-start@bcs0.html

  
#### Possible fixes ####

  * igt@drm_fdinfo@most-busy-idle-check-all@rcs0:
    - {shard-rkl}:        [FAIL][17] ([i915#7742]) -> [PASS][18]
   [17]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_7320/shard-rkl-3/igt@drm_fdinfo@most-busy-idle-check-all@rcs0.html
   [18]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9113/shard-rkl-7/igt@drm_fdinfo@most-busy-idle-check-all@rcs0.html

  * igt@gem_barrier_race@remote-request@rcs0:
    - shard-apl:          [ABORT][19] ([i915#7461] / [i915#8190]) -> [PASS][20]
   [19]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_7320/shard-apl6/igt@gem_barrier_race@remote-request@rcs0.html
   [20]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9113/shard-apl3/igt@gem_barrier_race@remote-request@rcs0.html
    - {shard-dg1}:        [ABORT][21] ([i915#7461] / [i915#8234]) -> [PASS][22]
   [21]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_7320/shard-dg1-15/igt@gem_barrier_race@remote-request@rcs0.html
   [22]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9113/shard-dg1-17/igt@gem_barrier_race@remote-request@rcs0.html

  * igt@gem_ctx_freq@sysfs:
    - {shard-dg1}:        [FAIL][23] ([i915#6786]) -> [PASS][24]
   [23]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_7320/shard-dg1-13/igt@gem_ctx_freq@sysfs.html
   [24]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9113/shard-dg1-16/igt@gem_ctx_freq@sysfs.html

  * igt@gem_eio@hibernate:
    - {shard-dg1}:        [ABORT][25] ([i915#4391] / [i915#7975] / [i915#8213]) -> [PASS][26]
   [25]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_7320/shard-dg1-14/igt@gem_eio@hibernate.html
   [26]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9113/shard-dg1-12/igt@gem_eio@hibernate.html

  * igt@gem_eio@unwedge-stress:
    - {shard-dg1}:        [FAIL][27] ([i915#5784]) -> [PASS][28]
   [27]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_7320/shard-dg1-18/igt@gem_eio@unwedge-stress.html
   [28]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9113/shard-dg1-12/igt@gem_eio@unwedge-stress.html

  * igt@gem_exec_fair@basic-pace-share@rcs0:
    - shard-glk:          [FAIL][29] ([i915#2842]) -> [PASS][30] +2 similar issues
   [29]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_7320/shard-glk4/igt@gem_exec_fair@basic-pace-share@rcs0.html
   [30]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9113/shard-glk5/igt@gem_exec_fair@basic-pace-share@rcs0.html
    - {shard-rkl}:        [FAIL][31] ([i915#2842]) -> [PASS][32]
   [31]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_7320/shard-rkl-6/igt@gem_exec_fair@basic-pace-share@rcs0.html
   [32]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9113/shard-rkl-3/igt@gem_exec_fair@basic-pace-share@rcs0.html

  * igt@gem_exec_fair@basic-pace-solo@rcs0:
    - shard-apl:          [FAIL][33] ([i915#2842]) -> [PASS][34]
   [33]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_7320/shard-apl7/igt@gem_exec_fair@basic-pace-solo@rcs0.html
   [34]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9113/shard-apl1/igt@gem_exec_fair@basic-pace-solo@rcs0.html

  * igt@i915_module_load@reload:
    - shard-snb:          [ABORT][35] ([i915#4528]) -> [PASS][36]
   [35]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_7320/shard-snb7/igt@i915_module_load@reload.html
   [36]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9113/shard-snb5/igt@i915_module_load@reload.html

  * igt@i915_pm_dc@dc9-dpms:
    - shard-apl:          [SKIP][37] ([fdo#109271]) -> [PASS][38]
   [37]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_7320/shard-apl2/igt@i915_pm_dc@dc9-dpms.html
   [38]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9113/shard-apl6/igt@i915_pm_dc@dc9-dpms.html

  * igt@i915_pm_rpm@dpms-lpsp:
    - {shard-dg1}:        [SKIP][39] ([i915#1397]) -> [PASS][40] +1 similar issue
   [39]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_7320/shard-dg1-18/igt@i915_pm_rpm@dpms-lpsp.html
   [40]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9113/shard-dg1-19/igt@i915_pm_rpm@dpms-lpsp.html

  * igt@i915_pm_rpm@dpms-non-lpsp:
    - {shard-rkl}:        [SKIP][41] ([i915#1397]) -> [PASS][42] +1 similar issue
   [41]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_7320/shard-rkl-7/igt@i915_pm_rpm@dpms-non-lpsp.html
   [42]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9113/shard-rkl-6/igt@i915_pm_rpm@dpms-non-lpsp.html

  * igt@i915_selftest@live@gt_heartbeat:
    - shard-apl:          [DMESG-FAIL][43] ([i915#5334]) -> [PASS][44]
   [43]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_7320/shard-apl4/igt@i915_selftest@live@gt_heartbeat.html
   [44]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9113/shard-apl4/igt@i915_selftest@live@gt_heartbeat.html

  * igt@kms_flip@flip-vs-expired-vblank@a-hdmi-a1:
    - shard-glk:          [FAIL][45] ([i915#2122]) -> [PASS][46]
   [45]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_7320/shard-glk9/igt@kms_flip@flip-vs-expired-vblank@a-hdmi-a1.html
   [46]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9113/shard-glk7/igt@kms_flip@flip-vs-expired-vblank@a-hdmi-a1.html

  * igt@kms_plane_scaling@intel-max-src-size@pipe-a-hdmi-a-1:
    - {shard-tglu}:       [FAIL][47] ([i915#8292]) -> [PASS][48]
   [47]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_7320/shard-tglu-3/igt@kms_plane_scaling@intel-max-src-size@pipe-a-hdmi-a-1.html
   [48]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9113/shard-tglu-7/igt@kms_plane_scaling@intel-max-src-size@pipe-a-hdmi-a-1.html

  
  {name}: This element is suppressed. This means it is ignored when computing
          the status of the difference (SUCCESS, WARNING, or FAILURE).

  [fdo#109271]: https://bugs.freedesktop.org/show_bug.cgi?id=109271
  [fdo#109274]: https://bugs.freedesktop.org/show_bug.cgi?id=109274
  [fdo#109280]: https://bugs.freedesktop.org/show_bug.cgi?id=109280
  [fdo#109285]: https://bugs.freedesktop.org/show_bug.cgi?id=109285
  [fdo#109289]: https://bugs.freedesktop.org/show_bug.cgi?id=109289
  [fdo#109300]: https://bugs.freedesktop.org/show_bug.cgi?id=109300
  [fdo#109307]: https://bugs.freedesktop.org/show_bug.cgi?id=109307
  [fdo#109312]: https://bugs.freedesktop.org/show_bug.cgi?id=109312
  [fdo#109315]: https://bugs.freedesktop.org/show_bug.cgi?id=109315
  [fdo#110189]: https://bugs.freedesktop.org/show_bug.cgi?id=110189
  [fdo#110723]: https://bugs.freedesktop.org/show_bug.cgi?id=110723
  [fdo#111614]: https://bugs.freedesktop.org/show_bug.cgi?id=111614
  [fdo#111615]: https://bugs.freedesktop.org/show_bug.cgi?id=111615
  [fdo#111825]: https://bugs.freedesktop.org/show_bug.cgi?id=111825
  [fdo#111827]: https://bugs.freedesktop.org/show_bug.cgi?id=111827
  [fdo#112283]: https://bugs.freedesktop.org/show_bug.cgi?id=112283
  [i915#1072]: https://gitlab.freedesktop.org/drm/intel/issues/1072
  [i915#118]: https://gitlab.freedesktop.org/drm/intel/issues/118
  [i915#1339]: https://gitlab.freedesktop.org/drm/intel/issues/1339
  [i915#1397]: https://gitlab.freedesktop.org/drm/intel/issues/1397
  [i915#1825]: https://gitlab.freedesktop.org/drm/intel/issues/1825
  [i915#2122]: https://gitlab.freedesktop.org/drm/intel/issues/2122
  [i915#2346]: https://gitlab.freedesktop.org/drm/intel/issues/2346
  [i915#2433]: https://gitlab.freedesktop.org/drm/intel/issues/2433
  [i915#2437]: https://gitlab.freedesktop.org/drm/intel/issues/2437
  [i915#2527]: https://gitlab.freedesktop.org/drm/intel/issues/2527
  [i915#2575]: https://gitlab.freedesktop.org/drm/intel/issues/2575
  [i915#2705]: https://gitlab.freedesktop.org/drm/intel/issues/2705
  [i915#2842]: https://gitlab.freedesktop.org/drm/intel/issues/2842
  [i915#3023]: https://gitlab.freedesktop.org/drm/intel/issues/3023
  [i915#3116]: https://gitlab.freedesktop.org/drm/intel/issues/3116
  [i915#3281]: https://gitlab.freedesktop.org/drm/intel/issues/3281
  [i915#3282]: https://gitlab.freedesktop.org/drm/intel/issues/3282
  [i915#3297]: https://gitlab.freedesktop.org/drm/intel/issues/3297
  [i915#3299]: https://gitlab.freedesktop.org/drm/intel/issues/3299
  [i915#3458]: https://gitlab.freedesktop.org/drm/intel/issues/3458
  [i915#3539]: https://gitlab.freedesktop.org/drm/intel/issues/3539
  [i915#3555]: https://gitlab.freedesktop.org/drm/intel/issues/3555
  [i915#3638]: https://gitlab.freedesktop.org/drm/intel/issues/3638
  [i915#3689]: https://gitlab.freedesktop.org/drm/intel/issues/3689
  [i915#3708]: https://gitlab.freedesktop.org/drm/intel/issues/3708
  [i915#3734]: https://gitlab.freedesktop.org/drm/intel/issues/3734
  [i915#3804]: https://gitlab.freedesktop.org/drm/intel/issues/3804
  [i915#3886]: https://gitlab.freedesktop.org/drm/intel/issues/3886
  [i915#4070]: https://gitlab.freedesktop.org/drm/intel/issues/4070
  [i915#4077]: https://gitlab.freedesktop.org/drm/intel/issues/4077
  [i915#4078]: https://gitlab.freedesktop.org/drm/intel/issues/4078
  [i915#4083]: https://gitlab.freedesktop.org/drm/intel/issues/4083
  [i915#4098]: https://gitlab.freedesktop.org/drm/intel/issues/4098
  [i915#4103]: https://gitlab.freedesktop.org/drm/intel/issues/4103
  [i915#4212]: https://gitlab.freedesktop.org/drm/intel/issues/4212
  [i915#4213]: https://gitlab.freedesktop.org/drm/intel/issues/4213
  [i915#4270]: https://gitlab.freedesktop.org/drm/intel/issues/4270
  [i915#4281]: https://gitlab.freedesktop.org/drm/intel/issues/4281
  [i915#4391]: https://gitlab.freedesktop.org/drm/intel/issues/4391
  [i915#4528]: https://gitlab.freedesktop.org/drm/intel/issues/4528
  [i915#4538]: https://gitlab.freedesktop.org/drm/intel/issues/4538
  [i915#4565]: https://gitlab.freedesktop.org/drm/intel/issues/4565
  [i915#4579]: https://gitlab.freedesktop.org/drm/intel/issues/4579
  [i915#4613]: https://gitlab.freedesktop.org/drm/intel/issues/4613
  [i915#4812]: https://gitlab.freedesktop.org/drm/intel/issues/4812
  [i915#4816]: https://gitlab.freedesktop.org/drm/intel/issues/4816
  [i915#4818]: https://gitlab.freedesktop.org/drm/intel/issues/4818
  [i915#4833]: https://gitlab.freedesktop.org/drm/intel/issues/4833
  [i915#4852]: https://gitlab.freedesktop.org/drm/intel/issues/4852
  [i915#4860]: https://gitlab.freedesktop.org/drm/intel/issues/4860
  [i915#4885]: https://gitlab.freedesktop.org/drm/intel/issues/4885
  [i915#5122]: https://gitlab.freedesktop.org/drm/intel/issues/5122
  [i915#5176]: https://gitlab.freedesktop.org/drm/intel/issues/5176
  [i915#5235]: https://gitlab.freedesktop.org/drm/intel/issues/5235
  [i915#5251]: https://gitlab.freedesktop.org/drm/intel/issues/5251
  [i915#5286]: https://gitlab.freedesktop.org/drm/intel/issues/5286
  [i915#5289]: https://gitlab.freedesktop.org/drm/intel/issues/5289
  [i915#533]: https://gitlab.freedesktop.org/drm/intel/issues/533
  [i915#5334]: https://gitlab.freedesktop.org/drm/intel/issues/5334
  [i915#5354]: https://gitlab.freedesktop.org/drm/intel/issues/5354
  [i915#5493]: https://gitlab.freedesktop.org/drm/intel/issues/5493
  [i915#5784]: https://gitlab.freedesktop.org/drm/intel/issues/5784
  [i915#6095]: https://gitlab.freedesktop.org/drm/intel/issues/6095
  [i915#6268]: https://gitlab.freedesktop.org/drm/intel/issues/6268
  [i915#6301]: https://gitlab.freedesktop.org/drm/intel/issues/6301
  [i915#6335]: https://gitlab.freedesktop.org/drm/intel/issues/6335
  [i915#6433]: https://gitlab.freedesktop.org/drm/intel/issues/6433
  [i915#658]: https://gitlab.freedesktop.org/drm/intel/issues/658
  [i915#6590]: https://gitlab.freedesktop.org/drm/intel/issues/6590
  [i915#6768]: https://gitlab.freedesktop.org/drm/intel/issues/6768
  [i915#6786]: https://gitlab.freedesktop.org/drm/intel/issues/6786
  [i915#6953]: https://gitlab.freedesktop.org/drm/intel/issues/6953
  [i915#7116]: https://gitlab.freedesktop.org/drm/intel/issues/7116
  [i915#7461]: https://gitlab.freedesktop.org/drm/intel/issues/7461
  [i915#7561]: https://gitlab.freedesktop.org/drm/intel/issues/7561
  [i915#7711]: https://gitlab.freedesktop.org/drm/intel/issues/7711
  [i915#7742]: https://gitlab.freedesktop.org/drm/intel/issues/7742
  [i915#7828]: https://gitlab.freedesktop.org/drm/intel/issues/7828
  [i915#79]: https://gitlab.freedesktop.org/drm/intel/issues/79
  [i915#7975]: https://gitlab.freedesktop.org/drm/intel/issues/7975
  [i915#8011]: https://gitlab.freedesktop.org/drm/intel/issues/8011
  [i915#8190]: https://gitlab.freedesktop.org/drm/intel/issues/8190
  [i915#8213]: https://gitlab.freedesktop.org/drm/intel/issues/8213
  [i915#8228]: https://gitlab.freedesktop.org/drm/intel/issues/8228
  [i915#8234]: https://gitlab.freedesktop.org/drm/intel/issues/8234
  [i915#8292]: https://gitlab.freedesktop.org/drm/intel/issues/8292
  [i915#8347]: https://gitlab.freedesktop.org/drm/intel/issues/8347
  [i915#8381]: https://gitlab.freedesktop.org/drm/intel/issues/8381
  [i915#8411]: https://gitlab.freedesktop.org/drm/intel/issues/8411
  [i915#8414]: https://gitlab.freedesktop.org/drm/intel/issues/8414
  [i915#8502]: https://gitlab.freedesktop.org/drm/intel/issues/8502
  [i915#8555]: https://gitlab.freedesktop.org/drm/intel/issues/8555


Build changes
-------------

  * CI: CI-20190529 -> None
  * IGT: IGT_7320 -> IGTPW_9113

  CI-20190529: 20190529
  CI_DRM_13235: 98a84b63adc57ae6500c03f8076f94e5d5a1743b @ git://anongit.freedesktop.org/gfx-ci/linux
  IGTPW_9113: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9113/index.html
  IGT_7320: 1c96b08a4cde6f2d49824a8cc3303bd860617b52 @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9113/index.html

[-- Attachment #2: Type: text/html, Size: 14094 bytes --]

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2023-06-07  2:03 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-06-06  9:14 [igt-dev] [PATCH i-g-t] scripts/xls_to_doc.py: add an script to partially import data from a spreadsheet Mauro Carvalho Chehab
2023-06-06 11:02 ` [igt-dev] ✗ GitLab.Pipeline: warning for " Patchwork
2023-06-06 11:28 ` [igt-dev] ✓ Fi.CI.BAT: success " Patchwork
2023-06-06 16:16 ` [igt-dev] [PATCH i-g-t] " Kamil Konieczny
2023-06-07  2:03 ` [igt-dev] ✓ Fi.CI.IGT: success for " Patchwork

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.