[
{
    "branch": "main",
    "index": "0",
    "phase": "pre",
    "playbook": "gitlab.com/softwarefactory-project/centosinfra-prod/packit-service-config/playbooks/pre.yaml",
    "plays": [
        {
            "play": {
                "duration": {
                    "end": "2026-06-08T21:12:13.603030Z",
                    "start": "2026-06-08T21:12:10.805865Z"
                },
                "id": "0a580a2a-0013-7298-955f-000000000002",
                "name": "localhost"
            },
            "tasks": [
                {
                    "hosts": {
                        "localhost": {
                            "action": "gather_facts",
                            "ansible_facts": {
                                "ansible_apparmor": {
                                    "status": "disabled"
                                },
                                "ansible_architecture": "x86_64",
                                "ansible_bios_date": "NA",
                                "ansible_bios_vendor": "NA",
                                "ansible_bios_version": "NA",
                                "ansible_board_asset_tag": "NA",
                                "ansible_board_name": "NA",
                                "ansible_board_serial": "NA",
                                "ansible_board_vendor": "NA",
                                "ansible_board_version": "NA",
                                "ansible_chassis_asset_tag": "NA",
                                "ansible_chassis_serial": "NA",
                                "ansible_chassis_vendor": "NA",
                                "ansible_chassis_version": "NA",
                                "ansible_cmdline": {
                                    "BOOT_IMAGE": "(hd0,gpt3)/vmlinuz-5.14.0-427.13.1.el9_4.x86_64",
                                    "console": "ttyS0,115200n8",
                                    "crashkernel": "1G-4G:192M,4G-64G:256M,64G-:512M",
                                    "net.ifnames": "0",
                                    "no_timer_check": true,
                                    "root": "UUID=2fb0abc1-9d08-48bc-9719-108d4ed14685"
                                },
                                "ansible_date_time": {
                                    "date": "2026-06-08",
                                    "day": "08",
                                    "epoch": "1780953131",
                                    "epoch_int": "1780953131",
                                    "hour": "21",
                                    "iso8601": "2026-06-08T21:12:11Z",
                                    "iso8601_basic": "20260608T211211455991",
                                    "iso8601_basic_short": "20260608T211211",
                                    "iso8601_micro": "2026-06-08T21:12:11.455991Z",
                                    "minute": "12",
                                    "month": "06",
                                    "second": "11",
                                    "time": "21:12:11",
                                    "tz": "UTC",
                                    "tz_dst": "UTC",
                                    "tz_offset": "+0000",
                                    "weekday": "Monday",
                                    "weekday_number": "1",
                                    "weeknumber": "23",
                                    "year": "2026"
                                },
                                "ansible_devices": {},
                                "ansible_distribution": "Redhat",
                                "ansible_distribution_major_version": "9",
                                "ansible_distribution_release": "Plow",
                                "ansible_distribution_version": "9.7",
                                "ansible_dns": {
                                    "nameservers": [
                                        "10.43.0.10"
                                    ],
                                    "options": {
                                        "ndots": "5"
                                    },
                                    "search": [
                                        "sf.svc.cluster.local",
                                        "svc.cluster.local",
                                        "cluster.local",
                                        "softwarefactory-project.io"
                                    ]
                                },
                                "ansible_domain": "zuul-executor-headless.sf.svc.cluster.local",
                                "ansible_effective_group_id": 0,
                                "ansible_effective_user_id": 1000,
                                "ansible_env": {
                                    "ANSIBLE_CONFIG": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/ansible/pre_playbook_0/ansible.cfg",
                                    "FLUENT_BIT_PORT": "tcp://10.43.126.94:2020",
                                    "FLUENT_BIT_PORT_2020_TCP": "tcp://10.43.126.94:2020",
                                    "FLUENT_BIT_PORT_2020_TCP_ADDR": "10.43.126.94",
                                    "FLUENT_BIT_PORT_2020_TCP_PORT": "2020",
                                    "FLUENT_BIT_PORT_2020_TCP_PROTO": "tcp",
                                    "FLUENT_BIT_PORT_24224_TCP": "tcp://10.43.126.94:24224",
                                    "FLUENT_BIT_PORT_24224_TCP_ADDR": "10.43.126.94",
                                    "FLUENT_BIT_PORT_24224_TCP_PORT": "24224",
                                    "FLUENT_BIT_PORT_24224_TCP_PROTO": "tcp",
                                    "FLUENT_BIT_PORT_5140_TCP": "tcp://10.43.126.94:5140",
                                    "FLUENT_BIT_PORT_5140_TCP_ADDR": "10.43.126.94",
                                    "FLUENT_BIT_PORT_5140_TCP_PORT": "5140",
                                    "FLUENT_BIT_PORT_5140_TCP_PROTO": "tcp",
                                    "FLUENT_BIT_SERVICE_HOST": "10.43.126.94",
                                    "FLUENT_BIT_SERVICE_PORT": "2020",
                                    "FLUENT_BIT_SERVICE_PORT_FB_FWD_INPUT": "24224",
                                    "FLUENT_BIT_SERVICE_PORT_FB_HTTP_INPUT": "5140",
                                    "FLUENT_BIT_SERVICE_PORT_HTTP": "2020",
                                    "HOME": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/work",
                                    "HOSTNAME": "zuul-executor-0",
                                    "K8S_COMPONENT": "zuul",
                                    "K8S_CONTAINER": "zuul-executor",
                                    "K8S_LABELS_APP": "sf",
                                    "K8S_LABELS_RUN": "zuul-executor",
                                    "K8S_NAMESPACE": "sf",
                                    "K8S_NODENAME": "microshift-ze05.softwarefactory-project.io",
                                    "K8S_PODIP": "10.42.0.19",
                                    "K8S_PODNAME": "zuul-executor-0",
                                    "KUBECONFIG": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/kube/config",
                                    "KUBERNETES_PORT": "tcp://10.43.0.1:443",
                                    "KUBERNETES_PORT_443_TCP": "tcp://10.43.0.1:443",
                                    "KUBERNETES_PORT_443_TCP_ADDR": "10.43.0.1",
                                    "KUBERNETES_PORT_443_TCP_PORT": "443",
                                    "KUBERNETES_PORT_443_TCP_PROTO": "tcp",
                                    "KUBERNETES_SERVICE_HOST": "10.43.0.1",
                                    "KUBERNETES_SERVICE_PORT": "443",
                                    "KUBERNETES_SERVICE_PORT_HTTPS": "443",
                                    "LC_CTYPE": "C.UTF-8",
                                    "NSS_SDB_USE_CACHE": "no",
                                    "PATH": "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                                    "PWD": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/trusted/project_0/gitlab.com/softwarefactory-project/centosinfra-prod/packit-service-config/playbooks",
                                    "PYTHONPATH": "/var/lib/zuul/ansible/9",
                                    "REQUESTS_CA_BUNDLE": "/etc/ssl/certs/ca-bundle.crt",
                                    "SHLVL": "1",
                                    "SSH_AGENT_PID": "2888000",
                                    "SSH_AUTH_SOCK": "/tmp/ssh-XXXXXXoKzvJk/agent.2887999",
                                    "TERM": "xterm",
                                    "TMP": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/work/tmp",
                                    "XDG_CACHE_HOME": "/var/cache/dhall",
                                    "ZUUL_ANSIBLE_SPLIT_STREAMS": "False",
                                    "ZUUL_JOBDIR": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a",
                                    "ZUUL_JOB_FAILURE_OUTPUT": "[]",
                                    "ZUUL_JOB_LOG_CONFIG": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/ansible/logging.json",
                                    "ZUUL_OUTPUT_MAX_BYTES": "1073741824",
                                    "_": "/usr/lib/zuul/ansible/9/bin/python",
                                    "container": "oci"
                                },
                                "ansible_fibre_channel_wwn": [],
                                "ansible_fips": false,
                                "ansible_form_factor": "NA",
                                "ansible_fqdn": "zuul-executor-0.zuul-executor-headless.sf.svc.cluster.local",
                                "ansible_hostname": "zuul-executor-0",
                                "ansible_hostnqn": "",
                                "ansible_is_chroot": false,
                                "ansible_iscsi_iqn": "",
                                "ansible_kernel": "5.14.0-427.13.1.el9_4.x86_64",
                                "ansible_kernel_version": "#1 SMP PREEMPT_DYNAMIC Wed Apr 10 10:29:16 EDT 2024",
                                "ansible_loadavg": {
                                    "15m": 1.07,
                                    "1m": 1.69,
                                    "5m": 1.3
                                },
                                "ansible_local": {},
                                "ansible_lsb": {},
                                "ansible_lvm": "N/A",
                                "ansible_machine": "x86_64",
                                "ansible_memfree_mb": 2049,
                                "ansible_memory_mb": {
                                    "nocache": {
                                        "free": 9339,
                                        "used": 6397
                                    },
                                    "real": {
                                        "free": 2049,
                                        "total": 15736,
                                        "used": 13687
                                    },
                                    "swap": {
                                        "cached": 0,
                                        "free": 0,
                                        "total": 0,
                                        "used": 0
                                    }
                                },
                                "ansible_memtotal_mb": 15736,
                                "ansible_mounts": [
                                    {
                                        "block_available": 21418239,
                                        "block_size": 4096,
                                        "block_total": 25884155,
                                        "block_used": 4465916,
                                        "device": "/dev/vda4",
                                        "fstype": "xfs",
                                        "inode_available": 51300187,
                                        "inode_total": 51801024,
                                        "inode_used": 500837,
                                        "mount": "/etc/hosts",
                                        "options": "ro,seclabel,nosuid,nodev,relatime,attr2,inode64,logbufs=8,logbsize=32k,noquota,bind",
                                        "size_available": 87729106944,
                                        "size_total": 106021498880,
                                        "uuid": "N/A"
                                    },
                                    {
                                        "block_available": 5412859,
                                        "block_size": 4096,
                                        "block_total": 7847936,
                                        "block_used": 2435077,
                                        "device": "/dev/topolvm/5b0c08ea-926a-4f1d-9546-d796c391dd30",
                                        "fstype": "xfs",
                                        "inode_available": 15396595,
                                        "inode_total": 15728640,
                                        "inode_used": 332045,
                                        "mount": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/work",
                                        "options": "rw,seclabel,nosuid,nodev,relatime,nouuid,attr2,inode64,logbufs=8,logbsize=32k,noquota,bind",
                                        "size_available": 22171070464,
                                        "size_total": 32145145856,
                                        "uuid": "N/A"
                                    },
                                    {
                                        "block_available": 21418239,
                                        "block_size": 4096,
                                        "block_total": 25884155,
                                        "block_used": 4465916,
                                        "device": "/dev/vda4",
                                        "fstype": "xfs",
                                        "inode_available": 51300187,
                                        "inode_total": 51801024,
                                        "inode_used": 500837,
                                        "mount": "/etc/pki/ca-trust/extracted",
                                        "options": "ro,seclabel,nosuid,nodev,relatime,attr2,inode64,logbufs=8,logbsize=32k,noquota,bind",
                                        "size_available": 87729106944,
                                        "size_total": 106021498880,
                                        "uuid": "N/A"
                                    },
                                    {
                                        "block_available": 5412859,
                                        "block_size": 4096,
                                        "block_total": 7847936,
                                        "block_used": 2435077,
                                        "device": "/dev/topolvm/5b0c08ea-926a-4f1d-9546-d796c391dd30",
                                        "fstype": "xfs",
                                        "inode_available": 15396595,
                                        "inode_total": 15728640,
                                        "inode_used": 332045,
                                        "mount": "/var/lib/zuul/ansible/9",
                                        "options": "ro,seclabel,nosuid,nodev,relatime,nouuid,attr2,inode64,logbufs=8,logbsize=32k,noquota,bind",
                                        "size_available": 22171070464,
                                        "size_total": 32145145856,
                                        "uuid": "N/A"
                                    },
                                    {
                                        "block_available": 5412859,
                                        "block_size": 4096,
                                        "block_total": 7847936,
                                        "block_used": 2435077,
                                        "device": "/dev/topolvm/5b0c08ea-926a-4f1d-9546-d796c391dd30",
                                        "fstype": "xfs",
                                        "inode_available": 15396595,
                                        "inode_total": 15728640,
                                        "inode_used": 332045,
                                        "mount": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/ansible",
                                        "options": "ro,seclabel,nosuid,nodev,relatime,nouuid,attr2,inode64,logbufs=8,logbsize=32k,noquota,bind",
                                        "size_available": 22171070464,
                                        "size_total": 32145145856,
                                        "uuid": "N/A"
                                    },
                                    {
                                        "block_available": 5412859,
                                        "block_size": 4096,
                                        "block_total": 7847936,
                                        "block_used": 2435077,
                                        "device": "/dev/topolvm/5b0c08ea-926a-4f1d-9546-d796c391dd30",
                                        "fstype": "xfs",
                                        "inode_available": 15396595,
                                        "inode_total": 15728640,
                                        "inode_used": 332045,
                                        "mount": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/kube",
                                        "options": "ro,seclabel,nosuid,nodev,relatime,nouuid,attr2,inode64,logbufs=8,logbsize=32k,noquota,bind",
                                        "size_available": 22171070464,
                                        "size_total": 32145145856,
                                        "uuid": "N/A"
                                    },
                                    {
                                        "block_available": 5412859,
                                        "block_size": 4096,
                                        "block_total": 7847936,
                                        "block_used": 2435077,
                                        "device": "/dev/topolvm/5b0c08ea-926a-4f1d-9546-d796c391dd30",
                                        "fstype": "xfs",
                                        "inode_available": 15396595,
                                        "inode_total": 15728640,
                                        "inode_used": 332045,
                                        "mount": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/trusted",
                                        "options": "ro,seclabel,nosuid,nodev,relatime,nouuid,attr2,inode64,logbufs=8,logbsize=32k,noquota,bind",
                                        "size_available": 22171070464,
                                        "size_total": 32145145856,
                                        "uuid": "N/A"
                                    },
                                    {
                                        "block_available": 5412859,
                                        "block_size": 4096,
                                        "block_total": 7847936,
                                        "block_used": 2435077,
                                        "device": "/dev/topolvm/5b0c08ea-926a-4f1d-9546-d796c391dd30",
                                        "fstype": "xfs",
                                        "inode_available": 15396595,
                                        "inode_total": 15728640,
                                        "inode_used": 332045,
                                        "mount": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/untrusted",
                                        "options": "ro,seclabel,nosuid,nodev,relatime,nouuid,attr2,inode64,logbufs=8,logbsize=32k,noquota,bind",
                                        "size_available": 22171070464,
                                        "size_total": 32145145856,
                                        "uuid": "N/A"
                                    },
                                    {
                                        "block_available": 5412859,
                                        "block_size": 4096,
                                        "block_total": 7847936,
                                        "block_used": 2435077,
                                        "device": "/dev/topolvm/5b0c08ea-926a-4f1d-9546-d796c391dd30",
                                        "fstype": "xfs",
                                        "inode_available": 15396595,
                                        "inode_total": 15728640,
                                        "inode_used": 332045,
                                        "mount": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/ansible/pre_playbook_0",
                                        "options": "ro,seclabel,nosuid,nodev,relatime,nouuid,attr2,inode64,logbufs=8,logbsize=32k,noquota,bind",
                                        "size_available": 22171070464,
                                        "size_total": 32145145856,
                                        "uuid": "N/A"
                                    },
                                    {
                                        "block_available": 5412859,
                                        "block_size": 4096,
                                        "block_total": 7847936,
                                        "block_used": 2435077,
                                        "device": "/dev/topolvm/5b0c08ea-926a-4f1d-9546-d796c391dd30",
                                        "fstype": "xfs",
                                        "inode_available": 15396595,
                                        "inode_total": 15728640,
                                        "inode_used": 332045,
                                        "mount": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/.ansible",
                                        "options": "rw,seclabel,nosuid,nodev,relatime,nouuid,attr2,inode64,logbufs=8,logbsize=32k,noquota,bind",
                                        "size_available": 22171070464,
                                        "size_total": 32145145856,
                                        "uuid": "N/A"
                                    }
                                ],
                                "ansible_nodename": "zuul-executor-0",
                                "ansible_os_family": "Redhat",
                                "ansible_pkg_mgr": "unknown",
                                "ansible_proc_cmdline": {
                                    "BOOT_IMAGE": "(hd0,gpt3)/vmlinuz-5.14.0-427.13.1.el9_4.x86_64",
                                    "console": [
                                        "tty0",
                                        "ttyS0,115200n8"
                                    ],
                                    "crashkernel": "1G-4G:192M,4G-64G:256M,64G-:512M",
                                    "net.ifnames": "0",
                                    "no_timer_check": true,
                                    "root": "UUID=2fb0abc1-9d08-48bc-9719-108d4ed14685"
                                },
                                "ansible_processor": [
                                    "0",
                                    "AuthenticAMD",
                                    "AMD EPYC-Rome Processor",
                                    "1",
                                    "AuthenticAMD",
                                    "AMD EPYC-Rome Processor",
                                    "2",
                                    "AuthenticAMD",
                                    "AMD EPYC-Rome Processor",
                                    "3",
                                    "AuthenticAMD",
                                    "AMD EPYC-Rome Processor",
                                    "4",
                                    "AuthenticAMD",
                                    "AMD EPYC-Rome Processor",
                                    "5",
                                    "AuthenticAMD",
                                    "AMD EPYC-Rome Processor",
                                    "6",
                                    "AuthenticAMD",
                                    "AMD EPYC-Rome Processor",
                                    "7",
                                    "AuthenticAMD",
                                    "AMD EPYC-Rome Processor"
                                ],
                                "ansible_processor_cores": 1,
                                "ansible_processor_count": 8,
                                "ansible_processor_nproc": 8,
                                "ansible_processor_threads_per_core": 1,
                                "ansible_processor_vcpus": 8,
                                "ansible_product_name": "NA",
                                "ansible_product_serial": "NA",
                                "ansible_product_uuid": "NA",
                                "ansible_product_version": "NA",
                                "ansible_python": {
                                    "executable": "/usr/lib/zuul/ansible/9/bin/python",
                                    "has_sslcontext": true,
                                    "type": "cpython",
                                    "version": {
                                        "major": 3,
                                        "micro": 13,
                                        "minor": 11,
                                        "releaselevel": "final",
                                        "serial": 0
                                    },
                                    "version_info": [
                                        3,
                                        11,
                                        13,
                                        "final",
                                        0
                                    ]
                                },
                                "ansible_python_version": "3.11.13",
                                "ansible_real_group_id": 0,
                                "ansible_real_user_id": 1000,
                                "ansible_selinux": {
                                    "status": "disabled"
                                },
                                "ansible_selinux_python_present": true,
                                "ansible_service_mgr": "bwrap",
                                "ansible_swapfree_mb": 0,
                                "ansible_swaptotal_mb": 0,
                                "ansible_system": "Linux",
                                "ansible_system_capabilities": [
                                    ""
                                ],
                                "ansible_system_capabilities_enforced": "True",
                                "ansible_system_vendor": "NA",
                                "ansible_uptime_seconds": 4003989,
                                "ansible_user_dir": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/work",
                                "ansible_user_gecos": "1000 user",
                                "ansible_user_gid": 0,
                                "ansible_user_id": "1000",
                                "ansible_user_shell": "/sbin/nologin",
                                "ansible_user_uid": 1000,
                                "ansible_userspace_architecture": "x86_64",
                                "ansible_userspace_bits": "64",
                                "ansible_virtualization_role": "guest",
                                "ansible_virtualization_tech_guest": [
                                    "container"
                                ],
                                "ansible_virtualization_tech_host": [
                                    "kvm"
                                ],
                                "ansible_virtualization_type": "container",
                                "gather_subset": [
                                    "all"
                                ],
                                "module_setup": true
                            },
                            "changed": false,
                            "deprecations": [],
                            "warnings": []
                        }
                    },
                    "task": {
                        "duration": {
                            "end": "2026-06-08T21:12:11.808004Z",
                            "start": "2026-06-08T21:12:10.812474Z"
                        },
                        "id": "0a580a2a-0013-7298-955f-0000000000a3",
                        "name": "Gathering Facts"
                    }
                },
                {
                    "hosts": {
                        "localhost": {
                            "action": "include_role",
                            "changed": false,
                            "include_args": {
                                "name": "set-zuul-log-path-fact"
                            }
                        }
                    },
                    "role": {
                        "id": "0a580a2a-0013-7298-955f-000000000008",
                        "name": "emit-job-header",
                        "path": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/trusted/project_1/opendev.org/zuul/zuul-jobs/roles/emit-job-header"
                    },
                    "task": {
                        "duration": {
                            "end": "2026-06-08T21:12:11.847527Z",
                            "start": "2026-06-08T21:12:11.816011Z"
                        },
                        "id": "0a580a2a-0013-7298-955f-00000000000a",
                        "name": "Setup log path fact"
                    }
                },
                {
                    "hosts": {
                        "localhost": {
                            "action": "set_fact",
                            "ansible_facts": {
                                "zuul_log_path": "ee8/packit-service/ee826544184d43cabc8c21484a8d852a"
                            },
                            "changed": false
                        }
                    },
                    "role": {
                        "id": "0a580a2a-0013-7298-955f-0000000000c6",
                        "name": "set-zuul-log-path-fact",
                        "path": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/trusted/project_1/opendev.org/zuul/zuul-jobs/roles/set-zuul-log-path-fact"
                    },
                    "task": {
                        "duration": {
                            "end": "2026-06-08T21:12:11.908350Z",
                            "start": "2026-06-08T21:12:11.869905Z"
                        },
                        "id": "0a580a2a-0013-7298-955f-0000000000c8",
                        "name": "Set log path for a build"
                    }
                },
                {
                    "hosts": {
                        "localhost": {
                            "action": "debug",
                            "changed": false,
                            "msg": "# Job Information\nAnsible Version: 2.16.18\nJob: specfile-tests-rpm-deps\nPipeline: check\nExecutor: 38.102.83.40\nTriggered by: https://github.com/packit/specfile/pull/540\nEvent ID: 8afcd2d0-637e-11f1-9ea3-9dc5147eb0b8\n"
                        }
                    },
                    "role": {
                        "id": "0a580a2a-0013-7298-955f-000000000008",
                        "name": "emit-job-header",
                        "path": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/trusted/project_1/opendev.org/zuul/zuul-jobs/roles/emit-job-header"
                    },
                    "task": {
                        "duration": {
                            "end": "2026-06-08T21:12:11.965672Z",
                            "start": "2026-06-08T21:12:11.915624Z"
                        },
                        "id": "0a580a2a-0013-7298-955f-00000000000b",
                        "name": "Print job information"
                    }
                },
                {
                    "hosts": {
                        "localhost": {
                            "action": "debug",
                            "changed": false,
                            "msg": "All items completed",
                            "results": [
                                {
                                    "ansible_loop_var": "zj_item",
                                    "changed": false,
                                    "failed": false,
                                    "msg": "# Node Information\nInventory Hostname: container\nHostname: np0000067687\nUsername: zuul-worker\nDistro: Fedora 43\nProvider: vexxhost-nodepool-sf\nRegion: RegionOne\nLabel: cloud-fedora-43\nProduct Name: OpenStack Nova\nInterface IP: 38.102.83.220\n",
                                    "zj_item": "container"
                                }
                            ]
                        }
                    },
                    "role": {
                        "id": "0a580a2a-0013-7298-955f-000000000008",
                        "name": "emit-job-header",
                        "path": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/trusted/project_1/opendev.org/zuul/zuul-jobs/roles/emit-job-header"
                    },
                    "task": {
                        "duration": {
                            "end": "2026-06-08T21:12:12.067075Z",
                            "start": "2026-06-08T21:12:11.968949Z"
                        },
                        "id": "0a580a2a-0013-7298-955f-00000000000c",
                        "name": "Print node information"
                    }
                },
                {
                    "hosts": {
                        "localhost": {
                            "action": "file",
                            "changed": true,
                            "diff": {
                                "after": {
                                    "mode": "0755",
                                    "path": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/work/logs/zuul-info",
                                    "state": "directory"
                                },
                                "before": {
                                    "mode": "02755",
                                    "path": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/work/logs/zuul-info",
                                    "state": "absent"
                                }
                            },
                            "gid": 0,
                            "group": "root",
                            "invocation": {
                                "module_args": {
                                    "_diff_peek": null,
                                    "_original_basename": null,
                                    "access_time": null,
                                    "access_time_format": "%Y%m%d%H%M.%S",
                                    "attributes": null,
                                    "follow": true,
                                    "force": false,
                                    "group": null,
                                    "mode": 493,
                                    "modification_time": null,
                                    "modification_time_format": "%Y%m%d%H%M.%S",
                                    "owner": null,
                                    "path": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/work/logs/zuul-info",
                                    "recurse": false,
                                    "selevel": null,
                                    "serole": null,
                                    "setype": null,
                                    "seuser": null,
                                    "src": null,
                                    "state": "directory",
                                    "unsafe_writes": false
                                }
                            },
                            "mode": "0755",
                            "owner": "1000",
                            "path": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/work/logs/zuul-info",
                            "size": 6,
                            "state": "directory",
                            "uid": 1000
                        }
                    },
                    "role": {
                        "id": "0a580a2a-0013-7298-955f-00000000001b",
                        "name": "log-inventory",
                        "path": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/trusted/project_1/opendev.org/zuul/zuul-jobs/roles/log-inventory"
                    },
                    "task": {
                        "duration": {
                            "end": "2026-06-08T21:12:12.602091Z",
                            "start": "2026-06-08T21:12:12.078353Z"
                        },
                        "id": "0a580a2a-0013-7298-955f-00000000001d",
                        "name": "Ensure Zuul Ansible directory exists"
                    }
                },
                {
                    "hosts": {
                        "localhost": {
                            "action": "copy",
                            "changed": true,
                            "checksum": "b5f5c58c77a182818fccb0d5f2fc508bb2deeda9",
                            "dest": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/work/logs/zuul-info/inventory.yaml",
                            "diff": [],
                            "gid": 0,
                            "group": "root",
                            "invocation": {
                                "module_args": {
                                    "_original_basename": "inventory.yaml",
                                    "attributes": null,
                                    "backup": false,
                                    "checksum": "b5f5c58c77a182818fccb0d5f2fc508bb2deeda9",
                                    "content": null,
                                    "dest": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/work/logs/zuul-info",
                                    "directory_mode": null,
                                    "follow": false,
                                    "force": true,
                                    "group": null,
                                    "local_follow": null,
                                    "mode": 420,
                                    "owner": null,
                                    "remote_src": null,
                                    "selevel": null,
                                    "serole": null,
                                    "setype": null,
                                    "seuser": null,
                                    "src": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/work/.ansible/tmp/ansible-tmp-1780953132.6522868-57-248247563739037/source",
                                    "unsafe_writes": false,
                                    "validate": null
                                }
                            },
                            "md5sum": "9590507604ba54ba60fe1bf3898f379f",
                            "mode": "0644",
                            "owner": "1000",
                            "size": 11698,
                            "src": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/work/.ansible/tmp/ansible-tmp-1780953132.6522868-57-248247563739037/source",
                            "state": "file",
                            "uid": 1000
                        }
                    },
                    "role": {
                        "id": "0a580a2a-0013-7298-955f-00000000001b",
                        "name": "log-inventory",
                        "path": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/trusted/project_1/opendev.org/zuul/zuul-jobs/roles/log-inventory"
                    },
                    "task": {
                        "duration": {
                            "end": "2026-06-08T21:12:13.603030Z",
                            "start": "2026-06-08T21:12:12.606217Z"
                        },
                        "id": "0a580a2a-0013-7298-955f-00000000001e",
                        "name": "Copy ansible inventory to logs dir"
                    }
                }
            ]
        },
        {
            "play": {
                "duration": {
                    "end": "2026-06-08T21:12:26.185212Z",
                    "start": "2026-06-08T21:12:13.608259Z"
                },
                "id": "0a580a2a-0013-7298-955f-000000000026",
                "name": "all"
            },
            "tasks": [
                {
                    "hosts": {
                        "container": {
                            "action": "zuul_console",
                            "changed": false,
                            "invocation": {
                                "module_args": {
                                    "path": "/tmp/console-{log_uuid}.log",
                                    "port": 19885,
                                    "state": "present"
                                }
                            }
                        }
                    },
                    "role": {
                        "id": "0a580a2a-0013-7298-955f-00000000002c",
                        "name": "start-zuul-console",
                        "path": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/trusted/project_1/opendev.org/zuul/zuul-jobs/roles/start-zuul-console"
                    },
                    "task": {
                        "duration": {
                            "end": "2026-06-08T21:12:14.117476Z",
                            "start": "2026-06-08T21:12:13.614605Z"
                        },
                        "id": "0a580a2a-0013-7298-955f-00000000002e",
                        "name": "Start zuul_console daemon."
                    }
                },
                {
                    "hosts": {
                        "container": {
                            "action": "set_fact",
                            "ansible_facts": {
                                "zuul_info_dir": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/work/logs/zuul-info"
                            },
                            "changed": false
                        }
                    },
                    "role": {
                        "id": "0a580a2a-0013-7298-955f-000000000039",
                        "name": "validate-host",
                        "path": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/trusted/project_1/opendev.org/zuul/zuul-jobs/roles/validate-host"
                    },
                    "task": {
                        "duration": {
                            "end": "2026-06-08T21:12:14.164121Z",
                            "start": "2026-06-08T21:12:14.124429Z"
                        },
                        "id": "0a580a2a-0013-7298-955f-00000000003b",
                        "name": "Define zuul_info_dir fact"
                    }
                },
                {
                    "hosts": {
                        "container": {
                            "action": "file",
                            "changed": false,
                            "diff": {
                                "after": {
                                    "path": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/work/logs/zuul-info"
                                },
                                "before": {
                                    "path": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/work/logs/zuul-info"
                                }
                            },
                            "gid": 0,
                            "group": "root",
                            "invocation": {
                                "module_args": {
                                    "_diff_peek": null,
                                    "_original_basename": null,
                                    "access_time": null,
                                    "access_time_format": "%Y%m%d%H%M.%S",
                                    "attributes": null,
                                    "follow": true,
                                    "force": false,
                                    "group": null,
                                    "mode": 493,
                                    "modification_time": null,
                                    "modification_time_format": "%Y%m%d%H%M.%S",
                                    "owner": null,
                                    "path": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/work/logs/zuul-info",
                                    "recurse": false,
                                    "selevel": null,
                                    "serole": null,
                                    "setype": null,
                                    "seuser": null,
                                    "src": null,
                                    "state": "directory",
                                    "unsafe_writes": false
                                }
                            },
                            "mode": "0755",
                            "owner": "1000",
                            "path": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/work/logs/zuul-info",
                            "size": 28,
                            "state": "directory",
                            "uid": 1000
                        }
                    },
                    "role": {
                        "id": "0a580a2a-0013-7298-955f-000000000039",
                        "name": "validate-host",
                        "path": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/trusted/project_1/opendev.org/zuul/zuul-jobs/roles/validate-host"
                    },
                    "task": {
                        "duration": {
                            "end": "2026-06-08T21:12:14.445087Z",
                            "start": "2026-06-08T21:12:14.167541Z"
                        },
                        "id": "0a580a2a-0013-7298-955f-00000000003c",
                        "name": "Ensure Zuul Ansible directory exists"
                    }
                },
                {
                    "hosts": {
                        "container": {
                            "action": "setup",
                            "ansible_facts": {
                                "ansible_all_ipv4_addresses": [
                                    "38.102.83.220"
                                ],
                                "ansible_all_ipv6_addresses": [
                                    "fe80::f816:3eff:fe5b:eb9f"
                                ],
                                "ansible_apparmor": {
                                    "status": "disabled"
                                },
                                "ansible_architecture": "x86_64",
                                "ansible_bios_date": "04/01/2014",
                                "ansible_bios_vendor": "SeaBIOS",
                                "ansible_bios_version": "1.15.0-1",
                                "ansible_board_asset_tag": "NA",
                                "ansible_board_name": "NA",
                                "ansible_board_serial": "NA",
                                "ansible_board_vendor": "NA",
                                "ansible_board_version": "NA",
                                "ansible_chassis_asset_tag": "NA",
                                "ansible_chassis_serial": "NA",
                                "ansible_chassis_vendor": "QEMU",
                                "ansible_chassis_version": "pc-i440fx-6.2",
                                "ansible_cmdline": {
                                    "BOOT_IMAGE": "(hd0,gpt3)/vmlinuz-7.0.11-100.fc43.x86_64",
                                    "console": "ttyS0,115200n8",
                                    "no_timer_check": true,
                                    "ro": true,
                                    "root": "UUID=55773572-92c8-4d7e-bafd-3f4943a2f380",
                                    "rootflags": "subvol=root",
                                    "systemd.firstboot": "off"
                                },
                                "ansible_date_time": {
                                    "date": "2026-06-08",
                                    "day": "08",
                                    "epoch": "1780953135",
                                    "epoch_int": "1780953135",
                                    "hour": "21",
                                    "iso8601": "2026-06-08T21:12:15Z",
                                    "iso8601_basic": "20260608T211215801945",
                                    "iso8601_basic_short": "20260608T211215",
                                    "iso8601_micro": "2026-06-08T21:12:15.801945Z",
                                    "minute": "12",
                                    "month": "06",
                                    "second": "15",
                                    "time": "21:12:15",
                                    "tz": "UTC",
                                    "tz_dst": "UTC",
                                    "tz_offset": "+0000",
                                    "weekday": "Monday",
                                    "weekday_number": "1",
                                    "weeknumber": "23",
                                    "year": "2026"
                                },
                                "ansible_default_ipv4": {
                                    "address": "38.102.83.220",
                                    "alias": "ens3",
                                    "broadcast": "38.102.83.255",
                                    "gateway": "38.102.83.1",
                                    "interface": "ens3",
                                    "macaddress": "fa:16:3e:5b:eb:9f",
                                    "mtu": 1500,
                                    "netmask": "255.255.255.0",
                                    "network": "38.102.83.0",
                                    "prefix": "24",
                                    "type": "ether"
                                },
                                "ansible_default_ipv6": {},
                                "ansible_device_links": {
                                    "ids": {
                                        "sr0": [
                                            "ata-QEMU_DVD-ROM_QM00001"
                                        ]
                                    },
                                    "labels": {
                                        "sr0": [
                                            "config-2"
                                        ],
                                        "vda2": [
                                            "EFI"
                                        ],
                                        "vda3": [
                                            "BOOT"
                                        ],
                                        "vda4": [
                                            "fedora"
                                        ],
                                        "zram0": [
                                            "zram0"
                                        ]
                                    },
                                    "masters": {},
                                    "uuids": {
                                        "sr0": [
                                            "2026-06-08-21-11-38-00"
                                        ],
                                        "vda2": [
                                            "980C-1628"
                                        ],
                                        "vda3": [
                                            "fc8240da-f3f1-47a3-87a1-4e80eb1371d0"
                                        ],
                                        "vda4": [
                                            "55773572-92c8-4d7e-bafd-3f4943a2f380"
                                        ],
                                        "zram0": [
                                            "9506ccb0-9275-4d69-b5d3-8a1cf66e7586"
                                        ]
                                    }
                                },
                                "ansible_devices": {
                                    "sr0": {
                                        "holders": [],
                                        "host": "",
                                        "links": {
                                            "ids": [
                                                "ata-QEMU_DVD-ROM_QM00001"
                                            ],
                                            "labels": [
                                                "config-2"
                                            ],
                                            "masters": [],
                                            "uuids": [
                                                "2026-06-08-21-11-38-00"
                                            ]
                                        },
                                        "model": "QEMU DVD-ROM",
                                        "partitions": {},
                                        "removable": "1",
                                        "rotational": "1",
                                        "sas_address": null,
                                        "sas_device_handle": null,
                                        "scheduler_mode": "bfq",
                                        "sectors": "964",
                                        "sectorsize": "2048",
                                        "size": "482.00 KB",
                                        "support_discard": "0",
                                        "vendor": "QEMU",
                                        "virtual": 1
                                    },
                                    "vda": {
                                        "holders": [],
                                        "host": "",
                                        "links": {
                                            "ids": [],
                                            "labels": [],
                                            "masters": [],
                                            "uuids": []
                                        },
                                        "model": null,
                                        "partitions": {
                                            "vda1": {
                                                "holders": [],
                                                "links": {
                                                    "ids": [],
                                                    "labels": [],
                                                    "masters": [],
                                                    "uuids": []
                                                },
                                                "sectors": "4096",
                                                "sectorsize": 512,
                                                "size": "2.00 MB",
                                                "start": "2048",
                                                "uuid": null
                                            },
                                            "vda2": {
                                                "holders": [],
                                                "links": {
                                                    "ids": [],
                                                    "labels": [
                                                        "EFI"
                                                    ],
                                                    "masters": [],
                                                    "uuids": [
                                                        "980C-1628"
                                                    ]
                                                },
                                                "sectors": "204800",
                                                "sectorsize": 512,
                                                "size": "100.00 MB",
                                                "start": "6144",
                                                "uuid": "980C-1628"
                                            },
                                            "vda3": {
                                                "holders": [],
                                                "links": {
                                                    "ids": [],
                                                    "labels": [
                                                        "BOOT"
                                                    ],
                                                    "masters": [],
                                                    "uuids": [
                                                        "fc8240da-f3f1-47a3-87a1-4e80eb1371d0"
                                                    ]
                                                },
                                                "sectors": "4096000",
                                                "sectorsize": 512,
                                                "size": "1.95 GB",
                                                "start": "210944",
                                                "uuid": "fc8240da-f3f1-47a3-87a1-4e80eb1371d0"
                                            },
                                            "vda4": {
                                                "holders": [],
                                                "links": {
                                                    "ids": [],
                                                    "labels": [
                                                        "fedora"
                                                    ],
                                                    "masters": [],
                                                    "uuids": [
                                                        "55773572-92c8-4d7e-bafd-3f4943a2f380"
                                                    ]
                                                },
                                                "sectors": "79579103",
                                                "sectorsize": 512,
                                                "size": "37.95 GB",
                                                "start": "4306944",
                                                "uuid": "55773572-92c8-4d7e-bafd-3f4943a2f380"
                                            }
                                        },
                                        "removable": "0",
                                        "rotational": "1",
                                        "sas_address": null,
                                        "sas_device_handle": null,
                                        "scheduler_mode": "none",
                                        "sectors": "83886080",
                                        "sectorsize": "512",
                                        "size": "40.00 GB",
                                        "support_discard": "512",
                                        "vendor": "0x1af4",
                                        "virtual": 1
                                    },
                                    "zram0": {
                                        "holders": [],
                                        "host": "",
                                        "links": {
                                            "ids": [],
                                            "labels": [
                                                "zram0"
                                            ],
                                            "masters": [],
                                            "uuids": [
                                                "9506ccb0-9275-4d69-b5d3-8a1cf66e7586"
                                            ]
                                        },
                                        "model": null,
                                        "partitions": {},
                                        "removable": "0",
                                        "rotational": "0",
                                        "sas_address": null,
                                        "sas_device_handle": null,
                                        "scheduler_mode": "",
                                        "sectors": "16232448",
                                        "sectorsize": "4096",
                                        "size": "7.74 GB",
                                        "support_discard": "4096",
                                        "vendor": null,
                                        "virtual": 1
                                    }
                                },
                                "ansible_distribution": "Fedora",
                                "ansible_distribution_file_parsed": true,
                                "ansible_distribution_file_path": "/etc/redhat-release",
                                "ansible_distribution_file_variety": "RedHat",
                                "ansible_distribution_major_version": "43",
                                "ansible_distribution_release": "",
                                "ansible_distribution_version": "43",
                                "ansible_dns": {
                                    "nameservers": [
                                        "127.0.0.53"
                                    ],
                                    "options": {
                                        "edns0": true,
                                        "trust-ad": true
                                    },
                                    "search": [
                                        "."
                                    ]
                                },
                                "ansible_domain": "novalocal",
                                "ansible_effective_group_id": 1000,
                                "ansible_effective_user_id": 1000,
                                "ansible_ens3": {
                                    "active": true,
                                    "device": "ens3",
                                    "ipv4": {
                                        "address": "38.102.83.220",
                                        "broadcast": "38.102.83.255",
                                        "netmask": "255.255.255.0",
                                        "network": "38.102.83.0",
                                        "prefix": "24"
                                    },
                                    "ipv6": [
                                        {
                                            "address": "fe80::f816:3eff:fe5b:eb9f",
                                            "prefix": "64",
                                            "scope": "link"
                                        }
                                    ],
                                    "macaddress": "fa:16:3e:5b:eb:9f",
                                    "module": "virtio_net",
                                    "mtu": 1500,
                                    "pciid": "virtio1",
                                    "promisc": false,
                                    "speed": -1,
                                    "type": "ether"
                                },
                                "ansible_env": {
                                    "DBUS_SESSION_BUS_ADDRESS": "unix:path=/run/user/1000/bus",
                                    "DEBUGINFOD_IMA_CERT_PATH": "/etc/keys/ima:",
                                    "DEBUGINFOD_URLS": "ima:enforcing https://debuginfod.fedoraproject.org/ ima:ignore ",
                                    "EDITOR": "/usr/bin/nano",
                                    "GPG_TTY": "not a tty",
                                    "HOME": "/home/zuul-worker",
                                    "LANG": "en_US.UTF-8",
                                    "LESSOPEN": "||/usr/bin/lesspipe.sh %s",
                                    "LOGNAME": "zuul-worker",
                                    "MOTD_SHOWN": "pam",
                                    "PATH": "/home/zuul-worker/.local/bin:/home/zuul-worker/bin:/usr/local/bin:/usr/bin",
                                    "PWD": "/home/zuul-worker",
                                    "SELINUX_LEVEL_REQUESTED": "",
                                    "SELINUX_ROLE_REQUESTED": "",
                                    "SELINUX_USE_CURRENT_RANGE": "",
                                    "SHELL": "/bin/bash",
                                    "SHLVL": "1",
                                    "SSH_CLIENT": "38.102.83.40 33764 22",
                                    "SSH_CONNECTION": "38.102.83.40 33764 38.102.83.220 22",
                                    "USER": "zuul-worker",
                                    "XDG_RUNTIME_DIR": "/run/user/1000",
                                    "XDG_SESSION_CLASS": "user",
                                    "XDG_SESSION_ID": "1",
                                    "XDG_SESSION_TYPE": "tty",
                                    "_": "/usr/bin/python3"
                                },
                                "ansible_fibre_channel_wwn": [],
                                "ansible_fips": false,
                                "ansible_form_factor": "Other",
                                "ansible_fqdn": "np0000067687.novalocal",
                                "ansible_hostname": "np0000067687",
                                "ansible_hostnqn": "",
                                "ansible_interfaces": [
                                    "ens3",
                                    "lo"
                                ],
                                "ansible_is_chroot": false,
                                "ansible_iscsi_iqn": "",
                                "ansible_kernel": "7.0.11-100.fc43.x86_64",
                                "ansible_kernel_version": "#1 SMP PREEMPT_DYNAMIC Mon Jun  1 22:51:40 UTC 2026",
                                "ansible_lo": {
                                    "active": true,
                                    "device": "lo",
                                    "ipv4": {
                                        "address": "127.0.0.1",
                                        "broadcast": "",
                                        "netmask": "255.0.0.0",
                                        "network": "127.0.0.0",
                                        "prefix": "8"
                                    },
                                    "mtu": 65536,
                                    "promisc": false,
                                    "type": "loopback"
                                },
                                "ansible_loadavg": {
                                    "15m": 0.03662109375,
                                    "1m": 0.431640625,
                                    "5m": 0.1103515625
                                },
                                "ansible_local": {},
                                "ansible_locally_reachable_ips": {
                                    "ipv4": [
                                        "38.102.83.220",
                                        "127.0.0.0/8",
                                        "127.0.0.1"
                                    ],
                                    "ipv6": [
                                        "fe80::f816:3eff:fe5b:eb9f"
                                    ]
                                },
                                "ansible_lsb": {},
                                "ansible_lvm": "N/A",
                                "ansible_machine": "x86_64",
                                "ansible_machine_id": "c044d0ef5df24dd392d56f108caf47fb",
                                "ansible_memfree_mb": 7459,
                                "ansible_memory_mb": {
                                    "nocache": {
                                        "free": 7632,
                                        "used": 294
                                    },
                                    "real": {
                                        "free": 7459,
                                        "total": 7926,
                                        "used": 467
                                    },
                                    "swap": {
                                        "cached": 0,
                                        "free": 7925,
                                        "total": 7925,
                                        "used": 0
                                    }
                                },
                                "ansible_memtotal_mb": 7926,
                                "ansible_mounts": [
                                    {
                                        "block_available": 9367940,
                                        "block_size": 4096,
                                        "block_total": 9947387,
                                        "block_used": 579447,
                                        "device": "/dev/vda4",
                                        "fstype": "btrfs",
                                        "inode_available": 0,
                                        "inode_total": 0,
                                        "inode_used": 0,
                                        "mount": "/",
                                        "options": "rw,seclabel,relatime,compress=zstd:1,discard=async,space_cache=v2,subvolid=256,subvol=/root,bind",
                                        "size_available": 38371082240,
                                        "size_total": 40744497152,
                                        "uuid": "55773572-92c8-4d7e-bafd-3f4943a2f380"
                                    },
                                    {
                                        "block_available": 9367940,
                                        "block_size": 4096,
                                        "block_total": 9947387,
                                        "block_used": 579447,
                                        "device": "/dev/vda4",
                                        "fstype": "btrfs",
                                        "inode_available": 0,
                                        "inode_total": 0,
                                        "inode_used": 0,
                                        "mount": "/home",
                                        "options": "rw,seclabel,relatime,compress=zstd:1,discard=async,space_cache=v2,subvolid=257,subvol=/home,bind",
                                        "size_available": 38371082240,
                                        "size_total": 40744497152,
                                        "uuid": "55773572-92c8-4d7e-bafd-3f4943a2f380"
                                    },
                                    {
                                        "block_available": 403733,
                                        "block_size": 4096,
                                        "block_total": 494270,
                                        "block_used": 90537,
                                        "device": "/dev/vda3",
                                        "fstype": "ext4",
                                        "inode_available": 127585,
                                        "inode_total": 128000,
                                        "inode_used": 415,
                                        "mount": "/boot",
                                        "options": "rw,seclabel,relatime",
                                        "size_available": 1653690368,
                                        "size_total": 2024529920,
                                        "uuid": "fc8240da-f3f1-47a3-87a1-4e80eb1371d0"
                                    },
                                    {
                                        "block_available": 9367940,
                                        "block_size": 4096,
                                        "block_total": 9947387,
                                        "block_used": 579447,
                                        "device": "/dev/vda4",
                                        "fstype": "btrfs",
                                        "inode_available": 0,
                                        "inode_total": 0,
                                        "inode_used": 0,
                                        "mount": "/var",
                                        "options": "rw,seclabel,relatime,compress=zstd:1,discard=async,space_cache=v2,subvolid=258,subvol=/var,bind",
                                        "size_available": 38371082240,
                                        "size_total": 40744497152,
                                        "uuid": "55773572-92c8-4d7e-bafd-3f4943a2f380"
                                    },
                                    {
                                        "block_available": 40471,
                                        "block_size": 2048,
                                        "block_total": 51078,
                                        "block_used": 10607,
                                        "device": "/dev/vda2",
                                        "fstype": "vfat",
                                        "inode_available": 0,
                                        "inode_total": 0,
                                        "inode_used": 0,
                                        "mount": "/boot/efi",
                                        "options": "rw,relatime,fmask=0077,dmask=0077,codepage=437,iocharset=ascii,shortname=winnt,errors=remount-ro",
                                        "size_available": 82884608,
                                        "size_total": 104607744,
                                        "uuid": "980C-1628"
                                    }
                                ],
                                "ansible_nodename": "np0000067687.novalocal",
                                "ansible_os_family": "RedHat",
                                "ansible_pkg_mgr": "dnf5",
                                "ansible_proc_cmdline": {
                                    "BOOT_IMAGE": "(hd0,gpt3)/vmlinuz-7.0.11-100.fc43.x86_64",
                                    "console": [
                                        "tty1",
                                        "ttyS0,115200n8"
                                    ],
                                    "no_timer_check": true,
                                    "ro": true,
                                    "root": "UUID=55773572-92c8-4d7e-bafd-3f4943a2f380",
                                    "rootflags": [
                                        "subvol=root",
                                        "subvol=root"
                                    ],
                                    "systemd.firstboot": "off"
                                },
                                "ansible_processor": [
                                    "0",
                                    "AuthenticAMD",
                                    "AMD EPYC-Rome Processor",
                                    "1",
                                    "AuthenticAMD",
                                    "AMD EPYC-Rome Processor",
                                    "2",
                                    "AuthenticAMD",
                                    "AMD EPYC-Rome Processor",
                                    "3",
                                    "AuthenticAMD",
                                    "AMD EPYC-Rome Processor",
                                    "4",
                                    "AuthenticAMD",
                                    "AMD EPYC-Rome Processor",
                                    "5",
                                    "AuthenticAMD",
                                    "AMD EPYC-Rome Processor",
                                    "6",
                                    "AuthenticAMD",
                                    "AMD EPYC-Rome Processor",
                                    "7",
                                    "AuthenticAMD",
                                    "AMD EPYC-Rome Processor"
                                ],
                                "ansible_processor_cores": 1,
                                "ansible_processor_count": 8,
                                "ansible_processor_nproc": 8,
                                "ansible_processor_threads_per_core": 1,
                                "ansible_processor_vcpus": 8,
                                "ansible_product_name": "OpenStack Nova",
                                "ansible_product_serial": "NA",
                                "ansible_product_uuid": "NA",
                                "ansible_product_version": "26.3.1",
                                "ansible_python": {
                                    "executable": "/usr/bin/python3",
                                    "has_sslcontext": true,
                                    "type": "cpython",
                                    "version": {
                                        "major": 3,
                                        "micro": 5,
                                        "minor": 14,
                                        "releaselevel": "final",
                                        "serial": 0
                                    },
                                    "version_info": [
                                        3,
                                        14,
                                        5,
                                        "final",
                                        0
                                    ]
                                },
                                "ansible_python_version": "3.14.5",
                                "ansible_real_group_id": 1000,
                                "ansible_real_user_id": 1000,
                                "ansible_selinux": {
                                    "config_mode": "enforcing",
                                    "mode": "enforcing",
                                    "policyvers": 35,
                                    "status": "enabled",
                                    "type": "targeted"
                                },
                                "ansible_selinux_python_present": true,
                                "ansible_service_mgr": "systemd",
                                "ansible_ssh_host_key_ecdsa_public": "AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBDkogE/reJEGPQJu8gLX2ZkGKaACLVJ8CEQ+aJqpjzgygNmgNUtRr1IHmplQDNRTb0f8ZiwJXUkMLBPBZ358G/w=",
                                "ansible_ssh_host_key_ecdsa_public_keytype": "ecdsa-sha2-nistp256",
                                "ansible_ssh_host_key_ed25519_public": "AAAAC3NzaC1lZDI1NTE5AAAAIDTq8Y9vBaLY1FyHg/ozqyHQZ3CRRDat1Ks+oDwdO3+L",
                                "ansible_ssh_host_key_ed25519_public_keytype": "ssh-ed25519",
                                "ansible_ssh_host_key_rsa_public": "AAAAB3NzaC1yc2EAAAADAQABAAABgQDd22rhSrIqbFJmweU6201vlSr/e+DNr+bbNVDVl+mCyZjtZ9UK4wmKWbOM7J7JAuwZstQIVAM6h4Wuy+Pkipr5BT2O7Hn8gJlyC6ypMxIlN+g232Q/gLKHcK5XP9EBuB5TXPNQiDN/l67pG83mTM0tjRrVFvxT5+pv/YMG/H5u1p3X+K5YE+WUJ0dA7r7xXqYFyEmTTE8vuOqJTZlZk1Lmzuvmv/lpTXwXQZqRJzENfHp/ccwEDUghOUEETk6i6FBjiSQwHCaTVLadkloyEE3qirAa1b2Dv83jbpIYUEjXxKARYNc8W4tW4VwSTFfYIjjakNLHkMjwtVdhX2w+hGj+Mn0GeblnuqxztyKO8+7PqTUCn2rLNBx+rkQ9+JQcCkeAvXuOOxbWLGg14hmSDemof0hzmpTjxdI0iJRsSXtYG052fd6aCNbEKYR2SXpsdQQRKtcare9p6dOl1x9QwyCVbXai1DnF6fKyq8fEwbFPn1Zc90n5GWrY2/rpTocmx9U=",
                                "ansible_ssh_host_key_rsa_public_keytype": "ssh-rsa",
                                "ansible_swapfree_mb": 7925,
                                "ansible_swaptotal_mb": 7925,
                                "ansible_system": "Linux",
                                "ansible_system_capabilities": [
                                    ""
                                ],
                                "ansible_system_capabilities_enforced": "True",
                                "ansible_system_vendor": "OpenStack Foundation",
                                "ansible_uptime_seconds": 34,
                                "ansible_user_dir": "/home/zuul-worker",
                                "ansible_user_gecos": "",
                                "ansible_user_gid": 1000,
                                "ansible_user_id": "zuul-worker",
                                "ansible_user_shell": "/bin/bash",
                                "ansible_user_uid": 1000,
                                "ansible_userspace_architecture": "x86_64",
                                "ansible_userspace_bits": "64",
                                "ansible_virtualization_role": "guest",
                                "ansible_virtualization_tech_guest": [
                                    "openstack"
                                ],
                                "ansible_virtualization_tech_host": [
                                    "kvm"
                                ],
                                "ansible_virtualization_type": "openstack",
                                "gather_subset": [
                                    "all"
                                ],
                                "module_setup": true
                            },
                            "changed": false,
                            "invocation": {
                                "module_args": {
                                    "fact_path": "/etc/ansible/facts.d",
                                    "filter": [],
                                    "gather_subset": [
                                        "all"
                                    ],
                                    "gather_timeout": 10
                                }
                            }
                        }
                    },
                    "role": {
                        "id": "0a580a2a-0013-7298-955f-000000000039",
                        "name": "validate-host",
                        "path": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/trusted/project_1/opendev.org/zuul/zuul-jobs/roles/validate-host"
                    },
                    "task": {
                        "duration": {
                            "end": "2026-06-08T21:12:15.889059Z",
                            "start": "2026-06-08T21:12:14.450058Z"
                        },
                        "id": "0a580a2a-0013-7298-955f-00000000003d",
                        "name": "Collect information about the host"
                    }
                },
                {
                    "hosts": {
                        "container": {
                            "action": "set_fact",
                            "ansible_facts": {
                                "validate_host_hostname_sanitized": "container"
                            },
                            "changed": false
                        }
                    },
                    "role": {
                        "id": "0a580a2a-0013-7298-955f-000000000039",
                        "name": "validate-host",
                        "path": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/trusted/project_1/opendev.org/zuul/zuul-jobs/roles/validate-host"
                    },
                    "task": {
                        "duration": {
                            "end": "2026-06-08T21:12:15.977139Z",
                            "start": "2026-06-08T21:12:15.899447Z"
                        },
                        "id": "0a580a2a-0013-7298-955f-00000000003e",
                        "name": "Sanitize hostname"
                    }
                },
                {
                    "hosts": {
                        "container": {
                            "action": "template",
                            "changed": true,
                            "checksum": "5fb8a3ce30cc41a608bd0e1fb9a73a8eb3acfec8",
                            "dest": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/work/logs/zuul-info/host-info.container.yaml",
                            "diff": [],
                            "gid": 0,
                            "group": "root",
                            "invocation": {
                                "module_args": {
                                    "_original_basename": "host-info.j2",
                                    "attributes": null,
                                    "backup": false,
                                    "checksum": "5fb8a3ce30cc41a608bd0e1fb9a73a8eb3acfec8",
                                    "content": null,
                                    "dest": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/work/logs/zuul-info/host-info.container.yaml",
                                    "directory_mode": null,
                                    "follow": false,
                                    "force": true,
                                    "group": null,
                                    "local_follow": null,
                                    "mode": 420,
                                    "owner": null,
                                    "remote_src": null,
                                    "selevel": null,
                                    "serole": null,
                                    "setype": null,
                                    "seuser": null,
                                    "src": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/work/.ansible/tmp/ansible-tmp-1780953136.0315025-104-147709538938279/source",
                                    "unsafe_writes": false,
                                    "validate": null
                                }
                            },
                            "md5sum": "8006aae73ec546da9f1fba39b6870a7d",
                            "mode": "0644",
                            "owner": "1000",
                            "size": 13398,
                            "src": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/work/.ansible/tmp/ansible-tmp-1780953136.0315025-104-147709538938279/source",
                            "state": "file",
                            "uid": 1000
                        }
                    },
                    "role": {
                        "id": "0a580a2a-0013-7298-955f-000000000039",
                        "name": "validate-host",
                        "path": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/trusted/project_1/opendev.org/zuul/zuul-jobs/roles/validate-host"
                    },
                    "task": {
                        "duration": {
                            "end": "2026-06-08T21:12:16.549569Z",
                            "start": "2026-06-08T21:12:15.985917Z"
                        },
                        "id": "0a580a2a-0013-7298-955f-00000000003f",
                        "name": "Write out all ansible variables/facts known for each host"
                    }
                },
                {
                    "hosts": {
                        "container": {
                            "_zuul_nolog_return": true,
                            "action": "zuul_debug_info",
                            "changed": false,
                            "df_i": "Filesystem      Inodes IUsed   IFree IUse% Mounted on\n/dev/vda4            0     0       0     - /\ndevtmpfs       1007460   553 1006907    1% /dev\ntmpfs          1014540     2 1014538    1% /dev/shm\ntmpfs           819200   852  818348    1% /run\ntmpfs             1024     2    1022    1% /run/credentials/systemd-journald.service\n/dev/vda4            0     0       0     - /home\n/dev/vda3       128000   415  127585    1% /boot\ntmpfs          1048576    19 1048557    1% /tmp\n/dev/vda4            0     0       0     - /var\n/dev/vda2            0     0       0     - /boot/efi\ntmpfs             1024     2    1022    1% /run/credentials/systemd-resolved.service\ntmpfs             1024     2    1022    1% /run/credentials/getty@tty1.service\ntmpfs             1024     2    1022    1% /run/credentials/serial-getty@ttyS0.service\ntmpfs           202908    21  202887    1% /run/user/1000\n",
                            "df_m": "Filesystem     1M-blocks  Used Available Use% Mounted on\n/dev/vda4          38857  1873     36594   5% /\ndevtmpfs            3936     0      3936   0% /dev\ntmpfs               3964     0      3964   0% /dev/shm\ntmpfs               1586     1      1585   1% /run\ntmpfs                  1     0         1   0% /run/credentials/systemd-journald.service\n/dev/vda4          38857  1873     36594   5% /home\n/dev/vda3           1931   238      1578  14% /boot\ntmpfs               3964     1      3963   1% /tmp\n/dev/vda4          38857  1873     36594   5% /var\n/dev/vda2            100    21        80  21% /boot/efi\ntmpfs                  1     0         1   0% /run/credentials/systemd-resolved.service\ntmpfs                  1     0         1   0% /run/credentials/getty@tty1.service\ntmpfs                  1     0         1   0% /run/credentials/serial-getty@ttyS0.service\ntmpfs                793     1       793   1% /run/user/1000\n",
                            "image_manifest_files": [],
                            "invocation": {
                                "module_args": {
                                    "image_manifest": null,
                                    "image_manifest_files": [
                                        "/etc/dib-builddate.txt",
                                        "/etc/image-hostname.txt"
                                    ],
                                    "ipv4_route_required": false,
                                    "ipv6_route_required": false,
                                    "traceroute_host": null
                                }
                            },
                            "network_interfaces": "1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000\n    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00\n    inet 127.0.0.1/8 scope host lo\n       valid_lft forever preferred_lft forever\n2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000\n    link/ether fa:16:3e:5b:eb:9f brd ff:ff:ff:ff:ff:ff\n    altname enp0s3\n    altname enxfa163e5beb9f\n    inet 38.102.83.220/24 brd 38.102.83.255 scope global dynamic noprefixroute ens3\n       valid_lft 43173sec preferred_lft 43173sec\n    inet6 fe80::f816:3eff:fe5b:eb9f/64 scope link noprefixroute \n       valid_lft forever preferred_lft forever\n",
                            "network_neighbors": "38.102.83.40 dev ens3 lladdr fa:16:3e:3f:fc:a1 REACHABLE \n38.102.83.1 dev ens3 lladdr fa:61:25:a2:5a:71 REACHABLE \n38.102.83.254 dev ens3 lladdr c6:e7:bc:23:0b:06 STALE \n38.102.83.253 dev ens3 lladdr fa:61:25:a2:5a:71 STALE \n",
                            "network_routing_v4": "default via 38.102.83.1 dev ens3 proto dhcp src 38.102.83.220 metric 100 \n38.102.83.0/24 dev ens3 proto kernel scope link src 38.102.83.220 metric 100 \n169.254.169.254 via 38.102.83.126 dev ens3 proto dhcp src 38.102.83.220 metric 100 \n",
                            "network_routing_v6": "fe80::/64 dev ens3 proto kernel metric 1024 pref medium\n",
                            "proc_cpuinfo": "processor\t: 0\nvendor_id\t: AuthenticAMD\ncpu family\t: 23\nmodel\t\t: 49\nmodel name\t: AMD EPYC-Rome Processor\nstepping\t: 0\nmicrocode\t: 0x1000065\ncpu MHz\t\t: 2799.998\ncache size\t: 512 KB\nphysical id\t: 0\nsiblings\t: 1\ncore id\t\t: 0\ncpu cores\t: 1\napicid\t\t: 0\ninitial apicid\t: 0\nfpu\t\t: yes\nfpu_exception\t: yes\ncpuid level\t: 13\nwp\t\t: yes\nflags\t\t: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm rep_good nopl xtopology cpuid extd_apicid tsc_known_freq pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm cmp_legacy svm cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw topoext perfctr_core ssbd ibrs ibpb stibp vmmcall fsgsbase tsc_adjust bmi1 avx2 smep bmi2 rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 clzero xsaveerptr wbnoinvd arat npt lbrv nrip_save tsc_scale vmcb_clean pausefilter pfthreshold umip rdpid arch_capabilities\nbugs\t\t: sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass retbleed smt_rsb srso ibpb_no_ret spectre_v2_user\nbogomips\t: 5599.99\nTLB size\t: 1024 4K pages\nclflush size\t: 64\ncache_alignment\t: 64\naddress sizes\t: 40 bits physical, 48 bits virtual\npower management:\n\nprocessor\t: 1\nvendor_id\t: AuthenticAMD\ncpu family\t: 23\nmodel\t\t: 49\nmodel name\t: AMD EPYC-Rome Processor\nstepping\t: 0\nmicrocode\t: 0x1000065\ncpu MHz\t\t: 2799.998\ncache size\t: 512 KB\nphysical id\t: 1\nsiblings\t: 1\ncore id\t\t: 0\ncpu cores\t: 1\napicid\t\t: 1\ninitial apicid\t: 1\nfpu\t\t: yes\nfpu_exception\t: yes\ncpuid level\t: 13\nwp\t\t: yes\nflags\t\t: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm rep_good nopl xtopology cpuid extd_apicid tsc_known_freq pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm cmp_legacy svm cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw topoext perfctr_core ssbd ibrs ibpb stibp vmmcall fsgsbase tsc_adjust bmi1 avx2 smep bmi2 rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 clzero xsaveerptr wbnoinvd arat npt lbrv nrip_save tsc_scale vmcb_clean pausefilter pfthreshold umip rdpid arch_capabilities\nbugs\t\t: sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass retbleed smt_rsb srso ibpb_no_ret spectre_v2_user\nbogomips\t: 5599.99\nTLB size\t: 1024 4K pages\nclflush size\t: 64\ncache_alignment\t: 64\naddress sizes\t: 40 bits physical, 48 bits virtual\npower management:\n\nprocessor\t: 2\nvendor_id\t: AuthenticAMD\ncpu family\t: 23\nmodel\t\t: 49\nmodel name\t: AMD EPYC-Rome Processor\nstepping\t: 0\nmicrocode\t: 0x1000065\ncpu MHz\t\t: 2799.998\ncache size\t: 512 KB\nphysical id\t: 2\nsiblings\t: 1\ncore id\t\t: 0\ncpu cores\t: 1\napicid\t\t: 2\ninitial apicid\t: 2\nfpu\t\t: yes\nfpu_exception\t: yes\ncpuid level\t: 13\nwp\t\t: yes\nflags\t\t: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm rep_good nopl xtopology cpuid extd_apicid tsc_known_freq pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm cmp_legacy svm cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw topoext perfctr_core ssbd ibrs ibpb stibp vmmcall fsgsbase tsc_adjust bmi1 avx2 smep bmi2 rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 clzero xsaveerptr wbnoinvd arat npt lbrv nrip_save tsc_scale vmcb_clean pausefilter pfthreshold umip rdpid arch_capabilities\nbugs\t\t: sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass retbleed smt_rsb srso ibpb_no_ret spectre_v2_user\nbogomips\t: 5599.99\nTLB size\t: 1024 4K pages\nclflush size\t: 64\ncache_alignment\t: 64\naddress sizes\t: 40 bits physical, 48 bits virtual\npower management:\n\nprocessor\t: 3\nvendor_id\t: AuthenticAMD\ncpu family\t: 23\nmodel\t\t: 49\nmodel name\t: AMD EPYC-Rome Processor\nstepping\t: 0\nmicrocode\t: 0x1000065\ncpu MHz\t\t: 2799.998\ncache size\t: 512 KB\nphysical id\t: 3\nsiblings\t: 1\ncore id\t\t: 0\ncpu cores\t: 1\napicid\t\t: 3\ninitial apicid\t: 3\nfpu\t\t: yes\nfpu_exception\t: yes\ncpuid level\t: 13\nwp\t\t: yes\nflags\t\t: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm rep_good nopl xtopology cpuid extd_apicid tsc_known_freq pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm cmp_legacy svm cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw topoext perfctr_core ssbd ibrs ibpb stibp vmmcall fsgsbase tsc_adjust bmi1 avx2 smep bmi2 rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 clzero xsaveerptr wbnoinvd arat npt lbrv nrip_save tsc_scale vmcb_clean pausefilter pfthreshold umip rdpid arch_capabilities\nbugs\t\t: sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass retbleed smt_rsb srso ibpb_no_ret spectre_v2_user\nbogomips\t: 5599.99\nTLB size\t: 1024 4K pages\nclflush size\t: 64\ncache_alignment\t: 64\naddress sizes\t: 40 bits physical, 48 bits virtual\npower management:\n\nprocessor\t: 4\nvendor_id\t: AuthenticAMD\ncpu family\t: 23\nmodel\t\t: 49\nmodel name\t: AMD EPYC-Rome Processor\nstepping\t: 0\nmicrocode\t: 0x1000065\ncpu MHz\t\t: 2799.998\ncache size\t: 512 KB\nphysical id\t: 4\nsiblings\t: 1\ncore id\t\t: 0\ncpu cores\t: 1\napicid\t\t: 4\ninitial apicid\t: 4\nfpu\t\t: yes\nfpu_exception\t: yes\ncpuid level\t: 13\nwp\t\t: yes\nflags\t\t: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm rep_good nopl xtopology cpuid extd_apicid tsc_known_freq pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm cmp_legacy svm cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw topoext perfctr_core ssbd ibrs ibpb stibp vmmcall fsgsbase tsc_adjust bmi1 avx2 smep bmi2 rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 clzero xsaveerptr wbnoinvd arat npt lbrv nrip_save tsc_scale vmcb_clean pausefilter pfthreshold umip rdpid arch_capabilities\nbugs\t\t: sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass retbleed smt_rsb srso ibpb_no_ret spectre_v2_user\nbogomips\t: 5599.99\nTLB size\t: 1024 4K pages\nclflush size\t: 64\ncache_alignment\t: 64\naddress sizes\t: 40 bits physical, 48 bits virtual\npower management:\n\nprocessor\t: 5\nvendor_id\t: AuthenticAMD\ncpu family\t: 23\nmodel\t\t: 49\nmodel name\t: AMD EPYC-Rome Processor\nstepping\t: 0\nmicrocode\t: 0x1000065\ncpu MHz\t\t: 2799.998\ncache size\t: 512 KB\nphysical id\t: 5\nsiblings\t: 1\ncore id\t\t: 0\ncpu cores\t: 1\napicid\t\t: 5\ninitial apicid\t: 5\nfpu\t\t: yes\nfpu_exception\t: yes\ncpuid level\t: 13\nwp\t\t: yes\nflags\t\t: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm rep_good nopl xtopology cpuid extd_apicid tsc_known_freq pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm cmp_legacy svm cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw topoext perfctr_core ssbd ibrs ibpb stibp vmmcall fsgsbase tsc_adjust bmi1 avx2 smep bmi2 rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 clzero xsaveerptr wbnoinvd arat npt lbrv nrip_save tsc_scale vmcb_clean pausefilter pfthreshold umip rdpid arch_capabilities\nbugs\t\t: sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass retbleed smt_rsb srso ibpb_no_ret spectre_v2_user\nbogomips\t: 5599.99\nTLB size\t: 1024 4K pages\nclflush size\t: 64\ncache_alignment\t: 64\naddress sizes\t: 40 bits physical, 48 bits virtual\npower management:\n\nprocessor\t: 6\nvendor_id\t: AuthenticAMD\ncpu family\t: 23\nmodel\t\t: 49\nmodel name\t: AMD EPYC-Rome Processor\nstepping\t: 0\nmicrocode\t: 0x1000065\ncpu MHz\t\t: 2799.998\ncache size\t: 512 KB\nphysical id\t: 6\nsiblings\t: 1\ncore id\t\t: 0\ncpu cores\t: 1\napicid\t\t: 6\ninitial apicid\t: 6\nfpu\t\t: yes\nfpu_exception\t: yes\ncpuid level\t: 13\nwp\t\t: yes\nflags\t\t: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm rep_good nopl xtopology cpuid extd_apicid tsc_known_freq pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm cmp_legacy svm cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw topoext perfctr_core ssbd ibrs ibpb stibp vmmcall fsgsbase tsc_adjust bmi1 avx2 smep bmi2 rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 clzero xsaveerptr wbnoinvd arat npt lbrv nrip_save tsc_scale vmcb_clean pausefilter pfthreshold umip rdpid arch_capabilities\nbugs\t\t: sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass retbleed smt_rsb srso ibpb_no_ret spectre_v2_user\nbogomips\t: 5599.99\nTLB size\t: 1024 4K pages\nclflush size\t: 64\ncache_alignment\t: 64\naddress sizes\t: 40 bits physical, 48 bits virtual\npower management:\n\nprocessor\t: 7\nvendor_id\t: AuthenticAMD\ncpu family\t: 23\nmodel\t\t: 49\nmodel name\t: AMD EPYC-Rome Processor\nstepping\t: 0\nmicrocode\t: 0x1000065\ncpu MHz\t\t: 2799.998\ncache size\t: 512 KB\nphysical id\t: 7\nsiblings\t: 1\ncore id\t\t: 0\ncpu cores\t: 1\napicid\t\t: 7\ninitial apicid\t: 7\nfpu\t\t: yes\nfpu_exception\t: yes\ncpuid level\t: 13\nwp\t\t: yes\nflags\t\t: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm rep_good nopl xtopology cpuid extd_apicid tsc_known_freq pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm cmp_legacy svm cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw topoext perfctr_core ssbd ibrs ibpb stibp vmmcall fsgsbase tsc_adjust bmi1 avx2 smep bmi2 rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 clzero xsaveerptr wbnoinvd arat npt lbrv nrip_save tsc_scale vmcb_clean pausefilter pfthreshold umip rdpid arch_capabilities\nbugs\t\t: sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass retbleed smt_rsb srso ibpb_no_ret spectre_v2_user\nbogomips\t: 5599.99\nTLB size\t: 1024 4K pages\nclflush size\t: 64\ncache_alignment\t: 64\naddress sizes\t: 40 bits physical, 48 bits virtual\npower management:\n\n",
                            "traceroute": null,
                            "uname": "Linux np0000067687.novalocal 7.0.11-100.fc43.x86_64 #1 SMP PREEMPT_DYNAMIC Mon Jun  1 22:51:40 UTC 2026 x86_64 GNU/Linux\n"
                        }
                    },
                    "role": {
                        "id": "0a580a2a-0013-7298-955f-000000000039",
                        "name": "validate-host",
                        "path": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/trusted/project_1/opendev.org/zuul/zuul-jobs/roles/validate-host"
                    },
                    "task": {
                        "duration": {
                            "end": "2026-06-08T21:12:17.051340Z",
                            "start": "2026-06-08T21:12:16.554078Z"
                        },
                        "id": "0a580a2a-0013-7298-955f-000000000041",
                        "name": "Collect information about zuul worker"
                    }
                },
                {
                    "hosts": {
                        "container": {
                            "action": "template",
                            "changed": true,
                            "checksum": "6d42d87d2bb50fbdd6a9951f27d49fc8a122b38a",
                            "dest": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/work/logs/zuul-info/zuul-info.container.txt",
                            "diff": [],
                            "gid": 0,
                            "group": "root",
                            "invocation": {
                                "module_args": {
                                    "_original_basename": "zuul-info.j2",
                                    "attributes": null,
                                    "backup": false,
                                    "checksum": "6d42d87d2bb50fbdd6a9951f27d49fc8a122b38a",
                                    "content": null,
                                    "dest": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/work/logs/zuul-info/zuul-info.container.txt",
                                    "directory_mode": null,
                                    "follow": false,
                                    "force": true,
                                    "group": null,
                                    "local_follow": null,
                                    "mode": 420,
                                    "owner": null,
                                    "remote_src": null,
                                    "selevel": null,
                                    "serole": null,
                                    "setype": null,
                                    "seuser": null,
                                    "src": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/work/.ansible/tmp/ansible-tmp-1780953137.1040823-127-178655208488397/source",
                                    "unsafe_writes": false,
                                    "validate": null
                                }
                            },
                            "md5sum": "0bf3fa32fa93810cbcc0199b88f3ecaa",
                            "mode": "0644",
                            "owner": "1000",
                            "size": 3470,
                            "src": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/work/.ansible/tmp/ansible-tmp-1780953137.1040823-127-178655208488397/source",
                            "state": "file",
                            "uid": 1000
                        }
                    },
                    "role": {
                        "id": "0a580a2a-0013-7298-955f-000000000039",
                        "name": "validate-host",
                        "path": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/trusted/project_1/opendev.org/zuul/zuul-jobs/roles/validate-host"
                    },
                    "task": {
                        "duration": {
                            "end": "2026-06-08T21:12:17.554354Z",
                            "start": "2026-06-08T21:12:17.059547Z"
                        },
                        "id": "0a580a2a-0013-7298-955f-000000000042",
                        "name": "Write out all zuul information for each host"
                    }
                },
                {
                    "hosts": {
                        "container": {
                            "action": "zuul_console",
                            "changed": false,
                            "invocation": {
                                "module_args": {
                                    "path": "/tmp/console-{log_uuid}.log",
                                    "port": 19885,
                                    "state": "present"
                                }
                            }
                        }
                    },
                    "role": {
                        "id": "0a580a2a-0013-7298-955f-000000000059",
                        "name": "prepare-workspace",
                        "path": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/trusted/project_1/opendev.org/zuul/zuul-jobs/roles/prepare-workspace"
                    },
                    "task": {
                        "duration": {
                            "end": "2026-06-08T21:12:17.881528Z",
                            "start": "2026-06-08T21:12:17.561329Z"
                        },
                        "id": "0a580a2a-0013-7298-955f-00000000005b",
                        "name": "Start zuul_console daemon."
                    }
                },
                {
                    "hosts": {
                        "container": {
                            "action": "synchronize",
                            "censored": "the output has been hidden due to the fact that 'no_log: true' was specified for this result",
                            "changed": true
                        }
                    },
                    "role": {
                        "id": "0a580a2a-0013-7298-955f-000000000059",
                        "name": "prepare-workspace",
                        "path": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/trusted/project_1/opendev.org/zuul/zuul-jobs/roles/prepare-workspace"
                    },
                    "task": {
                        "duration": {
                            "end": "2026-06-08T21:12:18.866182Z",
                            "start": "2026-06-08T21:12:17.890154Z"
                        },
                        "id": "0a580a2a-0013-7298-955f-00000000005c",
                        "name": "Synchronize src repos to workspace directory."
                    }
                },
                {
                    "hosts": {
                        "container": {
                            "action": "stat",
                            "changed": false,
                            "failed_when_result": false,
                            "invocation": {
                                "module_args": {
                                    "checksum_algorithm": "sha1",
                                    "follow": false,
                                    "get_attributes": true,
                                    "get_checksum": true,
                                    "get_mime": true,
                                    "path": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/work/ee826544184d43cabc8c21484a8d852a_id_rsa"
                                }
                            },
                            "stat": {
                                "exists": false
                            }
                        }
                    },
                    "role": {
                        "id": "0a580a2a-0013-7298-955f-000000000068",
                        "name": "add-build-sshkey",
                        "path": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/trusted/project_1/opendev.org/zuul/zuul-jobs/roles/add-build-sshkey"
                    },
                    "task": {
                        "duration": {
                            "end": "2026-06-08T21:12:19.173079Z",
                            "start": "2026-06-08T21:12:18.874704Z"
                        },
                        "id": "0a580a2a-0013-7298-955f-00000000006a",
                        "name": "Check to see if ssh key was already created for this build"
                    }
                },
                {
                    "hosts": {
                        "container": {
                            "action": "include_tasks",
                            "changed": false,
                            "include": "create-key-and-replace.yaml",
                            "include_args": {}
                        }
                    },
                    "role": {
                        "id": "0a580a2a-0013-7298-955f-000000000068",
                        "name": "add-build-sshkey",
                        "path": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/trusted/project_1/opendev.org/zuul/zuul-jobs/roles/add-build-sshkey"
                    },
                    "task": {
                        "duration": {
                            "end": "2026-06-08T21:12:19.206265Z",
                            "start": "2026-06-08T21:12:19.177887Z"
                        },
                        "id": "0a580a2a-0013-7298-955f-00000000006b",
                        "name": "Create a new key in workspace based on build UUID"
                    }
                },
                {
                    "hosts": {
                        "container": {
                            "action": "command",
                            "changed": true,
                            "cmd": [
                                "ssh-keygen",
                                "-t",
                                "rsa",
                                "-N",
                                "",
                                "-C",
                                "zuul-build-sshkey",
                                "-f",
                                "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/work/ee826544184d43cabc8c21484a8d852a_id_rsa",
                                "-b",
                                "3072"
                            ],
                            "delta": "0:00:00.133872",
                            "end": "2026-06-08 21:12:19.840619",
                            "invocation": {
                                "module_args": {
                                    "_raw_params": "ssh-keygen -t rsa -N '' -C 'zuul-build-sshkey' -f /var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/work/ee826544184d43cabc8c21484a8d852a_id_rsa -b 3072",
                                    "_uses_shell": false,
                                    "argv": null,
                                    "chdir": null,
                                    "creates": null,
                                    "executable": null,
                                    "expand_argument_vars": true,
                                    "removes": null,
                                    "stdin": null,
                                    "stdin_add_newline": true,
                                    "strip_empty_ends": true,
                                    "zuul_ansible_split_streams": false,
                                    "zuul_log_id": "0a580a2a-0013-7298-955f-000000000122-0-container",
                                    "zuul_no_log": false,
                                    "zuul_output_max_bytes": 1073741824
                                }
                            },
                            "msg": "",
                            "rc": 0,
                            "start": "2026-06-08 21:12:19.706747",
                            "stderr": "",
                            "stderr_lines": [],
                            "stdout": "Generating public/private rsa key pair.\nYour identification has been saved in /var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/work/ee826544184d43cabc8c21484a8d852a_id_rsa\nYour public key has been saved in /var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/work/ee826544184d43cabc8c21484a8d852a_id_rsa.pub\nThe key fingerprint is:\nSHA256:kTxNJrtwDvNOtvsS5LrDWShzaHNodaU9niZ1GubsCKc zuul-build-sshkey\nThe key's randomart image is:\n+---[RSA 3072]----+\n|        . o      |\n|       . B.      |\n|      + B+.      |\n|      .B++* .    |\n|     + =S* *     |\n|    O =+*.B      |\n|   o B Bo*       |\n|      E o..      |\n|      .o.o.      |\n+----[SHA256]-----+",
                            "stdout_lines": [
                                "Generating public/private rsa key pair.",
                                "Your identification has been saved in /var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/work/ee826544184d43cabc8c21484a8d852a_id_rsa",
                                "Your public key has been saved in /var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/work/ee826544184d43cabc8c21484a8d852a_id_rsa.pub",
                                "The key fingerprint is:",
                                "SHA256:kTxNJrtwDvNOtvsS5LrDWShzaHNodaU9niZ1GubsCKc zuul-build-sshkey",
                                "The key's randomart image is:",
                                "+---[RSA 3072]----+",
                                "|        . o      |",
                                "|       . B.      |",
                                "|      + B+.      |",
                                "|      .B++* .    |",
                                "|     + =S* *     |",
                                "|    O =+*.B      |",
                                "|   o B Bo*       |",
                                "|      E o..      |",
                                "|      .o.o.      |",
                                "+----[SHA256]-----+"
                            ],
                            "zuul_log_id": "0a580a2a-0013-7298-955f-000000000122-0-container"
                        }
                    },
                    "role": {
                        "id": "0a580a2a-0013-7298-955f-000000000068",
                        "name": "add-build-sshkey",
                        "path": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/trusted/project_1/opendev.org/zuul/zuul-jobs/roles/add-build-sshkey"
                    },
                    "task": {
                        "duration": {
                            "end": "2026-06-08T21:12:19.921046Z",
                            "start": "2026-06-08T21:12:19.220825Z"
                        },
                        "id": "0a580a2a-0013-7298-955f-000000000122",
                        "name": "Create Temp SSH key"
                    }
                },
                {
                    "hosts": {
                        "container": {
                            "action": "include_tasks",
                            "changed": false,
                            "include": "remote-linux.yaml",
                            "include_args": {}
                        }
                    },
                    "role": {
                        "id": "0a580a2a-0013-7298-955f-000000000068",
                        "name": "add-build-sshkey",
                        "path": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/trusted/project_1/opendev.org/zuul/zuul-jobs/roles/add-build-sshkey"
                    },
                    "task": {
                        "duration": {
                            "end": "2026-06-08T21:12:19.966907Z",
                            "start": "2026-06-08T21:12:19.937430Z"
                        },
                        "id": "0a580a2a-0013-7298-955f-000000000123",
                        "name": "Remote setup ssh keys (linux)"
                    }
                },
                {
                    "hosts": {
                        "container": {
                            "action": "lineinfile",
                            "changed": false,
                            "false_condition": "zuul_build_sshkey_cleanup",
                            "skip_reason": "Conditional result was False",
                            "skipped": true
                        }
                    },
                    "role": {
                        "id": "0a580a2a-0013-7298-955f-000000000068",
                        "name": "add-build-sshkey",
                        "path": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/trusted/project_1/opendev.org/zuul/zuul-jobs/roles/add-build-sshkey"
                    },
                    "task": {
                        "duration": {
                            "end": "2026-06-08T21:12:20.012287Z",
                            "start": "2026-06-08T21:12:19.986916Z"
                        },
                        "id": "0a580a2a-0013-7298-955f-000000000148",
                        "name": "Remove previously added zuul-build-sshkey"
                    }
                },
                {
                    "hosts": {
                        "container": {
                            "action": "authorized_key",
                            "changed": true,
                            "comment": null,
                            "exclusive": false,
                            "follow": false,
                            "invocation": {
                                "module_args": {
                                    "changed": true,
                                    "comment": null,
                                    "exclusive": false,
                                    "follow": false,
                                    "key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDDglJvb37Rb/b1I5Nr5ukWMuJW7bGcDM7wXQpsSNroyWdEr1GBqZ3JgHjQrdYAMAoHsUsNVABNZY7EcOnr3uUkONOilSh99W0E/PKl+f0/i1Y7Y7Q5rPyJJwqUatfVfZZGNH7+xcTYQBCEAITfT+EqFK2kSWTZGvNWgO8SUwclU0rss/75ci9d6MmMb6UFISSr6v8BP1CeYFw8pLSTkSeDub7k2US3NLs4Z2Sy3ua8/Oy/Gx0PGs5l0V/4flpl0tizNasw7O6FcuLIYZ5Ppt0xaThe8LWa2bykBq20tW0TuFRQE1Z9mvD2ZbquGELeoDLCXiNzQSLsPWcWOVFSpH1U+rmlDqAhrKBl4qgA6uMM/An+Xfie9cRBP0wpw4aD7DrZ80BkL08z/5H23S+PFaVlSk5mbJPHZoMYzheZJZplxDIeMpFOcWK/zlFvJ85AFuSbuDkfUi2cWCXy3bTKFIyTPXoC1nHN20Ixf6geFvbFW4jzhM9nAphYdPmdlp77TqE= zuul-build-sshkey",
                                    "key_options": null,
                                    "keyfile": "/home/zuul-worker/.ssh/authorized_keys",
                                    "manage_dir": true,
                                    "path": null,
                                    "state": "present",
                                    "user": "zuul-worker",
                                    "validate_certs": true
                                }
                            },
                            "key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDDglJvb37Rb/b1I5Nr5ukWMuJW7bGcDM7wXQpsSNroyWdEr1GBqZ3JgHjQrdYAMAoHsUsNVABNZY7EcOnr3uUkONOilSh99W0E/PKl+f0/i1Y7Y7Q5rPyJJwqUatfVfZZGNH7+xcTYQBCEAITfT+EqFK2kSWTZGvNWgO8SUwclU0rss/75ci9d6MmMb6UFISSr6v8BP1CeYFw8pLSTkSeDub7k2US3NLs4Z2Sy3ua8/Oy/Gx0PGs5l0V/4flpl0tizNasw7O6FcuLIYZ5Ppt0xaThe8LWa2bykBq20tW0TuFRQE1Z9mvD2ZbquGELeoDLCXiNzQSLsPWcWOVFSpH1U+rmlDqAhrKBl4qgA6uMM/An+Xfie9cRBP0wpw4aD7DrZ80BkL08z/5H23S+PFaVlSk5mbJPHZoMYzheZJZplxDIeMpFOcWK/zlFvJ85AFuSbuDkfUi2cWCXy3bTKFIyTPXoC1nHN20Ixf6geFvbFW4jzhM9nAphYdPmdlp77TqE= zuul-build-sshkey",
                            "key_options": null,
                            "keyfile": "/home/zuul-worker/.ssh/authorized_keys",
                            "manage_dir": true,
                            "path": null,
                            "state": "present",
                            "user": "zuul-worker",
                            "validate_certs": true
                        }
                    },
                    "role": {
                        "id": "0a580a2a-0013-7298-955f-000000000068",
                        "name": "add-build-sshkey",
                        "path": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/trusted/project_1/opendev.org/zuul/zuul-jobs/roles/add-build-sshkey"
                    },
                    "task": {
                        "duration": {
                            "end": "2026-06-08T21:12:20.551929Z",
                            "start": "2026-06-08T21:12:20.017835Z"
                        },
                        "id": "0a580a2a-0013-7298-955f-000000000149",
                        "name": "Enable access via build key on all nodes"
                    }
                },
                {
                    "hosts": {
                        "container": {
                            "action": "file",
                            "changed": false,
                            "diff": {
                                "after": {
                                    "path": "/home/zuul-worker/.ssh"
                                },
                                "before": {
                                    "path": "/home/zuul-worker/.ssh"
                                }
                            },
                            "gid": 1000,
                            "group": "zuul-worker",
                            "invocation": {
                                "module_args": {
                                    "_diff_peek": null,
                                    "_original_basename": null,
                                    "access_time": null,
                                    "access_time_format": "%Y%m%d%H%M.%S",
                                    "attributes": null,
                                    "follow": true,
                                    "force": false,
                                    "group": null,
                                    "mode": 448,
                                    "modification_time": null,
                                    "modification_time_format": "%Y%m%d%H%M.%S",
                                    "owner": null,
                                    "path": "/home/zuul-worker/.ssh",
                                    "recurse": false,
                                    "selevel": null,
                                    "serole": null,
                                    "setype": null,
                                    "seuser": null,
                                    "src": null,
                                    "state": "directory",
                                    "unsafe_writes": false
                                }
                            },
                            "mode": "0700",
                            "owner": "zuul-worker",
                            "path": "/home/zuul-worker/.ssh",
                            "secontext": "system_u:object_r:ssh_home_t:s0",
                            "size": 30,
                            "state": "directory",
                            "uid": 1000
                        }
                    },
                    "role": {
                        "id": "0a580a2a-0013-7298-955f-000000000068",
                        "name": "add-build-sshkey",
                        "path": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/trusted/project_1/opendev.org/zuul/zuul-jobs/roles/add-build-sshkey"
                    },
                    "task": {
                        "duration": {
                            "end": "2026-06-08T21:12:21.103994Z",
                            "start": "2026-06-08T21:12:20.555826Z"
                        },
                        "id": "0a580a2a-0013-7298-955f-00000000014a",
                        "name": "Make sure user has a .ssh"
                    }
                },
                {
                    "hosts": {
                        "container": {
                            "action": "copy",
                            "changed": true,
                            "checksum": "6488d2ab1dbc80cee8bb099e7c661549785d8014",
                            "dest": "/home/zuul-worker/.ssh/id_rsa",
                            "diff": [],
                            "gid": 1000,
                            "group": "zuul-worker",
                            "invocation": {
                                "module_args": {
                                    "_original_basename": "ee826544184d43cabc8c21484a8d852a_id_rsa",
                                    "attributes": null,
                                    "backup": false,
                                    "checksum": "6488d2ab1dbc80cee8bb099e7c661549785d8014",
                                    "content": null,
                                    "dest": "/home/zuul-worker/.ssh/id_rsa",
                                    "directory_mode": null,
                                    "follow": false,
                                    "force": false,
                                    "group": null,
                                    "local_follow": null,
                                    "mode": 384,
                                    "owner": null,
                                    "remote_src": null,
                                    "selevel": null,
                                    "serole": null,
                                    "setype": null,
                                    "seuser": null,
                                    "src": "/home/zuul-worker/.ansible/tmp/ansible-tmp-1780953141.2080472-205-56536823423360/source",
                                    "unsafe_writes": false,
                                    "validate": null
                                }
                            },
                            "md5sum": "127349b9b68144b345c5a56ccabf4a71",
                            "mode": "0600",
                            "owner": "zuul-worker",
                            "secontext": "unconfined_u:object_r:ssh_home_t:s0",
                            "size": 2602,
                            "src": "/home/zuul-worker/.ansible/tmp/ansible-tmp-1780953141.2080472-205-56536823423360/source",
                            "state": "file",
                            "uid": 1000
                        }
                    },
                    "role": {
                        "id": "0a580a2a-0013-7298-955f-000000000068",
                        "name": "add-build-sshkey",
                        "path": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/trusted/project_1/opendev.org/zuul/zuul-jobs/roles/add-build-sshkey"
                    },
                    "task": {
                        "duration": {
                            "end": "2026-06-08T21:12:22.022320Z",
                            "start": "2026-06-08T21:12:21.111288Z"
                        },
                        "id": "0a580a2a-0013-7298-955f-00000000014b",
                        "name": "Install build private key as SSH key on all nodes"
                    }
                },
                {
                    "hosts": {
                        "container": {
                            "action": "copy",
                            "changed": true,
                            "checksum": "82f6b4e96c4b295469e005601a6b912948182426",
                            "dest": "/home/zuul-worker/.ssh/id_rsa.pub",
                            "diff": [],
                            "gid": 1000,
                            "group": "zuul-worker",
                            "invocation": {
                                "module_args": {
                                    "_original_basename": "ee826544184d43cabc8c21484a8d852a_id_rsa.pub",
                                    "attributes": null,
                                    "backup": false,
                                    "checksum": "82f6b4e96c4b295469e005601a6b912948182426",
                                    "content": null,
                                    "dest": "/home/zuul-worker/.ssh/id_rsa.pub",
                                    "directory_mode": null,
                                    "follow": false,
                                    "force": false,
                                    "group": null,
                                    "local_follow": null,
                                    "mode": 420,
                                    "owner": null,
                                    "remote_src": null,
                                    "selevel": null,
                                    "serole": null,
                                    "setype": null,
                                    "seuser": null,
                                    "src": "/home/zuul-worker/.ansible/tmp/ansible-tmp-1780953142.1094477-215-204725114874195/source",
                                    "unsafe_writes": false,
                                    "validate": null
                                }
                            },
                            "md5sum": "cdc82e3bf66e6a5be9ca2cd7fdf829c8",
                            "mode": "0644",
                            "owner": "zuul-worker",
                            "secontext": "unconfined_u:object_r:ssh_home_t:s0",
                            "size": 571,
                            "src": "/home/zuul-worker/.ansible/tmp/ansible-tmp-1780953142.1094477-215-204725114874195/source",
                            "state": "file",
                            "uid": 1000
                        }
                    },
                    "role": {
                        "id": "0a580a2a-0013-7298-955f-000000000068",
                        "name": "add-build-sshkey",
                        "path": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/trusted/project_1/opendev.org/zuul/zuul-jobs/roles/add-build-sshkey"
                    },
                    "task": {
                        "duration": {
                            "end": "2026-06-08T21:12:22.823442Z",
                            "start": "2026-06-08T21:12:22.026024Z"
                        },
                        "id": "0a580a2a-0013-7298-955f-00000000014c",
                        "name": "Install build public key as SSH key on all nodes"
                    }
                },
                {
                    "hosts": {
                        "container": {
                            "action": "include_tasks",
                            "changed": false,
                            "false_condition": "ansible_os_family == \"Windows\"",
                            "skip_reason": "Conditional result was False",
                            "skipped": true
                        }
                    },
                    "role": {
                        "id": "0a580a2a-0013-7298-955f-000000000068",
                        "name": "add-build-sshkey",
                        "path": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/trusted/project_1/opendev.org/zuul/zuul-jobs/roles/add-build-sshkey"
                    },
                    "task": {
                        "duration": {
                            "end": "2026-06-08T21:12:22.855162Z",
                            "start": "2026-06-08T21:12:22.827854Z"
                        },
                        "id": "0a580a2a-0013-7298-955f-000000000124",
                        "name": "Remote setup ssh keys (windows)"
                    }
                },
                {
                    "hosts": {
                        "container": {
                            "action": "sshagent_remove_keys",
                            "changed": true,
                            "invocation": {
                                "module_args": {
                                    "remove": "^(?!\\(stdin\\)).*"
                                }
                            },
                            "removed": [
                                "/var/lib/zuul-ssh/..data/priv"
                            ]
                        }
                    },
                    "role": {
                        "id": "0a580a2a-0013-7298-955f-000000000129",
                        "name": "remove-zuul-sshkey",
                        "path": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/trusted/project_1/opendev.org/zuul/zuul-jobs/roles/remove-zuul-sshkey"
                    },
                    "task": {
                        "duration": {
                            "end": "2026-06-08T21:12:23.277738Z",
                            "start": "2026-06-08T21:12:22.864926Z"
                        },
                        "id": "0a580a2a-0013-7298-955f-00000000012b",
                        "name": "Remove master key from local agent"
                    }
                },
                {
                    "hosts": {
                        "container": {
                            "action": "command",
                            "changed": true,
                            "cmd": [
                                "ssh-add",
                                "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/work/ee826544184d43cabc8c21484a8d852a_id_rsa"
                            ],
                            "delta": "0:00:00.018498",
                            "end": "2026-06-08 21:12:23.627086",
                            "invocation": {
                                "module_args": {
                                    "_raw_params": "ssh-add /var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/work/ee826544184d43cabc8c21484a8d852a_id_rsa",
                                    "_uses_shell": false,
                                    "argv": null,
                                    "chdir": null,
                                    "creates": null,
                                    "executable": null,
                                    "expand_argument_vars": true,
                                    "removes": null,
                                    "stdin": null,
                                    "stdin_add_newline": true,
                                    "strip_empty_ends": true,
                                    "zuul_ansible_split_streams": false,
                                    "zuul_log_id": "0a580a2a-0013-7298-955f-000000000131-0-container",
                                    "zuul_no_log": false,
                                    "zuul_output_max_bytes": 1073741824
                                }
                            },
                            "msg": "",
                            "rc": 0,
                            "start": "2026-06-08 21:12:23.608588",
                            "stderr": "",
                            "stderr_lines": [],
                            "stdout": "Identity added: /var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/work/ee826544184d43cabc8c21484a8d852a_id_rsa (zuul-build-sshkey)",
                            "stdout_lines": [
                                "Identity added: /var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/work/ee826544184d43cabc8c21484a8d852a_id_rsa (zuul-build-sshkey)"
                            ],
                            "zuul_log_id": "0a580a2a-0013-7298-955f-000000000131-0-container"
                        }
                    },
                    "role": {
                        "id": "0a580a2a-0013-7298-955f-000000000068",
                        "name": "add-build-sshkey",
                        "path": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/trusted/project_1/opendev.org/zuul/zuul-jobs/roles/add-build-sshkey"
                    },
                    "task": {
                        "duration": {
                            "end": "2026-06-08T21:12:23.685402Z",
                            "start": "2026-06-08T21:12:23.295432Z"
                        },
                        "id": "0a580a2a-0013-7298-955f-000000000131",
                        "name": "Add back temp key"
                    }
                },
                {
                    "hosts": {
                        "container": {
                            "action": "ping",
                            "changed": false,
                            "invocation": {
                                "module_args": {
                                    "data": "pong"
                                }
                            },
                            "ping": "pong"
                        }
                    },
                    "role": {
                        "id": "0a580a2a-0013-7298-955f-000000000068",
                        "name": "add-build-sshkey",
                        "path": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/trusted/project_1/opendev.org/zuul/zuul-jobs/roles/add-build-sshkey"
                    },
                    "task": {
                        "duration": {
                            "end": "2026-06-08T21:12:24.256142Z",
                            "start": "2026-06-08T21:12:23.693888Z"
                        },
                        "id": "0a580a2a-0013-7298-955f-000000000132",
                        "name": "Verify we can still SSH to all nodes"
                    }
                },
                {
                    "hosts": {
                        "container": {
                            "action": "command",
                            "changed": false,
                            "false_condition": "ansible_os_family == \"Windows\"",
                            "skip_reason": "Conditional result was False",
                            "skipped": true
                        }
                    },
                    "role": {
                        "id": "0a580a2a-0013-7298-955f-000000000068",
                        "name": "add-build-sshkey",
                        "path": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/trusted/project_1/opendev.org/zuul/zuul-jobs/roles/add-build-sshkey"
                    },
                    "task": {
                        "duration": {
                            "end": "2026-06-08T21:12:24.287641Z",
                            "start": "2026-06-08T21:12:24.261189Z"
                        },
                        "id": "0a580a2a-0013-7298-955f-000000000133",
                        "name": "Verify we can still SSH to all nodes (windows)"
                    }
                },
                {
                    "hosts": {
                        "container": {
                            "action": "include_tasks",
                            "changed": false,
                            "results": [],
                            "skipped": true,
                            "skipped_reason": "No items in the list"
                        }
                    },
                    "role": {
                        "id": "0a580a2a-0013-7298-955f-000000000078",
                        "name": "prepare-workspace-openshift",
                        "path": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/trusted/project_1/opendev.org/zuul/zuul-jobs/roles/prepare-workspace-openshift"
                    },
                    "task": {
                        "duration": {
                            "end": "2026-06-08T21:12:24.360122Z",
                            "start": "2026-06-08T21:12:24.295104Z"
                        },
                        "id": "0a580a2a-0013-7298-955f-00000000007a",
                        "name": "Include rsync tasks"
                    }
                },
                {
                    "hosts": {
                        "container": {
                            "action": "sshagent_remove_keys",
                            "changed": false,
                            "false_condition": "ansible_connection == 'kubectl'",
                            "skip_reason": "Conditional result was False",
                            "skipped": true
                        }
                    },
                    "role": {
                        "id": "0a580a2a-0013-7298-955f-000000000085",
                        "name": "remove-zuul-sshkey",
                        "path": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/trusted/project_1/opendev.org/zuul/zuul-jobs/roles/remove-zuul-sshkey"
                    },
                    "task": {
                        "duration": {
                            "end": "2026-06-08T21:12:24.404641Z",
                            "start": "2026-06-08T21:12:24.376871Z"
                        },
                        "id": "0a580a2a-0013-7298-955f-000000000087",
                        "name": "Remove master key from local agent"
                    }
                },
                {
                    "hosts": {
                        "container": {
                            "action": "file",
                            "changed": false,
                            "msg": "All items completed",
                            "results": [
                                {
                                    "ansible_loop_var": "zj_output_dir",
                                    "changed": false,
                                    "failed": false,
                                    "invocation": {
                                        "module_args": {
                                            "_diff_peek": null,
                                            "_original_basename": null,
                                            "access_time": null,
                                            "access_time_format": "%Y%m%d%H%M.%S",
                                            "attributes": null,
                                            "follow": true,
                                            "force": false,
                                            "group": null,
                                            "mode": null,
                                            "modification_time": null,
                                            "modification_time_format": "%Y%m%d%H%M.%S",
                                            "owner": null,
                                            "path": "/home/zuul-worker/zuul-output/logs",
                                            "recurse": false,
                                            "selevel": null,
                                            "serole": null,
                                            "setype": null,
                                            "seuser": null,
                                            "src": null,
                                            "state": "absent",
                                            "unsafe_writes": false
                                        }
                                    },
                                    "path": "/home/zuul-worker/zuul-output/logs",
                                    "state": "absent",
                                    "zj_output_dir": "logs"
                                },
                                {
                                    "ansible_loop_var": "zj_output_dir",
                                    "changed": false,
                                    "failed": false,
                                    "invocation": {
                                        "module_args": {
                                            "_diff_peek": null,
                                            "_original_basename": null,
                                            "access_time": null,
                                            "access_time_format": "%Y%m%d%H%M.%S",
                                            "attributes": null,
                                            "follow": true,
                                            "force": false,
                                            "group": null,
                                            "mode": null,
                                            "modification_time": null,
                                            "modification_time_format": "%Y%m%d%H%M.%S",
                                            "owner": null,
                                            "path": "/home/zuul-worker/zuul-output/artifacts",
                                            "recurse": false,
                                            "selevel": null,
                                            "serole": null,
                                            "setype": null,
                                            "seuser": null,
                                            "src": null,
                                            "state": "absent",
                                            "unsafe_writes": false
                                        }
                                    },
                                    "path": "/home/zuul-worker/zuul-output/artifacts",
                                    "state": "absent",
                                    "zj_output_dir": "artifacts"
                                },
                                {
                                    "ansible_loop_var": "zj_output_dir",
                                    "changed": false,
                                    "failed": false,
                                    "invocation": {
                                        "module_args": {
                                            "_diff_peek": null,
                                            "_original_basename": null,
                                            "access_time": null,
                                            "access_time_format": "%Y%m%d%H%M.%S",
                                            "attributes": null,
                                            "follow": true,
                                            "force": false,
                                            "group": null,
                                            "mode": null,
                                            "modification_time": null,
                                            "modification_time_format": "%Y%m%d%H%M.%S",
                                            "owner": null,
                                            "path": "/home/zuul-worker/zuul-output/docs",
                                            "recurse": false,
                                            "selevel": null,
                                            "serole": null,
                                            "setype": null,
                                            "seuser": null,
                                            "src": null,
                                            "state": "absent",
                                            "unsafe_writes": false
                                        }
                                    },
                                    "path": "/home/zuul-worker/zuul-output/docs",
                                    "state": "absent",
                                    "zj_output_dir": "docs"
                                }
                            ]
                        }
                    },
                    "role": {
                        "id": "0a580a2a-0013-7298-955f-000000000092",
                        "name": "ensure-output-dirs",
                        "path": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/trusted/project_1/opendev.org/zuul/zuul-jobs/roles/ensure-output-dirs"
                    },
                    "task": {
                        "duration": {
                            "end": "2026-06-08T21:12:25.292056Z",
                            "start": "2026-06-08T21:12:24.419211Z"
                        },
                        "id": "0a580a2a-0013-7298-955f-000000000094",
                        "name": "Empty Zuul Output directories by removing them"
                    }
                },
                {
                    "hosts": {
                        "container": {
                            "action": "file",
                            "changed": true,
                            "msg": "All items completed",
                            "results": [
                                {
                                    "ansible_loop_var": "zj_output_dir",
                                    "changed": true,
                                    "diff": {
                                        "after": {
                                            "path": "/home/zuul-worker/zuul-output/logs",
                                            "state": "directory"
                                        },
                                        "before": {
                                            "path": "/home/zuul-worker/zuul-output/logs",
                                            "state": "absent"
                                        }
                                    },
                                    "failed": false,
                                    "gid": 1000,
                                    "group": "zuul-worker",
                                    "invocation": {
                                        "module_args": {
                                            "_diff_peek": null,
                                            "_original_basename": null,
                                            "access_time": null,
                                            "access_time_format": "%Y%m%d%H%M.%S",
                                            "attributes": null,
                                            "follow": true,
                                            "force": false,
                                            "group": null,
                                            "mode": 493,
                                            "modification_time": null,
                                            "modification_time_format": "%Y%m%d%H%M.%S",
                                            "owner": null,
                                            "path": "/home/zuul-worker/zuul-output/logs",
                                            "recurse": false,
                                            "selevel": null,
                                            "serole": null,
                                            "setype": null,
                                            "seuser": null,
                                            "src": null,
                                            "state": "directory",
                                            "unsafe_writes": false
                                        }
                                    },
                                    "mode": "0755",
                                    "owner": "zuul-worker",
                                    "path": "/home/zuul-worker/zuul-output/logs",
                                    "secontext": "unconfined_u:object_r:user_home_t:s0",
                                    "size": 0,
                                    "state": "directory",
                                    "uid": 1000,
                                    "zj_output_dir": "logs"
                                },
                                {
                                    "ansible_loop_var": "zj_output_dir",
                                    "changed": true,
                                    "diff": {
                                        "after": {
                                            "path": "/home/zuul-worker/zuul-output/artifacts",
                                            "state": "directory"
                                        },
                                        "before": {
                                            "path": "/home/zuul-worker/zuul-output/artifacts",
                                            "state": "absent"
                                        }
                                    },
                                    "failed": false,
                                    "gid": 1000,
                                    "group": "zuul-worker",
                                    "invocation": {
                                        "module_args": {
                                            "_diff_peek": null,
                                            "_original_basename": null,
                                            "access_time": null,
                                            "access_time_format": "%Y%m%d%H%M.%S",
                                            "attributes": null,
                                            "follow": true,
                                            "force": false,
                                            "group": null,
                                            "mode": 493,
                                            "modification_time": null,
                                            "modification_time_format": "%Y%m%d%H%M.%S",
                                            "owner": null,
                                            "path": "/home/zuul-worker/zuul-output/artifacts",
                                            "recurse": false,
                                            "selevel": null,
                                            "serole": null,
                                            "setype": null,
                                            "seuser": null,
                                            "src": null,
                                            "state": "directory",
                                            "unsafe_writes": false
                                        }
                                    },
                                    "mode": "0755",
                                    "owner": "zuul-worker",
                                    "path": "/home/zuul-worker/zuul-output/artifacts",
                                    "secontext": "unconfined_u:object_r:user_home_t:s0",
                                    "size": 0,
                                    "state": "directory",
                                    "uid": 1000,
                                    "zj_output_dir": "artifacts"
                                },
                                {
                                    "ansible_loop_var": "zj_output_dir",
                                    "changed": true,
                                    "diff": {
                                        "after": {
                                            "path": "/home/zuul-worker/zuul-output/docs",
                                            "state": "directory"
                                        },
                                        "before": {
                                            "path": "/home/zuul-worker/zuul-output/docs",
                                            "state": "absent"
                                        }
                                    },
                                    "failed": false,
                                    "gid": 1000,
                                    "group": "zuul-worker",
                                    "invocation": {
                                        "module_args": {
                                            "_diff_peek": null,
                                            "_original_basename": null,
                                            "access_time": null,
                                            "access_time_format": "%Y%m%d%H%M.%S",
                                            "attributes": null,
                                            "follow": true,
                                            "force": false,
                                            "group": null,
                                            "mode": 493,
                                            "modification_time": null,
                                            "modification_time_format": "%Y%m%d%H%M.%S",
                                            "owner": null,
                                            "path": "/home/zuul-worker/zuul-output/docs",
                                            "recurse": false,
                                            "selevel": null,
                                            "serole": null,
                                            "setype": null,
                                            "seuser": null,
                                            "src": null,
                                            "state": "directory",
                                            "unsafe_writes": false
                                        }
                                    },
                                    "mode": "0755",
                                    "owner": "zuul-worker",
                                    "path": "/home/zuul-worker/zuul-output/docs",
                                    "secontext": "unconfined_u:object_r:user_home_t:s0",
                                    "size": 0,
                                    "state": "directory",
                                    "uid": 1000,
                                    "zj_output_dir": "docs"
                                }
                            ]
                        }
                    },
                    "role": {
                        "id": "0a580a2a-0013-7298-955f-000000000092",
                        "name": "ensure-output-dirs",
                        "path": "/var/lib/zuul/builds/ee826544184d43cabc8c21484a8d852a/trusted/project_1/opendev.org/zuul/zuul-jobs/roles/ensure-output-dirs"
                    },
                    "task": {
                        "duration": {
                            "end": "2026-06-08T21:12:26.185212Z",
                            "start": "2026-06-08T21:12:25.302206Z"
                        },
                        "id": "0a580a2a-0013-7298-955f-000000000096",
                        "name": "Ensure Zuul Output directories exist"
                    }
                }
            ]
        }
    ],
    "stats": {
        "container": {
            "changed": 10,
            "failures": 0,
            "ignored": 0,
            "ok": 23,
            "rescued": 0,
            "skipped": 5,
            "unreachable": 0
        },
        "localhost": {
            "changed": 2,
            "failures": 0,
            "ignored": 0,
            "ok": 6,
            "rescued": 0,
            "skipped": 0,
            "unreachable": 0
        }
    },
    "trusted": true
},
{
    "branch": "main",
    "index": "1",
    "phase": "pre",
    "playbook": "github.com/packit/specfile/files/install-requirements-rpms.yaml",
    "plays": [
        {
            "play": {
                "duration": {
                    "end": "2026-06-08T21:12:38.659314Z",
                    "start": "2026-06-08T21:12:26.971924Z"
                },
                "id": "0a580a2a-0013-3e08-11cc-000000000002",
                "name": "Install RPM dependencies for specfile"
            },
            "tasks": [
                {
                    "hosts": {
                        "container": {
                            "action": "include_tasks",
                            "changed": false,
                            "include": "tasks/project-dir.yaml",
                            "include_args": {}
                        }
                    },
                    "task": {
                        "duration": {
                            "end": "2026-06-08T21:12:27.003368Z",
                            "start": "2026-06-08T21:12:26.983492Z"
                        },
                        "id": "0a580a2a-0013-3e08-11cc-000000000004",
                        "name": ""
                    }
                },
                {
                    "hosts": {
                        "container": {
                            "action": "set_fact",
                            "changed": false,
                            "false_condition": "zuul is not defined",
                            "skip_reason": "Conditional result was False",
                            "skipped": true
                        }
                    },
                    "task": {
                        "duration": {
                            "end": "2026-06-08T21:12:27.049472Z",
                            "start": "2026-06-08T21:12:27.014964Z"
                        },
                        "id": "0a580a2a-0013-3e08-11cc-000000000017",
                        "name": ""
                    }
                },
                {
                    "hosts": {
                        "container": {
                            "action": "set_fact",
                            "ansible_facts": {
                                "project_dir": "/home/zuul-worker/src/github.com/packit/specfile"
                            },
                            "changed": false
                        }
                    },
                    "task": {
                        "duration": {
                            "end": "2026-06-08T21:12:27.108147Z",
                            "start": "2026-06-08T21:12:27.054871Z"
                        },
                        "id": "0a580a2a-0013-3e08-11cc-000000000018",
                        "name": ""
                    }
                },
                {
                    "hosts": {
                        "container": {
                            "action": "stat",
                            "changed": false,
                            "invocation": {
                                "module_args": {
                                    "checksum_algorithm": "sha1",
                                    "follow": false,
                                    "get_attributes": true,
                                    "get_checksum": true,
                                    "get_mime": true,
                                    "path": "/home/zuul-worker/src/github.com/packit/specfile"
                                }
                            },
                            "stat": {
                                "atime": 1780953138.7468567,
                                "attr_flags": "",
                                "attributes": [],
                                "block_size": 4096,
                                "blocks": 0,
                                "charset": "binary",
                                "ctime": 1780953138.7528567,
                                "dev": 42,
                                "device_type": 0,
                                "executable": true,
                                "exists": true,
                                "gid": 1000,
                                "gr_name": "zuul-worker",
                                "inode": 273,
                                "isblk": false,
                                "ischr": false,
                                "isdir": true,
                                "isfifo": false,
                                "isgid": true,
                                "islnk": false,
                                "isreg": false,
                                "issock": false,
                                "isuid": false,
                                "mimetype": "inode/directory",
                                "mode": "2755",
                                "mtime": 1780953122.0532339,
                                "nlink": 1,
                                "path": "/home/zuul-worker/src/github.com/packit/specfile",
                                "pw_name": "zuul-worker",
                                "readable": true,
                                "rgrp": true,
                                "roth": true,
                                "rusr": true,
                                "size": 626,
                                "uid": 1000,
                                "version": "418",
                                "wgrp": false,
                                "woth": false,
                                "writeable": true,
                                "wusr": true,
                                "xgrp": true,
                                "xoth": true,
                                "xusr": true
                            }
                        }
                    },
                    "task": {
                        "duration": {
                            "end": "2026-06-08T21:12:27.617904Z",
                            "start": "2026-06-08T21:12:27.120042Z"
                        },
                        "id": "0a580a2a-0013-3e08-11cc-000000000019",
                        "name": "stat /home/zuul-worker/src/github.com/packit/specfile"
                    }
                },
                {
                    "hosts": {
                        "container": {
                            "action": "assert",
                            "changed": false,
                            "msg": "All assertions passed"
                        }
                    },
                    "task": {
                        "duration": {
                            "end": "2026-06-08T21:12:27.665918Z",
                            "start": "2026-06-08T21:12:27.624259Z"
                        },
                        "id": "0a580a2a-0013-3e08-11cc-00000000001a",
                        "name": "Make sure /home/zuul-worker/src/github.com/packit/specfile is present"
                    }
                },
                {
                    "hosts": {
                        "container": {
                            "action": "include_tasks",
                            "changed": false,
                            "include": "tasks/generic-dnf-requirements.yaml",
                            "include_args": {}
                        }
                    },
                    "task": {
                        "duration": {
                            "end": "2026-06-08T21:12:27.691690Z",
                            "start": "2026-06-08T21:12:27.670703Z"
                        },
                        "id": "0a580a2a-0013-3e08-11cc-000000000005",
                        "name": ""
                    }
                },
                {
                    "hosts": {
                        "container": {
                            "action": "dnf",
                            "changed": true,
                            "invocation": {
                                "module_args": {
                                    "allow_downgrade": false,
                                    "allowerasing": false,
                                    "autoremove": false,
                                    "bugfix": false,
                                    "cacheonly": false,
                                    "conf_file": null,
                                    "disable_excludes": null,
                                    "disable_gpg_check": false,
                                    "disable_plugin": [],
                                    "disablerepo": [],
                                    "download_dir": null,
                                    "download_only": false,
                                    "enable_plugin": [],
                                    "enablerepo": [],
                                    "exclude": [],
                                    "install_repoquery": true,
                                    "install_weak_deps": true,
                                    "installroot": "/",
                                    "list": null,
                                    "lock_timeout": 30,
                                    "name": [
                                        "make",
                                        "git",
                                        "dnf-utils",
                                        "python3-pip"
                                    ],
                                    "nobest": false,
                                    "releasever": null,
                                    "security": false,
                                    "skip_broken": false,
                                    "sslverify": true,
                                    "state": null,
                                    "update_cache": false,
                                    "update_only": false,
                                    "validate_certs": true
                                }
                            },
                            "msg": "",
                            "rc": 0,
                            "results": [
                                "Installed: dnf-utils-4.10.1-6.fc43.noarch",
                                "Installed: dnf-plugins-core-4.10.1-6.fc43.noarch",
                                "Installed: python3-dnf-plugins-core-4.10.1-6.fc43.noarch",
                                "Installed: python3-dateutil-1:2.9.0.post0-6.fc43.noarch",
                                "Installed: python3-systemd-235-17.fc43.x86_64"
                            ]
                        }
                    },
                    "task": {
                        "duration": {
                            "end": "2026-06-08T21:12:33.521310Z",
                            "start": "2026-06-08T21:12:27.706108Z"
                        },
                        "id": "0a580a2a-0013-3e08-11cc-000000000031",
                        "name": "Install generic RPM packages"
                    }
                },
                {
                    "hosts": {
                        "container": {
                            "action": "include_tasks",
                            "changed": false,
                            "include": "tasks/build-rpm-deps.yaml",
                            "include_args": {}
                        }
                    },
                    "task": {
                        "duration": {
                            "end": "2026-06-08T21:12:33.545018Z",
                            "start": "2026-06-08T21:12:33.524863Z"
                        },
                        "id": "0a580a2a-0013-3e08-11cc-000000000006",
                        "name": ""
                    }
                },
                {
                    "hosts": {
                        "container": {
                            "action": "command",
                            "changed": true,
                            "cmd": [
                                "dnf",
                                "-y",
                                "builddep",
                                "fedora/python-specfile.spec"
                            ],
                            "delta": "0:00:01.192457",
                            "end": "2026-06-08 21:12:35.217402",
                            "invocation": {
                                "module_args": {
                                    "_raw_params": "dnf -y builddep fedora/python-specfile.spec",
                                    "_uses_shell": false,
                                    "argv": null,
                                    "chdir": "/home/zuul-worker/src/github.com/packit/specfile",
                                    "creates": null,
                                    "executable": null,
                                    "expand_argument_vars": true,
                                    "removes": null,
                                    "stdin": null,
                                    "stdin_add_newline": true,
                                    "strip_empty_ends": true,
                                    "zuul_ansible_split_streams": false,
                                    "zuul_log_id": "0a580a2a-0013-3e08-11cc-000000000055-1-container",
                                    "zuul_no_log": false,
                                    "zuul_output_max_bytes": 1073741824
                                }
                            },
                            "msg": "",
                            "rc": 0,
                            "start": "2026-06-08 21:12:34.024945",
                            "stderr": "",
                            "stderr_lines": [],
                            "stdout": "Updating and loading repositories:\nRepositories loaded.\nPackage \"git-core-2.54.0-1.fc43.x86_64\" is already installed.\nPackage \"python3-devel-3.14.5-1.fc43.x86_64\" is already installed.\n\nNothing to do.",
                            "stdout_lines": [
                                "Updating and loading repositories:",
                                "Repositories loaded.",
                                "Package \"git-core-2.54.0-1.fc43.x86_64\" is already installed.",
                                "Package \"python3-devel-3.14.5-1.fc43.x86_64\" is already installed.",
                                "",
                                "Nothing to do."
                            ],
                            "zuul_log_id": "0a580a2a-0013-3e08-11cc-000000000055-1-container"
                        }
                    },
                    "task": {
                        "duration": {
                            "end": "2026-06-08T21:12:35.591154Z",
                            "start": "2026-06-08T21:12:33.568627Z"
                        },
                        "id": "0a580a2a-0013-3e08-11cc-000000000055",
                        "name": "Install build RPM dependencies"
                    }
                },
                {
                    "hosts": {
                        "container": {
                            "action": "include_tasks",
                            "changed": false,
                            "include": "tasks/rpm-deps.yaml",
                            "include_args": {}
                        }
                    },
                    "task": {
                        "duration": {
                            "end": "2026-06-08T21:12:35.636709Z",
                            "start": "2026-06-08T21:12:35.599251Z"
                        },
                        "id": "0a580a2a-0013-3e08-11cc-000000000007",
                        "name": ""
                    }
                },
                {
                    "hosts": {
                        "container": {
                            "action": "dnf",
                            "changed": true,
                            "invocation": {
                                "module_args": {
                                    "allow_downgrade": false,
                                    "allowerasing": false,
                                    "autoremove": false,
                                    "bugfix": false,
                                    "cacheonly": false,
                                    "conf_file": null,
                                    "disable_excludes": null,
                                    "disable_gpg_check": false,
                                    "disable_plugin": [],
                                    "disablerepo": [],
                                    "download_dir": null,
                                    "download_only": false,
                                    "enable_plugin": [],
                                    "enablerepo": [],
                                    "exclude": [],
                                    "install_repoquery": true,
                                    "install_weak_deps": true,
                                    "installroot": "/",
                                    "list": null,
                                    "lock_timeout": 30,
                                    "name": [
                                        "python3-typing-extensions"
                                    ],
                                    "nobest": false,
                                    "releasever": null,
                                    "security": false,
                                    "skip_broken": false,
                                    "sslverify": true,
                                    "state": null,
                                    "update_cache": false,
                                    "update_only": false,
                                    "validate_certs": true
                                }
                            },
                            "msg": "",
                            "rc": 0,
                            "results": [
                                "Installed: python3-typing-extensions-4.15.0-2.fc43.noarch"
                            ]
                        }
                    },
                    "task": {
                        "duration": {
                            "end": "2026-06-08T21:12:38.659314Z",
                            "start": "2026-06-08T21:12:35.659844Z"
                        },
                        "id": "0a580a2a-0013-3e08-11cc-000000000080",
                        "name": "Install runtime RPM dependencies"
                    }
                }
            ]
        }
    ],
    "stats": {
        "container": {
            "changed": 3,
            "failures": 0,
            "ignored": 0,
            "ok": 10,
            "rescued": 0,
            "skipped": 1,
            "unreachable": 0
        }
    },
    "trusted": false
},
{
    "branch": "main",
    "index": "0",
    "phase": "run",
    "playbook": "github.com/packit/specfile/files/zuul-tests.yaml",
    "plays": [
        {
            "play": {
                "duration": {
                    "end": "2026-06-08T21:13:38.431501Z",
                    "start": "2026-06-08T21:12:39.475007Z"
                },
                "id": "0a580a2a-0013-cfc5-4ec2-000000000002",
                "name": "Recipe for running specfile tests"
            },
            "tasks": [
                {
                    "hosts": {
                        "container": {
                            "action": "include_tasks",
                            "changed": false,
                            "include": "tasks/project-dir.yaml",
                            "include_args": {}
                        }
                    },
                    "task": {
                        "duration": {
                            "end": "2026-06-08T21:12:39.512790Z",
                            "start": "2026-06-08T21:12:39.485241Z"
                        },
                        "id": "0a580a2a-0013-cfc5-4ec2-000000000004",
                        "name": ""
                    }
                },
                {
                    "hosts": {
                        "container": {
                            "action": "set_fact",
                            "changed": false,
                            "false_condition": "zuul is not defined",
                            "skip_reason": "Conditional result was False",
                            "skipped": true
                        }
                    },
                    "task": {
                        "duration": {
                            "end": "2026-06-08T21:12:39.557970Z",
                            "start": "2026-06-08T21:12:39.523085Z"
                        },
                        "id": "0a580a2a-0013-cfc5-4ec2-000000000016",
                        "name": ""
                    }
                },
                {
                    "hosts": {
                        "container": {
                            "action": "set_fact",
                            "ansible_facts": {
                                "project_dir": "/home/zuul-worker/src/github.com/packit/specfile"
                            },
                            "changed": false
                        }
                    },
                    "task": {
                        "duration": {
                            "end": "2026-06-08T21:12:39.617907Z",
                            "start": "2026-06-08T21:12:39.564425Z"
                        },
                        "id": "0a580a2a-0013-cfc5-4ec2-000000000017",
                        "name": ""
                    }
                },
                {
                    "hosts": {
                        "container": {
                            "action": "stat",
                            "changed": false,
                            "invocation": {
                                "module_args": {
                                    "checksum_algorithm": "sha1",
                                    "follow": false,
                                    "get_attributes": true,
                                    "get_checksum": true,
                                    "get_mime": true,
                                    "path": "/home/zuul-worker/src/github.com/packit/specfile"
                                }
                            },
                            "stat": {
                                "atime": 1780953154.868624,
                                "attr_flags": "",
                                "attributes": [],
                                "block_size": 4096,
                                "blocks": 0,
                                "charset": "binary",
                                "ctime": 1780953138.7528567,
                                "dev": 42,
                                "device_type": 0,
                                "executable": true,
                                "exists": true,
                                "gid": 1000,
                                "gr_name": "zuul-worker",
                                "inode": 273,
                                "isblk": false,
                                "ischr": false,
                                "isdir": true,
                                "isfifo": false,
                                "isgid": true,
                                "islnk": false,
                                "isreg": false,
                                "issock": false,
                                "isuid": false,
                                "mimetype": "inode/directory",
                                "mode": "2755",
                                "mtime": 1780953122.0532339,
                                "nlink": 1,
                                "path": "/home/zuul-worker/src/github.com/packit/specfile",
                                "pw_name": "zuul-worker",
                                "readable": true,
                                "rgrp": true,
                                "roth": true,
                                "rusr": true,
                                "size": 626,
                                "uid": 1000,
                                "version": "418",
                                "wgrp": false,
                                "woth": false,
                                "writeable": true,
                                "wusr": true,
                                "xgrp": true,
                                "xoth": true,
                                "xusr": true
                            }
                        }
                    },
                    "task": {
                        "duration": {
                            "end": "2026-06-08T21:12:40.106359Z",
                            "start": "2026-06-08T21:12:39.629950Z"
                        },
                        "id": "0a580a2a-0013-cfc5-4ec2-000000000018",
                        "name": "stat /home/zuul-worker/src/github.com/packit/specfile"
                    }
                },
                {
                    "hosts": {
                        "container": {
                            "action": "assert",
                            "changed": false,
                            "msg": "All assertions passed"
                        }
                    },
                    "task": {
                        "duration": {
                            "end": "2026-06-08T21:12:40.142468Z",
                            "start": "2026-06-08T21:12:40.112352Z"
                        },
                        "id": "0a580a2a-0013-cfc5-4ec2-000000000019",
                        "name": "Make sure /home/zuul-worker/src/github.com/packit/specfile is present"
                    }
                },
                {
                    "hosts": {
                        "container": {
                            "action": "include_tasks",
                            "changed": false,
                            "include": "tasks/rpm-test-deps.yaml",
                            "include_args": {}
                        }
                    },
                    "task": {
                        "duration": {
                            "end": "2026-06-08T21:12:40.164245Z",
                            "start": "2026-06-08T21:12:40.145963Z"
                        },
                        "id": "0a580a2a-0013-cfc5-4ec2-000000000005",
                        "name": ""
                    }
                },
                {
                    "hosts": {
                        "container": {
                            "action": "dnf",
                            "changed": true,
                            "invocation": {
                                "module_args": {
                                    "allow_downgrade": false,
                                    "allowerasing": false,
                                    "autoremove": false,
                                    "bugfix": false,
                                    "cacheonly": false,
                                    "conf_file": null,
                                    "disable_excludes": null,
                                    "disable_gpg_check": false,
                                    "disable_plugin": [],
                                    "disablerepo": [],
                                    "download_dir": null,
                                    "download_only": false,
                                    "enable_plugin": [],
                                    "enablerepo": [],
                                    "exclude": [],
                                    "install_repoquery": true,
                                    "install_weak_deps": true,
                                    "installroot": "/",
                                    "list": null,
                                    "lock_timeout": 30,
                                    "name": [
                                        "python3-pytest",
                                        "python3-pytest-cov",
                                        "python3-flexmock"
                                    ],
                                    "nobest": false,
                                    "releasever": null,
                                    "security": false,
                                    "skip_broken": false,
                                    "sslverify": true,
                                    "state": null,
                                    "update_cache": false,
                                    "update_only": false,
                                    "validate_certs": true
                                }
                            },
                            "msg": "",
                            "rc": 0,
                            "results": [
                                "Installed: python3-pytest-8.3.5-9.fc43.noarch",
                                "Installed: python3-flexmock-0.12.2-6.fc43.noarch",
                                "Installed: python3-pytest-cov-5.0.0-8.fc43.noarch",
                                "Installed: python3-iniconfig-2.1.0-3.fc43.noarch",
                                "Installed: python3-pluggy-1.6.0-4.fc43.noarch",
                                "Installed: python3-coverage+toml-7.10.2-3.fc43.x86_64",
                                "Installed: python3-coverage-7.10.2-3.fc43.x86_64"
                            ]
                        }
                    },
                    "task": {
                        "duration": {
                            "end": "2026-06-08T21:12:44.830963Z",
                            "start": "2026-06-08T21:12:40.173403Z"
                        },
                        "id": "0a580a2a-0013-cfc5-4ec2-00000000002e",
                        "name": "Install test RPM dependencies"
                    }
                },
                {
                    "hosts": {
                        "container": {
                            "action": "command",
                            "changed": true,
                            "cmd": [
                                "make",
                                "check"
                            ],
                            "delta": "0:00:52.810731",
                            "end": "2026-06-08 21:13:38.213150",
                            "invocation": {
                                "module_args": {
                                    "_raw_params": "make check",
                                    "_uses_shell": false,
                                    "argv": null,
                                    "chdir": "/home/zuul-worker/src/github.com/packit/specfile",
                                    "creates": null,
                                    "executable": null,
                                    "expand_argument_vars": true,
                                    "removes": null,
                                    "stdin": null,
                                    "stdin_add_newline": true,
                                    "strip_empty_ends": true,
                                    "zuul_ansible_split_streams": false,
                                    "zuul_log_id": "0a580a2a-0013-cfc5-4ec2-000000000006-1-container",
                                    "zuul_no_log": false,
                                    "zuul_output_max_bytes": 1073741824
                                }
                            },
                            "msg": "",
                            "rc": 0,
                            "start": "2026-06-08 21:12:45.402419",
                            "stderr": "",
                            "stderr_lines": [],
                            "stdout": "PYTHONPATH=/home/zuul-worker/src/github.com/packit/specfile PYTHONDONTWRITEBYTECODE=1 python3 -m pytest --color=yes --verbose --showlocals ./tests/unit ./tests/integration --cov=specfile --cov-report=term-missing --full-trace\n\u001b[1m============================= test session starts ==============================\u001b[0m\nplatform linux -- Python 3.14.5, pytest-8.3.5, pluggy-1.6.0 -- /usr/bin/python3\ncachedir: .pytest_cache\nrootdir: /home/zuul-worker/src/github.com/packit/specfile\nconfigfile: setup.cfg\nplugins: cov-5.0.0, flexmock-0.12.2\n\u001b[1mcollecting ... \u001b[0mcollected 903 items\n\ntests/unit/test_changelog.py::test_entry_evr[* Thu Jan 04 2007 Michael Schwendt <mschwendt@fedoraproject.org>-None] \u001b[32mPASSED\u001b[0m\u001b[32m [  0%]\u001b[0m\ntests/unit/test_changelog.py::test_entry_evr[* Thu Jan 04 2007 Michael Schwendt <mschwendt@fedora-project.org>-None] \u001b[32mPASSED\u001b[0m\u001b[32m [  0%]\u001b[0m\ntests/unit/test_changelog.py::test_entry_evr[* Fri Jul 26 2024 Miroslav Such\\xfd <msuchy@redhat.com> - ss981107-67-evr2] \u001b[32mPASSED\u001b[0m\u001b[32m [  0%]\u001b[0m\ntests/unit/test_changelog.py::test_entry_evr[* Mon Jul 13 2020 Tom Stellard <tstellar@redhat.com> 4.0-0.4.pre2-evr3] \u001b[32mPASSED\u001b[0m\u001b[32m [  0%]\u001b[0m\ntests/unit/test_changelog.py::test_entry_evr[* Fri Jul 20 2018 Gwyn Ciesla <limburgher@gmail.com> - 0.52-6-evr4] \u001b[32mPASSED\u001b[0m\u001b[32m [  0%]\u001b[0m\ntests/unit/test_changelog.py::test_entry_evr[* Mon Feb 23 2009 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 1.23-3.20081106gitbe42b4-evr5] \u001b[32mPASSED\u001b[0m\u001b[32m [  0%]\u001b[0m\ntests/unit/test_changelog.py::test_entry_evr[* Thu Feb 04 2016 Marcin Zajaczkowski <mszpak ATT wp DOTT pl> - 1:0.9.10-6-evr6] \u001b[32mPASSED\u001b[0m\u001b[32m [  0%]\u001b[0m\ntests/unit/test_changelog.py::test_entry_evr[* Mon Jan 03 2022 Fedora Kernel Team <kernel-team@fedoraproject.org> [5.16-0.rc8.55]-evr7] \u001b[32mPASSED\u001b[0m\u001b[32m [  0%]\u001b[0m\ntests/unit/test_changelog.py::test_entry_evr[* Wed Jan 23 2002 Karsten Hopp <karsten@redhat.de> (4.6-1)-evr8] \u001b[32mPASSED\u001b[0m\u001b[32m [  0%]\u001b[0m\ntests/unit/test_changelog.py::test_entry_evr[* Thu Apr  9 2015 Jeffrey C. Ollie <jeff@ocjtech.us> - 13.3.2-1:-evr9] \u001b[32mPASSED\u001b[0m\u001b[32m [  1%]\u001b[0m\ntests/unit/test_changelog.py::test_entry_has_extended_timestamp[* Tue May 4 2021 Nikola Forr\\xf3 <nforro@redhat.com> - 0.1-1-False] \u001b[32mPASSED\u001b[0m\u001b[32m [  1%]\u001b[0m\ntests/unit/test_changelog.py::test_entry_has_extended_timestamp[* Tue May  4 2021 Nikola Forr\\xf3 <nforro@redhat.com> - 0.1-1-False] \u001b[32mPASSED\u001b[0m\u001b[32m [  1%]\u001b[0m\ntests/unit/test_changelog.py::test_entry_has_extended_timestamp[* Thu Jul 22 2021 Fedora Release Engineering <releng@fedoraproject.org> - 0.1-2-False] \u001b[32mPASSED\u001b[0m\u001b[32m [  1%]\u001b[0m\ntests/unit/test_changelog.py::test_entry_has_extended_timestamp[* Mon Oct 18 12:34:45 CEST 2021 Nikola Forr\\xf3 <nforro@redhat.com> - 0.2-1-True] \u001b[32mPASSED\u001b[0m\u001b[32m [  1%]\u001b[0m\ntests/unit/test_changelog.py::test_entry_day_of_month_padding[* Tue May 4 2021 Nikola Forr\\xf3 <nforro@redhat.com> - 0.1-1-] \u001b[32mPASSED\u001b[0m\u001b[32m [  1%]\u001b[0m\ntests/unit/test_changelog.py::test_entry_day_of_month_padding[* Tue May 04 2021 Nikola Forr\\xf3 <nforro@redhat.com> - 0.1-1-0] \u001b[32mPASSED\u001b[0m\u001b[32m [  1%]\u001b[0m\ntests/unit/test_changelog.py::test_entry_day_of_month_padding[* Tue May  4 2021 Nikola Forr\\xf3 <nforro@redhat.com> - 0.1-1- ] \u001b[32mPASSED\u001b[0m\u001b[32m [  1%]\u001b[0m\ntests/unit/test_changelog.py::test_entry_day_of_month_padding[* Thu Jul 22 2021 Fedora Release Engineering <releng@fedoraproject.org> - 0.1-2-] \u001b[32mPASSED\u001b[0m\u001b[32m [  1%]\u001b[0m\ntests/unit/test_changelog.py::test_entry_day_of_month_padding[* Mon Oct  18 12:34:45 CEST 2021 Nikola Forr\\xf3 <nforro@redhat.com> - 0.2-1-] \u001b[32mPASSED\u001b[0m\u001b[32m [  2%]\u001b[0m\ntests/unit/test_changelog.py::test_entry_day_of_month_padding[* Mon Dec  11 2006 Author <email> - 1.0-] \u001b[32mPASSED\u001b[0m\u001b[32m [  2%]\u001b[0m\ntests/unit/test_changelog.py::test_entry_day_of_month_padding[* Invalid header-] \u001b[32mPASSED\u001b[0m\u001b[32m [  2%]\u001b[0m\ntests/unit/test_changelog.py::test_filter[None-None-evrs0] \u001b[32mPASSED\u001b[0m\u001b[32m        [  2%]\u001b[0m\ntests/unit/test_changelog.py::test_filter[0.1-1-None-evrs1] \u001b[32mPASSED\u001b[0m\u001b[32m       [  2%]\u001b[0m\ntests/unit/test_changelog.py::test_filter[0.1-2-None-evrs2] \u001b[32mPASSED\u001b[0m\u001b[32m       [  2%]\u001b[0m\ntests/unit/test_changelog.py::test_filter[0.2-1-None-evrs3] \u001b[32mPASSED\u001b[0m\u001b[32m       [  2%]\u001b[0m\ntests/unit/test_changelog.py::test_filter[None-0.2-2-evrs4] \u001b[32mPASSED\u001b[0m\u001b[32m       [  2%]\u001b[0m\ntests/unit/test_changelog.py::test_filter[None-0.2-1-evrs5] \u001b[32mPASSED\u001b[0m\u001b[32m       [  2%]\u001b[0m\ntests/unit/test_changelog.py::test_filter[None-0.1-2-evrs6] \u001b[32mPASSED\u001b[0m\u001b[32m       [  3%]\u001b[0m\ntests/unit/test_changelog.py::test_filter[0.1-1-0.2-2-evrs7] \u001b[32mPASSED\u001b[0m\u001b[32m      [  3%]\u001b[0m\ntests/unit/test_changelog.py::test_filter[0.1-2-0.2-1-evrs8] \u001b[32mPASSED\u001b[0m\u001b[32m      [  3%]\u001b[0m\ntests/unit/test_changelog.py::test_filter[0.2-1-0.2-1-evrs9] \u001b[32mPASSED\u001b[0m\u001b[32m      [  3%]\u001b[0m\ntests/unit/test_changelog.py::test_filter[0.2-2-0.1-1-evrs10] \u001b[32mPASSED\u001b[0m\u001b[32m     [  3%]\u001b[0m\ntests/unit/test_changelog.py::test_filter[0.0.1-1-None-evrs11] \u001b[32mPASSED\u001b[0m\u001b[32m    [  3%]\u001b[0m\ntests/unit/test_changelog.py::test_filter[0.3-1-None-evrs12] \u001b[32mPASSED\u001b[0m\u001b[32m      [  3%]\u001b[0m\ntests/unit/test_changelog.py::test_filter[None-0.0.1-1-evrs13] \u001b[32mPASSED\u001b[0m\u001b[32m    [  3%]\u001b[0m\ntests/unit/test_changelog.py::test_filter[None-0.3-1-evrs14] \u001b[32mPASSED\u001b[0m\u001b[32m      [  3%]\u001b[0m\ntests/unit/test_changelog.py::test_filter[0.0.1-1-0.3-1-evrs15] \u001b[32mPASSED\u001b[0m\u001b[32m   [  4%]\u001b[0m\ntests/unit/test_changelog.py::test_parse \u001b[32mPASSED\u001b[0m\u001b[32m                          [  4%]\u001b[0m\ntests/unit/test_changelog.py::test_suse_style_changelog_parse \u001b[32mPASSED\u001b[0m\u001b[32m     [  4%]\u001b[0m\ntests/unit/test_changelog.py::test_create_opensuse_changelog_assemble[timestamp0-Dan \\u010cerm\\xe1k <dcermak@suse.com>-content0-entry0] \u001b[32mPASSED\u001b[0m\u001b[32m [  4%]\u001b[0m\ntests/unit/test_changelog.py::test_create_opensuse_changelog_assemble[timestamp1-Dan \\u010cerm\\xe1k <dcermak@suse.de>-content1-entry1] \u001b[32mPASSED\u001b[0m\u001b[32m [  4%]\u001b[0m\ntests/unit/test_changelog.py::test_get_raw_section_data \u001b[32mPASSED\u001b[0m\u001b[32m           [  4%]\u001b[0m\ntests/unit/test_changelog.py::test_copy_changelog \u001b[32mPASSED\u001b[0m\u001b[32m                 [  4%]\u001b[0m\ntests/unit/test_conditions.py::test_process_conditions[lines0-validity0-<lambda>] \u001b[32mPASSED\u001b[0m\u001b[32m [  4%]\u001b[0m\ntests/unit/test_conditions.py::test_process_conditions[lines1-validity1-<lambda>] \u001b[32mPASSED\u001b[0m\u001b[32m [  4%]\u001b[0m\ntests/unit/test_conditions.py::test_process_conditions[lines2-validity2-<lambda>] \u001b[32mPASSED\u001b[0m\u001b[32m [  5%]\u001b[0m\ntests/unit/test_conditions.py::test_process_conditions[lines3-validity3-<lambda>] \u001b[32mPASSED\u001b[0m\u001b[32m [  5%]\u001b[0m\ntests/unit/test_conditions.py::test_process_conditions[lines4-validity4-<lambda>] \u001b[32mPASSED\u001b[0m\u001b[32m [  5%]\u001b[0m\ntests/unit/test_formatter.py::test_format_expression[func('arg')-func('arg')] \u001b[32mPASSED\u001b[0m\u001b[32m [  5%]\u001b[0m\ntests/unit/test_formatter.py::test_format_expression[func('arg1', \"arg2\")-func('arg1', 'arg2')] \u001b[32mPASSED\u001b[0m\u001b[32m [  5%]\u001b[0m\ntests/unit/test_formatter.py::test_format_expression[func('arg1', 'arg\\\\'2')-func('arg1', \"arg'2\")] \u001b[32mPASSED\u001b[0m\u001b[32m [  5%]\u001b[0m\ntests/unit/test_formatter.py::test_format_expression[func('arg', kwarg='val')-func('arg', kwarg='val')] \u001b[32mPASSED\u001b[0m\u001b[32m [  5%]\u001b[0m\ntests/unit/test_formatter.py::test_format_expression[(None)-None] \u001b[32mPASSED\u001b[0m\u001b[32m [  5%]\u001b[0m\ntests/unit/test_formatter.py::test_format_expression[(None,)-(None,)] \u001b[32mPASSED\u001b[0m\u001b[32m [  5%]\u001b[0m\ntests/unit/test_formatter.py::test_format_expression[('a',\"b\",3)-('a', 'b', 3)] \u001b[32mPASSED\u001b[0m\u001b[32m [  6%]\u001b[0m\ntests/unit/test_formatter.py::test_format_expression[[1,2,3,4]-[1, 2, 3, 4]] \u001b[32mPASSED\u001b[0m\u001b[32m [  6%]\u001b[0m\ntests/unit/test_formatter.py::test_format_expression[{'key':'val'}-{'key': 'val'}] \u001b[32mPASSED\u001b[0m\u001b[32m [  6%]\u001b[0m\ntests/unit/test_formatter.py::test_format_expression[<ENUM_ITEM_1: 1>-<ENUM_ITEM_1: 1>] \u001b[32mPASSED\u001b[0m\u001b[32m [  6%]\u001b[0m\ntests/unit/test_formatter.py::test_format_expression[func1('first argument', True, func2(kwarg={42: ['nested list item 1', 'nested list item 2', 'nested list item 3']}), 0, indent='    ', spec=<rpm.spec object at 0x7fe1ae1a6b30>)-func1(\\n    'first argument',\\n    True,\\n    func2(\\n        kwarg={\\n            42: [\\n                'nested list item 1',\\n                'nested list item 2',\\n                'nested list item 3',\\n            ],\\n        },\\n    ),\\n    0,\\n    indent='    ',\\n    spec=<rpm.spec object at 0x7fe1ae1a6b30>,\\n)] \u001b[32mPASSED\u001b[0m\u001b[32m [  6%]\u001b[0m\ntests/unit/test_guess_packager.py::test_guess_packager_env \u001b[32mPASSED\u001b[0m\u001b[32m        [  6%]\u001b[0m\ntests/unit/test_guess_packager.py::test_guess_packager_macro \u001b[32mPASSED\u001b[0m\u001b[32m      [  6%]\u001b[0m\ntests/unit/test_guess_packager.py::test_guess_packager_git \u001b[32mPASSED\u001b[0m\u001b[32m        [  6%]\u001b[0m\ntests/unit/test_guess_packager.py::test_guess_packager_passwd \u001b[32mPASSED\u001b[0m\u001b[32m     [  6%]\u001b[0m\ntests/unit/test_guess_packager.py::test_guess_packager_pref1 \u001b[32mPASSED\u001b[0m\u001b[32m      [  7%]\u001b[0m\ntests/unit/test_guess_packager.py::test_guess_packager_pref2 \u001b[32mPASSED\u001b[0m\u001b[32m      [  7%]\u001b[0m\ntests/unit/test_guess_packager.py::test_guess_packager_pref3 \u001b[32mPASSED\u001b[0m\u001b[32m      [  7%]\u001b[0m\ntests/unit/test_guess_packager.py::test_guess_packager_pref4 \u001b[32mPASSED\u001b[0m\u001b[32m      [  7%]\u001b[0m\ntests/unit/test_guess_packager.py::test_guess_packager_empty \u001b[32mPASSED\u001b[0m\u001b[32m      [  7%]\u001b[0m\ntests/unit/test_macro_definitions.py::test_find \u001b[32mPASSED\u001b[0m\u001b[32m                   [  7%]\u001b[0m\ntests/unit/test_macro_definitions.py::test_get \u001b[32mPASSED\u001b[0m\u001b[32m                    [  7%]\u001b[0m\ntests/unit/test_macro_definitions.py::test_parse \u001b[32mPASSED\u001b[0m\u001b[32m                  [  7%]\u001b[0m\ntests/unit/test_macro_definitions.py::test_get_raw_data \u001b[32mPASSED\u001b[0m\u001b[32m           [  7%]\u001b[0m\ntests/unit/test_macro_definitions.py::test_copy_macro_definitions \u001b[32mPASSED\u001b[0m\u001b[32m [  8%]\u001b[0m\ntests/unit/test_macros.py::test_macros_parse \u001b[32mPASSED\u001b[0m\u001b[32m                      [  8%]\u001b[0m\ntests/unit/test_macros.py::test_macros_remove \u001b[32mPASSED\u001b[0m\u001b[32m                     [  8%]\u001b[0m\ntests/unit/test_macros.py::test_macros_remove_failure \u001b[32mPASSED\u001b[0m\u001b[32m             [  8%]\u001b[0m\ntests/unit/test_macros.py::test_macros_define \u001b[32mPASSED\u001b[0m\u001b[32m                     [  8%]\u001b[0m\ntests/unit/test_macros.py::test_macros_reinit \u001b[32mPASSED\u001b[0m\u001b[32m                     [  8%]\u001b[0m\ntests/unit/test_macros.py::test_macros_sideeffects \u001b[32mPASSED\u001b[0m\u001b[32m                [  8%]\u001b[0m\ntests/unit/test_options.py::test_positionals_get_items[vp:m:M:-tokens0-result0] \u001b[32mPASSED\u001b[0m\u001b[32m [  8%]\u001b[0m\ntests/unit/test_options.py::test_positionals_get_items[vp:m:M:-tokens1-result1] \u001b[32mPASSED\u001b[0m\u001b[32m [  8%]\u001b[0m\ntests/unit/test_options.py::test_positionals_get_items[vp:m:M:-tokens2-result2] \u001b[32mPASSED\u001b[0m\u001b[32m [  9%]\u001b[0m\ntests/unit/test_options.py::test_positionals_insert[vp:m:M:-tokens0-0-test arg-2-TokenType.DOUBLE_QUOTED] \u001b[32mPASSED\u001b[0m\u001b[32m [  9%]\u001b[0m\ntests/unit/test_options.py::test_positionals_insert[vp:m:M:-tokens1-1-123-4-TokenType.DEFAULT] \u001b[32mPASSED\u001b[0m\u001b[32m [  9%]\u001b[0m\ntests/unit/test_options.py::test_positionals_insert[vp:m:M:-tokens2-0-test-0-TokenType.DEFAULT] \u001b[32mPASSED\u001b[0m\u001b[32m [  9%]\u001b[0m\ntests/unit/test_options.py::test_options_valid_option[a:b:cDn:Tq-a-True] \u001b[32mPASSED\u001b[0m\u001b[32m [  9%]\u001b[0m\ntests/unit/test_options.py::test_options_valid_option[a:b:cDn:Tq-q-True] \u001b[32mPASSED\u001b[0m\u001b[32m [  9%]\u001b[0m\ntests/unit/test_options.py::test_options_valid_option[a:b:cDn:Tq-v-False] \u001b[32mPASSED\u001b[0m\u001b[32m [  9%]\u001b[0m\ntests/unit/test_options.py::test_options_requires_argument[a:b:cDn:Tq-a-True] \u001b[32mPASSED\u001b[0m\u001b[32m [  9%]\u001b[0m\ntests/unit/test_options.py::test_options_requires_argument[a:b:cDn:Tq-q-False] \u001b[32mPASSED\u001b[0m\u001b[32m [  9%]\u001b[0m\ntests/unit/test_options.py::test_options_requires_argument[a:b:cDn:Tq-v-None] \u001b[32mPASSED\u001b[0m\u001b[32m [ 10%]\u001b[0m\ntests/unit/test_options.py::test_options_find_option[P:p:REb:z:F:d:o:Z-tokens0-p-result0] \u001b[32mPASSED\u001b[0m\u001b[32m [ 10%]\u001b[0m\ntests/unit/test_options.py::test_options_find_option[P:p:REb:z:F:d:o:Z-tokens1-b-result1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 10%]\u001b[0m\ntests/unit/test_options.py::test_options_find_option[P:p:REb:z:F:d:o:Z-tokens2-E-result2] \u001b[32mPASSED\u001b[0m\u001b[32m [ 10%]\u001b[0m\ntests/unit/test_options.py::test_options_find_option[P:p:REb:z:F:d:o:Z-tokens3-F-result3] \u001b[32mPASSED\u001b[0m\u001b[32m [ 10%]\u001b[0m\ntests/unit/test_options.py::test_options_tokenize[-p1 -b .test -E-result0] \u001b[32mPASSED\u001b[0m\u001b[32m [ 10%]\u001b[0m\ntests/unit/test_options.py::test_options_tokenize[-p 28 -b .test\\\\ escape-result1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 10%]\u001b[0m\ntests/unit/test_options.py::test_options_tokenize[-b \".test \\\\\"double quotes\\\\\"\"-result2] \u001b[32mPASSED\u001b[0m\u001b[32m [ 10%]\u001b[0m\ntests/unit/test_options.py::test_options_tokenize[-p1 -b .test_whitespace_at_the_end -M 2  -result3] \u001b[32mPASSED\u001b[0m\u001b[32m [ 10%]\u001b[0m\ntests/unit/test_options.py::test_options_tokenize[-q -n %{name}-%{version}%[%{rc}?\"-rc\":\"\"]-result4] \u001b[32mPASSED\u001b[0m\u001b[32m [ 11%]\u001b[0m\ntests/unit/test_options.py::test_options_tokenize[-q -n '%{name}-%{version}'-result5] \u001b[32mPASSED\u001b[0m\u001b[32m [ 11%]\u001b[0m\ntests/unit/test_options.py::test_options_tokenize[-q -n \"%{name}-%{version}\"-result6] \u001b[32mPASSED\u001b[0m\u001b[32m [ 11%]\u001b[0m\ntests/unit/test_options.py::test_options_tokenize[-q -n '%{name}-%{version}%[%{rc}?\"-rc\":\"\"]'-result7] \u001b[32mPASSED\u001b[0m\u001b[32m [ 11%]\u001b[0m\ntests/unit/test_options.py::test_options_tokenize[-q %{?prever:-n %{name}-%{prever}}-result8] \u001b[32mPASSED\u001b[0m\u001b[32m [ 11%]\u001b[0m\ntests/unit/test_options.py::test_options_stringify[tokens0--p1 -b .test -E] \u001b[32mPASSED\u001b[0m\u001b[32m [ 11%]\u001b[0m\ntests/unit/test_options.py::test_options_stringify[tokens1--p 28 -b .test\\\\ escape] \u001b[32mPASSED\u001b[0m\u001b[32m [ 11%]\u001b[0m\ntests/unit/test_options.py::test_options_stringify[tokens2--b \".test \\\\\"double quotes\\\\\"\"] \u001b[32mPASSED\u001b[0m\u001b[32m [ 11%]\u001b[0m\ntests/unit/test_options.py::test_options_stringify[tokens3--p1 -b .test_whitespace_at_the_end -M 2  ] \u001b[32mPASSED\u001b[0m\u001b[32m [ 11%]\u001b[0m\ntests/unit/test_options.py::test_options_stringify[tokens4--q -n %{name}-%{version}%[%{rc}?\"-rc\":\"\"]] \u001b[32mPASSED\u001b[0m\u001b[32m [ 12%]\u001b[0m\ntests/unit/test_options.py::test_options_stringify[tokens5--q -n '%{name}-%{version}'] \u001b[32mPASSED\u001b[0m\u001b[32m [ 12%]\u001b[0m\ntests/unit/test_options.py::test_options_stringify[tokens6--q -n \"%{name}-%{version}\"] \u001b[32mPASSED\u001b[0m\u001b[32m [ 12%]\u001b[0m\ntests/unit/test_options.py::test_options_stringify[tokens7--q -n '%{name}-%{version}%[%{rc}?\"-rc\":\"\"]'] \u001b[32mPASSED\u001b[0m\u001b[32m [ 12%]\u001b[0m\ntests/unit/test_options.py::test_options_stringify[tokens8--q %{?prever:-n %{name}-%{prever}}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 12%]\u001b[0m\ntests/unit/test_prep.py::test_patch_macro_number[%patch2--p1-2] \u001b[32mPASSED\u001b[0m\u001b[32m   [ 12%]\u001b[0m\ntests/unit/test_prep.py::test_patch_macro_number[%patch0028--p2-28] \u001b[32mPASSED\u001b[0m\u001b[32m [ 12%]\u001b[0m\ntests/unit/test_prep.py::test_patch_macro_number[%patch--p1-0] \u001b[32mPASSED\u001b[0m\u001b[32m    [ 12%]\u001b[0m\ntests/unit/test_prep.py::test_patch_macro_number[%patch--P1-1] \u001b[32mPASSED\u001b[0m\u001b[32m    [ 12%]\u001b[0m\ntests/unit/test_prep.py::test_patch_macro_number[%patch3--P5-3] \u001b[32mPASSED\u001b[0m\u001b[32m   [ 13%]\u001b[0m\ntests/unit/test_prep.py::test_patch_macro_number[%patch0--P1 2-0] \u001b[32mPASSED\u001b[0m\u001b[32m [ 13%]\u001b[0m\ntests/unit/test_prep.py::test_patch_macro_number[%patch--P1 2-1] \u001b[32mPASSED\u001b[0m\u001b[32m  [ 13%]\u001b[0m\ntests/unit/test_prep.py::test_patch_macro_number[%patch-2-2] \u001b[32mPASSED\u001b[0m\u001b[32m      [ 13%]\u001b[0m\ntests/unit/test_prep.py::test_prep_macros_find \u001b[32mPASSED\u001b[0m\u001b[32m                    [ 13%]\u001b[0m\ntests/unit/test_prep.py::test_prep_add_patch_macro[lines_before0-0-True-options0-lines_after0] \u001b[32mPASSED\u001b[0m\u001b[32m [ 13%]\u001b[0m\ntests/unit/test_prep.py::test_prep_add_patch_macro[lines_before1-0-True-options1-lines_after1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 13%]\u001b[0m\ntests/unit/test_prep.py::test_prep_add_patch_macro[lines_before2-28-False-options2-lines_after2] \u001b[32mPASSED\u001b[0m\u001b[32m [ 13%]\u001b[0m\ntests/unit/test_prep.py::test_prep_add_patch_macro[lines_before3-1001-False-options3-lines_after3] \u001b[32mPASSED\u001b[0m\u001b[32m [ 13%]\u001b[0m\ntests/unit/test_prep.py::test_prep_add_patch_macro[lines_before4-28-False-options4-lines_after4] \u001b[32mPASSED\u001b[0m\u001b[32m [ 14%]\u001b[0m\ntests/unit/test_prep.py::test_prep_remove_patch_macro[lines_before0-1-lines_after0] \u001b[32mPASSED\u001b[0m\u001b[32m [ 14%]\u001b[0m\ntests/unit/test_prep.py::test_prep_remove_patch_macro[lines_before1-0-lines_after1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 14%]\u001b[0m\ntests/unit/test_prep.py::test_prep_parse \u001b[32mPASSED\u001b[0m\u001b[32m                          [ 14%]\u001b[0m\ntests/unit/test_prep.py::test_prep_get_raw_section_data \u001b[32mPASSED\u001b[0m\u001b[32m           [ 14%]\u001b[0m\ntests/unit/test_prep.py::test_copy_prep \u001b[32mPASSED\u001b[0m\u001b[32m                           [ 14%]\u001b[0m\ntests/unit/test_sanitizer.py::test_substring_extraction[c=%{commit}; echo ${c:0:7}-%{sub %{commit} 1 7}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 14%]\u001b[0m\ntests/unit/test_sanitizer.py::test_substring_extraction[c=%{commit};echo ${c:0:7}-%{sub %{commit} 1 7}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 14%]\u001b[0m\ntests/unit/test_sanitizer.py::test_substring_extraction[c=%{commit0}; echo ${c:0:7}-%{sub %{commit0} 1 7}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 14%]\u001b[0m\ntests/unit/test_sanitizer.py::test_substring_extraction[foo=%{version}; echo ${foo:0:5}-%{sub %{version} 1 5}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 15%]\u001b[0m\ntests/unit/test_sanitizer.py::test_substring_extraction[foo=%{version}; echo ${foo:6}-%{sub %{version} 7}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 15%]\u001b[0m\ntests/unit/test_sanitizer.py::test_substring_extraction[l=%{_lib}; echo ${l:3}-%{sub %{_lib} 4}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 15%]\u001b[0m\ntests/unit/test_sanitizer.py::test_substring_extraction[c=%{version}; echo ${c:12:4}-%{sub %{version} 13 16}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 15%]\u001b[0m\ntests/unit/test_sanitizer.py::test_substring_extraction[c=%{commit}; echo ${c:0:%{commit_abbrev}}-%{sub %{commit} 1 %{commit_abbrev}}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 15%]\u001b[0m\ntests/unit/test_sanitizer.py::test_substring_extraction[c=\"%{git_commit}\"; echo \"${c:0:8}\"-%{sub %{git_commit} 1 8}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 15%]\u001b[0m\ntests/unit/test_sanitizer.py::test_substring_extraction[n=%{modname}; echo ${n:0:1}-%{sub %{modname} 1 1}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 15%]\u001b[0m\ntests/unit/test_sanitizer.py::test_bash_replacement[v=%{version}; echo ${v//./_}-%{lua:print((rpm.expand(\"%{version}\"):gsub(\"%.\", \"_\")))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 15%]\u001b[0m\ntests/unit/test_sanitizer.py::test_bash_replacement[v=%{version}; echo ${v//./}-%{lua:print((rpm.expand(\"%{version}\"):gsub(\"%.\", \"\")))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 15%]\u001b[0m\ntests/unit/test_sanitizer.py::test_bash_replacement[n=%{name}; echo ${n//-/_}-%{lua:print((rpm.expand(\"%{name}\"):gsub(\"%-\", \"_\")))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 16%]\u001b[0m\ntests/unit/test_sanitizer.py::test_bash_replacement[b=%{built_tag_strip}; echo ${b/-/\"~\"}-%{lua:print((rpm.expand(\"%{built_tag_strip}\"):gsub(\"%-\", \"~\", 1)))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 16%]\u001b[0m\ntests/unit/test_sanitizer.py::test_bash_replacement[n=%{srcname}; echo ${n//-/.}-%{lua:print((rpm.expand(\"%{srcname}\"):gsub(\"%-\", \".\")))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 16%]\u001b[0m\ntests/unit/test_sanitizer.py::test_bash_replacement[v=%{version}; echo ${v//./-}-%{lua:print((rpm.expand(\"%{version}\"):gsub(\"%.\", \"-\")))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 16%]\u001b[0m\ntests/unit/test_sanitizer.py::test_bash_replacement[d=%{inkscape_date}; echo ${d//-/}-%{lua:print((rpm.expand(\"%{inkscape_date}\"):gsub(\"%-\", \"\")))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 16%]\u001b[0m\ntests/unit/test_sanitizer.py::test_bash_replacement[rel=\"%{releasenum}\"; echo \"${rel//-/}\"-%{lua:print((rpm.expand(\"%{releasenum}\"):gsub(\"%-\", \"\")))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 16%]\u001b[0m\ntests/unit/test_sanitizer.py::test_bash_replacement[v=%{version}; echo ${v//./%2F}-%{lua:print((rpm.expand(\"%{version}\"):gsub(\"%.\", \"%%2F\")))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 16%]\u001b[0m\ntests/unit/test_sanitizer.py::test_case_conversion[t=\"%{Bg_Name}\";echo ${t,,}-%{lower:%{Bg_Name}}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 16%]\u001b[0m\ntests/unit/test_sanitizer.py::test_case_conversion[v=%{name}; echo ${v^^}-%{upper:%{name}}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 16%]\u001b[0m\ntests/unit/test_sanitizer.py::test_suffix_removal[ver=%{version}; echo ${ver%%%%.*}-%{lua:local v=rpm.expand(\"%{version}\") print(v:match(\"^(.-)%.\") or v)}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 17%]\u001b[0m\ntests/unit/test_sanitizer.py::test_suffix_removal[v=%{version}; echo ${v%.*}-%{lua:local v=rpm.expand(\"%{version}\") print(v:match(\"^(.*)%.\") or v)}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 17%]\u001b[0m\ntests/unit/test_sanitizer.py::test_suffix_removal[v=%{version}; echo ${v%%%%*}-%{lua:print(\"\")}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 17%]\u001b[0m\ntests/unit/test_sanitizer.py::test_suffix_removal[v=%{version}; echo ${v%*}-%{lua:print(rpm.expand(\"%{version}\"))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 17%]\u001b[0m\ntests/unit/test_sanitizer.py::test_prefix_removal[v=%{version}; echo ${v##*.}-%{lua:local v=rpm.expand(\"%{version}\") print(v:match(\".*%.(.*)\") or v)}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 17%]\u001b[0m\ntests/unit/test_sanitizer.py::test_prefix_removal[v=%{version}; echo ${v#*.}-%{lua:local v=rpm.expand(\"%{version}\") print(v:match(\"%.(.*)\") or v)}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 17%]\u001b[0m\ntests/unit/test_sanitizer.py::test_prefix_removal[v=%{version}; echo ${v#*#}-%{lua:local v=rpm.expand(\"%{version}\") print(v:match(\"#(.*)\") or v)}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 17%]\u001b[0m\ntests/unit/test_sanitizer.py::test_prefix_removal[v=%{version}; echo ${v##*#}-%{lua:local v=rpm.expand(\"%{version}\") print(v:match(\".*#(.*)\") or v)}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 17%]\u001b[0m\ntests/unit/test_sanitizer.py::test_prefix_removal[v=%{version}; echo ${v##*}-%{lua:print(\"\")}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 17%]\u001b[0m\ntests/unit/test_sanitizer.py::test_prefix_removal[v=%{version}; echo ${v#*}-%{lua:print(rpm.expand(\"%{version}\"))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 18%]\u001b[0m\ntests/unit/test_sanitizer.py::test_pipe_to_cut[echo %{version} | cut -d. -f3-%{lua:local v=rpm.expand(\"%{version}\") local i=0 for f in v:gmatch(\"[^%.]+\") do i=i+1 if i==3 then print(f) break end end}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 18%]\u001b[0m\ntests/unit/test_sanitizer.py::test_pipe_to_cut[echo %{version} | cut -d. -f1-2-%{lua:local v=rpm.expand(\"%{version}\") local t={} for f in v:gmatch(\"[^%.]+\") do t[#t+1]=f end print(table.concat(t,\".\",1,2))}0] \u001b[32mPASSED\u001b[0m\u001b[32m [ 18%]\u001b[0m\ntests/unit/test_sanitizer.py::test_pipe_to_cut[echo %{version} | cut -d. -f1-%{lua:local v=rpm.expand(\"%{version}\") local i=0 for f in v:gmatch(\"[^%.]+\") do i=i+1 if i==1 then print(f) break end end}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 18%]\u001b[0m\ntests/unit/test_sanitizer.py::test_pipe_to_cut[echo %{version} | cut -d. -f1-2-%{lua:local v=rpm.expand(\"%{version}\") local t={} for f in v:gmatch(\"[^%.]+\") do t[#t+1]=f end print(table.concat(t,\".\",1,2))}1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 18%]\u001b[0m\ntests/unit/test_sanitizer.py::test_pipe_to_cut[echo %{version} | cut -d. -f-2-%{lua:local v=rpm.expand(\"%{version}\") local t={} for f in v:gmatch(\"[^%.]+\") do t[#t+1]=f end print(table.concat(t,\".\",1,2))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 18%]\u001b[0m\ntests/unit/test_sanitizer.py::test_pipe_to_cut[echo %{version} | cut -d '^' -f 1-%{lua:local v=rpm.expand(\"%{version}\") local i=0 for f in v:gmatch(\"[^%^]+\") do i=i+1 if i==1 then print(f) break end end}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 18%]\u001b[0m\ntests/unit/test_sanitizer.py::test_pipe_to_cut[echo %{version} | cut -d'-' -f 1-%{lua:local v=rpm.expand(\"%{version}\") local i=0 for f in v:gmatch(\"[^%-]+\") do i=i+1 if i==1 then print(f) break end end}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 18%]\u001b[0m\ntests/unit/test_sanitizer.py::test_pipe_to_cut[echo %{version} | cut -d. -f1-3-%{lua:local v=rpm.expand(\"%{version}\") local t={} for f in v:gmatch(\"[^%.]+\") do t[#t+1]=f end print(table.concat(t,\".\",1,3))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 18%]\u001b[0m\ntests/unit/test_sanitizer.py::test_pipe_to_cut_bytes[echo %{git_commit} | cut -c -8-%{sub %{git_commit} 1 8}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 19%]\u001b[0m\ntests/unit/test_sanitizer.py::test_pipe_to_cut_bytes[echo %{gitcommit} | cut -c 1-8-%{sub %{gitcommit} 1 8}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 19%]\u001b[0m\ntests/unit/test_sanitizer.py::test_pipe_to_cut_bytes[echo %{snapshot_rev} | cut -c1-6-%{sub %{snapshot_rev} 1 6}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 19%]\u001b[0m\ntests/unit/test_sanitizer.py::test_pipe_to_tr[echo \"%{name}\" | tr '[:upper:]' '[:lower:]'-%{lower:%{name}}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 19%]\u001b[0m\ntests/unit/test_sanitizer.py::test_pipe_to_tr[echo %{upstream_prever} | tr '[:upper:]' '[:lower:]'-%{lower:%{upstream_prever}}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 19%]\u001b[0m\ntests/unit/test_sanitizer.py::test_pipe_to_tr[echo %{version} | tr . _-%{lua:print((rpm.expand(\"%{version}\"):gsub(\"%.\", \"_\")))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 19%]\u001b[0m\ntests/unit/test_sanitizer.py::test_pipe_to_tr[echo '%{version}' | tr '^' '.'-%{lua:print((rpm.expand(\"%{version}\"):gsub(\"%^\", \".\")))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 19%]\u001b[0m\ntests/unit/test_sanitizer.py::test_pipe_to_tr[echo '%{version}' | tr -d .-%{lua:print((rpm.expand(\"%{version}\"):gsub(\"%.\", \"\")))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 19%]\u001b[0m\ntests/unit/test_sanitizer.py::test_pipe_to_tr[echo '%{version}' | tr -d '~'-%{lua:print((rpm.expand(\"%{version}\"):gsub(\"~\", \"\")))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 19%]\u001b[0m\ntests/unit/test_sanitizer.py::test_pipe_to_tr[echo %{date} | tr -d --%{lua:print((rpm.expand(\"%{date}\"):gsub(\"%-\", \"\")))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 20%]\u001b[0m\ntests/unit/test_sanitizer.py::test_pipe_to_sed[echo %{version} | sed 's/\\\\./-/g'-%{lua:print((rpm.expand(\"%{version}\"):gsub(\"%.\", \"-\")))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 20%]\u001b[0m\ntests/unit/test_sanitizer.py::test_pipe_to_sed[echo %{version} | sed 's|\\\\.|_|g'-%{lua:print((rpm.expand(\"%{version}\"):gsub(\"%.\", \"_\")))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 20%]\u001b[0m\ntests/unit/test_sanitizer.py::test_pipe_to_sed[echo %{py3_shebang_flags} | sed 's|s||'-%{lua:print((rpm.expand(\"%{py3_shebang_flags}\"):gsub(\"s\", \"\", 1)))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 20%]\u001b[0m\ntests/unit/test_sanitizer.py::test_pipe_to_sed[echo %{version} | sed \"s/\\\\./_/g\"-%{lua:print((rpm.expand(\"%{version}\"):gsub(\"%.\", \"_\")))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 20%]\u001b[0m\ntests/unit/test_sanitizer.py::test_pipe_to_sed[echo %{unversion} | sed 's/_/./g'-%{lua:print((rpm.expand(\"%{unversion}\"):gsub(\"_\", \".\")))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 20%]\u001b[0m\ntests/unit/test_sanitizer.py::test_pipe_to_sed[echo 1.2.3-rc4 | sed 's/-/~/g'-%{lua:print((rpm.expand(\"%{quote:1.2.3-rc4}\"):gsub(\"-\", \"~\")))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 20%]\u001b[0m\ntests/unit/test_sanitizer.py::test_pipe_to_sed[echo %{version} | sed 's/\\\\\\\\./_/g'-%{lua:print((rpm.expand(\"%{version}\"):gsub(\"%.\", \"_\")))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 20%]\u001b[0m\ntests/unit/test_sanitizer.py::test_chained_sed \u001b[32mPASSED\u001b[0m\u001b[32m                    [ 20%]\u001b[0m\ntests/unit/test_sanitizer.py::test_chained_sed_rpm_escaped \u001b[32mPASSED\u001b[0m\u001b[32m        [ 21%]\u001b[0m\ntests/unit/test_sanitizer.py::test_pipe_to_awk[echo %{version} | awk -F. '{print $1\".\"$2}'-%{lua:local v=rpm.expand(\"%{version}\") local t={} for f in v:gmatch(\"[^%.]+\") do t[#t+1]=f end print(t[1] .. \".\" .. t[2])}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 21%]\u001b[0m\ntests/unit/test_sanitizer.py::test_pipe_to_awk[echo %{version} | awk -F. '{print $1}'-%{lua:local v=rpm.expand(\"%{version}\") local t={} for f in v:gmatch(\"[^%.]+\") do t[#t+1]=f end print(t[1])}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 21%]\u001b[0m\ntests/unit/test_sanitizer.py::test_herestring[tr . _ <<< %{version}-%{lua:print((rpm.expand(\"%{version}\"):gsub(\"%.\", \"_\")))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 21%]\u001b[0m\ntests/unit/test_sanitizer.py::test_herestring[tr - . <<< %{upstreamver}-%{lua:print((rpm.expand(\"%{upstreamver}\"):gsub(\"%-\", \".\")))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 21%]\u001b[0m\ntests/unit/test_sanitizer.py::test_herestring[cut -d. -f1 <<< %{version}-%{lua:local v=rpm.expand(\"%{version}\") local i=0 for f in v:gmatch(\"[^%.]+\") do i=i+1 if i==1 then print(f) break end end}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 21%]\u001b[0m\ntests/unit/test_sanitizer.py::test_herestring[cut -d. -f1-2 <<< %{version}-%{lua:local v=rpm.expand(\"%{version}\") local t={} for f in v:gmatch(\"[^%.]+\") do t[#t+1]=f end print(table.concat(t,\".\",1,2))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 21%]\u001b[0m\ntests/unit/test_sanitizer.py::test_herestring[cut -b -7 <<< %{emacscommit}-%{sub %{emacscommit} 1 7}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 21%]\u001b[0m\ntests/unit/test_sanitizer.py::test_herestring[tr -d . <<< %{version}-%{lua:print((rpm.expand(\"%{version}\"):gsub(\"%.\", \"\")))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 21%]\u001b[0m\ntests/unit/test_sanitizer.py::test_herestring[sed 's/\\\\.//g' <<<%{version}-%{lua:print((rpm.expand(\"%{version}\"):gsub(\"%.\", \"\")))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 22%]\u001b[0m\ntests/unit/test_sanitizer.py::test_herestring[sed 's/-/~/g' <<<1.2.3-rc4-%{lua:print((rpm.expand(\"%{quote:1.2.3-rc4}\"):gsub(\"-\", \"~\")))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 22%]\u001b[0m\ntests/unit/test_sanitizer.py::test_variable_indirection[c=%{version}; echo $c | cut -d. -f1-%{lua:local v=rpm.expand(\"%{version}\") local i=0 for f in v:gmatch(\"[^%.]+\") do i=i+1 if i==1 then print(f) break end end}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 22%]\u001b[0m\ntests/unit/test_sanitizer.py::test_variable_indirection[v=%{version}; tr . _ <<< $v-%{lua:print((rpm.expand(\"%{version}\"):gsub(\"%.\", \"_\")))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 22%]\u001b[0m\ntests/unit/test_sanitizer.py::test_bash_array_field[foo=%{version}; a=(${foo//./ }); echo ${a[0]} -%{lua:local v=rpm.expand(\"%{version}\") local i=0 for f in v:gmatch(\"[^%.]+\") do i=i+1 if i==1 then print(f) break end end}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 22%]\u001b[0m\ntests/unit/test_sanitizer.py::test_bash_array_field[foo=%{version}; a=(${foo//./ }); echo ${a[1]} -%{lua:local v=rpm.expand(\"%{version}\") local i=0 for f in v:gmatch(\"[^%.]+\") do i=i+1 if i==2 then print(f) break end end}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 22%]\u001b[0m\ntests/unit/test_sanitizer.py::test_date_formatting[date +\"%Y%m%d\"-%{lua:print(os.date(\"%Y%m%d\"))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 22%]\u001b[0m\ntests/unit/test_sanitizer.py::test_date_formatting[date +'%Y%m%d'-%{lua:print(os.date(\"%Y%m%d\"))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 22%]\u001b[0m\ntests/unit/test_sanitizer.py::test_date_formatting[date -u +'%Y-%m-%dT%H:%M:%SZ'-%{lua:print(os.date(\"!%Y-%m-%dT%H:%M:%SZ\"))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 22%]\u001b[0m\ntests/unit/test_sanitizer.py::test_date_formatting[date +\"%Y-%d-%m\"-%{lua:print(os.date(\"%Y-%d-%m\"))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 23%]\u001b[0m\ntests/unit/test_sanitizer.py::test_arithmetic[echo $((%{__isa_bits}+0))-%[%{__isa_bits}+0]] \u001b[32mPASSED\u001b[0m\u001b[32m [ 23%]\u001b[0m\ntests/unit/test_sanitizer.py::test_arithmetic[echo $((%{__isa_bits}+2))-%[%{__isa_bits}+2]] \u001b[32mPASSED\u001b[0m\u001b[32m [ 23%]\u001b[0m\ntests/unit/test_sanitizer.py::test_arithmetic[echo $((%{ver_minor}+1))-%[%{ver_minor}+1]] \u001b[32mPASSED\u001b[0m\u001b[32m [ 23%]\u001b[0m\ntests/unit/test_sanitizer.py::test_arithmetic[echo $((%{sover}-1))-%[%{sover}-1]] \u001b[32mPASSED\u001b[0m\u001b[32m [ 23%]\u001b[0m\ntests/unit/test_sanitizer.py::test_arithmetic[ echo $(( %majorversion + 1 )) -%[%majorversion + 1]] \u001b[32mPASSED\u001b[0m\u001b[32m [ 23%]\u001b[0m\ntests/unit/test_sanitizer.py::test_basename_dirname[basename %{_python3_include}-%{lua:print((rpm.expand(\"%{_python3_include}\"):match(\"[^/]+$\")))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 23%]\u001b[0m\ntests/unit/test_sanitizer.py::test_basename_dirname[dirname %{bashcompdir}-%{lua:print((rpm.expand(\"%{bashcompdir}\"):match(\"^(.*)/\")))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 23%]\u001b[0m\ntests/unit/test_sanitizer.py::test_basename_dirname[dirname %{compdir}-%{lua:print((rpm.expand(\"%{compdir}\"):match(\"^(.*)/\")))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 23%]\u001b[0m\ntests/unit/test_sanitizer.py::test_string_comparison_not_equal \u001b[32mPASSED\u001b[0m\u001b[32m    [ 24%]\u001b[0m\ntests/unit/test_sanitizer.py::test_string_comparison_equal \u001b[32mPASSED\u001b[0m\u001b[32m        [ 24%]\u001b[0m\ntests/unit/test_sanitizer.py::test_empty_test \u001b[32mPASSED\u001b[0m\u001b[32m                     [ 24%]\u001b[0m\ntests/unit/test_sanitizer.py::test_printf_truncation \u001b[32mPASSED\u001b[0m\u001b[32m              [ 24%]\u001b[0m\ntests/unit/test_sanitizer.py::test_printf_float \u001b[32mPASSED\u001b[0m\u001b[32m                   [ 24%]\u001b[0m\ntests/unit/test_sanitizer.py::test_echo_concat[echo %{optflags} -fno-strict-aliasing-%{optflags} -fno-strict-aliasing] \u001b[32mPASSED\u001b[0m\u001b[32m [ 24%]\u001b[0m\ntests/unit/test_sanitizer.py::test_echo_concat[echo %{build_ldflags} -fuse-ld=lld-%{build_ldflags} -fuse-ld=lld] \u001b[32mPASSED\u001b[0m\u001b[32m [ 24%]\u001b[0m\ntests/unit/test_sanitizer.py::test_echo_concat[echo %{optflags} -D_DEFAULT_SOURCE-%{optflags} -D_DEFAULT_SOURCE] \u001b[32mPASSED\u001b[0m\u001b[32m [ 24%]\u001b[0m\ntests/unit/test_sanitizer.py::test_echo_concat[echo %{optflags} -Wno-error=dangling-reference-%{optflags} -Wno-error=dangling-reference] \u001b[32mPASSED\u001b[0m\u001b[32m [ 24%]\u001b[0m\ntests/unit/test_sanitizer.py::test_cut_bytes_with_macro_offset \u001b[32mPASSED\u001b[0m\u001b[32m    [ 25%]\u001b[0m\ntests/unit/test_sanitizer.py::test_unconvertible_returns_nil[octave-config -p VERSION || echo 0] \u001b[32mPASSED\u001b[0m\u001b[32m [ 25%]\u001b[0m\ntests/unit/test_sanitizer.py::test_unconvertible_returns_nil[python3-config --abiflags] \u001b[32mPASSED\u001b[0m\u001b[32m [ 25%]\u001b[0m\ntests/unit/test_sanitizer.py::test_unconvertible_returns_nil[pkg-config --modversion qwt] \u001b[32mPASSED\u001b[0m\u001b[32m [ 25%]\u001b[0m\ntests/unit/test_sanitizer.py::test_unconvertible_returns_nil[/usr/bin/getconf _NPROCESSORS_ONLN] \u001b[32mPASSED\u001b[0m\u001b[32m [ 25%]\u001b[0m\ntests/unit/test_sanitizer.py::test_unconvertible_returns_nil[uname -m] \u001b[32mPASSED\u001b[0m\u001b[32m [ 25%]\u001b[0m\ntests/unit/test_sanitizer.py::test_unconvertible_returns_nil[hostname] \u001b[32mPASSED\u001b[0m\u001b[32m [ 25%]\u001b[0m\ntests/unit/test_sanitizer.py::test_unconvertible_returns_nil[id -un] \u001b[32mPASSED\u001b[0m\u001b[32m [ 25%]\u001b[0m\ntests/unit/test_sanitizer.py::test_unconvertible_returns_nil[mktemp --directory] \u001b[32mPASSED\u001b[0m\u001b[32m [ 25%]\u001b[0m\ntests/unit/test_sanitizer.py::test_unconvertible_returns_nil[ruby -rrbconfig -e \"puts RbConfig::CONFIG['vendorlibdir']\"] \u001b[32mPASSED\u001b[0m\u001b[32m [ 26%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_safe_code[print(rpm.expand(\"%{version}\"))] \u001b[32mPASSED\u001b[0m\u001b[32m [ 26%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_safe_code[print((rpm.expand(\"%{version}\"):gsub(\"%.\", \"_\")))] \u001b[32mPASSED\u001b[0m\u001b[32m [ 26%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_safe_code[print(os.date(\"%Y%m%d\"))] \u001b[32mPASSED\u001b[0m\u001b[32m [ 26%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_safe_code[print(os.date(\"!%Y-%m-%dT%H:%M:%SZ\"))] \u001b[32mPASSED\u001b[0m\u001b[32m [ 26%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_safe_code[print(os.clock())] \u001b[32mPASSED\u001b[0m\u001b[32m [ 26%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_safe_code[print(os.time())] \u001b[32mPASSED\u001b[0m\u001b[32m [ 26%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_safe_code[print(os.difftime(os.time(), 0))] \u001b[32mPASSED\u001b[0m\u001b[32m [ 26%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_safe_code[local v=rpm.expand(\"%{version}\") print(v:match(\"^(.-)%.\") or v)] \u001b[32mPASSED\u001b[0m\u001b[32m [ 26%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_safe_code[local v=rpm.expand(\"%{version}\") local t={} for f in v:gmatch(\"[^%.]+\") do t[#t+1]=f end print(table.concat(t,\".\",1,2))] \u001b[32mPASSED\u001b[0m\u001b[32m [ 27%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_safe_code[print(string.len(\"hello\"))] \u001b[32mPASSED\u001b[0m\u001b[32m [ 27%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_safe_code[print(math.floor(3.7))] \u001b[32mPASSED\u001b[0m\u001b[32m [ 27%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_safe_code[print(math.max(1, 2, 3))] \u001b[32mPASSED\u001b[0m\u001b[32m [ 27%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_safe_code[print(table.concat({\"a\", \"b\"}, \",\"))] \u001b[32mPASSED\u001b[0m\u001b[32m [ 27%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_safe_code[print(tostring(42))] \u001b[32mPASSED\u001b[0m\u001b[32m [ 27%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_safe_code[print(tonumber(\"42\"))] \u001b[32mPASSED\u001b[0m\u001b[32m [ 27%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_safe_code[print(type(\"hello\"))] \u001b[32mPASSED\u001b[0m\u001b[32m [ 27%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_safe_code[local x = 1 print(x)] \u001b[32mPASSED\u001b[0m\u001b[32m [ 27%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_safe_code[print(string.format(\"%.4f\", tonumber(rpm.expand(\"%{version}\"))))] \u001b[32mPASSED\u001b[0m\u001b[32m [ 28%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_safe_code[print(string.format(\"%d\", 42))] \u001b[32mPASSED\u001b[0m\u001b[32m [ 28%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_safe_code[print(string.format(\"%%.4f\", tonumber(rpm.expand(\"%{version}\"))))] \u001b[32mPASSED\u001b[0m\u001b[32m [ 28%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_safe_code[print(rpm.expand(\"%{version}\")) -- a comment] \u001b[32mPASSED\u001b[0m\u001b[32m [ 28%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_safe_code[local x = 1 --[[ block comment ]] print(x)] \u001b[32mPASSED\u001b[0m\u001b[32m [ 28%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[os.execute(\"id\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 28%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[os.remove(\"/tmp/foo\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 28%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[os.rename(\"/tmp/a\", \"/tmp/b\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 28%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[os.exit(0)] \u001b[32mPASSED\u001b[0m\u001b[32m [ 28%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[io.open(\"/etc/passwd\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 29%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[io.popen(\"id\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 29%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[io.lines(\"/etc/passwd\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 29%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[io.tmpfile()] \u001b[32mPASSED\u001b[0m\u001b[32m [ 29%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[require(\"os\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 29%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[dofile(\"/tmp/evil.lua\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 29%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[loadfile(\"/tmp/evil.lua\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 29%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[loadstring(\"os.execute('id')\")()] \u001b[32mPASSED\u001b[0m\u001b[32m [ 29%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[load(\"os.execute('id')\")()] \u001b[32mPASSED\u001b[0m\u001b[32m [ 29%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[debug.getinfo(1)] \u001b[32mPASSED\u001b[0m\u001b[32m [ 30%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[debug.getregistry()] \u001b[32mPASSED\u001b[0m\u001b[32m [ 30%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[package.loadlib(\"/lib/libc.so.6\", \"system\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 30%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[collectgarbage()] \u001b[32mPASSED\u001b[0m\u001b[32m [ 30%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[coroutine.create(function() end)] \u001b[32mPASSED\u001b[0m\u001b[32m [ 30%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[rpm.define(\"evil_macro 1\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 30%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[rpm.undefine(\"Name\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 30%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[rpm.register(function() end)] \u001b[32mPASSED\u001b[0m\u001b[32m [ 30%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[rpm.execute(\"id\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 30%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[rpm.redirect2macro(\"foo\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 31%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[posix.exec(\"/bin/sh\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 31%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[fedora.rpm.vercmp(\"1\", \"2\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 31%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[string.dump(print)] \u001b[32mPASSED\u001b[0m\u001b[32m [ 31%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[string.char(37, 40)] \u001b[32mPASSED\u001b[0m\u001b[32m [ 31%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[string.sub(\"hello\", 1, 3)] \u001b[32mPASSED\u001b[0m\u001b[32m [ 31%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[string.find(\"hello\", \"l\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 31%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[string.reverse(\"hello\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 31%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[string.rep(\"x\", 5)] \u001b[32mPASSED\u001b[0m\u001b[32m [ 31%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[string.format(\"%c\", 37)] \u001b[32mPASSED\u001b[0m\u001b[32m [ 32%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[string.format(\"%s\", \"hello\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 32%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[string.format(\"%q\", \"hello\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 32%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[string.format(var)] \u001b[32mPASSED\u001b[0m\u001b[32m [ 32%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_identifiers[_G[\"os\"][\"execute\"](\"id\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 32%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_identifiers[_G['os']['execute']('id')] \u001b[32mPASSED\u001b[0m\u001b[32m [ 32%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_identifiers[rawget(_G, \"os\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 32%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_identifiers[rawset(_G, \"evil\", function() end)] \u001b[32mPASSED\u001b[0m\u001b[32m [ 32%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_identifiers[rawequal(_G, _G)] \u001b[32mPASSED\u001b[0m\u001b[32m [ 32%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_identifiers[getfenv(0)] \u001b[32mPASSED\u001b[0m\u001b[32m [ 33%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_identifiers[setfenv(1, {})] \u001b[32mPASSED\u001b[0m\u001b[32m [ 33%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_identifiers[getmetatable(\"\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 33%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_identifiers[setmetatable({}, {})] \u001b[32mPASSED\u001b[0m\u001b[32m [ 33%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_identifiers[newproxy(true)] \u001b[32mPASSED\u001b[0m\u001b[32m [ 33%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_identifiers[module(\"evil\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 33%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_identifiers[pcall(load, \"os.execute('id')\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 33%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_identifiers[xpcall(load, print, \"os.execute('id')\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 33%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_identifiers[pcall(function() end)] \u001b[32mPASSED\u001b[0m\u001b[32m [ 33%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_identifiers[xpcall(function() end, print)] \u001b[32mPASSED\u001b[0m\u001b[32m [ 33%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_bracket_notation[local x = {}; x[\"os\"] = true] \u001b[32mPASSED\u001b[0m\u001b[32m [ 34%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_bracket_notation[local x = {}; x['cmd'] = 'id'] \u001b[32mPASSED\u001b[0m\u001b[32m [ 34%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_bracket_notation[os[\"\\\\\"..\"]] \u001b[32mPASSED\u001b[0m\u001b[32m [ 34%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_bracket_notation[os[string.char(101,120,101,99,117,116,101)]()] \u001b[32mPASSED\u001b[0m\u001b[32m [ 34%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_bracket_notation[os[[[execute]]]()] \u001b[32mPASSED\u001b[0m\u001b[32m [ 34%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_bracket_notation[os[var]] \u001b[32mPASSED\u001b[0m\u001b[32m [ 34%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_variable_aliasing[local e = _G e.os.execute(\"id\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 34%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_variable_aliasing[local r = rawget print(r)] \u001b[32mPASSED\u001b[0m\u001b[32m [ 34%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_variable_aliasing[local d = debug d.getinfo(1)] \u001b[32mPASSED\u001b[0m\u001b[32m [ 34%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_variable_aliasing[local i = io i.popen(\"id\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 35%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_variable_aliasing[local l = loadstring l(\"print(1)\")()] \u001b[32mPASSED\u001b[0m\u001b[32m [ 35%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_variable_aliasing[local p = package p.loadlib(\"x\", \"y\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 35%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_spaced_dot[os . execute(\"id\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 35%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_spaced_dot[os  .  execute(\"id\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 35%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_spaced_dot[os\\t.\\texecute(\"id\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 35%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_paren_bypass[(os).execute(\"id\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 35%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_paren_bypass[((os)).execute(\"id\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 35%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_paren_bypass[(rpm).define(\"evil 1\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 35%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_paren_bypass[(string).dump(print)] \u001b[32mPASSED\u001b[0m\u001b[32m [ 36%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_colon_access[os:execute(\"id\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 36%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_colon_access[os:exit(0)] \u001b[32mPASSED\u001b[0m\u001b[32m [ 36%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_colon_access[rpm:define(\"evil 1\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 36%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_comment_bypass[os.--[[comment]]execute(\"id\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 36%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_comment_bypass[os.--[[x]]exit(0)] \u001b[32mPASSED\u001b[0m\u001b[32m [ 36%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_long_comment_bypass[--[=[ ]=] os.execute(\"id\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 36%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_long_comment_bypass[--[==[ ]==] os.execute(\"id\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 36%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_long_comment_bypass[print(\"safe\" --[=[ ]=]) os.execute(\"id\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 36%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_long_comment_bypass[--[===[ ]===] io.popen(\"id\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 37%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_rpm_expand_bypass[rpm.expand(\"%(whoami)\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 37%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_rpm_expand_bypass[rpm.expand(\"%{lua:os.execute('id')}\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 37%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_rpm_expand_bypass[print(rpm.expand(\"%(cat /etc/passwd)\"))] \u001b[32mPASSED\u001b[0m\u001b[32m [ 37%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_rpm_expand_bypass[rpm.expand('%(id)')] \u001b[32mPASSED\u001b[0m\u001b[32m [ 37%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_rpm_expand_bypass[local x = rpm.expand(\"%(uname -a)\") print(x)] \u001b[32mPASSED\u001b[0m\u001b[32m [ 37%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_rpm_expand_bypass[rpm.expand(\"%{load:/tmp/evil.lua}\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 37%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_rpm_expand_bypass[rpm.expand(\"%{include:/tmp/evil.spec}\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 37%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_rpm_expand_bypass[rpm.expand(\"%{uncompress:/tmp/file.gz}\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 37%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_rpm_expand_bypass[print(rpm.expand(\"%{load: /tmp/evil.lua}\"))] \u001b[32mPASSED\u001b[0m\u001b[32m [ 38%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_rpm_expand_bypass[rpm.expand(\"%{uncompress: file}\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 38%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_rpm_expand_bypass[rpm.expand(\"%{expand:%(whoami)}\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 38%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_rpm_expand_bypass[rpm.expand(\"%{expand:%{lua:os.execute('id')}}\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 38%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_rpm_expand_bypass[rpm.expand(\"%{define:evil %(whoami)}\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 38%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_rpm_expand_bypass[rpm.expand(\"%{global:evil %(whoami)}\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 38%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_rpm_expand_bypass[rpm.expand(\"%{define:Name evil}\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 38%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_rpm_expand_bypass[rpm.expand(\"%{global:_prefix /tmp/evil}\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 38%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_rpm_expand_bypass[rpm.expand(\"%{undefine:Name}\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 38%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_rpm_expand_bypass[rpm.expand(\"%{define :__spec_check_post exit 0}\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 39%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_rpm_expand_bypass[rpm.expand(\"%load /tmp/evil.lua\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 39%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_rpm_expand_bypass[rpm.expand(\"%include /tmp/evil.spec\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 39%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_rpm_expand_bypass[rpm.expand(\"%define __spec_check_post exit 0\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 39%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_rpm_expand_bypass[rpm.expand(\"%global _prefix /tmp/evil\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 39%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_rpm_expand_bypass[rpm.expand(\"%undefine Name\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 39%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_env[local e = _ENV] \u001b[32mPASSED\u001b[0m\u001b[32m [ 39%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_env[_ENV.os.execute(\"id\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 39%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_rpm_expand_shell_bypass_in_sanitize \u001b[32mPASSED\u001b[0m\u001b[32m [ 39%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_rpm_expand_nested_lua_bypass_in_sanitize \u001b[32mPASSED\u001b[0m\u001b[32m [ 40%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_rpm_expand_dynamic_args[rpm.expand(string.char(37, 40) .. \"whoami)\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 40%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_rpm_expand_dynamic_args[rpm.expand(string.format(\"%%\") .. \"(whoami)\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 40%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_rpm_expand_dynamic_args[rpm.expand(string.reverse(\")imaohw(%\"))] \u001b[32mPASSED\u001b[0m\u001b[32m [ 40%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_rpm_expand_dynamic_args[rpm.expand((\"%%\"):format() .. \"(whoami)\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 40%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_rpm_expand_dynamic_args[rpm.expand(\"\" .. \"\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 40%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_rpm_expand_dynamic_args[local f = rpm.expand] \u001b[32mPASSED\u001b[0m\u001b[32m [ 40%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_rpm_expand_dynamic_args[x = rpm.expand] \u001b[32mPASSED\u001b[0m\u001b[32m [ 40%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_rpm_expand_dynamic_args[rpm.expand(x)] \u001b[32mPASSED\u001b[0m\u001b[32m [ 40%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_rpm_expand_string_construction_bypass_in_sanitize[%{lua:rpm.expand(string.char(37, 40) .. \"whoami)\")}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 41%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_rpm_expand_string_construction_bypass_in_sanitize[%{lua:rpm.expand(string.format(\"%%\") .. \"(whoami)\")}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 41%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_rpm_expand_string_construction_bypass_in_sanitize[%{lua:rpm.expand(string.reverse(\")imaohw(%\"))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 41%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_rpm_expand_string_construction_bypass_in_sanitize[%{lua:rpm.expand((\"%%\"):format() .. \"(whoami)\")}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 41%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_in_sanitize \u001b[32mPASSED\u001b[0m\u001b[32m         [ 41%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_safe_in_sanitize \u001b[32mPASSED\u001b[0m\u001b[32m           [ 41%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_bracket_bypass_in_sanitize \u001b[32mPASSED\u001b[0m\u001b[32m [ 41%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_load_include_uncompress_bypass_in_sanitize[%{lua:print(rpm.expand(\"%{load:/tmp/evil.lua}\"))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 41%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_load_include_uncompress_bypass_in_sanitize[%{lua:print(rpm.expand(\"%{include:/tmp/evil.spec}\"))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 41%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_load_include_uncompress_bypass_in_sanitize[%{lua:print(rpm.expand(\"%{uncompress:/tmp/file.gz}\"))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 42%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_rpm_expand_define_global_bypass_in_sanitize[%{lua:print(rpm.expand(\"%{expand:%(whoami)}\"))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 42%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_rpm_expand_define_global_bypass_in_sanitize[%{lua:print(rpm.expand(\"%{expand:%{lua:os.execute('id')}}\"))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 42%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_rpm_expand_define_global_bypass_in_sanitize[%{lua:print(rpm.expand(\"%{define:evil %(whoami)}\"))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 42%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_rpm_expand_define_global_bypass_in_sanitize[%{lua:print(rpm.expand(\"%{global:evil %(whoami)}\"))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 42%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_rpm_expand_braceless_directive_bypass_in_sanitize[%{lua:rpm.expand(\"%load /tmp/evil.lua\")}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 42%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_rpm_expand_braceless_directive_bypass_in_sanitize[%{lua:rpm.expand(\"%include /tmp/evil.spec\")}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 42%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_rpm_expand_braceless_directive_bypass_in_sanitize[%{lua:rpm.expand(\"%define __spec_check_post exit 0\")}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 42%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_rpm_expand_braceless_directive_bypass_in_sanitize[%{lua:rpm.expand(\"%global _prefix /tmp/evil\")}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 42%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_rpm_expand_braceless_directive_bypass_in_sanitize[%{lua:rpm.expand(\"%undefine Name\")}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 43%]\u001b[0m\ntests/unit/test_sanitizer.py::test_builtin_macro_body_sanitized[%{expand:%(whoami)}-%{expand:%{nil}}-1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 43%]\u001b[0m\ntests/unit/test_sanitizer.py::test_builtin_macro_body_sanitized[%{lower:%(whoami)}-%{lower:%{nil}}-1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 43%]\u001b[0m\ntests/unit/test_sanitizer.py::test_builtin_macro_body_sanitized[%{upper:%(whoami)}-%{upper:%{nil}}-1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 43%]\u001b[0m\ntests/unit/test_sanitizer.py::test_builtin_macro_body_sanitized[%{expand:%{lua:os.execute(\"id\")}}-%{expand:%{nil}}-1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 43%]\u001b[0m\ntests/unit/test_sanitizer.py::test_builtin_macro_body_sanitized[%{lower:%{name}}-%{lower:%{name}}-0] \u001b[32mPASSED\u001b[0m\u001b[32m [ 43%]\u001b[0m\ntests/unit/test_sanitizer.py::test_builtin_macro_body_sanitized[%{quote:%(cat /etc/passwd)}-%{quote:%{nil}}-1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 43%]\u001b[0m\ntests/unit/test_sanitizer.py::test_builtin_macro_body_sanitized[%{uncompress:/tmp/file.gz}--1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 43%]\u001b[0m\ntests/unit/test_sanitizer.py::test_enclosed_macro_args_sanitized[%{upper %(whoami)}-%{upper %{nil}}-1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 43%]\u001b[0m\ntests/unit/test_sanitizer.py::test_enclosed_macro_args_sanitized[%{macro %(whoami) %{version}}-%{macro %{nil} %{version}}-1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 44%]\u001b[0m\ntests/unit/test_sanitizer.py::test_enclosed_macro_args_sanitized[%{macro %(whoami) %(id)}-%{macro %{nil} %{nil}}-2] \u001b[32mPASSED\u001b[0m\u001b[32m [ 44%]\u001b[0m\ntests/unit/test_sanitizer.py::test_enclosed_macro_args_sanitized[%{foo %{version}}-%{foo %{version}}-0] \u001b[32mPASSED\u001b[0m\u001b[32m [ 44%]\u001b[0m\ntests/unit/test_sanitizer.py::test_bash_replace_rejects_unsafe_repl[v=%{version}; echo ${v//./%(whoami)}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 44%]\u001b[0m\ntests/unit/test_sanitizer.py::test_bash_replace_rejects_unsafe_repl[v=%{version}; echo ${v//./%{lua:os.execute('id')}}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 44%]\u001b[0m\ntests/unit/test_sanitizer.py::test_bash_replace_rejects_unsafe_repl[v=%{name}; echo ${v//-/%(cat /etc/passwd)}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 44%]\u001b[0m\ntests/unit/test_sanitizer.py::test_test_str_rejects_unsafe_values[test \"a\" == \"a\" && echo \"%(whoami)\" || echo \"no\"] \u001b[32mPASSED\u001b[0m\u001b[32m [ 44%]\u001b[0m\ntests/unit/test_sanitizer.py::test_test_str_rejects_unsafe_values[test \"a\" != \"b\" && echo \"safe\" || echo \"%(id)\"] \u001b[32mPASSED\u001b[0m\u001b[32m [ 44%]\u001b[0m\ntests/unit/test_sanitizer.py::test_test_str_rejects_unsafe_values[test \"%(whoami)\" == \"a\" && echo \"yes\" || echo \"no\"] \u001b[32mPASSED\u001b[0m\u001b[32m [ 44%]\u001b[0m\ntests/unit/test_sanitizer.py::test_test_str_rejects_unsafe_values[test \"a\" == \"%(whoami)\" && echo \"yes\" || echo \"no\"] \u001b[32mPASSED\u001b[0m\u001b[32m [ 45%]\u001b[0m\ntests/unit/test_sanitizer.py::test_test_empty_rejects_unsafe_values[[ -z \"%{?flag}\" ] && echo \"%(whoami)\" || echo \"safe\"] \u001b[32mPASSED\u001b[0m\u001b[32m [ 45%]\u001b[0m\ntests/unit/test_sanitizer.py::test_test_empty_rejects_unsafe_values[[ -z \"%{?flag}\" ] && echo \"safe\" || echo \"%(whoami)\"] \u001b[32mPASSED\u001b[0m\u001b[32m [ 45%]\u001b[0m\ntests/unit/test_sanitizer.py::test_date_rejects_unsafe_format[date +%(whoami)] \u001b[32mPASSED\u001b[0m\u001b[32m [ 45%]\u001b[0m\ntests/unit/test_sanitizer.py::test_date_rejects_unsafe_format[date +\"%(whoami)%Y\"] \u001b[32mPASSED\u001b[0m\u001b[32m [ 45%]\u001b[0m\ntests/unit/test_sanitizer.py::test_sed_rejects_unsafe_replacement[echo %{version} | sed 's/\\\\./ %(whoami)/g'] \u001b[32mPASSED\u001b[0m\u001b[32m [ 45%]\u001b[0m\ntests/unit/test_sanitizer.py::test_sed_rejects_unsafe_replacement[echo %{version} | sed 's/x/%(id)/g'] \u001b[32mPASSED\u001b[0m\u001b[32m [ 45%]\u001b[0m\ntests/unit/test_sanitizer.py::test_awk_rejects_unsafe_separator[echo %{version} | awk -F. '{print $1\"%(whoami)\"$2}'] \u001b[32mPASSED\u001b[0m\u001b[32m [ 45%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_escape_sequence_bypass[print(\"\\\\037(whoami)\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 45%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_escape_sequence_bypass[print(\"\\\\037{lua:os.execute(\\\\\"id\\\\\")}\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 46%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_escape_sequence_bypass[print(\"\\\\x25(whoami)\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 46%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_escape_sequence_bypass[print(\"\\\\u{25}(whoami)\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 46%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_escape_sequence_bypass[print(\"\\\\037\\\\z (whoami)\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 46%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_string_format_bypass[print(string.format(\"%c(whoami)\", 37))] \u001b[32mPASSED\u001b[0m\u001b[32m [ 46%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_string_format_bypass[print(string.format(\"%c\", 37) .. \"(whoami)\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 46%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_colon_method_bypass[print((\"%c(whoami)\"):format(37))] \u001b[32mPASSED\u001b[0m\u001b[32m [ 46%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_colon_method_bypass[print((\"\"):format(37))] \u001b[32mPASSED\u001b[0m\u001b[32m [ 46%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_colon_method_bypass[print((\"\"):char(37))] \u001b[32mPASSED\u001b[0m\u001b[32m [ 46%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_colon_method_bypass[print((\"\"):dump())] \u001b[32mPASSED\u001b[0m\u001b[32m [ 47%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_concatenation_bypass[print(\"%\" .. \"(whoami)\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 47%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_concatenation_bypass[print(\"x%\" .. \"(whoami)\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 47%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_concatenation_bypass[print(\"\\\\037\" .. \"(whoami)\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 47%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_string_extraction_bypass[print(string.sub(\"% \", 1, 1) .. \"(whoami)\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 47%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_string_extraction_bypass[print((\"% \"):sub(1, 1) .. \"(whoami)\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 47%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_string_extraction_bypass[local _,_,c = string.find(\"% x\", \"^(.)\"); print(c .. \"(whoami)\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 47%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_string_extraction_bypass[print(string.reverse(\"X%\") .. \"(whoami)\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 47%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_string_extraction_bypass[print(string.rep(\"% \", 1):sub(1,1) .. \"(whoami)\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 47%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_string_format_alias_bypass[local f=string.format print(f(\"%%%c(whoami)\", 40))] \u001b[32mPASSED\u001b[0m\u001b[32m [ 48%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_string_format_alias_bypass[local f=string.format; print(f(\"%%%c\", 40) .. \"whoami)\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 48%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_string_format_alias_bypass[local t={f=string.format} print(t.f(\"%%%c\", 40))] \u001b[32mPASSED\u001b[0m\u001b[32m [ 48%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_comment_injection_bypass[x = \"--[[\"; os.execute(\"id\"); x = \"--]]\"] \u001b[32mPASSED\u001b[0m\u001b[32m [ 48%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_comment_injection_bypass[x = '--[['; os.execute('id'); x = '--]]'] \u001b[32mPASSED\u001b[0m\u001b[32m [ 48%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_comment_injection_bypass[x = \"--[=[\"; os.execute(\"id\"); x = \"--]=]\"] \u001b[32mPASSED\u001b[0m\u001b[32m [ 48%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_safe_real_comment_not_confused_with_string \u001b[32mPASSED\u001b[0m\u001b[32m [ 48%]\u001b[0m\ntests/unit/test_sanitizer.py::test_expression_expansion_sanitized[%[1+1]-%[1+1]] \u001b[32mPASSED\u001b[0m\u001b[32m [ 48%]\u001b[0m\ntests/unit/test_sanitizer.py::test_expression_expansion_sanitized[%[%{version}]-%[%{version}]] \u001b[32mPASSED\u001b[0m\u001b[32m [ 48%]\u001b[0m\ntests/unit/test_sanitizer.py::test_expression_expansion_sanitized[%[%{lua:os.execute(\"id\")}]-%[%{nil}]] \u001b[32mPASSED\u001b[0m\u001b[32m [ 49%]\u001b[0m\ntests/unit/test_sanitizer.py::test_expression_expansion_sanitized[%[%(whoami)]-%[%{nil}]] \u001b[32mPASSED\u001b[0m\u001b[32m [ 49%]\u001b[0m\ntests/unit/test_sanitizer.py::test_expression_expansion_sanitized[%[lua:os.execute('id')]-%{nil}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 49%]\u001b[0m\ntests/unit/test_sanitizer.py::test_expression_expansion_sanitized[%[lua: os.execute('id')]-%{nil}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 49%]\u001b[0m\ntests/unit/test_sanitizer.py::test_expression_expansion_sanitized[%[lua:rpm.expand(\"%{version}\")]-%[lua:rpm.expand(\"%{version}\")]] \u001b[32mPASSED\u001b[0m\u001b[32m [ 49%]\u001b[0m\ntests/unit/test_sanitizer.py::test_macro_name_sanitized[%{%(whoami)}-%{%{nil}}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 49%]\u001b[0m\ntests/unit/test_sanitizer.py::test_macro_name_sanitized[%{%(whoami) arg1 arg2}-%{%{nil} arg1 arg2}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 49%]\u001b[0m\ntests/unit/test_sanitizer.py::test_macro_name_sanitized[%{%(whoami):body}-%{nil}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 49%]\u001b[0m\ntests/unit/test_sanitizer.py::test_macro_name_sanitized[%{%{lua:os.execute(\"id\")}}-%{nil}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 49%]\u001b[0m\ntests/unit/test_sanitizer.py::test_macro_name_sanitized[%{?%(whoami):body}-%{nil}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 50%]\u001b[0m\ntests/unit/test_sanitizer.py::test_macro_name_sanitized[%{!%(whoami):body}-%{nil}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 50%]\u001b[0m\ntests/unit/test_sanitizer.py::test_macro_name_sanitized[%{version}-%{version}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 50%]\u001b[0m\ntests/unit/test_sanitizer.py::test_macro_name_sanitized[%{?dist}-%{?dist}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 50%]\u001b[0m\ntests/unit/test_sanitizer.py::test_macro_name_sanitized[%{?prerel:0.}-%{?prerel:0.}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 50%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_expression_expansion_in_string[print(rpm.expand(\"%[lua:os.execute('id')]\"))] \u001b[32mPASSED\u001b[0m\u001b[32m [ 50%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_expression_expansion_in_string[print(\"%[1+1]\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 50%]\u001b[0m\ntests/unit/test_sanitizer.py::test_sed_pattern_newline_escape \u001b[32mPASSED\u001b[0m\u001b[32m     [ 50%]\u001b[0m\ntests/unit/test_sanitizer.py::test_sed_pattern_parentheses_escaped \u001b[32mPASSED\u001b[0m\u001b[32m [ 50%]\u001b[0m\ntests/unit/test_sanitizer.py::test_sanitize_idempotent_printf_float \u001b[32mPASSED\u001b[0m\u001b[32m [ 51%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_char_escape_bypass[rpm.expand(\"%\\\\040whoami)\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 51%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_char_escape_bypass[rpm.expand(\"%\\\\091lua\\\\058os.execute('id')\\\\093\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 51%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_char_escape_bypass[rpm.expand(\"%\\\\x28whoami)\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 51%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_char_escape_bypass[rpm.expand(\"%\\\\x7blua\\\\x3aos.execute('id')}\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 51%]\u001b[0m\ntests/unit/test_sanitizer.py::test_lua_unsafe_char_escape_bypass[rpm.expand(\"%\\\\u{28}whoami)\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 51%]\u001b[0m\ntests/unit/test_sanitizer.py::test_decode_lua_escapes_out_of_range \u001b[32mPASSED\u001b[0m\u001b[32m [ 51%]\u001b[0m\ntests/unit/test_sanitizer.py::test_sanitize_depth_limit \u001b[32mPASSED\u001b[0m\u001b[32m           [ 51%]\u001b[0m\ntests/unit/test_sections.py::test_find \u001b[32mPASSED\u001b[0m\u001b[32m                            [ 51%]\u001b[0m\ntests/unit/test_sections.py::test_get \u001b[32mPASSED\u001b[0m\u001b[32m                             [ 52%]\u001b[0m\ntests/unit/test_sections.py::test_contains_and_getattr \u001b[32mPASSED\u001b[0m\u001b[32m            [ 52%]\u001b[0m\ntests/unit/test_sections.py::test_get_or_create[package-True-package--content0] \u001b[32mPASSED\u001b[0m\u001b[32m [ 52%]\u001b[0m\ntests/unit/test_sections.py::test_get_or_create[prep-True-prep--content1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 52%]\u001b[0m\ntests/unit/test_sections.py::test_get_or_create[package -n subpkg1-True-package--n subpkg1-content2] \u001b[32mPASSED\u001b[0m\u001b[32m [ 52%]\u001b[0m\ntests/unit/test_sections.py::test_get_or_create[package -n subpkg2-False-package--n subpkg2-content3] \u001b[32mPASSED\u001b[0m\u001b[32m [ 52%]\u001b[0m\ntests/unit/test_sections.py::test_parse \u001b[32mPASSED\u001b[0m\u001b[32m                           [ 52%]\u001b[0m\ntests/unit/test_sections.py::test_parse_case_insensitive \u001b[32mPASSED\u001b[0m\u001b[32m          [ 52%]\u001b[0m\ntests/unit/test_sections.py::test_parse_invalid_name \u001b[32mPASSED\u001b[0m\u001b[32m              [ 52%]\u001b[0m\ntests/unit/test_sections.py::test_parse_macro_definitions \u001b[32mPASSED\u001b[0m\u001b[32m         [ 53%]\u001b[0m\ntests/unit/test_sections.py::test_get_raw_data \u001b[32mPASSED\u001b[0m\u001b[32m                    [ 53%]\u001b[0m\ntests/unit/test_sections.py::test_copy_sections \u001b[32mPASSED\u001b[0m\u001b[32m                   [ 53%]\u001b[0m\ntests/unit/test_sections.py::test_is_script[package-False] \u001b[32mPASSED\u001b[0m\u001b[32m        [ 53%]\u001b[0m\ntests/unit/test_sections.py::test_is_script[install-True] \u001b[32mPASSED\u001b[0m\u001b[32m         [ 53%]\u001b[0m\ntests/unit/test_sections.py::test_is_script[PostUn-True] \u001b[32mPASSED\u001b[0m\u001b[32m          [ 53%]\u001b[0m\ntests/unit/test_sections.py::test_is_script[SourceList-False] \u001b[32mPASSED\u001b[0m\u001b[32m     [ 53%]\u001b[0m\ntests/unit/test_sourcelist.py::test_parse \u001b[32mPASSED\u001b[0m\u001b[32m                         [ 53%]\u001b[0m\ntests/unit/test_sourcelist.py::test_get_raw_section_data \u001b[32mPASSED\u001b[0m\u001b[32m          [ 53%]\u001b[0m\ntests/unit/test_sourcelist.py::test_copy_sourcelist \u001b[32mPASSED\u001b[0m\u001b[32m               [ 54%]\u001b[0m\ntests/unit/test_sources.py::test_tag_source_extract_number[Source-None] \u001b[32mPASSED\u001b[0m\u001b[32m [ 54%]\u001b[0m\ntests/unit/test_sources.py::test_tag_source_extract_number[Source0-0] \u001b[32mPASSED\u001b[0m\u001b[32m [ 54%]\u001b[0m\ntests/unit/test_sources.py::test_tag_source_extract_number[Patch0001-0001] \u001b[32mPASSED\u001b[0m\u001b[32m [ 54%]\u001b[0m\ntests/unit/test_sources.py::test_tag_source_extract_number[Patch28-28] \u001b[32mPASSED\u001b[0m\u001b[32m [ 54%]\u001b[0m\ntests/unit/test_sources.py::test_tag_source_extract_number[Patch99999-99999] \u001b[32mPASSED\u001b[0m\u001b[32m [ 54%]\u001b[0m\ntests/unit/test_sources.py::test_sources_detect_implicit_numbering[tags0-True-False] \u001b[32mPASSED\u001b[0m\u001b[32m [ 54%]\u001b[0m\ntests/unit/test_sources.py::test_sources_detect_implicit_numbering[tags1-False-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 54%]\u001b[0m\ntests/unit/test_sources.py::test_sources_detect_implicit_numbering[tags2-False-False] \u001b[32mPASSED\u001b[0m\u001b[32m [ 54%]\u001b[0m\ntests/unit/test_sources.py::test_sources_detect_implicit_numbering[tags3-True-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 55%]\u001b[0m\ntests/unit/test_sources.py::test_sources_get_tag_format[Source-: -28-Source-: ] \u001b[32mPASSED\u001b[0m\u001b[32m [ 55%]\u001b[0m\ntests/unit/test_sources.py::test_sources_get_tag_format[Source0-: -28-Source28-:] \u001b[32mPASSED\u001b[0m\u001b[32m [ 55%]\u001b[0m\ntests/unit/test_sources.py::test_sources_get_tag_format[Source0001-:      -2-Source0002-:      ] \u001b[32mPASSED\u001b[0m\u001b[32m [ 55%]\u001b[0m\ntests/unit/test_sources.py::test_sources_get_initial_tag_setup[tags0-0-2] \u001b[32mPASSED\u001b[0m\u001b[32m [ 55%]\u001b[0m\ntests/unit/test_sources.py::test_sources_get_initial_tag_setup[tags1-999-0] \u001b[32mPASSED\u001b[0m\u001b[32m [ 55%]\u001b[0m\ntests/unit/test_sources.py::test_sources_deduplicate_tag_names[tags0-deduplicated_tags0] \u001b[32mPASSED\u001b[0m\u001b[32m [ 55%]\u001b[0m\ntests/unit/test_sources.py::test_sources_deduplicate_tag_names[tags1-deduplicated_tags1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 55%]\u001b[0m\ntests/unit/test_sources.py::test_sources_deduplicate_tag_names[tags2-deduplicated_tags2] \u001b[32mPASSED\u001b[0m\u001b[32m [ 55%]\u001b[0m\ntests/unit/test_sources.py::test_sources_deduplicate_tag_names[tags3-deduplicated_tags3] \u001b[32mPASSED\u001b[0m\u001b[32m [ 56%]\u001b[0m\ntests/unit/test_sources.py::test_sources_deduplicate_tag_names[tags4-deduplicated_tags4] \u001b[32mPASSED\u001b[0m\u001b[32m [ 56%]\u001b[0m\ntests/unit/test_sources.py::test_sources_deduplicate_tag_names[tags5-deduplicated_tags5] \u001b[32mPASSED\u001b[0m\u001b[32m [ 56%]\u001b[0m\ntests/unit/test_sources.py::test_sources_deduplicate_tag_names[tags6-deduplicated_tags6] \u001b[32mPASSED\u001b[0m\u001b[32m [ 56%]\u001b[0m\ntests/unit/test_sources.py::test_sources_insert[tags0-sourcelists0-0-test-0-TagSource] \u001b[32mPASSED\u001b[0m\u001b[32m [ 56%]\u001b[0m\ntests/unit/test_sources.py::test_sources_insert[tags1-sourcelists1-0-test-0-ListSource] \u001b[32mPASSED\u001b[0m\u001b[32m [ 56%]\u001b[0m\ntests/unit/test_sources.py::test_sources_insert[tags2-sourcelists2-10-test-2-TagSource] \u001b[32mPASSED\u001b[0m\u001b[32m [ 56%]\u001b[0m\ntests/unit/test_sources.py::test_sources_insert[tags3-sourcelists3-10-test-4-ListSource] \u001b[32mPASSED\u001b[0m\u001b[32m [ 56%]\u001b[0m\ntests/unit/test_sources.py::test_sources_insert[tags4-sourcelists4-1-test-1-TagSource] \u001b[32mPASSED\u001b[0m\u001b[32m [ 56%]\u001b[0m\ntests/unit/test_sources.py::test_sources_insert[tags5-sourcelists5-1-test-10-TagSource] \u001b[32mPASSED\u001b[0m\u001b[32m [ 57%]\u001b[0m\ntests/unit/test_sources.py::test_sources_insert[tags6-sourcelists6-2-test-2-ListSource] \u001b[32mPASSED\u001b[0m\u001b[32m [ 57%]\u001b[0m\ntests/unit/test_sources.py::test_sources_insert[tags7-sourcelists7-10-source0-None-None] \u001b[32mPASSED\u001b[0m\u001b[32m [ 57%]\u001b[0m\ntests/unit/test_sources.py::test_sources_insert_numbered[tags0-28-test-0] \u001b[32mPASSED\u001b[0m\u001b[32m [ 57%]\u001b[0m\ntests/unit/test_sources.py::test_sources_insert_numbered[tags1-0-test-0] \u001b[32mPASSED\u001b[0m\u001b[32m [ 57%]\u001b[0m\ntests/unit/test_sources.py::test_sources_insert_numbered[tags2-2-test-2] \u001b[32mPASSED\u001b[0m\u001b[32m [ 57%]\u001b[0m\ntests/unit/test_sources.py::test_sources_insert_numbered[tags3-42-test-3] \u001b[32mPASSED\u001b[0m\u001b[32m [ 57%]\u001b[0m\ntests/unit/test_sources.py::test_sources_insert_numbered[tags4-1000-test-4] \u001b[32mPASSED\u001b[0m\u001b[32m [ 57%]\u001b[0m\ntests/unit/test_sources.py::test_sources_insert_numbered[tags5-37-test-1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 57%]\u001b[0m\ntests/unit/test_sources.py::test_sources_remove_numbered[tags0-sourcelists0-1-new_tags0-new_sourcelists0] \u001b[32mPASSED\u001b[0m\u001b[32m [ 58%]\u001b[0m\ntests/unit/test_sources.py::test_sources_remove_numbered[tags1-sourcelists1-2-new_tags1-new_sourcelists1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 58%]\u001b[0m\ntests/unit/test_sources.py::test_sources_remove_numbered[tags2-sourcelists2-2-new_tags2-new_sourcelists2] \u001b[32mPASSED\u001b[0m\u001b[32m [ 58%]\u001b[0m\ntests/unit/test_sources.py::test_patches_get_tag_format[Patch99-:      -100-Patch100-:     ] \u001b[32mPASSED\u001b[0m\u001b[32m [ 58%]\u001b[0m\ntests/unit/test_sources.py::test_patches_get_tag_format[Patch9999-:  -28-Patch28-:    ] \u001b[32mPASSED\u001b[0m\u001b[32m [ 58%]\u001b[0m\ntests/unit/test_sources.py::test_patches_get_tag_format[Patch0999-:  -28-Patch0028-:  ] \u001b[32mPASSED\u001b[0m\u001b[32m [ 58%]\u001b[0m\ntests/unit/test_sources.py::test_patches_get_tag_format[Source2-:     -0-Patch0-:      ] \u001b[32mPASSED\u001b[0m\u001b[32m [ 58%]\u001b[0m\ntests/unit/test_sources.py::test_patches_get_initial_tag_setup[tags0-0-3] \u001b[32mPASSED\u001b[0m\u001b[32m [ 58%]\u001b[0m\ntests/unit/test_sources.py::test_patches_get_initial_tag_setup[tags1-1-3] \u001b[32mPASSED\u001b[0m\u001b[32m [ 58%]\u001b[0m\ntests/unit/test_sources.py::test_patches_get_initial_tag_setup[tags2-2-2] \u001b[32mPASSED\u001b[0m\u001b[32m [ 59%]\u001b[0m\ntests/unit/test_sources.py::test_patches_get_initial_tag_setup[tags3-999-0] \u001b[32mPASSED\u001b[0m\u001b[32m [ 59%]\u001b[0m\ntests/unit/test_sources.py::test_copy_sources \u001b[32mPASSED\u001b[0m\u001b[32m                     [ 59%]\u001b[0m\ntests/unit/test_spec_parser.py::test_spec_parser_do_parse \u001b[32mPASSED\u001b[0m\u001b[32m         [ 59%]\u001b[0m\ntests/unit/test_spec_parser.py::test_copy_spec_parser \u001b[32mPASSED\u001b[0m\u001b[32m             [ 59%]\u001b[0m\ntests/unit/test_spec_parser.py::test_spec_parser_macros \u001b[32mPASSED\u001b[0m\u001b[32m           [ 59%]\u001b[0m\ntests/unit/test_spec_parser.py::test_spec_parser_make_dummy_sources \u001b[32mPASSED\u001b[0m\u001b[32m [ 59%]\u001b[0m\ntests/unit/test_specfile.py::test_split_raw_release[1%{?dist}-1-%{?dist}-None] \u001b[32mPASSED\u001b[0m\u001b[32m [ 59%]\u001b[0m\ntests/unit/test_specfile.py::test_split_raw_release[0.1%{prerelease}%{dist}-0.1%{prerelease}-%{dist}-None] \u001b[32mPASSED\u001b[0m\u001b[32m [ 59%]\u001b[0m\ntests/unit/test_specfile.py::test_split_raw_release[%{_short_release}%{?dist}.20-%{_short_release}-%{?dist}-20] \u001b[32mPASSED\u001b[0m\u001b[32m [ 60%]\u001b[0m\ntests/unit/test_specfile.py::test_split_raw_release[28%dist-28-%dist-None] \u001b[32mPASSED\u001b[0m\u001b[32m [ 60%]\u001b[0m\ntests/unit/test_specfile.py::test_split_raw_release[%{release_string}-%{release_string}-None-None] \u001b[32mPASSED\u001b[0m\u001b[32m [ 60%]\u001b[0m\ntests/unit/test_specfile.py::test_get_updated_release[1%{?dist}-28-28%{?dist}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 60%]\u001b[0m\ntests/unit/test_specfile.py::test_get_updated_release[0.1%{prerelease}%{dist}-1-1%{dist}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 60%]\u001b[0m\ntests/unit/test_specfile.py::test_get_updated_release[%{_short_release}%{?dist}.20-3-3%{?dist}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 60%]\u001b[0m\ntests/unit/test_specfile.py::test_get_updated_release[28%dist-0.1-0.1%dist] \u001b[32mPASSED\u001b[0m\u001b[32m [ 60%]\u001b[0m\ntests/unit/test_specfile.py::test_get_updated_release[%{release_string}-1-1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 60%]\u001b[0m\ntests/unit/test_specfile.py::test_bump_release_string[1%{?dist}-2%{?dist}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 60%]\u001b[0m\ntests/unit/test_specfile.py::test_bump_release_string[0.1%{?dist}-0.2%{?dist}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 61%]\u001b[0m\ntests/unit/test_specfile.py::test_bump_release_string[%release_func 26-%release_func 27] \u001b[32mPASSED\u001b[0m\u001b[32m [ 61%]\u001b[0m\ntests/unit/test_specfile.py::test_bump_release_string[0.24.rc1%{?dist}-0.25.rc1%{?dist}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 61%]\u001b[0m\ntests/unit/test_specfile.py::test_bump_release_string[0.2.%{prerel}%{?dist}-0.3.%{prerel}%{?dist}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 61%]\u001b[0m\ntests/unit/test_specfile.py::test_bump_release_string[0.8.%{commitdate}%{shortcommit}%{?dist}-0.9.%{commitdate}%{shortcommit}%{?dist}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 61%]\u001b[0m\ntests/unit/test_specfile.py::test_bump_release_string[3.%{git_date}git%{git_commit_short}%{?dist}-4.%{git_date}git%{git_commit_short}%{?dist}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 61%]\u001b[0m\ntests/unit/test_specfile.py::test_bump_release_string[1%{?rcrel}%{?dist}.1-1%{?rcrel}%{?dist}.2] \u001b[32mPASSED\u001b[0m\u001b[32m [ 61%]\u001b[0m\ntests/unit/test_specfile.py::test_bump_release_string[%{?beta_ver:0.}%{fedora_rel}%{?beta_ver:.%beta_ver}%{?dist}%{flagrel}%{?extrarel}-%{?beta_ver:0.}%{fedora_rel}%{?beta_ver:.%beta_ver}%{?dist}%{flagrel}%{?extrarel}.1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 61%]\u001b[0m\ntests/unit/test_specfile.py::test_bump_release_string[4.rc2%{?dist}-4.rc2%{?dist}.1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 61%]\u001b[0m\ntests/unit/test_tags.py::test_find \u001b[32mPASSED\u001b[0m\u001b[32m                                [ 62%]\u001b[0m\ntests/unit/test_tags.py::test_parse \u001b[32mPASSED\u001b[0m\u001b[32m                               [ 62%]\u001b[0m\ntests/unit/test_tags.py::test_get_raw_section_data \u001b[32mPASSED\u001b[0m\u001b[32m                [ 62%]\u001b[0m\ntests/unit/test_tags.py::test_copy_tags \u001b[32mPASSED\u001b[0m\u001b[32m                           [ 62%]\u001b[0m\ntests/unit/test_utils.py::test_get_filename_from_location[-] \u001b[32mPASSED\u001b[0m\u001b[32m      [ 62%]\u001b[0m\ntests/unit/test_utils.py::test_get_filename_from_location[tarball-0.1.tar.gz-tarball-0.1.tar.gz] \u001b[32mPASSED\u001b[0m\u001b[32m [ 62%]\u001b[0m\ntests/unit/test_utils.py::test_get_filename_from_location[https://example.com-example.com] \u001b[32mPASSED\u001b[0m\u001b[32m [ 62%]\u001b[0m\ntests/unit/test_utils.py::test_get_filename_from_location[https://example.com#fragment-example.com#fragment] \u001b[32mPASSED\u001b[0m\u001b[32m [ 62%]\u001b[0m\ntests/unit/test_utils.py::test_get_filename_from_location[https://example.com/archive/tarball-0.1.tar.gz-tarball-0.1.tar.gz] \u001b[32mPASSED\u001b[0m\u001b[32m [ 62%]\u001b[0m\ntests/unit/test_utils.py::test_get_filename_from_location[https://example.com/archive/tarball-0.1.tar.gz#fragment-tarball-0.1.tar.gz#fragment] \u001b[32mPASSED\u001b[0m\u001b[32m [ 63%]\u001b[0m\ntests/unit/test_utils.py::test_get_filename_from_location[https://example.com/download_tarball.cgi#/tarball-0.1.tar.gz-tarball-0.1.tar.gz] \u001b[32mPASSED\u001b[0m\u001b[32m [ 63%]\u001b[0m\ntests/unit/test_utils.py::test_get_filename_from_location[https://example.com/tarball-latest.tar.gz#/file=tarball-0.1.tar.gz-tarball-0.1.tar.gz] \u001b[32mPASSED\u001b[0m\u001b[32m [ 63%]\u001b[0m\ntests/unit/test_utils.py::test_count_brackets[-count0] \u001b[32mPASSED\u001b[0m\u001b[32m            [ 63%]\u001b[0m\ntests/unit/test_utils.py::test_count_brackets[%macro-count1] \u001b[32mPASSED\u001b[0m\u001b[32m      [ 63%]\u001b[0m\ntests/unit/test_utils.py::test_count_brackets[%{macro}-count2] \u001b[32mPASSED\u001b[0m\u001b[32m    [ 63%]\u001b[0m\ntests/unit/test_utils.py::test_count_brackets[%{{macro}}-count3] \u001b[32mPASSED\u001b[0m\u001b[32m  [ 63%]\u001b[0m\ntests/unit/test_utils.py::test_count_brackets[%{{macro}-count4] \u001b[32mPASSED\u001b[0m\u001b[32m   [ 63%]\u001b[0m\ntests/unit/test_utils.py::test_count_brackets[%{macro:-count5] \u001b[32mPASSED\u001b[0m\u001b[32m    [ 63%]\u001b[0m\ntests/unit/test_utils.py::test_count_brackets[%(echo %{v}-count6] \u001b[32mPASSED\u001b[0m\u001b[32m [ 64%]\u001b[0m\ntests/unit/test_utils.py::test_count_brackets[%(echo %{v} | cut -d. -f3)-count7] \u001b[32mPASSED\u001b[0m\u001b[32m [ 64%]\u001b[0m\ntests/unit/test_utils.py::test_EVR_compare \u001b[32mPASSED\u001b[0m\u001b[32m                        [ 64%]\u001b[0m\ntests/unit/test_utils.py::test_NEVR_compare \u001b[32mPASSED\u001b[0m\u001b[32m                       [ 64%]\u001b[0m\ntests/unit/test_utils.py::test_NEVRA_compare \u001b[32mPASSED\u001b[0m\u001b[32m                      [ 64%]\u001b[0m\ntests/unit/test_utils.py::test_EVR_from_string[0-result0] \u001b[32mPASSED\u001b[0m\u001b[32m         [ 64%]\u001b[0m\ntests/unit/test_utils.py::test_EVR_from_string[12.0-1-result1] \u001b[32mPASSED\u001b[0m\u001b[32m    [ 64%]\u001b[0m\ntests/unit/test_utils.py::test_EVR_from_string[2:56.8-5-result2] \u001b[32mPASSED\u001b[0m\u001b[32m  [ 64%]\u001b[0m\ntests/unit/test_utils.py::test_EVR_from_string[0.8.0-1.fc37-result3] \u001b[32mPASSED\u001b[0m\u001b[32m [ 64%]\u001b[0m\ntests/unit/test_utils.py::test_EVR_from_string[0.5.0~rc2-1.el9-result4] \u001b[32mPASSED\u001b[0m\u001b[32m [ 65%]\u001b[0m\ntests/unit/test_utils.py::test_EVR_from_string[7.3-0.2.rc1.fc38-result5] \u001b[32mPASSED\u001b[0m\u001b[32m [ 65%]\u001b[0m\ntests/unit/test_utils.py::test_EVR_from_string[7.3~rc1^20200701gdeadf00f-12.fc38-result6] \u001b[32mPASSED\u001b[0m\u001b[32m [ 65%]\u001b[0m\ntests/unit/test_utils.py::test_NEVR_from_string[package-0-result0] \u001b[32mPASSED\u001b[0m\u001b[32m [ 65%]\u001b[0m\ntests/unit/test_utils.py::test_NEVR_from_string[package-12.0-1-result1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 65%]\u001b[0m\ntests/unit/test_utils.py::test_NEVR_from_string[package-2:56.8-5-result2] \u001b[32mPASSED\u001b[0m\u001b[32m [ 65%]\u001b[0m\ntests/unit/test_utils.py::test_NEVR_from_string[package-0.8.0-1.fc37-result3] \u001b[32mPASSED\u001b[0m\u001b[32m [ 65%]\u001b[0m\ntests/unit/test_utils.py::test_NEVR_from_string[package-0.5.0~rc2-1.el9-result4] \u001b[32mPASSED\u001b[0m\u001b[32m [ 65%]\u001b[0m\ntests/unit/test_utils.py::test_NEVR_from_string[package-devel-7.3-0.2.rc1.fc38-result5] \u001b[32mPASSED\u001b[0m\u001b[32m [ 65%]\u001b[0m\ntests/unit/test_utils.py::test_NEVR_from_string[package-7.3~rc1^20200701gdeadf00f-12.fc38-result6] \u001b[32mPASSED\u001b[0m\u001b[32m [ 66%]\u001b[0m\ntests/unit/test_utils.py::test_NEVRA_from_string[package-12.0-1.x86_64-result0] \u001b[32mPASSED\u001b[0m\u001b[32m [ 66%]\u001b[0m\ntests/unit/test_utils.py::test_NEVRA_from_string[package-2:56.8-5.aarch64-result1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 66%]\u001b[0m\ntests/unit/test_utils.py::test_NEVRA_from_string[package-0.8.0-1.fc37.armv6hl-result2] \u001b[32mPASSED\u001b[0m\u001b[32m [ 66%]\u001b[0m\ntests/unit/test_utils.py::test_NEVRA_from_string[package-0.5.0~rc2-1.el9.noarch-result3] \u001b[32mPASSED\u001b[0m\u001b[32m [ 66%]\u001b[0m\ntests/unit/test_utils.py::test_NEVRA_from_string[package-devel-7.3-0.2.rc1.fc38.i686-result4] \u001b[32mPASSED\u001b[0m\u001b[32m [ 66%]\u001b[0m\ntests/unit/test_utils.py::test_NEVRA_from_string[package-7.3~rc1^20200701gdeadf00f-12.fc38.riscv-result5] \u001b[32mPASSED\u001b[0m\u001b[32m [ 66%]\u001b[0m\ntests/unit/test_value_parser.py::test_parse[-nodes0] \u001b[32mPASSED\u001b[0m\u001b[32m              [ 66%]\u001b[0m\ntests/unit/test_value_parser.py::test_parse[escaped %%macro-nodes1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 66%]\u001b[0m\ntests/unit/test_value_parser.py::test_parse[%(echo %{version} | cut -d. -f3)-nodes2] \u001b[32mPASSED\u001b[0m\u001b[32m [ 66%]\u001b[0m\ntests/unit/test_value_parser.py::test_parse[%version-nodes3] \u001b[32mPASSED\u001b[0m\u001b[32m      [ 67%]\u001b[0m\ntests/unit/test_value_parser.py::test_parse[1%{?dist}-nodes4] \u001b[32mPASSED\u001b[0m\u001b[32m     [ 67%]\u001b[0m\ntests/unit/test_value_parser.py::test_parse[%{longdesc %{name}}-nodes5] \u001b[32mPASSED\u001b[0m\u001b[32m [ 67%]\u001b[0m\ntests/unit/test_value_parser.py::test_parse[%{fedorarel}%{?dist}.2-nodes6] \u001b[32mPASSED\u001b[0m\u001b[32m [ 67%]\u001b[0m\ntests/unit/test_value_parser.py::test_parse[%{?prever:0.}%{mainrel}%{?prever:.%{prerpmver}}-nodes7] \u001b[32mPASSED\u001b[0m\u001b[32m [ 67%]\u001b[0m\ntests/unit/test_value_parser.py::test_parse[%{lua:ver = string.gsub(rpm.expand(\"%{ver}\"), \"-\", \"~\"); print(string.lower(ver))}-nodes8] \u001b[32mPASSED\u001b[0m\u001b[32m [ 67%]\u001b[0m\ntests/unit/test_value_parser.py::test_parse[%{%{28}}-nodes9] \u001b[32mPASSED\u001b[0m\u001b[32m      [ 67%]\u001b[0m\ntests/unit/test_value_parser.py::test_parse[%{%{macro}}-nodes10] \u001b[32mPASSED\u001b[0m\u001b[32m  [ 67%]\u001b[0m\ntests/unit/test_value_parser.py::test_parse[%{upper:%{name}}-nodes11] \u001b[32mPASSED\u001b[0m\u001b[32m [ 67%]\u001b[0m\ntests/unit/test_value_parser.py::test_parse[%{version_no_tilde %{quote:nil}}-nodes12] \u001b[32mPASSED\u001b[0m\u001b[32m [ 68%]\u001b[0m\ntests/unit/test_value_parser.py::test_construct_regex[%(echo %version | cut -d. -f1,2).0-macros0-modifiable_entities0-flippable_entities0-^1\\\\.1(?P<sub_0>.+?)$-%(echo %version | cut -d. -f1,2)${sub_0}-entities_to_flip0] \u001b[32mPASSED\u001b[0m\u001b[32m [ 68%]\u001b[0m\ntests/unit/test_value_parser.py::test_construct_regex[%version-macros1-modifiable_entities1-flippable_entities1-^(?P<version>.+)$-%version-entities_to_flip1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 68%]\u001b[0m\ntests/unit/test_value_parser.py::test_construct_regex[%?version-macros2-modifiable_entities2-flippable_entities2-^(?P<version>.+)$-%?version-entities_to_flip2] \u001b[32mPASSED\u001b[0m\u001b[32m [ 68%]\u001b[0m\ntests/unit/test_value_parser.py::test_construct_regex[%!?version-macros3-modifiable_entities3-flippable_entities3-^$-%!?version-entities_to_flip3] \u001b[32mPASSED\u001b[0m\u001b[32m [ 68%]\u001b[0m\ntests/unit/test_value_parser.py::test_construct_regex[1%{?dist}-macros4-modifiable_entities4-flippable_entities4-^(?P<sub_0>.+?)\\\\.fc35$-${sub_0}%{?dist}-entities_to_flip4] \u001b[32mPASSED\u001b[0m\u001b[32m [ 68%]\u001b[0m\ntests/unit/test_value_parser.py::test_construct_regex[%{longdesc %name}-macros5-modifiable_entities5-flippable_entities5-^Lorem\\\\ ipsum\\\\ dolor\\\\ sit\\\\ amet$-%{longdesc %name}-entities_to_flip5] \u001b[32mPASSED\u001b[0m\u001b[32m [ 68%]\u001b[0m\ntests/unit/test_value_parser.py::test_construct_regex[%{?prever:0.}%{mainrel}%{?prever:.%{prerpmver}}-macros6-modifiable_entities6-flippable_entities6-^(?P<sub_0>.+?)\\\\.(?P<mainrel>.+)\\\\.(?P<prerpmver>.+)$-%{?prever:${sub_0}.}%{mainrel}%{?prever:.%{prerpmver}}-entities_to_flip6] \u001b[32mPASSED\u001b[0m\u001b[32m [ 68%]\u001b[0m\ntests/unit/test_value_parser.py::test_construct_regex[%{?prever:0.}%{mainrel}%{?prever:.%{prerpmver}}-macros7-modifiable_entities7-flippable_entities7-^(?P<sub_0>.+?)\\\\.(?P<mainrel>.+)\\\\.(?P<prerpmver>.+)$-%{?prever:${sub_0}.}%{mainrel}%{?prever:.%{prerpmver}}-entities_to_flip7] \u001b[32mPASSED\u001b[0m\u001b[32m [ 68%]\u001b[0m\ntests/unit/test_value_parser.py::test_construct_regex[%{mingw64_libdir}/lib%{pkgname}stub%{majorver1}%{majorver2}.a-macros8-modifiable_entities8-flippable_entities8-^$-%{mingw64_libdir}/lib%{pkgname}stub%{majorver1}%{majorver2}.a-entities_to_flip8] \u001b[32mPASSED\u001b[0m\u001b[32m [ 69%]\u001b[0m\ntests/unit/test_value_parser.py::test_construct_regex[%{?commit:%{commit}}%{?!commit:%{tag}}-macros9-modifiable_entities9-flippable_entities9-^(?P<commit>.+)$-%{?commit:%{commit}}%{?!commit:%{tag}}-entities_to_flip9] \u001b[32mPASSED\u001b[0m\u001b[32m [ 69%]\u001b[0m\ntests/unit/test_value_parser.py::test_construct_regex[%{?commit:%{commit}}%{?!commit:%{tag}}-macros10-modifiable_entities10-flippable_entities10-^(?P<commit>.+)$-%{?commit:%{commit}}%{?!commit:%{tag}}-entities_to_flip10] \u001b[32mPASSED\u001b[0m\u001b[32m [ 69%]\u001b[0m\ntests/integration/test_specfile.py::test_parse \u001b[32mPASSED\u001b[0m\u001b[32m                    [ 69%]\u001b[0m\ntests/integration/test_specfile.py::test_prep_traditional[file_path] \u001b[32mPASSED\u001b[0m\u001b[32m [ 69%]\u001b[0m\ntests/integration/test_specfile.py::test_prep_traditional[text_file] \u001b[32mPASSED\u001b[0m\u001b[32m [ 69%]\u001b[0m\ntests/integration/test_specfile.py::test_prep_traditional[binary_file] \u001b[32mPASSED\u001b[0m\u001b[32m [ 69%]\u001b[0m\ntests/integration/test_specfile.py::test_prep_traditional[text_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 69%]\u001b[0m\ntests/integration/test_specfile.py::test_prep_traditional[binary_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 69%]\u001b[0m\ntests/integration/test_specfile.py::test_prep_traditional[content_string] \u001b[32mPASSED\u001b[0m\u001b[32m [ 70%]\u001b[0m\ntests/integration/test_specfile.py::test_prep_autosetup[file_path] \u001b[32mPASSED\u001b[0m\u001b[32m [ 70%]\u001b[0m\ntests/integration/test_specfile.py::test_prep_autosetup[text_file] \u001b[32mPASSED\u001b[0m\u001b[32m [ 70%]\u001b[0m\ntests/integration/test_specfile.py::test_prep_autosetup[binary_file] \u001b[32mPASSED\u001b[0m\u001b[32m [ 70%]\u001b[0m\ntests/integration/test_specfile.py::test_prep_autosetup[text_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 70%]\u001b[0m\ntests/integration/test_specfile.py::test_prep_autosetup[binary_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 70%]\u001b[0m\ntests/integration/test_specfile.py::test_prep_autosetup[content_string] \u001b[32mPASSED\u001b[0m\u001b[32m [ 70%]\u001b[0m\ntests/integration/test_specfile.py::test_prep_autopatch[file_path] \u001b[32mPASSED\u001b[0m\u001b[32m [ 70%]\u001b[0m\ntests/integration/test_specfile.py::test_prep_autopatch[text_file] \u001b[32mPASSED\u001b[0m\u001b[32m [ 70%]\u001b[0m\ntests/integration/test_specfile.py::test_prep_autopatch[binary_file] \u001b[32mPASSED\u001b[0m\u001b[32m [ 71%]\u001b[0m\ntests/integration/test_specfile.py::test_prep_autopatch[text_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 71%]\u001b[0m\ntests/integration/test_specfile.py::test_prep_autopatch[binary_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 71%]\u001b[0m\ntests/integration/test_specfile.py::test_prep_autopatch[content_string] \u001b[32mPASSED\u001b[0m\u001b[32m [ 71%]\u001b[0m\ntests/integration/test_specfile.py::test_sources[file_path] \u001b[32mPASSED\u001b[0m\u001b[32m       [ 71%]\u001b[0m\ntests/integration/test_specfile.py::test_sources[text_file] \u001b[32mPASSED\u001b[0m\u001b[32m       [ 71%]\u001b[0m\ntests/integration/test_specfile.py::test_sources[binary_file] \u001b[32mPASSED\u001b[0m\u001b[32m     [ 71%]\u001b[0m\ntests/integration/test_specfile.py::test_sources[text_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m  [ 71%]\u001b[0m\ntests/integration/test_specfile.py::test_sources[binary_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 71%]\u001b[0m\ntests/integration/test_specfile.py::test_sources[content_string] \u001b[32mPASSED\u001b[0m\u001b[32m  [ 72%]\u001b[0m\ntests/integration/test_specfile.py::test_patches[file_path] \u001b[32mPASSED\u001b[0m\u001b[32m       [ 72%]\u001b[0m\ntests/integration/test_specfile.py::test_patches[text_file] \u001b[32mPASSED\u001b[0m\u001b[32m       [ 72%]\u001b[0m\ntests/integration/test_specfile.py::test_patches[binary_file] \u001b[32mPASSED\u001b[0m\u001b[32m     [ 72%]\u001b[0m\ntests/integration/test_specfile.py::test_patches[text_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m  [ 72%]\u001b[0m\ntests/integration/test_specfile.py::test_patches[binary_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 72%]\u001b[0m\ntests/integration/test_specfile.py::test_patches[content_string] \u001b[32mPASSED\u001b[0m\u001b[32m  [ 72%]\u001b[0m\ntests/integration/test_specfile.py::test_add_changelog_entry[file_path-test-None-None-timestamp0-None-result0] \u001b[32mPASSED\u001b[0m\u001b[32m [ 72%]\u001b[0m\ntests/integration/test_specfile.py::test_add_changelog_entry[file_path-test-None-None-timestamp1-%{version}-%{release}-result1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 72%]\u001b[0m\ntests/integration/test_specfile.py::test_add_changelog_entry[file_path-test-None-None-timestamp2-0.1-1-result2] \u001b[32mPASSED\u001b[0m\u001b[32m [ 73%]\u001b[0m\ntests/integration/test_specfile.py::test_add_changelog_entry[file_path-test-None-None-timestamp3-0.2-1.1-result3] \u001b[32mPASSED\u001b[0m\u001b[32m [ 73%]\u001b[0m\ntests/integration/test_specfile.py::test_add_changelog_entry[file_path-test-Bill Packager-None-timestamp4-None-result4] \u001b[32mPASSED\u001b[0m\u001b[32m [ 73%]\u001b[0m\ntests/integration/test_specfile.py::test_add_changelog_entry[file_path-test-Bill Packager-bill@packager.net-timestamp5-None-result5] \u001b[32mPASSED\u001b[0m\u001b[32m [ 73%]\u001b[0m\ntests/integration/test_specfile.py::test_add_changelog_entry[file_path-test-Bill Packager-bill@packager.net-timestamp6-None-result6] \u001b[32mPASSED\u001b[0m\u001b[32m [ 73%]\u001b[0m\ntests/integration/test_specfile.py::test_add_changelog_entry[file_path-entry7-Bill Packager-bill@packager.net-timestamp7-None-result7] \u001b[32mPASSED\u001b[0m\u001b[32m [ 73%]\u001b[0m\ntests/integration/test_specfile.py::test_add_changelog_entry[text_file-test-None-None-timestamp0-None-result0] \u001b[32mPASSED\u001b[0m\u001b[32m [ 73%]\u001b[0m\ntests/integration/test_specfile.py::test_add_changelog_entry[text_file-test-None-None-timestamp1-%{version}-%{release}-result1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 73%]\u001b[0m\ntests/integration/test_specfile.py::test_add_changelog_entry[text_file-test-None-None-timestamp2-0.1-1-result2] \u001b[32mPASSED\u001b[0m\u001b[32m [ 73%]\u001b[0m\ntests/integration/test_specfile.py::test_add_changelog_entry[text_file-test-None-None-timestamp3-0.2-1.1-result3] \u001b[32mPASSED\u001b[0m\u001b[32m [ 74%]\u001b[0m\ntests/integration/test_specfile.py::test_add_changelog_entry[text_file-test-Bill Packager-None-timestamp4-None-result4] \u001b[32mPASSED\u001b[0m\u001b[32m [ 74%]\u001b[0m\ntests/integration/test_specfile.py::test_add_changelog_entry[text_file-test-Bill Packager-bill@packager.net-timestamp5-None-result5] \u001b[32mPASSED\u001b[0m\u001b[32m [ 74%]\u001b[0m\ntests/integration/test_specfile.py::test_add_changelog_entry[text_file-test-Bill Packager-bill@packager.net-timestamp6-None-result6] \u001b[32mPASSED\u001b[0m\u001b[32m [ 74%]\u001b[0m\ntests/integration/test_specfile.py::test_add_changelog_entry[text_file-entry7-Bill Packager-bill@packager.net-timestamp7-None-result7] \u001b[32mPASSED\u001b[0m\u001b[32m [ 74%]\u001b[0m\ntests/integration/test_specfile.py::test_add_changelog_entry[binary_file-test-None-None-timestamp0-None-result0] \u001b[32mPASSED\u001b[0m\u001b[32m [ 74%]\u001b[0m\ntests/integration/test_specfile.py::test_add_changelog_entry[binary_file-test-None-None-timestamp1-%{version}-%{release}-result1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 74%]\u001b[0m\ntests/integration/test_specfile.py::test_add_changelog_entry[binary_file-test-None-None-timestamp2-0.1-1-result2] \u001b[32mPASSED\u001b[0m\u001b[32m [ 74%]\u001b[0m\ntests/integration/test_specfile.py::test_add_changelog_entry[binary_file-test-None-None-timestamp3-0.2-1.1-result3] \u001b[32mPASSED\u001b[0m\u001b[32m [ 74%]\u001b[0m\ntests/integration/test_specfile.py::test_add_changelog_entry[binary_file-test-Bill Packager-None-timestamp4-None-result4] \u001b[32mPASSED\u001b[0m\u001b[32m [ 75%]\u001b[0m\ntests/integration/test_specfile.py::test_add_changelog_entry[binary_file-test-Bill Packager-bill@packager.net-timestamp5-None-result5] \u001b[32mPASSED\u001b[0m\u001b[32m [ 75%]\u001b[0m\ntests/integration/test_specfile.py::test_add_changelog_entry[binary_file-test-Bill Packager-bill@packager.net-timestamp6-None-result6] \u001b[32mPASSED\u001b[0m\u001b[32m [ 75%]\u001b[0m\ntests/integration/test_specfile.py::test_add_changelog_entry[binary_file-entry7-Bill Packager-bill@packager.net-timestamp7-None-result7] \u001b[32mPASSED\u001b[0m\u001b[32m [ 75%]\u001b[0m\ntests/integration/test_specfile.py::test_add_changelog_entry[text_io_stream-test-None-None-timestamp0-None-result0] \u001b[32mPASSED\u001b[0m\u001b[32m [ 75%]\u001b[0m\ntests/integration/test_specfile.py::test_add_changelog_entry[text_io_stream-test-None-None-timestamp1-%{version}-%{release}-result1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 75%]\u001b[0m\ntests/integration/test_specfile.py::test_add_changelog_entry[text_io_stream-test-None-None-timestamp2-0.1-1-result2] \u001b[32mPASSED\u001b[0m\u001b[32m [ 75%]\u001b[0m\ntests/integration/test_specfile.py::test_add_changelog_entry[text_io_stream-test-None-None-timestamp3-0.2-1.1-result3] \u001b[32mPASSED\u001b[0m\u001b[32m [ 75%]\u001b[0m\ntests/integration/test_specfile.py::test_add_changelog_entry[text_io_stream-test-Bill Packager-None-timestamp4-None-result4] \u001b[32mPASSED\u001b[0m\u001b[32m [ 75%]\u001b[0m\ntests/integration/test_specfile.py::test_add_changelog_entry[text_io_stream-test-Bill Packager-bill@packager.net-timestamp5-None-result5] \u001b[32mPASSED\u001b[0m\u001b[32m [ 76%]\u001b[0m\ntests/integration/test_specfile.py::test_add_changelog_entry[text_io_stream-test-Bill Packager-bill@packager.net-timestamp6-None-result6] \u001b[32mPASSED\u001b[0m\u001b[32m [ 76%]\u001b[0m\ntests/integration/test_specfile.py::test_add_changelog_entry[text_io_stream-entry7-Bill Packager-bill@packager.net-timestamp7-None-result7] \u001b[32mPASSED\u001b[0m\u001b[32m [ 76%]\u001b[0m\ntests/integration/test_specfile.py::test_add_changelog_entry[binary_io_stream-test-None-None-timestamp0-None-result0] \u001b[32mPASSED\u001b[0m\u001b[32m [ 76%]\u001b[0m\ntests/integration/test_specfile.py::test_add_changelog_entry[binary_io_stream-test-None-None-timestamp1-%{version}-%{release}-result1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 76%]\u001b[0m\ntests/integration/test_specfile.py::test_add_changelog_entry[binary_io_stream-test-None-None-timestamp2-0.1-1-result2] \u001b[32mPASSED\u001b[0m\u001b[32m [ 76%]\u001b[0m\ntests/integration/test_specfile.py::test_add_changelog_entry[binary_io_stream-test-None-None-timestamp3-0.2-1.1-result3] \u001b[32mPASSED\u001b[0m\u001b[32m [ 76%]\u001b[0m\ntests/integration/test_specfile.py::test_add_changelog_entry[binary_io_stream-test-Bill Packager-None-timestamp4-None-result4] \u001b[32mPASSED\u001b[0m\u001b[32m [ 76%]\u001b[0m\ntests/integration/test_specfile.py::test_add_changelog_entry[binary_io_stream-test-Bill Packager-bill@packager.net-timestamp5-None-result5] \u001b[32mPASSED\u001b[0m\u001b[32m [ 76%]\u001b[0m\ntests/integration/test_specfile.py::test_add_changelog_entry[binary_io_stream-test-Bill Packager-bill@packager.net-timestamp6-None-result6] \u001b[32mPASSED\u001b[0m\u001b[32m [ 77%]\u001b[0m\ntests/integration/test_specfile.py::test_add_changelog_entry[binary_io_stream-entry7-Bill Packager-bill@packager.net-timestamp7-None-result7] \u001b[32mPASSED\u001b[0m\u001b[32m [ 77%]\u001b[0m\ntests/integration/test_specfile.py::test_add_changelog_entry[content_string-test-None-None-timestamp0-None-result0] \u001b[32mPASSED\u001b[0m\u001b[32m [ 77%]\u001b[0m\ntests/integration/test_specfile.py::test_add_changelog_entry[content_string-test-None-None-timestamp1-%{version}-%{release}-result1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 77%]\u001b[0m\ntests/integration/test_specfile.py::test_add_changelog_entry[content_string-test-None-None-timestamp2-0.1-1-result2] \u001b[32mPASSED\u001b[0m\u001b[32m [ 77%]\u001b[0m\ntests/integration/test_specfile.py::test_add_changelog_entry[content_string-test-None-None-timestamp3-0.2-1.1-result3] \u001b[32mPASSED\u001b[0m\u001b[32m [ 77%]\u001b[0m\ntests/integration/test_specfile.py::test_add_changelog_entry[content_string-test-Bill Packager-None-timestamp4-None-result4] \u001b[32mPASSED\u001b[0m\u001b[32m [ 77%]\u001b[0m\ntests/integration/test_specfile.py::test_add_changelog_entry[content_string-test-Bill Packager-bill@packager.net-timestamp5-None-result5] \u001b[32mPASSED\u001b[0m\u001b[32m [ 77%]\u001b[0m\ntests/integration/test_specfile.py::test_add_changelog_entry[content_string-test-Bill Packager-bill@packager.net-timestamp6-None-result6] \u001b[32mPASSED\u001b[0m\u001b[32m [ 77%]\u001b[0m\ntests/integration/test_specfile.py::test_add_changelog_entry[content_string-entry7-Bill Packager-bill@packager.net-timestamp7-None-result7] \u001b[32mPASSED\u001b[0m\u001b[32m [ 78%]\u001b[0m\ntests/integration/test_specfile.py::test_add_changelog_entry_ignores_invalid_padding[file_path] \u001b[32mPASSED\u001b[0m\u001b[32m [ 78%]\u001b[0m\ntests/integration/test_specfile.py::test_add_changelog_entry_ignores_invalid_padding[text_file] \u001b[32mPASSED\u001b[0m\u001b[32m [ 78%]\u001b[0m\ntests/integration/test_specfile.py::test_add_changelog_entry_ignores_invalid_padding[binary_file] \u001b[32mPASSED\u001b[0m\u001b[32m [ 78%]\u001b[0m\ntests/integration/test_specfile.py::test_add_changelog_entry_ignores_invalid_padding[text_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 78%]\u001b[0m\ntests/integration/test_specfile.py::test_add_changelog_entry_ignores_invalid_padding[binary_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 78%]\u001b[0m\ntests/integration/test_specfile.py::test_add_changelog_entry_ignores_invalid_padding[content_string] \u001b[32mPASSED\u001b[0m\u001b[32m [ 78%]\u001b[0m\ntests/integration/test_specfile.py::test_set_version_and_release[file_path-0.2-3] \u001b[32mPASSED\u001b[0m\u001b[32m [ 78%]\u001b[0m\ntests/integration/test_specfile.py::test_set_version_and_release[file_path-67-1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 78%]\u001b[0m\ntests/integration/test_specfile.py::test_set_version_and_release[file_path-1.4.6-0.1rc5] \u001b[32mPASSED\u001b[0m\u001b[32m [ 79%]\u001b[0m\ntests/integration/test_specfile.py::test_set_version_and_release[text_file-0.2-3] \u001b[32mPASSED\u001b[0m\u001b[32m [ 79%]\u001b[0m\ntests/integration/test_specfile.py::test_set_version_and_release[text_file-67-1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 79%]\u001b[0m\ntests/integration/test_specfile.py::test_set_version_and_release[text_file-1.4.6-0.1rc5] \u001b[32mPASSED\u001b[0m\u001b[32m [ 79%]\u001b[0m\ntests/integration/test_specfile.py::test_set_version_and_release[binary_file-0.2-3] \u001b[32mPASSED\u001b[0m\u001b[32m [ 79%]\u001b[0m\ntests/integration/test_specfile.py::test_set_version_and_release[binary_file-67-1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 79%]\u001b[0m\ntests/integration/test_specfile.py::test_set_version_and_release[binary_file-1.4.6-0.1rc5] \u001b[32mPASSED\u001b[0m\u001b[32m [ 79%]\u001b[0m\ntests/integration/test_specfile.py::test_set_version_and_release[text_io_stream-0.2-3] \u001b[32mPASSED\u001b[0m\u001b[32m [ 79%]\u001b[0m\ntests/integration/test_specfile.py::test_set_version_and_release[text_io_stream-67-1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 79%]\u001b[0m\ntests/integration/test_specfile.py::test_set_version_and_release[text_io_stream-1.4.6-0.1rc5] \u001b[32mPASSED\u001b[0m\u001b[32m [ 80%]\u001b[0m\ntests/integration/test_specfile.py::test_set_version_and_release[binary_io_stream-0.2-3] \u001b[32mPASSED\u001b[0m\u001b[32m [ 80%]\u001b[0m\ntests/integration/test_specfile.py::test_set_version_and_release[binary_io_stream-67-1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 80%]\u001b[0m\ntests/integration/test_specfile.py::test_set_version_and_release[binary_io_stream-1.4.6-0.1rc5] \u001b[32mPASSED\u001b[0m\u001b[32m [ 80%]\u001b[0m\ntests/integration/test_specfile.py::test_set_version_and_release[content_string-0.2-3] \u001b[32mPASSED\u001b[0m\u001b[32m [ 80%]\u001b[0m\ntests/integration/test_specfile.py::test_set_version_and_release[content_string-67-1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 80%]\u001b[0m\ntests/integration/test_specfile.py::test_set_version_and_release[content_string-1.4.6-0.1rc5] \u001b[32mPASSED\u001b[0m\u001b[32m [ 80%]\u001b[0m\ntests/integration/test_specfile.py::test_add_patch[file_path-patchX.patch-None-None] \u001b[32mPASSED\u001b[0m\u001b[32m [ 80%]\u001b[0m\ntests/integration/test_specfile.py::test_add_patch[file_path-patchX.patch-0-None] \u001b[32mPASSED\u001b[0m\u001b[32m [ 80%]\u001b[0m\ntests/integration/test_specfile.py::test_add_patch[file_path-patch2.patch-None-None] \u001b[32mPASSED\u001b[0m\u001b[32m [ 81%]\u001b[0m\ntests/integration/test_specfile.py::test_add_patch[file_path-patch3.patch-3-patch3] \u001b[32mPASSED\u001b[0m\u001b[32m [ 81%]\u001b[0m\ntests/integration/test_specfile.py::test_add_patch[text_file-patchX.patch-None-None] \u001b[32mPASSED\u001b[0m\u001b[32m [ 81%]\u001b[0m\ntests/integration/test_specfile.py::test_add_patch[text_file-patchX.patch-0-None] \u001b[32mPASSED\u001b[0m\u001b[32m [ 81%]\u001b[0m\ntests/integration/test_specfile.py::test_add_patch[text_file-patch2.patch-None-None] \u001b[32mPASSED\u001b[0m\u001b[32m [ 81%]\u001b[0m\ntests/integration/test_specfile.py::test_add_patch[text_file-patch3.patch-3-patch3] \u001b[32mPASSED\u001b[0m\u001b[32m [ 81%]\u001b[0m\ntests/integration/test_specfile.py::test_add_patch[binary_file-patchX.patch-None-None] \u001b[32mPASSED\u001b[0m\u001b[32m [ 81%]\u001b[0m\ntests/integration/test_specfile.py::test_add_patch[binary_file-patchX.patch-0-None] \u001b[32mPASSED\u001b[0m\u001b[32m [ 81%]\u001b[0m\ntests/integration/test_specfile.py::test_add_patch[binary_file-patch2.patch-None-None] \u001b[32mPASSED\u001b[0m\u001b[32m [ 81%]\u001b[0m\ntests/integration/test_specfile.py::test_add_patch[binary_file-patch3.patch-3-patch3] \u001b[32mPASSED\u001b[0m\u001b[32m [ 82%]\u001b[0m\ntests/integration/test_specfile.py::test_add_patch[text_io_stream-patchX.patch-None-None] \u001b[32mPASSED\u001b[0m\u001b[32m [ 82%]\u001b[0m\ntests/integration/test_specfile.py::test_add_patch[text_io_stream-patchX.patch-0-None] \u001b[32mPASSED\u001b[0m\u001b[32m [ 82%]\u001b[0m\ntests/integration/test_specfile.py::test_add_patch[text_io_stream-patch2.patch-None-None] \u001b[32mPASSED\u001b[0m\u001b[32m [ 82%]\u001b[0m\ntests/integration/test_specfile.py::test_add_patch[text_io_stream-patch3.patch-3-patch3] \u001b[32mPASSED\u001b[0m\u001b[32m [ 82%]\u001b[0m\ntests/integration/test_specfile.py::test_add_patch[binary_io_stream-patchX.patch-None-None] \u001b[32mPASSED\u001b[0m\u001b[32m [ 82%]\u001b[0m\ntests/integration/test_specfile.py::test_add_patch[binary_io_stream-patchX.patch-0-None] \u001b[32mPASSED\u001b[0m\u001b[32m [ 82%]\u001b[0m\ntests/integration/test_specfile.py::test_add_patch[binary_io_stream-patch2.patch-None-None] \u001b[32mPASSED\u001b[0m\u001b[32m [ 82%]\u001b[0m\ntests/integration/test_specfile.py::test_add_patch[binary_io_stream-patch3.patch-3-patch3] \u001b[32mPASSED\u001b[0m\u001b[32m [ 82%]\u001b[0m\ntests/integration/test_specfile.py::test_add_patch[content_string-patchX.patch-None-None] \u001b[32mPASSED\u001b[0m\u001b[32m [ 83%]\u001b[0m\ntests/integration/test_specfile.py::test_add_patch[content_string-patchX.patch-0-None] \u001b[32mPASSED\u001b[0m\u001b[32m [ 83%]\u001b[0m\ntests/integration/test_specfile.py::test_add_patch[content_string-patch2.patch-None-None] \u001b[32mPASSED\u001b[0m\u001b[32m [ 83%]\u001b[0m\ntests/integration/test_specfile.py::test_add_patch[content_string-patch3.patch-3-patch3] \u001b[32mPASSED\u001b[0m\u001b[32m [ 83%]\u001b[0m\ntests/integration/test_specfile.py::test_remove_patches[file_path] \u001b[32mPASSED\u001b[0m\u001b[32m [ 83%]\u001b[0m\ntests/integration/test_specfile.py::test_remove_patches[text_file] \u001b[32mPASSED\u001b[0m\u001b[32m [ 83%]\u001b[0m\ntests/integration/test_specfile.py::test_remove_patches[binary_file] \u001b[32mPASSED\u001b[0m\u001b[32m [ 83%]\u001b[0m\ntests/integration/test_specfile.py::test_remove_patches[text_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 83%]\u001b[0m\ntests/integration/test_specfile.py::test_remove_patches[binary_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 83%]\u001b[0m\ntests/integration/test_specfile.py::test_remove_patches[content_string] \u001b[32mPASSED\u001b[0m\u001b[32m [ 84%]\u001b[0m\ntests/integration/test_specfile.py::test_autorelease[file_path-1%{?dist}-False] \u001b[32mPASSED\u001b[0m\u001b[32m [ 84%]\u001b[0m\ntests/integration/test_specfile.py::test_autorelease[file_path-%{release_number}%{?dist}-False] \u001b[32mPASSED\u001b[0m\u001b[32m [ 84%]\u001b[0m\ntests/integration/test_specfile.py::test_autorelease[file_path-0.27.%{commitdate}git%{shortcommit}%{?dist}-False] \u001b[32mPASSED\u001b[0m\u001b[32m [ 84%]\u001b[0m\ntests/integration/test_specfile.py::test_autorelease[file_path-%autorelease-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 84%]\u001b[0m\ntests/integration/test_specfile.py::test_autorelease[file_path-%{autorelease}-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 84%]\u001b[0m\ntests/integration/test_specfile.py::test_autorelease[file_path-%autorelease -b 4 -s %{date}git%{shortcommit}-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 84%]\u001b[0m\ntests/integration/test_specfile.py::test_autorelease[file_path-%{?autorelease}%{!?autorelease:1%{?dist}}-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 84%]\u001b[0m\ntests/integration/test_specfile.py::test_autorelease[file_path-0.10.%{date}git%{shortcommit}.%autorelease-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 84%]\u001b[0m\ntests/integration/test_specfile.py::test_autorelease[file_path-%{obsrel}.%{autorelease}-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 85%]\u001b[0m\ntests/integration/test_specfile.py::test_autorelease[text_file-1%{?dist}-False] \u001b[32mPASSED\u001b[0m\u001b[32m [ 85%]\u001b[0m\ntests/integration/test_specfile.py::test_autorelease[text_file-%{release_number}%{?dist}-False] \u001b[32mPASSED\u001b[0m\u001b[32m [ 85%]\u001b[0m\ntests/integration/test_specfile.py::test_autorelease[text_file-0.27.%{commitdate}git%{shortcommit}%{?dist}-False] \u001b[32mPASSED\u001b[0m\u001b[32m [ 85%]\u001b[0m\ntests/integration/test_specfile.py::test_autorelease[text_file-%autorelease-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 85%]\u001b[0m\ntests/integration/test_specfile.py::test_autorelease[text_file-%{autorelease}-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 85%]\u001b[0m\ntests/integration/test_specfile.py::test_autorelease[text_file-%autorelease -b 4 -s %{date}git%{shortcommit}-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 85%]\u001b[0m\ntests/integration/test_specfile.py::test_autorelease[text_file-%{?autorelease}%{!?autorelease:1%{?dist}}-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 85%]\u001b[0m\ntests/integration/test_specfile.py::test_autorelease[text_file-0.10.%{date}git%{shortcommit}.%autorelease-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 85%]\u001b[0m\ntests/integration/test_specfile.py::test_autorelease[text_file-%{obsrel}.%{autorelease}-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 86%]\u001b[0m\ntests/integration/test_specfile.py::test_autorelease[binary_file-1%{?dist}-False] \u001b[32mPASSED\u001b[0m\u001b[32m [ 86%]\u001b[0m\ntests/integration/test_specfile.py::test_autorelease[binary_file-%{release_number}%{?dist}-False] \u001b[32mPASSED\u001b[0m\u001b[32m [ 86%]\u001b[0m\ntests/integration/test_specfile.py::test_autorelease[binary_file-0.27.%{commitdate}git%{shortcommit}%{?dist}-False] \u001b[32mPASSED\u001b[0m\u001b[32m [ 86%]\u001b[0m\ntests/integration/test_specfile.py::test_autorelease[binary_file-%autorelease-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 86%]\u001b[0m\ntests/integration/test_specfile.py::test_autorelease[binary_file-%{autorelease}-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 86%]\u001b[0m\ntests/integration/test_specfile.py::test_autorelease[binary_file-%autorelease -b 4 -s %{date}git%{shortcommit}-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 86%]\u001b[0m\ntests/integration/test_specfile.py::test_autorelease[binary_file-%{?autorelease}%{!?autorelease:1%{?dist}}-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 86%]\u001b[0m\ntests/integration/test_specfile.py::test_autorelease[binary_file-0.10.%{date}git%{shortcommit}.%autorelease-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 86%]\u001b[0m\ntests/integration/test_specfile.py::test_autorelease[binary_file-%{obsrel}.%{autorelease}-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 87%]\u001b[0m\ntests/integration/test_specfile.py::test_autorelease[text_io_stream-1%{?dist}-False] \u001b[32mPASSED\u001b[0m\u001b[32m [ 87%]\u001b[0m\ntests/integration/test_specfile.py::test_autorelease[text_io_stream-%{release_number}%{?dist}-False] \u001b[32mPASSED\u001b[0m\u001b[32m [ 87%]\u001b[0m\ntests/integration/test_specfile.py::test_autorelease[text_io_stream-0.27.%{commitdate}git%{shortcommit}%{?dist}-False] \u001b[32mPASSED\u001b[0m\u001b[32m [ 87%]\u001b[0m\ntests/integration/test_specfile.py::test_autorelease[text_io_stream-%autorelease-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 87%]\u001b[0m\ntests/integration/test_specfile.py::test_autorelease[text_io_stream-%{autorelease}-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 87%]\u001b[0m\ntests/integration/test_specfile.py::test_autorelease[text_io_stream-%autorelease -b 4 -s %{date}git%{shortcommit}-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 87%]\u001b[0m\ntests/integration/test_specfile.py::test_autorelease[text_io_stream-%{?autorelease}%{!?autorelease:1%{?dist}}-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 87%]\u001b[0m\ntests/integration/test_specfile.py::test_autorelease[text_io_stream-0.10.%{date}git%{shortcommit}.%autorelease-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 87%]\u001b[0m\ntests/integration/test_specfile.py::test_autorelease[text_io_stream-%{obsrel}.%{autorelease}-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 88%]\u001b[0m\ntests/integration/test_specfile.py::test_autorelease[binary_io_stream-1%{?dist}-False] \u001b[32mPASSED\u001b[0m\u001b[32m [ 88%]\u001b[0m\ntests/integration/test_specfile.py::test_autorelease[binary_io_stream-%{release_number}%{?dist}-False] \u001b[32mPASSED\u001b[0m\u001b[32m [ 88%]\u001b[0m\ntests/integration/test_specfile.py::test_autorelease[binary_io_stream-0.27.%{commitdate}git%{shortcommit}%{?dist}-False] \u001b[32mPASSED\u001b[0m\u001b[32m [ 88%]\u001b[0m\ntests/integration/test_specfile.py::test_autorelease[binary_io_stream-%autorelease-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 88%]\u001b[0m\ntests/integration/test_specfile.py::test_autorelease[binary_io_stream-%{autorelease}-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 88%]\u001b[0m\ntests/integration/test_specfile.py::test_autorelease[binary_io_stream-%autorelease -b 4 -s %{date}git%{shortcommit}-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 88%]\u001b[0m\ntests/integration/test_specfile.py::test_autorelease[binary_io_stream-%{?autorelease}%{!?autorelease:1%{?dist}}-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 88%]\u001b[0m\ntests/integration/test_specfile.py::test_autorelease[binary_io_stream-0.10.%{date}git%{shortcommit}.%autorelease-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 88%]\u001b[0m\ntests/integration/test_specfile.py::test_autorelease[binary_io_stream-%{obsrel}.%{autorelease}-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 89%]\u001b[0m\ntests/integration/test_specfile.py::test_autorelease[content_string-1%{?dist}-False] \u001b[32mPASSED\u001b[0m\u001b[32m [ 89%]\u001b[0m\ntests/integration/test_specfile.py::test_autorelease[content_string-%{release_number}%{?dist}-False] \u001b[32mPASSED\u001b[0m\u001b[32m [ 89%]\u001b[0m\ntests/integration/test_specfile.py::test_autorelease[content_string-0.27.%{commitdate}git%{shortcommit}%{?dist}-False] \u001b[32mPASSED\u001b[0m\u001b[32m [ 89%]\u001b[0m\ntests/integration/test_specfile.py::test_autorelease[content_string-%autorelease-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 89%]\u001b[0m\ntests/integration/test_specfile.py::test_autorelease[content_string-%{autorelease}-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 89%]\u001b[0m\ntests/integration/test_specfile.py::test_autorelease[content_string-%autorelease -b 4 -s %{date}git%{shortcommit}-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 89%]\u001b[0m\ntests/integration/test_specfile.py::test_autorelease[content_string-%{?autorelease}%{!?autorelease:1%{?dist}}-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 89%]\u001b[0m\ntests/integration/test_specfile.py::test_autorelease[content_string-0.10.%{date}git%{shortcommit}.%autorelease-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 89%]\u001b[0m\ntests/integration/test_specfile.py::test_autorelease[content_string-%{obsrel}.%{autorelease}-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 90%]\u001b[0m\ntests/integration/test_specfile.py::test_autochangelog[file_path] \u001b[32mPASSED\u001b[0m\u001b[32m [ 90%]\u001b[0m\ntests/integration/test_specfile.py::test_autochangelog[text_file] \u001b[32mPASSED\u001b[0m\u001b[32m [ 90%]\u001b[0m\ntests/integration/test_specfile.py::test_autochangelog[binary_file] \u001b[32mPASSED\u001b[0m\u001b[32m [ 90%]\u001b[0m\ntests/integration/test_specfile.py::test_autochangelog[text_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 90%]\u001b[0m\ntests/integration/test_specfile.py::test_autochangelog[binary_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 90%]\u001b[0m\ntests/integration/test_specfile.py::test_autochangelog[content_string] \u001b[32mPASSED\u001b[0m\u001b[32m [ 90%]\u001b[0m\ntests/integration/test_specfile.py::test_update_tag[file_path] \u001b[32mPASSED\u001b[0m\u001b[32m    [ 90%]\u001b[0m\ntests/integration/test_specfile.py::test_update_tag[text_file] \u001b[32mPASSED\u001b[0m\u001b[32m    [ 90%]\u001b[0m\ntests/integration/test_specfile.py::test_update_tag[binary_file] \u001b[32mPASSED\u001b[0m\u001b[32m  [ 91%]\u001b[0m\ntests/integration/test_specfile.py::test_update_tag[text_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 91%]\u001b[0m\ntests/integration/test_specfile.py::test_update_tag[binary_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 91%]\u001b[0m\ntests/integration/test_specfile.py::test_update_tag[content_string] \u001b[32mPASSED\u001b[0m\u001b[32m [ 91%]\u001b[0m\ntests/integration/test_specfile.py::test_multiple_instances[file_path] \u001b[32mPASSED\u001b[0m\u001b[32m [ 91%]\u001b[0m\ntests/integration/test_specfile.py::test_multiple_instances[text_file] \u001b[32mPASSED\u001b[0m\u001b[32m [ 91%]\u001b[0m\ntests/integration/test_specfile.py::test_multiple_instances[binary_file] \u001b[32mPASSED\u001b[0m\u001b[32m [ 91%]\u001b[0m\ntests/integration/test_specfile.py::test_multiple_instances[text_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 91%]\u001b[0m\ntests/integration/test_specfile.py::test_multiple_instances[binary_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 91%]\u001b[0m\ntests/integration/test_specfile.py::test_multiple_instances[content_string] \u001b[32mPASSED\u001b[0m\u001b[32m [ 92%]\u001b[0m\ntests/integration/test_specfile.py::test_includes[file_path] \u001b[32mPASSED\u001b[0m\u001b[32m      [ 92%]\u001b[0m\ntests/integration/test_specfile.py::test_includes[text_file] \u001b[32mPASSED\u001b[0m\u001b[32m      [ 92%]\u001b[0m\ntests/integration/test_specfile.py::test_includes[binary_file] \u001b[32mPASSED\u001b[0m\u001b[32m    [ 92%]\u001b[0m\ntests/integration/test_specfile.py::test_includes[text_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 92%]\u001b[0m\ntests/integration/test_specfile.py::test_includes[binary_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 92%]\u001b[0m\ntests/integration/test_specfile.py::test_includes[content_string] \u001b[32mPASSED\u001b[0m\u001b[32m [ 92%]\u001b[0m\ntests/integration/test_specfile.py::test_shell_expansions[file_path] \u001b[32mPASSED\u001b[0m\u001b[32m [ 92%]\u001b[0m\ntests/integration/test_specfile.py::test_shell_expansions[text_file] \u001b[32mPASSED\u001b[0m\u001b[32m [ 92%]\u001b[0m\ntests/integration/test_specfile.py::test_shell_expansions[binary_file] \u001b[32mPASSED\u001b[0m\u001b[32m [ 93%]\u001b[0m\ntests/integration/test_specfile.py::test_shell_expansions[text_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 93%]\u001b[0m\ntests/integration/test_specfile.py::test_shell_expansions[binary_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 93%]\u001b[0m\ntests/integration/test_specfile.py::test_shell_expansions[content_string] \u001b[32mPASSED\u001b[0m\u001b[32m [ 93%]\u001b[0m\ntests/integration/test_specfile.py::test_context_management[file_path] \u001b[32mPASSED\u001b[0m\u001b[32m [ 93%]\u001b[0m\ntests/integration/test_specfile.py::test_context_management[text_file] \u001b[32mPASSED\u001b[0m\u001b[32m [ 93%]\u001b[0m\ntests/integration/test_specfile.py::test_context_management[binary_file] \u001b[32mPASSED\u001b[0m\u001b[32m [ 93%]\u001b[0m\ntests/integration/test_specfile.py::test_context_management[text_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 93%]\u001b[0m\ntests/integration/test_specfile.py::test_context_management[binary_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 93%]\u001b[0m\ntests/integration/test_specfile.py::test_context_management[content_string] \u001b[32mPASSED\u001b[0m\u001b[32m [ 94%]\u001b[0m\ntests/integration/test_specfile.py::test_copy[file_path] \u001b[32mPASSED\u001b[0m\u001b[32m          [ 94%]\u001b[0m\ntests/integration/test_specfile.py::test_copy[text_file] \u001b[32mPASSED\u001b[0m\u001b[32m          [ 94%]\u001b[0m\ntests/integration/test_specfile.py::test_copy[binary_file] \u001b[32mPASSED\u001b[0m\u001b[32m        [ 94%]\u001b[0m\ntests/integration/test_specfile.py::test_copy[text_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m     [ 94%]\u001b[0m\ntests/integration/test_specfile.py::test_copy[binary_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m   [ 94%]\u001b[0m\ntests/integration/test_specfile.py::test_copy[content_string] \u001b[32mPASSED\u001b[0m\u001b[32m     [ 94%]\u001b[0m\ntests/integration/test_specfile.py::test_parse_if_necessary[file_path] \u001b[32mPASSED\u001b[0m\u001b[32m [ 94%]\u001b[0m\ntests/integration/test_specfile.py::test_parse_if_necessary[text_file] \u001b[32mPASSED\u001b[0m\u001b[32m [ 94%]\u001b[0m\ntests/integration/test_specfile.py::test_parse_if_necessary[binary_file] \u001b[32mPASSED\u001b[0m\u001b[32m [ 95%]\u001b[0m\ntests/integration/test_specfile.py::test_parse_if_necessary[text_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 95%]\u001b[0m\ntests/integration/test_specfile.py::test_parse_if_necessary[binary_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 95%]\u001b[0m\ntests/integration/test_specfile.py::test_parse_if_necessary[content_string] \u001b[32mPASSED\u001b[0m\u001b[32m [ 95%]\u001b[0m\ntests/integration/test_specfile.py::test_update_version[file_path] \u001b[32mPASSED\u001b[0m\u001b[32m [ 95%]\u001b[0m\ntests/integration/test_specfile.py::test_update_version[text_file] \u001b[32mPASSED\u001b[0m\u001b[32m [ 95%]\u001b[0m\ntests/integration/test_specfile.py::test_update_version[binary_file] \u001b[32mPASSED\u001b[0m\u001b[32m [ 95%]\u001b[0m\ntests/integration/test_specfile.py::test_update_version[text_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 95%]\u001b[0m\ntests/integration/test_specfile.py::test_update_version[binary_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 95%]\u001b[0m\ntests/integration/test_specfile.py::test_update_version[content_string] \u001b[32mPASSED\u001b[0m\u001b[32m [ 96%]\u001b[0m\ntests/integration/test_specfile.py::test_trailing_newline[file_path] \u001b[32mPASSED\u001b[0m\u001b[32m [ 96%]\u001b[0m\ntests/integration/test_specfile.py::test_trailing_newline[text_file] \u001b[32mPASSED\u001b[0m\u001b[32m [ 96%]\u001b[0m\ntests/integration/test_specfile.py::test_trailing_newline[binary_file] \u001b[32mPASSED\u001b[0m\u001b[32m [ 96%]\u001b[0m\ntests/integration/test_specfile.py::test_trailing_newline[text_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 96%]\u001b[0m\ntests/integration/test_specfile.py::test_trailing_newline[binary_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 96%]\u001b[0m\ntests/integration/test_specfile.py::test_trailing_newline[content_string] \u001b[32mPASSED\u001b[0m\u001b[32m [ 96%]\u001b[0m\ntests/integration/test_specfile.py::test_reload[file_path-False] \u001b[32mPASSED\u001b[0m\u001b[32m  [ 96%]\u001b[0m\ntests/integration/test_specfile.py::test_reload[file_path-True] \u001b[32mPASSED\u001b[0m\u001b[32m   [ 96%]\u001b[0m\ntests/integration/test_specfile.py::test_reload[text_file-False] \u001b[32mPASSED\u001b[0m\u001b[32m  [ 97%]\u001b[0m\ntests/integration/test_specfile.py::test_reload[text_file-True] \u001b[32mPASSED\u001b[0m\u001b[32m   [ 97%]\u001b[0m\ntests/integration/test_specfile.py::test_reload[binary_file-False] \u001b[32mPASSED\u001b[0m\u001b[32m [ 97%]\u001b[0m\ntests/integration/test_specfile.py::test_reload[binary_file-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 97%]\u001b[0m\ntests/integration/test_specfile.py::test_reload[text_io_stream-False] \u001b[32mPASSED\u001b[0m\u001b[32m [ 97%]\u001b[0m\ntests/integration/test_specfile.py::test_reload[text_io_stream-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 97%]\u001b[0m\ntests/integration/test_specfile.py::test_reload[binary_io_stream-False] \u001b[32mPASSED\u001b[0m\u001b[32m [ 97%]\u001b[0m\ntests/integration/test_specfile.py::test_reload[binary_io_stream-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 97%]\u001b[0m\ntests/integration/test_specfile.py::test_reload[content_string-False] \u001b[32mPASSED\u001b[0m\u001b[32m [ 97%]\u001b[0m\ntests/integration/test_specfile.py::test_reload[content_string-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 98%]\u001b[0m\ntests/integration/test_specfile.py::test_save_after_inode_change[file_path] \u001b[32mPASSED\u001b[0m\u001b[32m [ 98%]\u001b[0m\ntests/integration/test_specfile.py::test_save_after_inode_change[text_file] \u001b[32mPASSED\u001b[0m\u001b[32m [ 98%]\u001b[0m\ntests/integration/test_specfile.py::test_save_after_inode_change[binary_file] \u001b[32mPASSED\u001b[0m\u001b[32m [ 98%]\u001b[0m\ntests/integration/test_specfile.py::test_save_after_inode_change[text_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 98%]\u001b[0m\ntests/integration/test_specfile.py::test_save_after_inode_change[binary_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 98%]\u001b[0m\ntests/integration/test_specfile.py::test_save_after_inode_change[content_string] \u001b[32mPASSED\u001b[0m\u001b[32m [ 98%]\u001b[0m\ntests/integration/test_specfile.py::test_sanitize[file_path] \u001b[32mPASSED\u001b[0m\u001b[32m      [ 98%]\u001b[0m\ntests/integration/test_specfile.py::test_sanitize[text_file] \u001b[32mPASSED\u001b[0m\u001b[32m      [ 98%]\u001b[0m\ntests/integration/test_specfile.py::test_sanitize[binary_file] \u001b[32mPASSED\u001b[0m\u001b[32m    [ 99%]\u001b[0m\ntests/integration/test_specfile.py::test_sanitize[text_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 99%]\u001b[0m\ntests/integration/test_specfile.py::test_sanitize[binary_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 99%]\u001b[0m\ntests/integration/test_specfile.py::test_sanitize[content_string] \u001b[32mPASSED\u001b[0m\u001b[32m [ 99%]\u001b[0m\ntests/integration/test_specfile.py::test_circular_expansion[file_path] \u001b[32mPASSED\u001b[0m\u001b[32m [ 99%]\u001b[0m\ntests/integration/test_specfile.py::test_circular_expansion[text_file] \u001b[32mPASSED\u001b[0m\u001b[32m [ 99%]\u001b[0m\ntests/integration/test_specfile.py::test_circular_expansion[binary_file] \u001b[32mPASSED\u001b[0m\u001b[32m [ 99%]\u001b[0m\ntests/integration/test_specfile.py::test_circular_expansion[text_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 99%]\u001b[0m\ntests/integration/test_specfile.py::test_circular_expansion[binary_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 99%]\u001b[0m\ntests/integration/test_specfile.py::test_circular_expansion[content_string] \u001b[32mPASSED\u001b[0m\u001b[32m [100%]\u001b[0m\n\n---------- coverage: platform linux, python 3.14.5-final-0 -----------\nName                             Stmts   Miss  Cover   Missing\n--------------------------------------------------------------\nspecfile/__init__.py                11      3    73%   12-14\nspecfile/changelog.py              205     26    87%   107, 115, 119, 132-133, 303, 307, 311, 315, 324-336, 339, 361, 364-365, 460-463\nspecfile/conditions.py              83     11    87%   49-50, 55-59, 145, 147-149\nspecfile/constants.py                8      0   100%\nspecfile/context_management.py      74      8    89%   66-68, 95, 99, 105, 125-128\nspecfile/exceptions.py              17      5    71%   19-23\nspecfile/formatter.py               92     10    89%   34, 36, 38, 78, 94, 107, 109, 112, 140-141\nspecfile/macro_definitions.py      186     43    77%   87, 101, 108-117, 179, 194-195, 200-206, 209-214, 218, 222, 231-245, 248, 283, 346-347\nspecfile/macros.py                 104      5    95%   33-35, 72, 77\nspecfile/options.py                324     68    79%   37, 63, 67, 85, 89, 97, 101, 106-110, 117, 121, 124-129, 135-136, 145-146, 193, 251, 311, 315, 317, 333, 349, 355, 380, 383-387, 392-397, 400-417, 434-435, 438-441, 444-447, 511, 514, 535-536, 541, 545\nspecfile/prep.py                   193     33    83%   65, 79, 89, 126-134, 183, 188, 195, 199, 219-220, 229-230, 233-238, 270, 275, 278, 286-288, 393-394\nspecfile/sanitizer.py              685     61    91%   252-253, 274, 363-364, 389, 398-399, 404-405, 414, 419, 431, 435-447, 467, 475, 533, 577, 594, 816, 821-822, 864-866, 873-878, 887-888, 918, 987-988, 1008-1015, 1049-1050, 1071-1072, 1078-1080\nspecfile/sections.py               181     29    84%   63, 78, 83, 90, 94, 114, 122, 164, 168, 182, 189-190, 195-201, 204-209, 212, 247, 279, 290-291\nspecfile/sourcelist.py              77     10    87%   53, 58, 76-78, 108, 112, 116, 120, 125\nspecfile/sources.py                311     39    87%   53-54, 90-92, 98, 152, 157-159, 169, 187-189, 195, 209, 214, 219, 224, 234, 273, 288, 303-305, 312, 316, 321, 327, 331, 334-339, 434, 463, 492, 644\nspecfile/spec_parser.py            206      8    96%   71, 145, 160, 163, 279-280, 321, 326\nspecfile/specfile.py               499     54    89%   103, 113, 117-118, 130, 150, 158, 211, 239-242, 251, 256, 264, 268, 303-304, 342-343, 357, 437-438, 440, 459-460, 507, 575, 649, 656, 664, 678, 706-707, 731-732, 801, 950-951, 1007, 1035, 1111-1112, 1119, 1126-1127, 1169-1178\nspecfile/tags.py                   289     55    81%   59, 67, 100, 103-105, 110, 114, 118, 122, 128, 134, 137-147, 158-160, 163-165, 238, 250, 262, 303, 358, 362, 366, 401-402, 419-420, 425-431, 434-439, 442, 480, 491-492, 510, 541\nspecfile/types.py                   11      5    55%   8-12, 19-20\nspecfile/utils.py                  217     59    73%   28, 31, 40-42, 46, 51, 56, 61, 66, 71, 74-76, 82, 99, 102, 106, 109, 112-116, 120, 125, 129-133, 137, 140, 144, 150, 156, 171, 176, 179, 183, 186, 189-193, 197, 206, 212-216, 220, 223, 227, 234, 240, 333\nspecfile/value_parser.py           314     21    93%   34, 41, 55, 59, 89, 96, 115-116, 124, 144, 151, 161, 168, 178, 201, 243, 247, 249, 374, 472-473\n--------------------------------------------------------------\nTOTAL                             4087    553    86%\n\n\n\u001b[32m============================= \u001b[32m\u001b[1m903 passed\u001b[0m\u001b[32m in 52.16s\u001b[0m\u001b[32m =============================\u001b[0m",
                            "stdout_lines": [
                                "PYTHONPATH=/home/zuul-worker/src/github.com/packit/specfile PYTHONDONTWRITEBYTECODE=1 python3 -m pytest --color=yes --verbose --showlocals ./tests/unit ./tests/integration --cov=specfile --cov-report=term-missing --full-trace",
                                "\u001b[1m============================= test session starts ==============================\u001b[0m",
                                "platform linux -- Python 3.14.5, pytest-8.3.5, pluggy-1.6.0 -- /usr/bin/python3",
                                "cachedir: .pytest_cache",
                                "rootdir: /home/zuul-worker/src/github.com/packit/specfile",
                                "configfile: setup.cfg",
                                "plugins: cov-5.0.0, flexmock-0.12.2",
                                "\u001b[1mcollecting ... \u001b[0mcollected 903 items",
                                "",
                                "tests/unit/test_changelog.py::test_entry_evr[* Thu Jan 04 2007 Michael Schwendt <mschwendt@fedoraproject.org>-None] \u001b[32mPASSED\u001b[0m\u001b[32m [  0%]\u001b[0m",
                                "tests/unit/test_changelog.py::test_entry_evr[* Thu Jan 04 2007 Michael Schwendt <mschwendt@fedora-project.org>-None] \u001b[32mPASSED\u001b[0m\u001b[32m [  0%]\u001b[0m",
                                "tests/unit/test_changelog.py::test_entry_evr[* Fri Jul 26 2024 Miroslav Such\\xfd <msuchy@redhat.com> - ss981107-67-evr2] \u001b[32mPASSED\u001b[0m\u001b[32m [  0%]\u001b[0m",
                                "tests/unit/test_changelog.py::test_entry_evr[* Mon Jul 13 2020 Tom Stellard <tstellar@redhat.com> 4.0-0.4.pre2-evr3] \u001b[32mPASSED\u001b[0m\u001b[32m [  0%]\u001b[0m",
                                "tests/unit/test_changelog.py::test_entry_evr[* Fri Jul 20 2018 Gwyn Ciesla <limburgher@gmail.com> - 0.52-6-evr4] \u001b[32mPASSED\u001b[0m\u001b[32m [  0%]\u001b[0m",
                                "tests/unit/test_changelog.py::test_entry_evr[* Mon Feb 23 2009 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 1.23-3.20081106gitbe42b4-evr5] \u001b[32mPASSED\u001b[0m\u001b[32m [  0%]\u001b[0m",
                                "tests/unit/test_changelog.py::test_entry_evr[* Thu Feb 04 2016 Marcin Zajaczkowski <mszpak ATT wp DOTT pl> - 1:0.9.10-6-evr6] \u001b[32mPASSED\u001b[0m\u001b[32m [  0%]\u001b[0m",
                                "tests/unit/test_changelog.py::test_entry_evr[* Mon Jan 03 2022 Fedora Kernel Team <kernel-team@fedoraproject.org> [5.16-0.rc8.55]-evr7] \u001b[32mPASSED\u001b[0m\u001b[32m [  0%]\u001b[0m",
                                "tests/unit/test_changelog.py::test_entry_evr[* Wed Jan 23 2002 Karsten Hopp <karsten@redhat.de> (4.6-1)-evr8] \u001b[32mPASSED\u001b[0m\u001b[32m [  0%]\u001b[0m",
                                "tests/unit/test_changelog.py::test_entry_evr[* Thu Apr  9 2015 Jeffrey C. Ollie <jeff@ocjtech.us> - 13.3.2-1:-evr9] \u001b[32mPASSED\u001b[0m\u001b[32m [  1%]\u001b[0m",
                                "tests/unit/test_changelog.py::test_entry_has_extended_timestamp[* Tue May 4 2021 Nikola Forr\\xf3 <nforro@redhat.com> - 0.1-1-False] \u001b[32mPASSED\u001b[0m\u001b[32m [  1%]\u001b[0m",
                                "tests/unit/test_changelog.py::test_entry_has_extended_timestamp[* Tue May  4 2021 Nikola Forr\\xf3 <nforro@redhat.com> - 0.1-1-False] \u001b[32mPASSED\u001b[0m\u001b[32m [  1%]\u001b[0m",
                                "tests/unit/test_changelog.py::test_entry_has_extended_timestamp[* Thu Jul 22 2021 Fedora Release Engineering <releng@fedoraproject.org> - 0.1-2-False] \u001b[32mPASSED\u001b[0m\u001b[32m [  1%]\u001b[0m",
                                "tests/unit/test_changelog.py::test_entry_has_extended_timestamp[* Mon Oct 18 12:34:45 CEST 2021 Nikola Forr\\xf3 <nforro@redhat.com> - 0.2-1-True] \u001b[32mPASSED\u001b[0m\u001b[32m [  1%]\u001b[0m",
                                "tests/unit/test_changelog.py::test_entry_day_of_month_padding[* Tue May 4 2021 Nikola Forr\\xf3 <nforro@redhat.com> - 0.1-1-] \u001b[32mPASSED\u001b[0m\u001b[32m [  1%]\u001b[0m",
                                "tests/unit/test_changelog.py::test_entry_day_of_month_padding[* Tue May 04 2021 Nikola Forr\\xf3 <nforro@redhat.com> - 0.1-1-0] \u001b[32mPASSED\u001b[0m\u001b[32m [  1%]\u001b[0m",
                                "tests/unit/test_changelog.py::test_entry_day_of_month_padding[* Tue May  4 2021 Nikola Forr\\xf3 <nforro@redhat.com> - 0.1-1- ] \u001b[32mPASSED\u001b[0m\u001b[32m [  1%]\u001b[0m",
                                "tests/unit/test_changelog.py::test_entry_day_of_month_padding[* Thu Jul 22 2021 Fedora Release Engineering <releng@fedoraproject.org> - 0.1-2-] \u001b[32mPASSED\u001b[0m\u001b[32m [  1%]\u001b[0m",
                                "tests/unit/test_changelog.py::test_entry_day_of_month_padding[* Mon Oct  18 12:34:45 CEST 2021 Nikola Forr\\xf3 <nforro@redhat.com> - 0.2-1-] \u001b[32mPASSED\u001b[0m\u001b[32m [  2%]\u001b[0m",
                                "tests/unit/test_changelog.py::test_entry_day_of_month_padding[* Mon Dec  11 2006 Author <email> - 1.0-] \u001b[32mPASSED\u001b[0m\u001b[32m [  2%]\u001b[0m",
                                "tests/unit/test_changelog.py::test_entry_day_of_month_padding[* Invalid header-] \u001b[32mPASSED\u001b[0m\u001b[32m [  2%]\u001b[0m",
                                "tests/unit/test_changelog.py::test_filter[None-None-evrs0] \u001b[32mPASSED\u001b[0m\u001b[32m        [  2%]\u001b[0m",
                                "tests/unit/test_changelog.py::test_filter[0.1-1-None-evrs1] \u001b[32mPASSED\u001b[0m\u001b[32m       [  2%]\u001b[0m",
                                "tests/unit/test_changelog.py::test_filter[0.1-2-None-evrs2] \u001b[32mPASSED\u001b[0m\u001b[32m       [  2%]\u001b[0m",
                                "tests/unit/test_changelog.py::test_filter[0.2-1-None-evrs3] \u001b[32mPASSED\u001b[0m\u001b[32m       [  2%]\u001b[0m",
                                "tests/unit/test_changelog.py::test_filter[None-0.2-2-evrs4] \u001b[32mPASSED\u001b[0m\u001b[32m       [  2%]\u001b[0m",
                                "tests/unit/test_changelog.py::test_filter[None-0.2-1-evrs5] \u001b[32mPASSED\u001b[0m\u001b[32m       [  2%]\u001b[0m",
                                "tests/unit/test_changelog.py::test_filter[None-0.1-2-evrs6] \u001b[32mPASSED\u001b[0m\u001b[32m       [  3%]\u001b[0m",
                                "tests/unit/test_changelog.py::test_filter[0.1-1-0.2-2-evrs7] \u001b[32mPASSED\u001b[0m\u001b[32m      [  3%]\u001b[0m",
                                "tests/unit/test_changelog.py::test_filter[0.1-2-0.2-1-evrs8] \u001b[32mPASSED\u001b[0m\u001b[32m      [  3%]\u001b[0m",
                                "tests/unit/test_changelog.py::test_filter[0.2-1-0.2-1-evrs9] \u001b[32mPASSED\u001b[0m\u001b[32m      [  3%]\u001b[0m",
                                "tests/unit/test_changelog.py::test_filter[0.2-2-0.1-1-evrs10] \u001b[32mPASSED\u001b[0m\u001b[32m     [  3%]\u001b[0m",
                                "tests/unit/test_changelog.py::test_filter[0.0.1-1-None-evrs11] \u001b[32mPASSED\u001b[0m\u001b[32m    [  3%]\u001b[0m",
                                "tests/unit/test_changelog.py::test_filter[0.3-1-None-evrs12] \u001b[32mPASSED\u001b[0m\u001b[32m      [  3%]\u001b[0m",
                                "tests/unit/test_changelog.py::test_filter[None-0.0.1-1-evrs13] \u001b[32mPASSED\u001b[0m\u001b[32m    [  3%]\u001b[0m",
                                "tests/unit/test_changelog.py::test_filter[None-0.3-1-evrs14] \u001b[32mPASSED\u001b[0m\u001b[32m      [  3%]\u001b[0m",
                                "tests/unit/test_changelog.py::test_filter[0.0.1-1-0.3-1-evrs15] \u001b[32mPASSED\u001b[0m\u001b[32m   [  4%]\u001b[0m",
                                "tests/unit/test_changelog.py::test_parse \u001b[32mPASSED\u001b[0m\u001b[32m                          [  4%]\u001b[0m",
                                "tests/unit/test_changelog.py::test_suse_style_changelog_parse \u001b[32mPASSED\u001b[0m\u001b[32m     [  4%]\u001b[0m",
                                "tests/unit/test_changelog.py::test_create_opensuse_changelog_assemble[timestamp0-Dan \\u010cerm\\xe1k <dcermak@suse.com>-content0-entry0] \u001b[32mPASSED\u001b[0m\u001b[32m [  4%]\u001b[0m",
                                "tests/unit/test_changelog.py::test_create_opensuse_changelog_assemble[timestamp1-Dan \\u010cerm\\xe1k <dcermak@suse.de>-content1-entry1] \u001b[32mPASSED\u001b[0m\u001b[32m [  4%]\u001b[0m",
                                "tests/unit/test_changelog.py::test_get_raw_section_data \u001b[32mPASSED\u001b[0m\u001b[32m           [  4%]\u001b[0m",
                                "tests/unit/test_changelog.py::test_copy_changelog \u001b[32mPASSED\u001b[0m\u001b[32m                 [  4%]\u001b[0m",
                                "tests/unit/test_conditions.py::test_process_conditions[lines0-validity0-<lambda>] \u001b[32mPASSED\u001b[0m\u001b[32m [  4%]\u001b[0m",
                                "tests/unit/test_conditions.py::test_process_conditions[lines1-validity1-<lambda>] \u001b[32mPASSED\u001b[0m\u001b[32m [  4%]\u001b[0m",
                                "tests/unit/test_conditions.py::test_process_conditions[lines2-validity2-<lambda>] \u001b[32mPASSED\u001b[0m\u001b[32m [  5%]\u001b[0m",
                                "tests/unit/test_conditions.py::test_process_conditions[lines3-validity3-<lambda>] \u001b[32mPASSED\u001b[0m\u001b[32m [  5%]\u001b[0m",
                                "tests/unit/test_conditions.py::test_process_conditions[lines4-validity4-<lambda>] \u001b[32mPASSED\u001b[0m\u001b[32m [  5%]\u001b[0m",
                                "tests/unit/test_formatter.py::test_format_expression[func('arg')-func('arg')] \u001b[32mPASSED\u001b[0m\u001b[32m [  5%]\u001b[0m",
                                "tests/unit/test_formatter.py::test_format_expression[func('arg1', \"arg2\")-func('arg1', 'arg2')] \u001b[32mPASSED\u001b[0m\u001b[32m [  5%]\u001b[0m",
                                "tests/unit/test_formatter.py::test_format_expression[func('arg1', 'arg\\\\'2')-func('arg1', \"arg'2\")] \u001b[32mPASSED\u001b[0m\u001b[32m [  5%]\u001b[0m",
                                "tests/unit/test_formatter.py::test_format_expression[func('arg', kwarg='val')-func('arg', kwarg='val')] \u001b[32mPASSED\u001b[0m\u001b[32m [  5%]\u001b[0m",
                                "tests/unit/test_formatter.py::test_format_expression[(None)-None] \u001b[32mPASSED\u001b[0m\u001b[32m [  5%]\u001b[0m",
                                "tests/unit/test_formatter.py::test_format_expression[(None,)-(None,)] \u001b[32mPASSED\u001b[0m\u001b[32m [  5%]\u001b[0m",
                                "tests/unit/test_formatter.py::test_format_expression[('a',\"b\",3)-('a', 'b', 3)] \u001b[32mPASSED\u001b[0m\u001b[32m [  6%]\u001b[0m",
                                "tests/unit/test_formatter.py::test_format_expression[[1,2,3,4]-[1, 2, 3, 4]] \u001b[32mPASSED\u001b[0m\u001b[32m [  6%]\u001b[0m",
                                "tests/unit/test_formatter.py::test_format_expression[{'key':'val'}-{'key': 'val'}] \u001b[32mPASSED\u001b[0m\u001b[32m [  6%]\u001b[0m",
                                "tests/unit/test_formatter.py::test_format_expression[<ENUM_ITEM_1: 1>-<ENUM_ITEM_1: 1>] \u001b[32mPASSED\u001b[0m\u001b[32m [  6%]\u001b[0m",
                                "tests/unit/test_formatter.py::test_format_expression[func1('first argument', True, func2(kwarg={42: ['nested list item 1', 'nested list item 2', 'nested list item 3']}), 0, indent='    ', spec=<rpm.spec object at 0x7fe1ae1a6b30>)-func1(\\n    'first argument',\\n    True,\\n    func2(\\n        kwarg={\\n            42: [\\n                'nested list item 1',\\n                'nested list item 2',\\n                'nested list item 3',\\n            ],\\n        },\\n    ),\\n    0,\\n    indent='    ',\\n    spec=<rpm.spec object at 0x7fe1ae1a6b30>,\\n)] \u001b[32mPASSED\u001b[0m\u001b[32m [  6%]\u001b[0m",
                                "tests/unit/test_guess_packager.py::test_guess_packager_env \u001b[32mPASSED\u001b[0m\u001b[32m        [  6%]\u001b[0m",
                                "tests/unit/test_guess_packager.py::test_guess_packager_macro \u001b[32mPASSED\u001b[0m\u001b[32m      [  6%]\u001b[0m",
                                "tests/unit/test_guess_packager.py::test_guess_packager_git \u001b[32mPASSED\u001b[0m\u001b[32m        [  6%]\u001b[0m",
                                "tests/unit/test_guess_packager.py::test_guess_packager_passwd \u001b[32mPASSED\u001b[0m\u001b[32m     [  6%]\u001b[0m",
                                "tests/unit/test_guess_packager.py::test_guess_packager_pref1 \u001b[32mPASSED\u001b[0m\u001b[32m      [  7%]\u001b[0m",
                                "tests/unit/test_guess_packager.py::test_guess_packager_pref2 \u001b[32mPASSED\u001b[0m\u001b[32m      [  7%]\u001b[0m",
                                "tests/unit/test_guess_packager.py::test_guess_packager_pref3 \u001b[32mPASSED\u001b[0m\u001b[32m      [  7%]\u001b[0m",
                                "tests/unit/test_guess_packager.py::test_guess_packager_pref4 \u001b[32mPASSED\u001b[0m\u001b[32m      [  7%]\u001b[0m",
                                "tests/unit/test_guess_packager.py::test_guess_packager_empty \u001b[32mPASSED\u001b[0m\u001b[32m      [  7%]\u001b[0m",
                                "tests/unit/test_macro_definitions.py::test_find \u001b[32mPASSED\u001b[0m\u001b[32m                   [  7%]\u001b[0m",
                                "tests/unit/test_macro_definitions.py::test_get \u001b[32mPASSED\u001b[0m\u001b[32m                    [  7%]\u001b[0m",
                                "tests/unit/test_macro_definitions.py::test_parse \u001b[32mPASSED\u001b[0m\u001b[32m                  [  7%]\u001b[0m",
                                "tests/unit/test_macro_definitions.py::test_get_raw_data \u001b[32mPASSED\u001b[0m\u001b[32m           [  7%]\u001b[0m",
                                "tests/unit/test_macro_definitions.py::test_copy_macro_definitions \u001b[32mPASSED\u001b[0m\u001b[32m [  8%]\u001b[0m",
                                "tests/unit/test_macros.py::test_macros_parse \u001b[32mPASSED\u001b[0m\u001b[32m                      [  8%]\u001b[0m",
                                "tests/unit/test_macros.py::test_macros_remove \u001b[32mPASSED\u001b[0m\u001b[32m                     [  8%]\u001b[0m",
                                "tests/unit/test_macros.py::test_macros_remove_failure \u001b[32mPASSED\u001b[0m\u001b[32m             [  8%]\u001b[0m",
                                "tests/unit/test_macros.py::test_macros_define \u001b[32mPASSED\u001b[0m\u001b[32m                     [  8%]\u001b[0m",
                                "tests/unit/test_macros.py::test_macros_reinit \u001b[32mPASSED\u001b[0m\u001b[32m                     [  8%]\u001b[0m",
                                "tests/unit/test_macros.py::test_macros_sideeffects \u001b[32mPASSED\u001b[0m\u001b[32m                [  8%]\u001b[0m",
                                "tests/unit/test_options.py::test_positionals_get_items[vp:m:M:-tokens0-result0] \u001b[32mPASSED\u001b[0m\u001b[32m [  8%]\u001b[0m",
                                "tests/unit/test_options.py::test_positionals_get_items[vp:m:M:-tokens1-result1] \u001b[32mPASSED\u001b[0m\u001b[32m [  8%]\u001b[0m",
                                "tests/unit/test_options.py::test_positionals_get_items[vp:m:M:-tokens2-result2] \u001b[32mPASSED\u001b[0m\u001b[32m [  9%]\u001b[0m",
                                "tests/unit/test_options.py::test_positionals_insert[vp:m:M:-tokens0-0-test arg-2-TokenType.DOUBLE_QUOTED] \u001b[32mPASSED\u001b[0m\u001b[32m [  9%]\u001b[0m",
                                "tests/unit/test_options.py::test_positionals_insert[vp:m:M:-tokens1-1-123-4-TokenType.DEFAULT] \u001b[32mPASSED\u001b[0m\u001b[32m [  9%]\u001b[0m",
                                "tests/unit/test_options.py::test_positionals_insert[vp:m:M:-tokens2-0-test-0-TokenType.DEFAULT] \u001b[32mPASSED\u001b[0m\u001b[32m [  9%]\u001b[0m",
                                "tests/unit/test_options.py::test_options_valid_option[a:b:cDn:Tq-a-True] \u001b[32mPASSED\u001b[0m\u001b[32m [  9%]\u001b[0m",
                                "tests/unit/test_options.py::test_options_valid_option[a:b:cDn:Tq-q-True] \u001b[32mPASSED\u001b[0m\u001b[32m [  9%]\u001b[0m",
                                "tests/unit/test_options.py::test_options_valid_option[a:b:cDn:Tq-v-False] \u001b[32mPASSED\u001b[0m\u001b[32m [  9%]\u001b[0m",
                                "tests/unit/test_options.py::test_options_requires_argument[a:b:cDn:Tq-a-True] \u001b[32mPASSED\u001b[0m\u001b[32m [  9%]\u001b[0m",
                                "tests/unit/test_options.py::test_options_requires_argument[a:b:cDn:Tq-q-False] \u001b[32mPASSED\u001b[0m\u001b[32m [  9%]\u001b[0m",
                                "tests/unit/test_options.py::test_options_requires_argument[a:b:cDn:Tq-v-None] \u001b[32mPASSED\u001b[0m\u001b[32m [ 10%]\u001b[0m",
                                "tests/unit/test_options.py::test_options_find_option[P:p:REb:z:F:d:o:Z-tokens0-p-result0] \u001b[32mPASSED\u001b[0m\u001b[32m [ 10%]\u001b[0m",
                                "tests/unit/test_options.py::test_options_find_option[P:p:REb:z:F:d:o:Z-tokens1-b-result1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 10%]\u001b[0m",
                                "tests/unit/test_options.py::test_options_find_option[P:p:REb:z:F:d:o:Z-tokens2-E-result2] \u001b[32mPASSED\u001b[0m\u001b[32m [ 10%]\u001b[0m",
                                "tests/unit/test_options.py::test_options_find_option[P:p:REb:z:F:d:o:Z-tokens3-F-result3] \u001b[32mPASSED\u001b[0m\u001b[32m [ 10%]\u001b[0m",
                                "tests/unit/test_options.py::test_options_tokenize[-p1 -b .test -E-result0] \u001b[32mPASSED\u001b[0m\u001b[32m [ 10%]\u001b[0m",
                                "tests/unit/test_options.py::test_options_tokenize[-p 28 -b .test\\\\ escape-result1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 10%]\u001b[0m",
                                "tests/unit/test_options.py::test_options_tokenize[-b \".test \\\\\"double quotes\\\\\"\"-result2] \u001b[32mPASSED\u001b[0m\u001b[32m [ 10%]\u001b[0m",
                                "tests/unit/test_options.py::test_options_tokenize[-p1 -b .test_whitespace_at_the_end -M 2  -result3] \u001b[32mPASSED\u001b[0m\u001b[32m [ 10%]\u001b[0m",
                                "tests/unit/test_options.py::test_options_tokenize[-q -n %{name}-%{version}%[%{rc}?\"-rc\":\"\"]-result4] \u001b[32mPASSED\u001b[0m\u001b[32m [ 11%]\u001b[0m",
                                "tests/unit/test_options.py::test_options_tokenize[-q -n '%{name}-%{version}'-result5] \u001b[32mPASSED\u001b[0m\u001b[32m [ 11%]\u001b[0m",
                                "tests/unit/test_options.py::test_options_tokenize[-q -n \"%{name}-%{version}\"-result6] \u001b[32mPASSED\u001b[0m\u001b[32m [ 11%]\u001b[0m",
                                "tests/unit/test_options.py::test_options_tokenize[-q -n '%{name}-%{version}%[%{rc}?\"-rc\":\"\"]'-result7] \u001b[32mPASSED\u001b[0m\u001b[32m [ 11%]\u001b[0m",
                                "tests/unit/test_options.py::test_options_tokenize[-q %{?prever:-n %{name}-%{prever}}-result8] \u001b[32mPASSED\u001b[0m\u001b[32m [ 11%]\u001b[0m",
                                "tests/unit/test_options.py::test_options_stringify[tokens0--p1 -b .test -E] \u001b[32mPASSED\u001b[0m\u001b[32m [ 11%]\u001b[0m",
                                "tests/unit/test_options.py::test_options_stringify[tokens1--p 28 -b .test\\\\ escape] \u001b[32mPASSED\u001b[0m\u001b[32m [ 11%]\u001b[0m",
                                "tests/unit/test_options.py::test_options_stringify[tokens2--b \".test \\\\\"double quotes\\\\\"\"] \u001b[32mPASSED\u001b[0m\u001b[32m [ 11%]\u001b[0m",
                                "tests/unit/test_options.py::test_options_stringify[tokens3--p1 -b .test_whitespace_at_the_end -M 2  ] \u001b[32mPASSED\u001b[0m\u001b[32m [ 11%]\u001b[0m",
                                "tests/unit/test_options.py::test_options_stringify[tokens4--q -n %{name}-%{version}%[%{rc}?\"-rc\":\"\"]] \u001b[32mPASSED\u001b[0m\u001b[32m [ 12%]\u001b[0m",
                                "tests/unit/test_options.py::test_options_stringify[tokens5--q -n '%{name}-%{version}'] \u001b[32mPASSED\u001b[0m\u001b[32m [ 12%]\u001b[0m",
                                "tests/unit/test_options.py::test_options_stringify[tokens6--q -n \"%{name}-%{version}\"] \u001b[32mPASSED\u001b[0m\u001b[32m [ 12%]\u001b[0m",
                                "tests/unit/test_options.py::test_options_stringify[tokens7--q -n '%{name}-%{version}%[%{rc}?\"-rc\":\"\"]'] \u001b[32mPASSED\u001b[0m\u001b[32m [ 12%]\u001b[0m",
                                "tests/unit/test_options.py::test_options_stringify[tokens8--q %{?prever:-n %{name}-%{prever}}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 12%]\u001b[0m",
                                "tests/unit/test_prep.py::test_patch_macro_number[%patch2--p1-2] \u001b[32mPASSED\u001b[0m\u001b[32m   [ 12%]\u001b[0m",
                                "tests/unit/test_prep.py::test_patch_macro_number[%patch0028--p2-28] \u001b[32mPASSED\u001b[0m\u001b[32m [ 12%]\u001b[0m",
                                "tests/unit/test_prep.py::test_patch_macro_number[%patch--p1-0] \u001b[32mPASSED\u001b[0m\u001b[32m    [ 12%]\u001b[0m",
                                "tests/unit/test_prep.py::test_patch_macro_number[%patch--P1-1] \u001b[32mPASSED\u001b[0m\u001b[32m    [ 12%]\u001b[0m",
                                "tests/unit/test_prep.py::test_patch_macro_number[%patch3--P5-3] \u001b[32mPASSED\u001b[0m\u001b[32m   [ 13%]\u001b[0m",
                                "tests/unit/test_prep.py::test_patch_macro_number[%patch0--P1 2-0] \u001b[32mPASSED\u001b[0m\u001b[32m [ 13%]\u001b[0m",
                                "tests/unit/test_prep.py::test_patch_macro_number[%patch--P1 2-1] \u001b[32mPASSED\u001b[0m\u001b[32m  [ 13%]\u001b[0m",
                                "tests/unit/test_prep.py::test_patch_macro_number[%patch-2-2] \u001b[32mPASSED\u001b[0m\u001b[32m      [ 13%]\u001b[0m",
                                "tests/unit/test_prep.py::test_prep_macros_find \u001b[32mPASSED\u001b[0m\u001b[32m                    [ 13%]\u001b[0m",
                                "tests/unit/test_prep.py::test_prep_add_patch_macro[lines_before0-0-True-options0-lines_after0] \u001b[32mPASSED\u001b[0m\u001b[32m [ 13%]\u001b[0m",
                                "tests/unit/test_prep.py::test_prep_add_patch_macro[lines_before1-0-True-options1-lines_after1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 13%]\u001b[0m",
                                "tests/unit/test_prep.py::test_prep_add_patch_macro[lines_before2-28-False-options2-lines_after2] \u001b[32mPASSED\u001b[0m\u001b[32m [ 13%]\u001b[0m",
                                "tests/unit/test_prep.py::test_prep_add_patch_macro[lines_before3-1001-False-options3-lines_after3] \u001b[32mPASSED\u001b[0m\u001b[32m [ 13%]\u001b[0m",
                                "tests/unit/test_prep.py::test_prep_add_patch_macro[lines_before4-28-False-options4-lines_after4] \u001b[32mPASSED\u001b[0m\u001b[32m [ 14%]\u001b[0m",
                                "tests/unit/test_prep.py::test_prep_remove_patch_macro[lines_before0-1-lines_after0] \u001b[32mPASSED\u001b[0m\u001b[32m [ 14%]\u001b[0m",
                                "tests/unit/test_prep.py::test_prep_remove_patch_macro[lines_before1-0-lines_after1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 14%]\u001b[0m",
                                "tests/unit/test_prep.py::test_prep_parse \u001b[32mPASSED\u001b[0m\u001b[32m                          [ 14%]\u001b[0m",
                                "tests/unit/test_prep.py::test_prep_get_raw_section_data \u001b[32mPASSED\u001b[0m\u001b[32m           [ 14%]\u001b[0m",
                                "tests/unit/test_prep.py::test_copy_prep \u001b[32mPASSED\u001b[0m\u001b[32m                           [ 14%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_substring_extraction[c=%{commit}; echo ${c:0:7}-%{sub %{commit} 1 7}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 14%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_substring_extraction[c=%{commit};echo ${c:0:7}-%{sub %{commit} 1 7}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 14%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_substring_extraction[c=%{commit0}; echo ${c:0:7}-%{sub %{commit0} 1 7}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 14%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_substring_extraction[foo=%{version}; echo ${foo:0:5}-%{sub %{version} 1 5}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 15%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_substring_extraction[foo=%{version}; echo ${foo:6}-%{sub %{version} 7}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 15%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_substring_extraction[l=%{_lib}; echo ${l:3}-%{sub %{_lib} 4}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 15%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_substring_extraction[c=%{version}; echo ${c:12:4}-%{sub %{version} 13 16}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 15%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_substring_extraction[c=%{commit}; echo ${c:0:%{commit_abbrev}}-%{sub %{commit} 1 %{commit_abbrev}}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 15%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_substring_extraction[c=\"%{git_commit}\"; echo \"${c:0:8}\"-%{sub %{git_commit} 1 8}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 15%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_substring_extraction[n=%{modname}; echo ${n:0:1}-%{sub %{modname} 1 1}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 15%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_bash_replacement[v=%{version}; echo ${v//./_}-%{lua:print((rpm.expand(\"%{version}\"):gsub(\"%.\", \"_\")))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 15%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_bash_replacement[v=%{version}; echo ${v//./}-%{lua:print((rpm.expand(\"%{version}\"):gsub(\"%.\", \"\")))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 15%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_bash_replacement[n=%{name}; echo ${n//-/_}-%{lua:print((rpm.expand(\"%{name}\"):gsub(\"%-\", \"_\")))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 16%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_bash_replacement[b=%{built_tag_strip}; echo ${b/-/\"~\"}-%{lua:print((rpm.expand(\"%{built_tag_strip}\"):gsub(\"%-\", \"~\", 1)))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 16%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_bash_replacement[n=%{srcname}; echo ${n//-/.}-%{lua:print((rpm.expand(\"%{srcname}\"):gsub(\"%-\", \".\")))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 16%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_bash_replacement[v=%{version}; echo ${v//./-}-%{lua:print((rpm.expand(\"%{version}\"):gsub(\"%.\", \"-\")))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 16%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_bash_replacement[d=%{inkscape_date}; echo ${d//-/}-%{lua:print((rpm.expand(\"%{inkscape_date}\"):gsub(\"%-\", \"\")))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 16%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_bash_replacement[rel=\"%{releasenum}\"; echo \"${rel//-/}\"-%{lua:print((rpm.expand(\"%{releasenum}\"):gsub(\"%-\", \"\")))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 16%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_bash_replacement[v=%{version}; echo ${v//./%2F}-%{lua:print((rpm.expand(\"%{version}\"):gsub(\"%.\", \"%%2F\")))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 16%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_case_conversion[t=\"%{Bg_Name}\";echo ${t,,}-%{lower:%{Bg_Name}}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 16%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_case_conversion[v=%{name}; echo ${v^^}-%{upper:%{name}}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 16%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_suffix_removal[ver=%{version}; echo ${ver%%%%.*}-%{lua:local v=rpm.expand(\"%{version}\") print(v:match(\"^(.-)%.\") or v)}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 17%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_suffix_removal[v=%{version}; echo ${v%.*}-%{lua:local v=rpm.expand(\"%{version}\") print(v:match(\"^(.*)%.\") or v)}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 17%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_suffix_removal[v=%{version}; echo ${v%%%%*}-%{lua:print(\"\")}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 17%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_suffix_removal[v=%{version}; echo ${v%*}-%{lua:print(rpm.expand(\"%{version}\"))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 17%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_prefix_removal[v=%{version}; echo ${v##*.}-%{lua:local v=rpm.expand(\"%{version}\") print(v:match(\".*%.(.*)\") or v)}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 17%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_prefix_removal[v=%{version}; echo ${v#*.}-%{lua:local v=rpm.expand(\"%{version}\") print(v:match(\"%.(.*)\") or v)}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 17%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_prefix_removal[v=%{version}; echo ${v#*#}-%{lua:local v=rpm.expand(\"%{version}\") print(v:match(\"#(.*)\") or v)}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 17%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_prefix_removal[v=%{version}; echo ${v##*#}-%{lua:local v=rpm.expand(\"%{version}\") print(v:match(\".*#(.*)\") or v)}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 17%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_prefix_removal[v=%{version}; echo ${v##*}-%{lua:print(\"\")}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 17%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_prefix_removal[v=%{version}; echo ${v#*}-%{lua:print(rpm.expand(\"%{version}\"))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 18%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_pipe_to_cut[echo %{version} | cut -d. -f3-%{lua:local v=rpm.expand(\"%{version}\") local i=0 for f in v:gmatch(\"[^%.]+\") do i=i+1 if i==3 then print(f) break end end}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 18%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_pipe_to_cut[echo %{version} | cut -d. -f1-2-%{lua:local v=rpm.expand(\"%{version}\") local t={} for f in v:gmatch(\"[^%.]+\") do t[#t+1]=f end print(table.concat(t,\".\",1,2))}0] \u001b[32mPASSED\u001b[0m\u001b[32m [ 18%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_pipe_to_cut[echo %{version} | cut -d. -f1-%{lua:local v=rpm.expand(\"%{version}\") local i=0 for f in v:gmatch(\"[^%.]+\") do i=i+1 if i==1 then print(f) break end end}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 18%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_pipe_to_cut[echo %{version} | cut -d. -f1-2-%{lua:local v=rpm.expand(\"%{version}\") local t={} for f in v:gmatch(\"[^%.]+\") do t[#t+1]=f end print(table.concat(t,\".\",1,2))}1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 18%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_pipe_to_cut[echo %{version} | cut -d. -f-2-%{lua:local v=rpm.expand(\"%{version}\") local t={} for f in v:gmatch(\"[^%.]+\") do t[#t+1]=f end print(table.concat(t,\".\",1,2))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 18%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_pipe_to_cut[echo %{version} | cut -d '^' -f 1-%{lua:local v=rpm.expand(\"%{version}\") local i=0 for f in v:gmatch(\"[^%^]+\") do i=i+1 if i==1 then print(f) break end end}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 18%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_pipe_to_cut[echo %{version} | cut -d'-' -f 1-%{lua:local v=rpm.expand(\"%{version}\") local i=0 for f in v:gmatch(\"[^%-]+\") do i=i+1 if i==1 then print(f) break end end}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 18%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_pipe_to_cut[echo %{version} | cut -d. -f1-3-%{lua:local v=rpm.expand(\"%{version}\") local t={} for f in v:gmatch(\"[^%.]+\") do t[#t+1]=f end print(table.concat(t,\".\",1,3))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 18%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_pipe_to_cut_bytes[echo %{git_commit} | cut -c -8-%{sub %{git_commit} 1 8}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 19%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_pipe_to_cut_bytes[echo %{gitcommit} | cut -c 1-8-%{sub %{gitcommit} 1 8}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 19%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_pipe_to_cut_bytes[echo %{snapshot_rev} | cut -c1-6-%{sub %{snapshot_rev} 1 6}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 19%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_pipe_to_tr[echo \"%{name}\" | tr '[:upper:]' '[:lower:]'-%{lower:%{name}}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 19%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_pipe_to_tr[echo %{upstream_prever} | tr '[:upper:]' '[:lower:]'-%{lower:%{upstream_prever}}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 19%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_pipe_to_tr[echo %{version} | tr . _-%{lua:print((rpm.expand(\"%{version}\"):gsub(\"%.\", \"_\")))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 19%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_pipe_to_tr[echo '%{version}' | tr '^' '.'-%{lua:print((rpm.expand(\"%{version}\"):gsub(\"%^\", \".\")))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 19%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_pipe_to_tr[echo '%{version}' | tr -d .-%{lua:print((rpm.expand(\"%{version}\"):gsub(\"%.\", \"\")))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 19%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_pipe_to_tr[echo '%{version}' | tr -d '~'-%{lua:print((rpm.expand(\"%{version}\"):gsub(\"~\", \"\")))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 19%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_pipe_to_tr[echo %{date} | tr -d --%{lua:print((rpm.expand(\"%{date}\"):gsub(\"%-\", \"\")))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 20%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_pipe_to_sed[echo %{version} | sed 's/\\\\./-/g'-%{lua:print((rpm.expand(\"%{version}\"):gsub(\"%.\", \"-\")))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 20%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_pipe_to_sed[echo %{version} | sed 's|\\\\.|_|g'-%{lua:print((rpm.expand(\"%{version}\"):gsub(\"%.\", \"_\")))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 20%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_pipe_to_sed[echo %{py3_shebang_flags} | sed 's|s||'-%{lua:print((rpm.expand(\"%{py3_shebang_flags}\"):gsub(\"s\", \"\", 1)))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 20%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_pipe_to_sed[echo %{version} | sed \"s/\\\\./_/g\"-%{lua:print((rpm.expand(\"%{version}\"):gsub(\"%.\", \"_\")))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 20%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_pipe_to_sed[echo %{unversion} | sed 's/_/./g'-%{lua:print((rpm.expand(\"%{unversion}\"):gsub(\"_\", \".\")))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 20%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_pipe_to_sed[echo 1.2.3-rc4 | sed 's/-/~/g'-%{lua:print((rpm.expand(\"%{quote:1.2.3-rc4}\"):gsub(\"-\", \"~\")))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 20%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_pipe_to_sed[echo %{version} | sed 's/\\\\\\\\./_/g'-%{lua:print((rpm.expand(\"%{version}\"):gsub(\"%.\", \"_\")))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 20%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_chained_sed \u001b[32mPASSED\u001b[0m\u001b[32m                    [ 20%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_chained_sed_rpm_escaped \u001b[32mPASSED\u001b[0m\u001b[32m        [ 21%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_pipe_to_awk[echo %{version} | awk -F. '{print $1\".\"$2}'-%{lua:local v=rpm.expand(\"%{version}\") local t={} for f in v:gmatch(\"[^%.]+\") do t[#t+1]=f end print(t[1] .. \".\" .. t[2])}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 21%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_pipe_to_awk[echo %{version} | awk -F. '{print $1}'-%{lua:local v=rpm.expand(\"%{version}\") local t={} for f in v:gmatch(\"[^%.]+\") do t[#t+1]=f end print(t[1])}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 21%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_herestring[tr . _ <<< %{version}-%{lua:print((rpm.expand(\"%{version}\"):gsub(\"%.\", \"_\")))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 21%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_herestring[tr - . <<< %{upstreamver}-%{lua:print((rpm.expand(\"%{upstreamver}\"):gsub(\"%-\", \".\")))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 21%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_herestring[cut -d. -f1 <<< %{version}-%{lua:local v=rpm.expand(\"%{version}\") local i=0 for f in v:gmatch(\"[^%.]+\") do i=i+1 if i==1 then print(f) break end end}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 21%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_herestring[cut -d. -f1-2 <<< %{version}-%{lua:local v=rpm.expand(\"%{version}\") local t={} for f in v:gmatch(\"[^%.]+\") do t[#t+1]=f end print(table.concat(t,\".\",1,2))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 21%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_herestring[cut -b -7 <<< %{emacscommit}-%{sub %{emacscommit} 1 7}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 21%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_herestring[tr -d . <<< %{version}-%{lua:print((rpm.expand(\"%{version}\"):gsub(\"%.\", \"\")))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 21%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_herestring[sed 's/\\\\.//g' <<<%{version}-%{lua:print((rpm.expand(\"%{version}\"):gsub(\"%.\", \"\")))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 22%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_herestring[sed 's/-/~/g' <<<1.2.3-rc4-%{lua:print((rpm.expand(\"%{quote:1.2.3-rc4}\"):gsub(\"-\", \"~\")))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 22%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_variable_indirection[c=%{version}; echo $c | cut -d. -f1-%{lua:local v=rpm.expand(\"%{version}\") local i=0 for f in v:gmatch(\"[^%.]+\") do i=i+1 if i==1 then print(f) break end end}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 22%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_variable_indirection[v=%{version}; tr . _ <<< $v-%{lua:print((rpm.expand(\"%{version}\"):gsub(\"%.\", \"_\")))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 22%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_bash_array_field[foo=%{version}; a=(${foo//./ }); echo ${a[0]} -%{lua:local v=rpm.expand(\"%{version}\") local i=0 for f in v:gmatch(\"[^%.]+\") do i=i+1 if i==1 then print(f) break end end}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 22%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_bash_array_field[foo=%{version}; a=(${foo//./ }); echo ${a[1]} -%{lua:local v=rpm.expand(\"%{version}\") local i=0 for f in v:gmatch(\"[^%.]+\") do i=i+1 if i==2 then print(f) break end end}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 22%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_date_formatting[date +\"%Y%m%d\"-%{lua:print(os.date(\"%Y%m%d\"))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 22%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_date_formatting[date +'%Y%m%d'-%{lua:print(os.date(\"%Y%m%d\"))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 22%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_date_formatting[date -u +'%Y-%m-%dT%H:%M:%SZ'-%{lua:print(os.date(\"!%Y-%m-%dT%H:%M:%SZ\"))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 22%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_date_formatting[date +\"%Y-%d-%m\"-%{lua:print(os.date(\"%Y-%d-%m\"))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 23%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_arithmetic[echo $((%{__isa_bits}+0))-%[%{__isa_bits}+0]] \u001b[32mPASSED\u001b[0m\u001b[32m [ 23%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_arithmetic[echo $((%{__isa_bits}+2))-%[%{__isa_bits}+2]] \u001b[32mPASSED\u001b[0m\u001b[32m [ 23%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_arithmetic[echo $((%{ver_minor}+1))-%[%{ver_minor}+1]] \u001b[32mPASSED\u001b[0m\u001b[32m [ 23%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_arithmetic[echo $((%{sover}-1))-%[%{sover}-1]] \u001b[32mPASSED\u001b[0m\u001b[32m [ 23%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_arithmetic[ echo $(( %majorversion + 1 )) -%[%majorversion + 1]] \u001b[32mPASSED\u001b[0m\u001b[32m [ 23%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_basename_dirname[basename %{_python3_include}-%{lua:print((rpm.expand(\"%{_python3_include}\"):match(\"[^/]+$\")))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 23%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_basename_dirname[dirname %{bashcompdir}-%{lua:print((rpm.expand(\"%{bashcompdir}\"):match(\"^(.*)/\")))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 23%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_basename_dirname[dirname %{compdir}-%{lua:print((rpm.expand(\"%{compdir}\"):match(\"^(.*)/\")))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 23%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_string_comparison_not_equal \u001b[32mPASSED\u001b[0m\u001b[32m    [ 24%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_string_comparison_equal \u001b[32mPASSED\u001b[0m\u001b[32m        [ 24%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_empty_test \u001b[32mPASSED\u001b[0m\u001b[32m                     [ 24%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_printf_truncation \u001b[32mPASSED\u001b[0m\u001b[32m              [ 24%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_printf_float \u001b[32mPASSED\u001b[0m\u001b[32m                   [ 24%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_echo_concat[echo %{optflags} -fno-strict-aliasing-%{optflags} -fno-strict-aliasing] \u001b[32mPASSED\u001b[0m\u001b[32m [ 24%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_echo_concat[echo %{build_ldflags} -fuse-ld=lld-%{build_ldflags} -fuse-ld=lld] \u001b[32mPASSED\u001b[0m\u001b[32m [ 24%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_echo_concat[echo %{optflags} -D_DEFAULT_SOURCE-%{optflags} -D_DEFAULT_SOURCE] \u001b[32mPASSED\u001b[0m\u001b[32m [ 24%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_echo_concat[echo %{optflags} -Wno-error=dangling-reference-%{optflags} -Wno-error=dangling-reference] \u001b[32mPASSED\u001b[0m\u001b[32m [ 24%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_cut_bytes_with_macro_offset \u001b[32mPASSED\u001b[0m\u001b[32m    [ 25%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_unconvertible_returns_nil[octave-config -p VERSION || echo 0] \u001b[32mPASSED\u001b[0m\u001b[32m [ 25%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_unconvertible_returns_nil[python3-config --abiflags] \u001b[32mPASSED\u001b[0m\u001b[32m [ 25%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_unconvertible_returns_nil[pkg-config --modversion qwt] \u001b[32mPASSED\u001b[0m\u001b[32m [ 25%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_unconvertible_returns_nil[/usr/bin/getconf _NPROCESSORS_ONLN] \u001b[32mPASSED\u001b[0m\u001b[32m [ 25%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_unconvertible_returns_nil[uname -m] \u001b[32mPASSED\u001b[0m\u001b[32m [ 25%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_unconvertible_returns_nil[hostname] \u001b[32mPASSED\u001b[0m\u001b[32m [ 25%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_unconvertible_returns_nil[id -un] \u001b[32mPASSED\u001b[0m\u001b[32m [ 25%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_unconvertible_returns_nil[mktemp --directory] \u001b[32mPASSED\u001b[0m\u001b[32m [ 25%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_unconvertible_returns_nil[ruby -rrbconfig -e \"puts RbConfig::CONFIG['vendorlibdir']\"] \u001b[32mPASSED\u001b[0m\u001b[32m [ 26%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_safe_code[print(rpm.expand(\"%{version}\"))] \u001b[32mPASSED\u001b[0m\u001b[32m [ 26%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_safe_code[print((rpm.expand(\"%{version}\"):gsub(\"%.\", \"_\")))] \u001b[32mPASSED\u001b[0m\u001b[32m [ 26%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_safe_code[print(os.date(\"%Y%m%d\"))] \u001b[32mPASSED\u001b[0m\u001b[32m [ 26%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_safe_code[print(os.date(\"!%Y-%m-%dT%H:%M:%SZ\"))] \u001b[32mPASSED\u001b[0m\u001b[32m [ 26%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_safe_code[print(os.clock())] \u001b[32mPASSED\u001b[0m\u001b[32m [ 26%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_safe_code[print(os.time())] \u001b[32mPASSED\u001b[0m\u001b[32m [ 26%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_safe_code[print(os.difftime(os.time(), 0))] \u001b[32mPASSED\u001b[0m\u001b[32m [ 26%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_safe_code[local v=rpm.expand(\"%{version}\") print(v:match(\"^(.-)%.\") or v)] \u001b[32mPASSED\u001b[0m\u001b[32m [ 26%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_safe_code[local v=rpm.expand(\"%{version}\") local t={} for f in v:gmatch(\"[^%.]+\") do t[#t+1]=f end print(table.concat(t,\".\",1,2))] \u001b[32mPASSED\u001b[0m\u001b[32m [ 27%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_safe_code[print(string.len(\"hello\"))] \u001b[32mPASSED\u001b[0m\u001b[32m [ 27%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_safe_code[print(math.floor(3.7))] \u001b[32mPASSED\u001b[0m\u001b[32m [ 27%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_safe_code[print(math.max(1, 2, 3))] \u001b[32mPASSED\u001b[0m\u001b[32m [ 27%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_safe_code[print(table.concat({\"a\", \"b\"}, \",\"))] \u001b[32mPASSED\u001b[0m\u001b[32m [ 27%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_safe_code[print(tostring(42))] \u001b[32mPASSED\u001b[0m\u001b[32m [ 27%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_safe_code[print(tonumber(\"42\"))] \u001b[32mPASSED\u001b[0m\u001b[32m [ 27%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_safe_code[print(type(\"hello\"))] \u001b[32mPASSED\u001b[0m\u001b[32m [ 27%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_safe_code[local x = 1 print(x)] \u001b[32mPASSED\u001b[0m\u001b[32m [ 27%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_safe_code[print(string.format(\"%.4f\", tonumber(rpm.expand(\"%{version}\"))))] \u001b[32mPASSED\u001b[0m\u001b[32m [ 28%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_safe_code[print(string.format(\"%d\", 42))] \u001b[32mPASSED\u001b[0m\u001b[32m [ 28%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_safe_code[print(string.format(\"%%.4f\", tonumber(rpm.expand(\"%{version}\"))))] \u001b[32mPASSED\u001b[0m\u001b[32m [ 28%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_safe_code[print(rpm.expand(\"%{version}\")) -- a comment] \u001b[32mPASSED\u001b[0m\u001b[32m [ 28%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_safe_code[local x = 1 --[[ block comment ]] print(x)] \u001b[32mPASSED\u001b[0m\u001b[32m [ 28%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[os.execute(\"id\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 28%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[os.remove(\"/tmp/foo\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 28%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[os.rename(\"/tmp/a\", \"/tmp/b\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 28%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[os.exit(0)] \u001b[32mPASSED\u001b[0m\u001b[32m [ 28%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[io.open(\"/etc/passwd\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 29%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[io.popen(\"id\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 29%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[io.lines(\"/etc/passwd\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 29%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[io.tmpfile()] \u001b[32mPASSED\u001b[0m\u001b[32m [ 29%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[require(\"os\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 29%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[dofile(\"/tmp/evil.lua\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 29%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[loadfile(\"/tmp/evil.lua\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 29%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[loadstring(\"os.execute('id')\")()] \u001b[32mPASSED\u001b[0m\u001b[32m [ 29%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[load(\"os.execute('id')\")()] \u001b[32mPASSED\u001b[0m\u001b[32m [ 29%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[debug.getinfo(1)] \u001b[32mPASSED\u001b[0m\u001b[32m [ 30%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[debug.getregistry()] \u001b[32mPASSED\u001b[0m\u001b[32m [ 30%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[package.loadlib(\"/lib/libc.so.6\", \"system\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 30%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[collectgarbage()] \u001b[32mPASSED\u001b[0m\u001b[32m [ 30%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[coroutine.create(function() end)] \u001b[32mPASSED\u001b[0m\u001b[32m [ 30%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[rpm.define(\"evil_macro 1\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 30%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[rpm.undefine(\"Name\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 30%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[rpm.register(function() end)] \u001b[32mPASSED\u001b[0m\u001b[32m [ 30%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[rpm.execute(\"id\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 30%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[rpm.redirect2macro(\"foo\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 31%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[posix.exec(\"/bin/sh\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 31%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[fedora.rpm.vercmp(\"1\", \"2\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 31%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[string.dump(print)] \u001b[32mPASSED\u001b[0m\u001b[32m [ 31%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[string.char(37, 40)] \u001b[32mPASSED\u001b[0m\u001b[32m [ 31%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[string.sub(\"hello\", 1, 3)] \u001b[32mPASSED\u001b[0m\u001b[32m [ 31%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[string.find(\"hello\", \"l\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 31%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[string.reverse(\"hello\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 31%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[string.rep(\"x\", 5)] \u001b[32mPASSED\u001b[0m\u001b[32m [ 31%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[string.format(\"%c\", 37)] \u001b[32mPASSED\u001b[0m\u001b[32m [ 32%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[string.format(\"%s\", \"hello\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 32%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[string.format(\"%q\", \"hello\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 32%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_direct_calls[string.format(var)] \u001b[32mPASSED\u001b[0m\u001b[32m [ 32%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_identifiers[_G[\"os\"][\"execute\"](\"id\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 32%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_identifiers[_G['os']['execute']('id')] \u001b[32mPASSED\u001b[0m\u001b[32m [ 32%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_identifiers[rawget(_G, \"os\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 32%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_identifiers[rawset(_G, \"evil\", function() end)] \u001b[32mPASSED\u001b[0m\u001b[32m [ 32%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_identifiers[rawequal(_G, _G)] \u001b[32mPASSED\u001b[0m\u001b[32m [ 32%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_identifiers[getfenv(0)] \u001b[32mPASSED\u001b[0m\u001b[32m [ 33%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_identifiers[setfenv(1, {})] \u001b[32mPASSED\u001b[0m\u001b[32m [ 33%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_identifiers[getmetatable(\"\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 33%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_identifiers[setmetatable({}, {})] \u001b[32mPASSED\u001b[0m\u001b[32m [ 33%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_identifiers[newproxy(true)] \u001b[32mPASSED\u001b[0m\u001b[32m [ 33%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_identifiers[module(\"evil\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 33%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_identifiers[pcall(load, \"os.execute('id')\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 33%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_identifiers[xpcall(load, print, \"os.execute('id')\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 33%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_identifiers[pcall(function() end)] \u001b[32mPASSED\u001b[0m\u001b[32m [ 33%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_identifiers[xpcall(function() end, print)] \u001b[32mPASSED\u001b[0m\u001b[32m [ 33%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_bracket_notation[local x = {}; x[\"os\"] = true] \u001b[32mPASSED\u001b[0m\u001b[32m [ 34%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_bracket_notation[local x = {}; x['cmd'] = 'id'] \u001b[32mPASSED\u001b[0m\u001b[32m [ 34%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_bracket_notation[os[\"\\\\\"..\"]] \u001b[32mPASSED\u001b[0m\u001b[32m [ 34%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_bracket_notation[os[string.char(101,120,101,99,117,116,101)]()] \u001b[32mPASSED\u001b[0m\u001b[32m [ 34%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_bracket_notation[os[[[execute]]]()] \u001b[32mPASSED\u001b[0m\u001b[32m [ 34%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_bracket_notation[os[var]] \u001b[32mPASSED\u001b[0m\u001b[32m [ 34%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_variable_aliasing[local e = _G e.os.execute(\"id\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 34%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_variable_aliasing[local r = rawget print(r)] \u001b[32mPASSED\u001b[0m\u001b[32m [ 34%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_variable_aliasing[local d = debug d.getinfo(1)] \u001b[32mPASSED\u001b[0m\u001b[32m [ 34%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_variable_aliasing[local i = io i.popen(\"id\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 35%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_variable_aliasing[local l = loadstring l(\"print(1)\")()] \u001b[32mPASSED\u001b[0m\u001b[32m [ 35%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_variable_aliasing[local p = package p.loadlib(\"x\", \"y\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 35%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_spaced_dot[os . execute(\"id\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 35%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_spaced_dot[os  .  execute(\"id\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 35%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_spaced_dot[os\\t.\\texecute(\"id\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 35%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_paren_bypass[(os).execute(\"id\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 35%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_paren_bypass[((os)).execute(\"id\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 35%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_paren_bypass[(rpm).define(\"evil 1\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 35%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_paren_bypass[(string).dump(print)] \u001b[32mPASSED\u001b[0m\u001b[32m [ 36%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_colon_access[os:execute(\"id\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 36%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_colon_access[os:exit(0)] \u001b[32mPASSED\u001b[0m\u001b[32m [ 36%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_colon_access[rpm:define(\"evil 1\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 36%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_comment_bypass[os.--[[comment]]execute(\"id\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 36%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_comment_bypass[os.--[[x]]exit(0)] \u001b[32mPASSED\u001b[0m\u001b[32m [ 36%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_long_comment_bypass[--[=[ ]=] os.execute(\"id\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 36%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_long_comment_bypass[--[==[ ]==] os.execute(\"id\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 36%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_long_comment_bypass[print(\"safe\" --[=[ ]=]) os.execute(\"id\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 36%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_long_comment_bypass[--[===[ ]===] io.popen(\"id\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 37%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_rpm_expand_bypass[rpm.expand(\"%(whoami)\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 37%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_rpm_expand_bypass[rpm.expand(\"%{lua:os.execute('id')}\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 37%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_rpm_expand_bypass[print(rpm.expand(\"%(cat /etc/passwd)\"))] \u001b[32mPASSED\u001b[0m\u001b[32m [ 37%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_rpm_expand_bypass[rpm.expand('%(id)')] \u001b[32mPASSED\u001b[0m\u001b[32m [ 37%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_rpm_expand_bypass[local x = rpm.expand(\"%(uname -a)\") print(x)] \u001b[32mPASSED\u001b[0m\u001b[32m [ 37%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_rpm_expand_bypass[rpm.expand(\"%{load:/tmp/evil.lua}\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 37%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_rpm_expand_bypass[rpm.expand(\"%{include:/tmp/evil.spec}\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 37%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_rpm_expand_bypass[rpm.expand(\"%{uncompress:/tmp/file.gz}\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 37%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_rpm_expand_bypass[print(rpm.expand(\"%{load: /tmp/evil.lua}\"))] \u001b[32mPASSED\u001b[0m\u001b[32m [ 38%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_rpm_expand_bypass[rpm.expand(\"%{uncompress: file}\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 38%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_rpm_expand_bypass[rpm.expand(\"%{expand:%(whoami)}\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 38%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_rpm_expand_bypass[rpm.expand(\"%{expand:%{lua:os.execute('id')}}\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 38%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_rpm_expand_bypass[rpm.expand(\"%{define:evil %(whoami)}\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 38%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_rpm_expand_bypass[rpm.expand(\"%{global:evil %(whoami)}\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 38%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_rpm_expand_bypass[rpm.expand(\"%{define:Name evil}\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 38%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_rpm_expand_bypass[rpm.expand(\"%{global:_prefix /tmp/evil}\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 38%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_rpm_expand_bypass[rpm.expand(\"%{undefine:Name}\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 38%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_rpm_expand_bypass[rpm.expand(\"%{define :__spec_check_post exit 0}\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 39%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_rpm_expand_bypass[rpm.expand(\"%load /tmp/evil.lua\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 39%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_rpm_expand_bypass[rpm.expand(\"%include /tmp/evil.spec\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 39%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_rpm_expand_bypass[rpm.expand(\"%define __spec_check_post exit 0\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 39%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_rpm_expand_bypass[rpm.expand(\"%global _prefix /tmp/evil\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 39%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_rpm_expand_bypass[rpm.expand(\"%undefine Name\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 39%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_env[local e = _ENV] \u001b[32mPASSED\u001b[0m\u001b[32m [ 39%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_env[_ENV.os.execute(\"id\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 39%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_rpm_expand_shell_bypass_in_sanitize \u001b[32mPASSED\u001b[0m\u001b[32m [ 39%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_rpm_expand_nested_lua_bypass_in_sanitize \u001b[32mPASSED\u001b[0m\u001b[32m [ 40%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_rpm_expand_dynamic_args[rpm.expand(string.char(37, 40) .. \"whoami)\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 40%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_rpm_expand_dynamic_args[rpm.expand(string.format(\"%%\") .. \"(whoami)\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 40%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_rpm_expand_dynamic_args[rpm.expand(string.reverse(\")imaohw(%\"))] \u001b[32mPASSED\u001b[0m\u001b[32m [ 40%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_rpm_expand_dynamic_args[rpm.expand((\"%%\"):format() .. \"(whoami)\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 40%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_rpm_expand_dynamic_args[rpm.expand(\"\" .. \"\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 40%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_rpm_expand_dynamic_args[local f = rpm.expand] \u001b[32mPASSED\u001b[0m\u001b[32m [ 40%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_rpm_expand_dynamic_args[x = rpm.expand] \u001b[32mPASSED\u001b[0m\u001b[32m [ 40%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_rpm_expand_dynamic_args[rpm.expand(x)] \u001b[32mPASSED\u001b[0m\u001b[32m [ 40%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_rpm_expand_string_construction_bypass_in_sanitize[%{lua:rpm.expand(string.char(37, 40) .. \"whoami)\")}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 41%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_rpm_expand_string_construction_bypass_in_sanitize[%{lua:rpm.expand(string.format(\"%%\") .. \"(whoami)\")}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 41%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_rpm_expand_string_construction_bypass_in_sanitize[%{lua:rpm.expand(string.reverse(\")imaohw(%\"))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 41%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_rpm_expand_string_construction_bypass_in_sanitize[%{lua:rpm.expand((\"%%\"):format() .. \"(whoami)\")}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 41%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_in_sanitize \u001b[32mPASSED\u001b[0m\u001b[32m         [ 41%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_safe_in_sanitize \u001b[32mPASSED\u001b[0m\u001b[32m           [ 41%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_bracket_bypass_in_sanitize \u001b[32mPASSED\u001b[0m\u001b[32m [ 41%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_load_include_uncompress_bypass_in_sanitize[%{lua:print(rpm.expand(\"%{load:/tmp/evil.lua}\"))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 41%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_load_include_uncompress_bypass_in_sanitize[%{lua:print(rpm.expand(\"%{include:/tmp/evil.spec}\"))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 41%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_load_include_uncompress_bypass_in_sanitize[%{lua:print(rpm.expand(\"%{uncompress:/tmp/file.gz}\"))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 42%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_rpm_expand_define_global_bypass_in_sanitize[%{lua:print(rpm.expand(\"%{expand:%(whoami)}\"))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 42%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_rpm_expand_define_global_bypass_in_sanitize[%{lua:print(rpm.expand(\"%{expand:%{lua:os.execute('id')}}\"))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 42%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_rpm_expand_define_global_bypass_in_sanitize[%{lua:print(rpm.expand(\"%{define:evil %(whoami)}\"))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 42%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_rpm_expand_define_global_bypass_in_sanitize[%{lua:print(rpm.expand(\"%{global:evil %(whoami)}\"))}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 42%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_rpm_expand_braceless_directive_bypass_in_sanitize[%{lua:rpm.expand(\"%load /tmp/evil.lua\")}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 42%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_rpm_expand_braceless_directive_bypass_in_sanitize[%{lua:rpm.expand(\"%include /tmp/evil.spec\")}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 42%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_rpm_expand_braceless_directive_bypass_in_sanitize[%{lua:rpm.expand(\"%define __spec_check_post exit 0\")}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 42%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_rpm_expand_braceless_directive_bypass_in_sanitize[%{lua:rpm.expand(\"%global _prefix /tmp/evil\")}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 42%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_rpm_expand_braceless_directive_bypass_in_sanitize[%{lua:rpm.expand(\"%undefine Name\")}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 43%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_builtin_macro_body_sanitized[%{expand:%(whoami)}-%{expand:%{nil}}-1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 43%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_builtin_macro_body_sanitized[%{lower:%(whoami)}-%{lower:%{nil}}-1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 43%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_builtin_macro_body_sanitized[%{upper:%(whoami)}-%{upper:%{nil}}-1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 43%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_builtin_macro_body_sanitized[%{expand:%{lua:os.execute(\"id\")}}-%{expand:%{nil}}-1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 43%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_builtin_macro_body_sanitized[%{lower:%{name}}-%{lower:%{name}}-0] \u001b[32mPASSED\u001b[0m\u001b[32m [ 43%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_builtin_macro_body_sanitized[%{quote:%(cat /etc/passwd)}-%{quote:%{nil}}-1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 43%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_builtin_macro_body_sanitized[%{uncompress:/tmp/file.gz}--1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 43%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_enclosed_macro_args_sanitized[%{upper %(whoami)}-%{upper %{nil}}-1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 43%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_enclosed_macro_args_sanitized[%{macro %(whoami) %{version}}-%{macro %{nil} %{version}}-1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 44%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_enclosed_macro_args_sanitized[%{macro %(whoami) %(id)}-%{macro %{nil} %{nil}}-2] \u001b[32mPASSED\u001b[0m\u001b[32m [ 44%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_enclosed_macro_args_sanitized[%{foo %{version}}-%{foo %{version}}-0] \u001b[32mPASSED\u001b[0m\u001b[32m [ 44%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_bash_replace_rejects_unsafe_repl[v=%{version}; echo ${v//./%(whoami)}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 44%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_bash_replace_rejects_unsafe_repl[v=%{version}; echo ${v//./%{lua:os.execute('id')}}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 44%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_bash_replace_rejects_unsafe_repl[v=%{name}; echo ${v//-/%(cat /etc/passwd)}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 44%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_test_str_rejects_unsafe_values[test \"a\" == \"a\" && echo \"%(whoami)\" || echo \"no\"] \u001b[32mPASSED\u001b[0m\u001b[32m [ 44%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_test_str_rejects_unsafe_values[test \"a\" != \"b\" && echo \"safe\" || echo \"%(id)\"] \u001b[32mPASSED\u001b[0m\u001b[32m [ 44%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_test_str_rejects_unsafe_values[test \"%(whoami)\" == \"a\" && echo \"yes\" || echo \"no\"] \u001b[32mPASSED\u001b[0m\u001b[32m [ 44%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_test_str_rejects_unsafe_values[test \"a\" == \"%(whoami)\" && echo \"yes\" || echo \"no\"] \u001b[32mPASSED\u001b[0m\u001b[32m [ 45%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_test_empty_rejects_unsafe_values[[ -z \"%{?flag}\" ] && echo \"%(whoami)\" || echo \"safe\"] \u001b[32mPASSED\u001b[0m\u001b[32m [ 45%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_test_empty_rejects_unsafe_values[[ -z \"%{?flag}\" ] && echo \"safe\" || echo \"%(whoami)\"] \u001b[32mPASSED\u001b[0m\u001b[32m [ 45%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_date_rejects_unsafe_format[date +%(whoami)] \u001b[32mPASSED\u001b[0m\u001b[32m [ 45%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_date_rejects_unsafe_format[date +\"%(whoami)%Y\"] \u001b[32mPASSED\u001b[0m\u001b[32m [ 45%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_sed_rejects_unsafe_replacement[echo %{version} | sed 's/\\\\./ %(whoami)/g'] \u001b[32mPASSED\u001b[0m\u001b[32m [ 45%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_sed_rejects_unsafe_replacement[echo %{version} | sed 's/x/%(id)/g'] \u001b[32mPASSED\u001b[0m\u001b[32m [ 45%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_awk_rejects_unsafe_separator[echo %{version} | awk -F. '{print $1\"%(whoami)\"$2}'] \u001b[32mPASSED\u001b[0m\u001b[32m [ 45%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_escape_sequence_bypass[print(\"\\\\037(whoami)\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 45%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_escape_sequence_bypass[print(\"\\\\037{lua:os.execute(\\\\\"id\\\\\")}\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 46%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_escape_sequence_bypass[print(\"\\\\x25(whoami)\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 46%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_escape_sequence_bypass[print(\"\\\\u{25}(whoami)\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 46%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_escape_sequence_bypass[print(\"\\\\037\\\\z (whoami)\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 46%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_string_format_bypass[print(string.format(\"%c(whoami)\", 37))] \u001b[32mPASSED\u001b[0m\u001b[32m [ 46%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_string_format_bypass[print(string.format(\"%c\", 37) .. \"(whoami)\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 46%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_colon_method_bypass[print((\"%c(whoami)\"):format(37))] \u001b[32mPASSED\u001b[0m\u001b[32m [ 46%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_colon_method_bypass[print((\"\"):format(37))] \u001b[32mPASSED\u001b[0m\u001b[32m [ 46%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_colon_method_bypass[print((\"\"):char(37))] \u001b[32mPASSED\u001b[0m\u001b[32m [ 46%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_colon_method_bypass[print((\"\"):dump())] \u001b[32mPASSED\u001b[0m\u001b[32m [ 47%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_concatenation_bypass[print(\"%\" .. \"(whoami)\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 47%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_concatenation_bypass[print(\"x%\" .. \"(whoami)\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 47%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_concatenation_bypass[print(\"\\\\037\" .. \"(whoami)\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 47%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_string_extraction_bypass[print(string.sub(\"% \", 1, 1) .. \"(whoami)\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 47%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_string_extraction_bypass[print((\"% \"):sub(1, 1) .. \"(whoami)\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 47%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_string_extraction_bypass[local _,_,c = string.find(\"% x\", \"^(.)\"); print(c .. \"(whoami)\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 47%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_string_extraction_bypass[print(string.reverse(\"X%\") .. \"(whoami)\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 47%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_string_extraction_bypass[print(string.rep(\"% \", 1):sub(1,1) .. \"(whoami)\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 47%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_string_format_alias_bypass[local f=string.format print(f(\"%%%c(whoami)\", 40))] \u001b[32mPASSED\u001b[0m\u001b[32m [ 48%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_string_format_alias_bypass[local f=string.format; print(f(\"%%%c\", 40) .. \"whoami)\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 48%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_string_format_alias_bypass[local t={f=string.format} print(t.f(\"%%%c\", 40))] \u001b[32mPASSED\u001b[0m\u001b[32m [ 48%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_comment_injection_bypass[x = \"--[[\"; os.execute(\"id\"); x = \"--]]\"] \u001b[32mPASSED\u001b[0m\u001b[32m [ 48%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_comment_injection_bypass[x = '--[['; os.execute('id'); x = '--]]'] \u001b[32mPASSED\u001b[0m\u001b[32m [ 48%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_comment_injection_bypass[x = \"--[=[\"; os.execute(\"id\"); x = \"--]=]\"] \u001b[32mPASSED\u001b[0m\u001b[32m [ 48%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_safe_real_comment_not_confused_with_string \u001b[32mPASSED\u001b[0m\u001b[32m [ 48%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_expression_expansion_sanitized[%[1+1]-%[1+1]] \u001b[32mPASSED\u001b[0m\u001b[32m [ 48%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_expression_expansion_sanitized[%[%{version}]-%[%{version}]] \u001b[32mPASSED\u001b[0m\u001b[32m [ 48%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_expression_expansion_sanitized[%[%{lua:os.execute(\"id\")}]-%[%{nil}]] \u001b[32mPASSED\u001b[0m\u001b[32m [ 49%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_expression_expansion_sanitized[%[%(whoami)]-%[%{nil}]] \u001b[32mPASSED\u001b[0m\u001b[32m [ 49%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_expression_expansion_sanitized[%[lua:os.execute('id')]-%{nil}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 49%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_expression_expansion_sanitized[%[lua: os.execute('id')]-%{nil}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 49%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_expression_expansion_sanitized[%[lua:rpm.expand(\"%{version}\")]-%[lua:rpm.expand(\"%{version}\")]] \u001b[32mPASSED\u001b[0m\u001b[32m [ 49%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_macro_name_sanitized[%{%(whoami)}-%{%{nil}}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 49%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_macro_name_sanitized[%{%(whoami) arg1 arg2}-%{%{nil} arg1 arg2}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 49%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_macro_name_sanitized[%{%(whoami):body}-%{nil}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 49%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_macro_name_sanitized[%{%{lua:os.execute(\"id\")}}-%{nil}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 49%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_macro_name_sanitized[%{?%(whoami):body}-%{nil}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 50%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_macro_name_sanitized[%{!%(whoami):body}-%{nil}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 50%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_macro_name_sanitized[%{version}-%{version}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 50%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_macro_name_sanitized[%{?dist}-%{?dist}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 50%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_macro_name_sanitized[%{?prerel:0.}-%{?prerel:0.}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 50%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_expression_expansion_in_string[print(rpm.expand(\"%[lua:os.execute('id')]\"))] \u001b[32mPASSED\u001b[0m\u001b[32m [ 50%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_expression_expansion_in_string[print(\"%[1+1]\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 50%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_sed_pattern_newline_escape \u001b[32mPASSED\u001b[0m\u001b[32m     [ 50%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_sed_pattern_parentheses_escaped \u001b[32mPASSED\u001b[0m\u001b[32m [ 50%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_sanitize_idempotent_printf_float \u001b[32mPASSED\u001b[0m\u001b[32m [ 51%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_char_escape_bypass[rpm.expand(\"%\\\\040whoami)\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 51%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_char_escape_bypass[rpm.expand(\"%\\\\091lua\\\\058os.execute('id')\\\\093\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 51%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_char_escape_bypass[rpm.expand(\"%\\\\x28whoami)\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 51%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_char_escape_bypass[rpm.expand(\"%\\\\x7blua\\\\x3aos.execute('id')}\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 51%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_lua_unsafe_char_escape_bypass[rpm.expand(\"%\\\\u{28}whoami)\")] \u001b[32mPASSED\u001b[0m\u001b[32m [ 51%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_decode_lua_escapes_out_of_range \u001b[32mPASSED\u001b[0m\u001b[32m [ 51%]\u001b[0m",
                                "tests/unit/test_sanitizer.py::test_sanitize_depth_limit \u001b[32mPASSED\u001b[0m\u001b[32m           [ 51%]\u001b[0m",
                                "tests/unit/test_sections.py::test_find \u001b[32mPASSED\u001b[0m\u001b[32m                            [ 51%]\u001b[0m",
                                "tests/unit/test_sections.py::test_get \u001b[32mPASSED\u001b[0m\u001b[32m                             [ 52%]\u001b[0m",
                                "tests/unit/test_sections.py::test_contains_and_getattr \u001b[32mPASSED\u001b[0m\u001b[32m            [ 52%]\u001b[0m",
                                "tests/unit/test_sections.py::test_get_or_create[package-True-package--content0] \u001b[32mPASSED\u001b[0m\u001b[32m [ 52%]\u001b[0m",
                                "tests/unit/test_sections.py::test_get_or_create[prep-True-prep--content1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 52%]\u001b[0m",
                                "tests/unit/test_sections.py::test_get_or_create[package -n subpkg1-True-package--n subpkg1-content2] \u001b[32mPASSED\u001b[0m\u001b[32m [ 52%]\u001b[0m",
                                "tests/unit/test_sections.py::test_get_or_create[package -n subpkg2-False-package--n subpkg2-content3] \u001b[32mPASSED\u001b[0m\u001b[32m [ 52%]\u001b[0m",
                                "tests/unit/test_sections.py::test_parse \u001b[32mPASSED\u001b[0m\u001b[32m                           [ 52%]\u001b[0m",
                                "tests/unit/test_sections.py::test_parse_case_insensitive \u001b[32mPASSED\u001b[0m\u001b[32m          [ 52%]\u001b[0m",
                                "tests/unit/test_sections.py::test_parse_invalid_name \u001b[32mPASSED\u001b[0m\u001b[32m              [ 52%]\u001b[0m",
                                "tests/unit/test_sections.py::test_parse_macro_definitions \u001b[32mPASSED\u001b[0m\u001b[32m         [ 53%]\u001b[0m",
                                "tests/unit/test_sections.py::test_get_raw_data \u001b[32mPASSED\u001b[0m\u001b[32m                    [ 53%]\u001b[0m",
                                "tests/unit/test_sections.py::test_copy_sections \u001b[32mPASSED\u001b[0m\u001b[32m                   [ 53%]\u001b[0m",
                                "tests/unit/test_sections.py::test_is_script[package-False] \u001b[32mPASSED\u001b[0m\u001b[32m        [ 53%]\u001b[0m",
                                "tests/unit/test_sections.py::test_is_script[install-True] \u001b[32mPASSED\u001b[0m\u001b[32m         [ 53%]\u001b[0m",
                                "tests/unit/test_sections.py::test_is_script[PostUn-True] \u001b[32mPASSED\u001b[0m\u001b[32m          [ 53%]\u001b[0m",
                                "tests/unit/test_sections.py::test_is_script[SourceList-False] \u001b[32mPASSED\u001b[0m\u001b[32m     [ 53%]\u001b[0m",
                                "tests/unit/test_sourcelist.py::test_parse \u001b[32mPASSED\u001b[0m\u001b[32m                         [ 53%]\u001b[0m",
                                "tests/unit/test_sourcelist.py::test_get_raw_section_data \u001b[32mPASSED\u001b[0m\u001b[32m          [ 53%]\u001b[0m",
                                "tests/unit/test_sourcelist.py::test_copy_sourcelist \u001b[32mPASSED\u001b[0m\u001b[32m               [ 54%]\u001b[0m",
                                "tests/unit/test_sources.py::test_tag_source_extract_number[Source-None] \u001b[32mPASSED\u001b[0m\u001b[32m [ 54%]\u001b[0m",
                                "tests/unit/test_sources.py::test_tag_source_extract_number[Source0-0] \u001b[32mPASSED\u001b[0m\u001b[32m [ 54%]\u001b[0m",
                                "tests/unit/test_sources.py::test_tag_source_extract_number[Patch0001-0001] \u001b[32mPASSED\u001b[0m\u001b[32m [ 54%]\u001b[0m",
                                "tests/unit/test_sources.py::test_tag_source_extract_number[Patch28-28] \u001b[32mPASSED\u001b[0m\u001b[32m [ 54%]\u001b[0m",
                                "tests/unit/test_sources.py::test_tag_source_extract_number[Patch99999-99999] \u001b[32mPASSED\u001b[0m\u001b[32m [ 54%]\u001b[0m",
                                "tests/unit/test_sources.py::test_sources_detect_implicit_numbering[tags0-True-False] \u001b[32mPASSED\u001b[0m\u001b[32m [ 54%]\u001b[0m",
                                "tests/unit/test_sources.py::test_sources_detect_implicit_numbering[tags1-False-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 54%]\u001b[0m",
                                "tests/unit/test_sources.py::test_sources_detect_implicit_numbering[tags2-False-False] \u001b[32mPASSED\u001b[0m\u001b[32m [ 54%]\u001b[0m",
                                "tests/unit/test_sources.py::test_sources_detect_implicit_numbering[tags3-True-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 55%]\u001b[0m",
                                "tests/unit/test_sources.py::test_sources_get_tag_format[Source-: -28-Source-: ] \u001b[32mPASSED\u001b[0m\u001b[32m [ 55%]\u001b[0m",
                                "tests/unit/test_sources.py::test_sources_get_tag_format[Source0-: -28-Source28-:] \u001b[32mPASSED\u001b[0m\u001b[32m [ 55%]\u001b[0m",
                                "tests/unit/test_sources.py::test_sources_get_tag_format[Source0001-:      -2-Source0002-:      ] \u001b[32mPASSED\u001b[0m\u001b[32m [ 55%]\u001b[0m",
                                "tests/unit/test_sources.py::test_sources_get_initial_tag_setup[tags0-0-2] \u001b[32mPASSED\u001b[0m\u001b[32m [ 55%]\u001b[0m",
                                "tests/unit/test_sources.py::test_sources_get_initial_tag_setup[tags1-999-0] \u001b[32mPASSED\u001b[0m\u001b[32m [ 55%]\u001b[0m",
                                "tests/unit/test_sources.py::test_sources_deduplicate_tag_names[tags0-deduplicated_tags0] \u001b[32mPASSED\u001b[0m\u001b[32m [ 55%]\u001b[0m",
                                "tests/unit/test_sources.py::test_sources_deduplicate_tag_names[tags1-deduplicated_tags1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 55%]\u001b[0m",
                                "tests/unit/test_sources.py::test_sources_deduplicate_tag_names[tags2-deduplicated_tags2] \u001b[32mPASSED\u001b[0m\u001b[32m [ 55%]\u001b[0m",
                                "tests/unit/test_sources.py::test_sources_deduplicate_tag_names[tags3-deduplicated_tags3] \u001b[32mPASSED\u001b[0m\u001b[32m [ 56%]\u001b[0m",
                                "tests/unit/test_sources.py::test_sources_deduplicate_tag_names[tags4-deduplicated_tags4] \u001b[32mPASSED\u001b[0m\u001b[32m [ 56%]\u001b[0m",
                                "tests/unit/test_sources.py::test_sources_deduplicate_tag_names[tags5-deduplicated_tags5] \u001b[32mPASSED\u001b[0m\u001b[32m [ 56%]\u001b[0m",
                                "tests/unit/test_sources.py::test_sources_deduplicate_tag_names[tags6-deduplicated_tags6] \u001b[32mPASSED\u001b[0m\u001b[32m [ 56%]\u001b[0m",
                                "tests/unit/test_sources.py::test_sources_insert[tags0-sourcelists0-0-test-0-TagSource] \u001b[32mPASSED\u001b[0m\u001b[32m [ 56%]\u001b[0m",
                                "tests/unit/test_sources.py::test_sources_insert[tags1-sourcelists1-0-test-0-ListSource] \u001b[32mPASSED\u001b[0m\u001b[32m [ 56%]\u001b[0m",
                                "tests/unit/test_sources.py::test_sources_insert[tags2-sourcelists2-10-test-2-TagSource] \u001b[32mPASSED\u001b[0m\u001b[32m [ 56%]\u001b[0m",
                                "tests/unit/test_sources.py::test_sources_insert[tags3-sourcelists3-10-test-4-ListSource] \u001b[32mPASSED\u001b[0m\u001b[32m [ 56%]\u001b[0m",
                                "tests/unit/test_sources.py::test_sources_insert[tags4-sourcelists4-1-test-1-TagSource] \u001b[32mPASSED\u001b[0m\u001b[32m [ 56%]\u001b[0m",
                                "tests/unit/test_sources.py::test_sources_insert[tags5-sourcelists5-1-test-10-TagSource] \u001b[32mPASSED\u001b[0m\u001b[32m [ 57%]\u001b[0m",
                                "tests/unit/test_sources.py::test_sources_insert[tags6-sourcelists6-2-test-2-ListSource] \u001b[32mPASSED\u001b[0m\u001b[32m [ 57%]\u001b[0m",
                                "tests/unit/test_sources.py::test_sources_insert[tags7-sourcelists7-10-source0-None-None] \u001b[32mPASSED\u001b[0m\u001b[32m [ 57%]\u001b[0m",
                                "tests/unit/test_sources.py::test_sources_insert_numbered[tags0-28-test-0] \u001b[32mPASSED\u001b[0m\u001b[32m [ 57%]\u001b[0m",
                                "tests/unit/test_sources.py::test_sources_insert_numbered[tags1-0-test-0] \u001b[32mPASSED\u001b[0m\u001b[32m [ 57%]\u001b[0m",
                                "tests/unit/test_sources.py::test_sources_insert_numbered[tags2-2-test-2] \u001b[32mPASSED\u001b[0m\u001b[32m [ 57%]\u001b[0m",
                                "tests/unit/test_sources.py::test_sources_insert_numbered[tags3-42-test-3] \u001b[32mPASSED\u001b[0m\u001b[32m [ 57%]\u001b[0m",
                                "tests/unit/test_sources.py::test_sources_insert_numbered[tags4-1000-test-4] \u001b[32mPASSED\u001b[0m\u001b[32m [ 57%]\u001b[0m",
                                "tests/unit/test_sources.py::test_sources_insert_numbered[tags5-37-test-1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 57%]\u001b[0m",
                                "tests/unit/test_sources.py::test_sources_remove_numbered[tags0-sourcelists0-1-new_tags0-new_sourcelists0] \u001b[32mPASSED\u001b[0m\u001b[32m [ 58%]\u001b[0m",
                                "tests/unit/test_sources.py::test_sources_remove_numbered[tags1-sourcelists1-2-new_tags1-new_sourcelists1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 58%]\u001b[0m",
                                "tests/unit/test_sources.py::test_sources_remove_numbered[tags2-sourcelists2-2-new_tags2-new_sourcelists2] \u001b[32mPASSED\u001b[0m\u001b[32m [ 58%]\u001b[0m",
                                "tests/unit/test_sources.py::test_patches_get_tag_format[Patch99-:      -100-Patch100-:     ] \u001b[32mPASSED\u001b[0m\u001b[32m [ 58%]\u001b[0m",
                                "tests/unit/test_sources.py::test_patches_get_tag_format[Patch9999-:  -28-Patch28-:    ] \u001b[32mPASSED\u001b[0m\u001b[32m [ 58%]\u001b[0m",
                                "tests/unit/test_sources.py::test_patches_get_tag_format[Patch0999-:  -28-Patch0028-:  ] \u001b[32mPASSED\u001b[0m\u001b[32m [ 58%]\u001b[0m",
                                "tests/unit/test_sources.py::test_patches_get_tag_format[Source2-:     -0-Patch0-:      ] \u001b[32mPASSED\u001b[0m\u001b[32m [ 58%]\u001b[0m",
                                "tests/unit/test_sources.py::test_patches_get_initial_tag_setup[tags0-0-3] \u001b[32mPASSED\u001b[0m\u001b[32m [ 58%]\u001b[0m",
                                "tests/unit/test_sources.py::test_patches_get_initial_tag_setup[tags1-1-3] \u001b[32mPASSED\u001b[0m\u001b[32m [ 58%]\u001b[0m",
                                "tests/unit/test_sources.py::test_patches_get_initial_tag_setup[tags2-2-2] \u001b[32mPASSED\u001b[0m\u001b[32m [ 59%]\u001b[0m",
                                "tests/unit/test_sources.py::test_patches_get_initial_tag_setup[tags3-999-0] \u001b[32mPASSED\u001b[0m\u001b[32m [ 59%]\u001b[0m",
                                "tests/unit/test_sources.py::test_copy_sources \u001b[32mPASSED\u001b[0m\u001b[32m                     [ 59%]\u001b[0m",
                                "tests/unit/test_spec_parser.py::test_spec_parser_do_parse \u001b[32mPASSED\u001b[0m\u001b[32m         [ 59%]\u001b[0m",
                                "tests/unit/test_spec_parser.py::test_copy_spec_parser \u001b[32mPASSED\u001b[0m\u001b[32m             [ 59%]\u001b[0m",
                                "tests/unit/test_spec_parser.py::test_spec_parser_macros \u001b[32mPASSED\u001b[0m\u001b[32m           [ 59%]\u001b[0m",
                                "tests/unit/test_spec_parser.py::test_spec_parser_make_dummy_sources \u001b[32mPASSED\u001b[0m\u001b[32m [ 59%]\u001b[0m",
                                "tests/unit/test_specfile.py::test_split_raw_release[1%{?dist}-1-%{?dist}-None] \u001b[32mPASSED\u001b[0m\u001b[32m [ 59%]\u001b[0m",
                                "tests/unit/test_specfile.py::test_split_raw_release[0.1%{prerelease}%{dist}-0.1%{prerelease}-%{dist}-None] \u001b[32mPASSED\u001b[0m\u001b[32m [ 59%]\u001b[0m",
                                "tests/unit/test_specfile.py::test_split_raw_release[%{_short_release}%{?dist}.20-%{_short_release}-%{?dist}-20] \u001b[32mPASSED\u001b[0m\u001b[32m [ 60%]\u001b[0m",
                                "tests/unit/test_specfile.py::test_split_raw_release[28%dist-28-%dist-None] \u001b[32mPASSED\u001b[0m\u001b[32m [ 60%]\u001b[0m",
                                "tests/unit/test_specfile.py::test_split_raw_release[%{release_string}-%{release_string}-None-None] \u001b[32mPASSED\u001b[0m\u001b[32m [ 60%]\u001b[0m",
                                "tests/unit/test_specfile.py::test_get_updated_release[1%{?dist}-28-28%{?dist}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 60%]\u001b[0m",
                                "tests/unit/test_specfile.py::test_get_updated_release[0.1%{prerelease}%{dist}-1-1%{dist}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 60%]\u001b[0m",
                                "tests/unit/test_specfile.py::test_get_updated_release[%{_short_release}%{?dist}.20-3-3%{?dist}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 60%]\u001b[0m",
                                "tests/unit/test_specfile.py::test_get_updated_release[28%dist-0.1-0.1%dist] \u001b[32mPASSED\u001b[0m\u001b[32m [ 60%]\u001b[0m",
                                "tests/unit/test_specfile.py::test_get_updated_release[%{release_string}-1-1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 60%]\u001b[0m",
                                "tests/unit/test_specfile.py::test_bump_release_string[1%{?dist}-2%{?dist}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 60%]\u001b[0m",
                                "tests/unit/test_specfile.py::test_bump_release_string[0.1%{?dist}-0.2%{?dist}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 61%]\u001b[0m",
                                "tests/unit/test_specfile.py::test_bump_release_string[%release_func 26-%release_func 27] \u001b[32mPASSED\u001b[0m\u001b[32m [ 61%]\u001b[0m",
                                "tests/unit/test_specfile.py::test_bump_release_string[0.24.rc1%{?dist}-0.25.rc1%{?dist}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 61%]\u001b[0m",
                                "tests/unit/test_specfile.py::test_bump_release_string[0.2.%{prerel}%{?dist}-0.3.%{prerel}%{?dist}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 61%]\u001b[0m",
                                "tests/unit/test_specfile.py::test_bump_release_string[0.8.%{commitdate}%{shortcommit}%{?dist}-0.9.%{commitdate}%{shortcommit}%{?dist}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 61%]\u001b[0m",
                                "tests/unit/test_specfile.py::test_bump_release_string[3.%{git_date}git%{git_commit_short}%{?dist}-4.%{git_date}git%{git_commit_short}%{?dist}] \u001b[32mPASSED\u001b[0m\u001b[32m [ 61%]\u001b[0m",
                                "tests/unit/test_specfile.py::test_bump_release_string[1%{?rcrel}%{?dist}.1-1%{?rcrel}%{?dist}.2] \u001b[32mPASSED\u001b[0m\u001b[32m [ 61%]\u001b[0m",
                                "tests/unit/test_specfile.py::test_bump_release_string[%{?beta_ver:0.}%{fedora_rel}%{?beta_ver:.%beta_ver}%{?dist}%{flagrel}%{?extrarel}-%{?beta_ver:0.}%{fedora_rel}%{?beta_ver:.%beta_ver}%{?dist}%{flagrel}%{?extrarel}.1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 61%]\u001b[0m",
                                "tests/unit/test_specfile.py::test_bump_release_string[4.rc2%{?dist}-4.rc2%{?dist}.1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 61%]\u001b[0m",
                                "tests/unit/test_tags.py::test_find \u001b[32mPASSED\u001b[0m\u001b[32m                                [ 62%]\u001b[0m",
                                "tests/unit/test_tags.py::test_parse \u001b[32mPASSED\u001b[0m\u001b[32m                               [ 62%]\u001b[0m",
                                "tests/unit/test_tags.py::test_get_raw_section_data \u001b[32mPASSED\u001b[0m\u001b[32m                [ 62%]\u001b[0m",
                                "tests/unit/test_tags.py::test_copy_tags \u001b[32mPASSED\u001b[0m\u001b[32m                           [ 62%]\u001b[0m",
                                "tests/unit/test_utils.py::test_get_filename_from_location[-] \u001b[32mPASSED\u001b[0m\u001b[32m      [ 62%]\u001b[0m",
                                "tests/unit/test_utils.py::test_get_filename_from_location[tarball-0.1.tar.gz-tarball-0.1.tar.gz] \u001b[32mPASSED\u001b[0m\u001b[32m [ 62%]\u001b[0m",
                                "tests/unit/test_utils.py::test_get_filename_from_location[https://example.com-example.com] \u001b[32mPASSED\u001b[0m\u001b[32m [ 62%]\u001b[0m",
                                "tests/unit/test_utils.py::test_get_filename_from_location[https://example.com#fragment-example.com#fragment] \u001b[32mPASSED\u001b[0m\u001b[32m [ 62%]\u001b[0m",
                                "tests/unit/test_utils.py::test_get_filename_from_location[https://example.com/archive/tarball-0.1.tar.gz-tarball-0.1.tar.gz] \u001b[32mPASSED\u001b[0m\u001b[32m [ 62%]\u001b[0m",
                                "tests/unit/test_utils.py::test_get_filename_from_location[https://example.com/archive/tarball-0.1.tar.gz#fragment-tarball-0.1.tar.gz#fragment] \u001b[32mPASSED\u001b[0m\u001b[32m [ 63%]\u001b[0m",
                                "tests/unit/test_utils.py::test_get_filename_from_location[https://example.com/download_tarball.cgi#/tarball-0.1.tar.gz-tarball-0.1.tar.gz] \u001b[32mPASSED\u001b[0m\u001b[32m [ 63%]\u001b[0m",
                                "tests/unit/test_utils.py::test_get_filename_from_location[https://example.com/tarball-latest.tar.gz#/file=tarball-0.1.tar.gz-tarball-0.1.tar.gz] \u001b[32mPASSED\u001b[0m\u001b[32m [ 63%]\u001b[0m",
                                "tests/unit/test_utils.py::test_count_brackets[-count0] \u001b[32mPASSED\u001b[0m\u001b[32m            [ 63%]\u001b[0m",
                                "tests/unit/test_utils.py::test_count_brackets[%macro-count1] \u001b[32mPASSED\u001b[0m\u001b[32m      [ 63%]\u001b[0m",
                                "tests/unit/test_utils.py::test_count_brackets[%{macro}-count2] \u001b[32mPASSED\u001b[0m\u001b[32m    [ 63%]\u001b[0m",
                                "tests/unit/test_utils.py::test_count_brackets[%{{macro}}-count3] \u001b[32mPASSED\u001b[0m\u001b[32m  [ 63%]\u001b[0m",
                                "tests/unit/test_utils.py::test_count_brackets[%{{macro}-count4] \u001b[32mPASSED\u001b[0m\u001b[32m   [ 63%]\u001b[0m",
                                "tests/unit/test_utils.py::test_count_brackets[%{macro:-count5] \u001b[32mPASSED\u001b[0m\u001b[32m    [ 63%]\u001b[0m",
                                "tests/unit/test_utils.py::test_count_brackets[%(echo %{v}-count6] \u001b[32mPASSED\u001b[0m\u001b[32m [ 64%]\u001b[0m",
                                "tests/unit/test_utils.py::test_count_brackets[%(echo %{v} | cut -d. -f3)-count7] \u001b[32mPASSED\u001b[0m\u001b[32m [ 64%]\u001b[0m",
                                "tests/unit/test_utils.py::test_EVR_compare \u001b[32mPASSED\u001b[0m\u001b[32m                        [ 64%]\u001b[0m",
                                "tests/unit/test_utils.py::test_NEVR_compare \u001b[32mPASSED\u001b[0m\u001b[32m                       [ 64%]\u001b[0m",
                                "tests/unit/test_utils.py::test_NEVRA_compare \u001b[32mPASSED\u001b[0m\u001b[32m                      [ 64%]\u001b[0m",
                                "tests/unit/test_utils.py::test_EVR_from_string[0-result0] \u001b[32mPASSED\u001b[0m\u001b[32m         [ 64%]\u001b[0m",
                                "tests/unit/test_utils.py::test_EVR_from_string[12.0-1-result1] \u001b[32mPASSED\u001b[0m\u001b[32m    [ 64%]\u001b[0m",
                                "tests/unit/test_utils.py::test_EVR_from_string[2:56.8-5-result2] \u001b[32mPASSED\u001b[0m\u001b[32m  [ 64%]\u001b[0m",
                                "tests/unit/test_utils.py::test_EVR_from_string[0.8.0-1.fc37-result3] \u001b[32mPASSED\u001b[0m\u001b[32m [ 64%]\u001b[0m",
                                "tests/unit/test_utils.py::test_EVR_from_string[0.5.0~rc2-1.el9-result4] \u001b[32mPASSED\u001b[0m\u001b[32m [ 65%]\u001b[0m",
                                "tests/unit/test_utils.py::test_EVR_from_string[7.3-0.2.rc1.fc38-result5] \u001b[32mPASSED\u001b[0m\u001b[32m [ 65%]\u001b[0m",
                                "tests/unit/test_utils.py::test_EVR_from_string[7.3~rc1^20200701gdeadf00f-12.fc38-result6] \u001b[32mPASSED\u001b[0m\u001b[32m [ 65%]\u001b[0m",
                                "tests/unit/test_utils.py::test_NEVR_from_string[package-0-result0] \u001b[32mPASSED\u001b[0m\u001b[32m [ 65%]\u001b[0m",
                                "tests/unit/test_utils.py::test_NEVR_from_string[package-12.0-1-result1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 65%]\u001b[0m",
                                "tests/unit/test_utils.py::test_NEVR_from_string[package-2:56.8-5-result2] \u001b[32mPASSED\u001b[0m\u001b[32m [ 65%]\u001b[0m",
                                "tests/unit/test_utils.py::test_NEVR_from_string[package-0.8.0-1.fc37-result3] \u001b[32mPASSED\u001b[0m\u001b[32m [ 65%]\u001b[0m",
                                "tests/unit/test_utils.py::test_NEVR_from_string[package-0.5.0~rc2-1.el9-result4] \u001b[32mPASSED\u001b[0m\u001b[32m [ 65%]\u001b[0m",
                                "tests/unit/test_utils.py::test_NEVR_from_string[package-devel-7.3-0.2.rc1.fc38-result5] \u001b[32mPASSED\u001b[0m\u001b[32m [ 65%]\u001b[0m",
                                "tests/unit/test_utils.py::test_NEVR_from_string[package-7.3~rc1^20200701gdeadf00f-12.fc38-result6] \u001b[32mPASSED\u001b[0m\u001b[32m [ 66%]\u001b[0m",
                                "tests/unit/test_utils.py::test_NEVRA_from_string[package-12.0-1.x86_64-result0] \u001b[32mPASSED\u001b[0m\u001b[32m [ 66%]\u001b[0m",
                                "tests/unit/test_utils.py::test_NEVRA_from_string[package-2:56.8-5.aarch64-result1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 66%]\u001b[0m",
                                "tests/unit/test_utils.py::test_NEVRA_from_string[package-0.8.0-1.fc37.armv6hl-result2] \u001b[32mPASSED\u001b[0m\u001b[32m [ 66%]\u001b[0m",
                                "tests/unit/test_utils.py::test_NEVRA_from_string[package-0.5.0~rc2-1.el9.noarch-result3] \u001b[32mPASSED\u001b[0m\u001b[32m [ 66%]\u001b[0m",
                                "tests/unit/test_utils.py::test_NEVRA_from_string[package-devel-7.3-0.2.rc1.fc38.i686-result4] \u001b[32mPASSED\u001b[0m\u001b[32m [ 66%]\u001b[0m",
                                "tests/unit/test_utils.py::test_NEVRA_from_string[package-7.3~rc1^20200701gdeadf00f-12.fc38.riscv-result5] \u001b[32mPASSED\u001b[0m\u001b[32m [ 66%]\u001b[0m",
                                "tests/unit/test_value_parser.py::test_parse[-nodes0] \u001b[32mPASSED\u001b[0m\u001b[32m              [ 66%]\u001b[0m",
                                "tests/unit/test_value_parser.py::test_parse[escaped %%macro-nodes1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 66%]\u001b[0m",
                                "tests/unit/test_value_parser.py::test_parse[%(echo %{version} | cut -d. -f3)-nodes2] \u001b[32mPASSED\u001b[0m\u001b[32m [ 66%]\u001b[0m",
                                "tests/unit/test_value_parser.py::test_parse[%version-nodes3] \u001b[32mPASSED\u001b[0m\u001b[32m      [ 67%]\u001b[0m",
                                "tests/unit/test_value_parser.py::test_parse[1%{?dist}-nodes4] \u001b[32mPASSED\u001b[0m\u001b[32m     [ 67%]\u001b[0m",
                                "tests/unit/test_value_parser.py::test_parse[%{longdesc %{name}}-nodes5] \u001b[32mPASSED\u001b[0m\u001b[32m [ 67%]\u001b[0m",
                                "tests/unit/test_value_parser.py::test_parse[%{fedorarel}%{?dist}.2-nodes6] \u001b[32mPASSED\u001b[0m\u001b[32m [ 67%]\u001b[0m",
                                "tests/unit/test_value_parser.py::test_parse[%{?prever:0.}%{mainrel}%{?prever:.%{prerpmver}}-nodes7] \u001b[32mPASSED\u001b[0m\u001b[32m [ 67%]\u001b[0m",
                                "tests/unit/test_value_parser.py::test_parse[%{lua:ver = string.gsub(rpm.expand(\"%{ver}\"), \"-\", \"~\"); print(string.lower(ver))}-nodes8] \u001b[32mPASSED\u001b[0m\u001b[32m [ 67%]\u001b[0m",
                                "tests/unit/test_value_parser.py::test_parse[%{%{28}}-nodes9] \u001b[32mPASSED\u001b[0m\u001b[32m      [ 67%]\u001b[0m",
                                "tests/unit/test_value_parser.py::test_parse[%{%{macro}}-nodes10] \u001b[32mPASSED\u001b[0m\u001b[32m  [ 67%]\u001b[0m",
                                "tests/unit/test_value_parser.py::test_parse[%{upper:%{name}}-nodes11] \u001b[32mPASSED\u001b[0m\u001b[32m [ 67%]\u001b[0m",
                                "tests/unit/test_value_parser.py::test_parse[%{version_no_tilde %{quote:nil}}-nodes12] \u001b[32mPASSED\u001b[0m\u001b[32m [ 68%]\u001b[0m",
                                "tests/unit/test_value_parser.py::test_construct_regex[%(echo %version | cut -d. -f1,2).0-macros0-modifiable_entities0-flippable_entities0-^1\\\\.1(?P<sub_0>.+?)$-%(echo %version | cut -d. -f1,2)${sub_0}-entities_to_flip0] \u001b[32mPASSED\u001b[0m\u001b[32m [ 68%]\u001b[0m",
                                "tests/unit/test_value_parser.py::test_construct_regex[%version-macros1-modifiable_entities1-flippable_entities1-^(?P<version>.+)$-%version-entities_to_flip1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 68%]\u001b[0m",
                                "tests/unit/test_value_parser.py::test_construct_regex[%?version-macros2-modifiable_entities2-flippable_entities2-^(?P<version>.+)$-%?version-entities_to_flip2] \u001b[32mPASSED\u001b[0m\u001b[32m [ 68%]\u001b[0m",
                                "tests/unit/test_value_parser.py::test_construct_regex[%!?version-macros3-modifiable_entities3-flippable_entities3-^$-%!?version-entities_to_flip3] \u001b[32mPASSED\u001b[0m\u001b[32m [ 68%]\u001b[0m",
                                "tests/unit/test_value_parser.py::test_construct_regex[1%{?dist}-macros4-modifiable_entities4-flippable_entities4-^(?P<sub_0>.+?)\\\\.fc35$-${sub_0}%{?dist}-entities_to_flip4] \u001b[32mPASSED\u001b[0m\u001b[32m [ 68%]\u001b[0m",
                                "tests/unit/test_value_parser.py::test_construct_regex[%{longdesc %name}-macros5-modifiable_entities5-flippable_entities5-^Lorem\\\\ ipsum\\\\ dolor\\\\ sit\\\\ amet$-%{longdesc %name}-entities_to_flip5] \u001b[32mPASSED\u001b[0m\u001b[32m [ 68%]\u001b[0m",
                                "tests/unit/test_value_parser.py::test_construct_regex[%{?prever:0.}%{mainrel}%{?prever:.%{prerpmver}}-macros6-modifiable_entities6-flippable_entities6-^(?P<sub_0>.+?)\\\\.(?P<mainrel>.+)\\\\.(?P<prerpmver>.+)$-%{?prever:${sub_0}.}%{mainrel}%{?prever:.%{prerpmver}}-entities_to_flip6] \u001b[32mPASSED\u001b[0m\u001b[32m [ 68%]\u001b[0m",
                                "tests/unit/test_value_parser.py::test_construct_regex[%{?prever:0.}%{mainrel}%{?prever:.%{prerpmver}}-macros7-modifiable_entities7-flippable_entities7-^(?P<sub_0>.+?)\\\\.(?P<mainrel>.+)\\\\.(?P<prerpmver>.+)$-%{?prever:${sub_0}.}%{mainrel}%{?prever:.%{prerpmver}}-entities_to_flip7] \u001b[32mPASSED\u001b[0m\u001b[32m [ 68%]\u001b[0m",
                                "tests/unit/test_value_parser.py::test_construct_regex[%{mingw64_libdir}/lib%{pkgname}stub%{majorver1}%{majorver2}.a-macros8-modifiable_entities8-flippable_entities8-^$-%{mingw64_libdir}/lib%{pkgname}stub%{majorver1}%{majorver2}.a-entities_to_flip8] \u001b[32mPASSED\u001b[0m\u001b[32m [ 69%]\u001b[0m",
                                "tests/unit/test_value_parser.py::test_construct_regex[%{?commit:%{commit}}%{?!commit:%{tag}}-macros9-modifiable_entities9-flippable_entities9-^(?P<commit>.+)$-%{?commit:%{commit}}%{?!commit:%{tag}}-entities_to_flip9] \u001b[32mPASSED\u001b[0m\u001b[32m [ 69%]\u001b[0m",
                                "tests/unit/test_value_parser.py::test_construct_regex[%{?commit:%{commit}}%{?!commit:%{tag}}-macros10-modifiable_entities10-flippable_entities10-^(?P<commit>.+)$-%{?commit:%{commit}}%{?!commit:%{tag}}-entities_to_flip10] \u001b[32mPASSED\u001b[0m\u001b[32m [ 69%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_parse \u001b[32mPASSED\u001b[0m\u001b[32m                    [ 69%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_prep_traditional[file_path] \u001b[32mPASSED\u001b[0m\u001b[32m [ 69%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_prep_traditional[text_file] \u001b[32mPASSED\u001b[0m\u001b[32m [ 69%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_prep_traditional[binary_file] \u001b[32mPASSED\u001b[0m\u001b[32m [ 69%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_prep_traditional[text_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 69%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_prep_traditional[binary_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 69%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_prep_traditional[content_string] \u001b[32mPASSED\u001b[0m\u001b[32m [ 70%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_prep_autosetup[file_path] \u001b[32mPASSED\u001b[0m\u001b[32m [ 70%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_prep_autosetup[text_file] \u001b[32mPASSED\u001b[0m\u001b[32m [ 70%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_prep_autosetup[binary_file] \u001b[32mPASSED\u001b[0m\u001b[32m [ 70%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_prep_autosetup[text_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 70%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_prep_autosetup[binary_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 70%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_prep_autosetup[content_string] \u001b[32mPASSED\u001b[0m\u001b[32m [ 70%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_prep_autopatch[file_path] \u001b[32mPASSED\u001b[0m\u001b[32m [ 70%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_prep_autopatch[text_file] \u001b[32mPASSED\u001b[0m\u001b[32m [ 70%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_prep_autopatch[binary_file] \u001b[32mPASSED\u001b[0m\u001b[32m [ 71%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_prep_autopatch[text_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 71%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_prep_autopatch[binary_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 71%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_prep_autopatch[content_string] \u001b[32mPASSED\u001b[0m\u001b[32m [ 71%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_sources[file_path] \u001b[32mPASSED\u001b[0m\u001b[32m       [ 71%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_sources[text_file] \u001b[32mPASSED\u001b[0m\u001b[32m       [ 71%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_sources[binary_file] \u001b[32mPASSED\u001b[0m\u001b[32m     [ 71%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_sources[text_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m  [ 71%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_sources[binary_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 71%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_sources[content_string] \u001b[32mPASSED\u001b[0m\u001b[32m  [ 72%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_patches[file_path] \u001b[32mPASSED\u001b[0m\u001b[32m       [ 72%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_patches[text_file] \u001b[32mPASSED\u001b[0m\u001b[32m       [ 72%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_patches[binary_file] \u001b[32mPASSED\u001b[0m\u001b[32m     [ 72%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_patches[text_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m  [ 72%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_patches[binary_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 72%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_patches[content_string] \u001b[32mPASSED\u001b[0m\u001b[32m  [ 72%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_changelog_entry[file_path-test-None-None-timestamp0-None-result0] \u001b[32mPASSED\u001b[0m\u001b[32m [ 72%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_changelog_entry[file_path-test-None-None-timestamp1-%{version}-%{release}-result1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 72%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_changelog_entry[file_path-test-None-None-timestamp2-0.1-1-result2] \u001b[32mPASSED\u001b[0m\u001b[32m [ 73%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_changelog_entry[file_path-test-None-None-timestamp3-0.2-1.1-result3] \u001b[32mPASSED\u001b[0m\u001b[32m [ 73%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_changelog_entry[file_path-test-Bill Packager-None-timestamp4-None-result4] \u001b[32mPASSED\u001b[0m\u001b[32m [ 73%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_changelog_entry[file_path-test-Bill Packager-bill@packager.net-timestamp5-None-result5] \u001b[32mPASSED\u001b[0m\u001b[32m [ 73%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_changelog_entry[file_path-test-Bill Packager-bill@packager.net-timestamp6-None-result6] \u001b[32mPASSED\u001b[0m\u001b[32m [ 73%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_changelog_entry[file_path-entry7-Bill Packager-bill@packager.net-timestamp7-None-result7] \u001b[32mPASSED\u001b[0m\u001b[32m [ 73%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_changelog_entry[text_file-test-None-None-timestamp0-None-result0] \u001b[32mPASSED\u001b[0m\u001b[32m [ 73%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_changelog_entry[text_file-test-None-None-timestamp1-%{version}-%{release}-result1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 73%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_changelog_entry[text_file-test-None-None-timestamp2-0.1-1-result2] \u001b[32mPASSED\u001b[0m\u001b[32m [ 73%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_changelog_entry[text_file-test-None-None-timestamp3-0.2-1.1-result3] \u001b[32mPASSED\u001b[0m\u001b[32m [ 74%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_changelog_entry[text_file-test-Bill Packager-None-timestamp4-None-result4] \u001b[32mPASSED\u001b[0m\u001b[32m [ 74%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_changelog_entry[text_file-test-Bill Packager-bill@packager.net-timestamp5-None-result5] \u001b[32mPASSED\u001b[0m\u001b[32m [ 74%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_changelog_entry[text_file-test-Bill Packager-bill@packager.net-timestamp6-None-result6] \u001b[32mPASSED\u001b[0m\u001b[32m [ 74%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_changelog_entry[text_file-entry7-Bill Packager-bill@packager.net-timestamp7-None-result7] \u001b[32mPASSED\u001b[0m\u001b[32m [ 74%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_changelog_entry[binary_file-test-None-None-timestamp0-None-result0] \u001b[32mPASSED\u001b[0m\u001b[32m [ 74%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_changelog_entry[binary_file-test-None-None-timestamp1-%{version}-%{release}-result1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 74%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_changelog_entry[binary_file-test-None-None-timestamp2-0.1-1-result2] \u001b[32mPASSED\u001b[0m\u001b[32m [ 74%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_changelog_entry[binary_file-test-None-None-timestamp3-0.2-1.1-result3] \u001b[32mPASSED\u001b[0m\u001b[32m [ 74%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_changelog_entry[binary_file-test-Bill Packager-None-timestamp4-None-result4] \u001b[32mPASSED\u001b[0m\u001b[32m [ 75%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_changelog_entry[binary_file-test-Bill Packager-bill@packager.net-timestamp5-None-result5] \u001b[32mPASSED\u001b[0m\u001b[32m [ 75%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_changelog_entry[binary_file-test-Bill Packager-bill@packager.net-timestamp6-None-result6] \u001b[32mPASSED\u001b[0m\u001b[32m [ 75%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_changelog_entry[binary_file-entry7-Bill Packager-bill@packager.net-timestamp7-None-result7] \u001b[32mPASSED\u001b[0m\u001b[32m [ 75%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_changelog_entry[text_io_stream-test-None-None-timestamp0-None-result0] \u001b[32mPASSED\u001b[0m\u001b[32m [ 75%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_changelog_entry[text_io_stream-test-None-None-timestamp1-%{version}-%{release}-result1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 75%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_changelog_entry[text_io_stream-test-None-None-timestamp2-0.1-1-result2] \u001b[32mPASSED\u001b[0m\u001b[32m [ 75%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_changelog_entry[text_io_stream-test-None-None-timestamp3-0.2-1.1-result3] \u001b[32mPASSED\u001b[0m\u001b[32m [ 75%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_changelog_entry[text_io_stream-test-Bill Packager-None-timestamp4-None-result4] \u001b[32mPASSED\u001b[0m\u001b[32m [ 75%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_changelog_entry[text_io_stream-test-Bill Packager-bill@packager.net-timestamp5-None-result5] \u001b[32mPASSED\u001b[0m\u001b[32m [ 76%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_changelog_entry[text_io_stream-test-Bill Packager-bill@packager.net-timestamp6-None-result6] \u001b[32mPASSED\u001b[0m\u001b[32m [ 76%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_changelog_entry[text_io_stream-entry7-Bill Packager-bill@packager.net-timestamp7-None-result7] \u001b[32mPASSED\u001b[0m\u001b[32m [ 76%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_changelog_entry[binary_io_stream-test-None-None-timestamp0-None-result0] \u001b[32mPASSED\u001b[0m\u001b[32m [ 76%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_changelog_entry[binary_io_stream-test-None-None-timestamp1-%{version}-%{release}-result1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 76%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_changelog_entry[binary_io_stream-test-None-None-timestamp2-0.1-1-result2] \u001b[32mPASSED\u001b[0m\u001b[32m [ 76%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_changelog_entry[binary_io_stream-test-None-None-timestamp3-0.2-1.1-result3] \u001b[32mPASSED\u001b[0m\u001b[32m [ 76%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_changelog_entry[binary_io_stream-test-Bill Packager-None-timestamp4-None-result4] \u001b[32mPASSED\u001b[0m\u001b[32m [ 76%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_changelog_entry[binary_io_stream-test-Bill Packager-bill@packager.net-timestamp5-None-result5] \u001b[32mPASSED\u001b[0m\u001b[32m [ 76%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_changelog_entry[binary_io_stream-test-Bill Packager-bill@packager.net-timestamp6-None-result6] \u001b[32mPASSED\u001b[0m\u001b[32m [ 77%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_changelog_entry[binary_io_stream-entry7-Bill Packager-bill@packager.net-timestamp7-None-result7] \u001b[32mPASSED\u001b[0m\u001b[32m [ 77%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_changelog_entry[content_string-test-None-None-timestamp0-None-result0] \u001b[32mPASSED\u001b[0m\u001b[32m [ 77%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_changelog_entry[content_string-test-None-None-timestamp1-%{version}-%{release}-result1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 77%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_changelog_entry[content_string-test-None-None-timestamp2-0.1-1-result2] \u001b[32mPASSED\u001b[0m\u001b[32m [ 77%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_changelog_entry[content_string-test-None-None-timestamp3-0.2-1.1-result3] \u001b[32mPASSED\u001b[0m\u001b[32m [ 77%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_changelog_entry[content_string-test-Bill Packager-None-timestamp4-None-result4] \u001b[32mPASSED\u001b[0m\u001b[32m [ 77%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_changelog_entry[content_string-test-Bill Packager-bill@packager.net-timestamp5-None-result5] \u001b[32mPASSED\u001b[0m\u001b[32m [ 77%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_changelog_entry[content_string-test-Bill Packager-bill@packager.net-timestamp6-None-result6] \u001b[32mPASSED\u001b[0m\u001b[32m [ 77%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_changelog_entry[content_string-entry7-Bill Packager-bill@packager.net-timestamp7-None-result7] \u001b[32mPASSED\u001b[0m\u001b[32m [ 78%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_changelog_entry_ignores_invalid_padding[file_path] \u001b[32mPASSED\u001b[0m\u001b[32m [ 78%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_changelog_entry_ignores_invalid_padding[text_file] \u001b[32mPASSED\u001b[0m\u001b[32m [ 78%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_changelog_entry_ignores_invalid_padding[binary_file] \u001b[32mPASSED\u001b[0m\u001b[32m [ 78%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_changelog_entry_ignores_invalid_padding[text_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 78%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_changelog_entry_ignores_invalid_padding[binary_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 78%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_changelog_entry_ignores_invalid_padding[content_string] \u001b[32mPASSED\u001b[0m\u001b[32m [ 78%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_set_version_and_release[file_path-0.2-3] \u001b[32mPASSED\u001b[0m\u001b[32m [ 78%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_set_version_and_release[file_path-67-1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 78%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_set_version_and_release[file_path-1.4.6-0.1rc5] \u001b[32mPASSED\u001b[0m\u001b[32m [ 79%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_set_version_and_release[text_file-0.2-3] \u001b[32mPASSED\u001b[0m\u001b[32m [ 79%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_set_version_and_release[text_file-67-1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 79%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_set_version_and_release[text_file-1.4.6-0.1rc5] \u001b[32mPASSED\u001b[0m\u001b[32m [ 79%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_set_version_and_release[binary_file-0.2-3] \u001b[32mPASSED\u001b[0m\u001b[32m [ 79%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_set_version_and_release[binary_file-67-1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 79%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_set_version_and_release[binary_file-1.4.6-0.1rc5] \u001b[32mPASSED\u001b[0m\u001b[32m [ 79%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_set_version_and_release[text_io_stream-0.2-3] \u001b[32mPASSED\u001b[0m\u001b[32m [ 79%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_set_version_and_release[text_io_stream-67-1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 79%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_set_version_and_release[text_io_stream-1.4.6-0.1rc5] \u001b[32mPASSED\u001b[0m\u001b[32m [ 80%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_set_version_and_release[binary_io_stream-0.2-3] \u001b[32mPASSED\u001b[0m\u001b[32m [ 80%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_set_version_and_release[binary_io_stream-67-1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 80%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_set_version_and_release[binary_io_stream-1.4.6-0.1rc5] \u001b[32mPASSED\u001b[0m\u001b[32m [ 80%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_set_version_and_release[content_string-0.2-3] \u001b[32mPASSED\u001b[0m\u001b[32m [ 80%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_set_version_and_release[content_string-67-1] \u001b[32mPASSED\u001b[0m\u001b[32m [ 80%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_set_version_and_release[content_string-1.4.6-0.1rc5] \u001b[32mPASSED\u001b[0m\u001b[32m [ 80%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_patch[file_path-patchX.patch-None-None] \u001b[32mPASSED\u001b[0m\u001b[32m [ 80%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_patch[file_path-patchX.patch-0-None] \u001b[32mPASSED\u001b[0m\u001b[32m [ 80%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_patch[file_path-patch2.patch-None-None] \u001b[32mPASSED\u001b[0m\u001b[32m [ 81%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_patch[file_path-patch3.patch-3-patch3] \u001b[32mPASSED\u001b[0m\u001b[32m [ 81%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_patch[text_file-patchX.patch-None-None] \u001b[32mPASSED\u001b[0m\u001b[32m [ 81%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_patch[text_file-patchX.patch-0-None] \u001b[32mPASSED\u001b[0m\u001b[32m [ 81%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_patch[text_file-patch2.patch-None-None] \u001b[32mPASSED\u001b[0m\u001b[32m [ 81%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_patch[text_file-patch3.patch-3-patch3] \u001b[32mPASSED\u001b[0m\u001b[32m [ 81%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_patch[binary_file-patchX.patch-None-None] \u001b[32mPASSED\u001b[0m\u001b[32m [ 81%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_patch[binary_file-patchX.patch-0-None] \u001b[32mPASSED\u001b[0m\u001b[32m [ 81%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_patch[binary_file-patch2.patch-None-None] \u001b[32mPASSED\u001b[0m\u001b[32m [ 81%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_patch[binary_file-patch3.patch-3-patch3] \u001b[32mPASSED\u001b[0m\u001b[32m [ 82%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_patch[text_io_stream-patchX.patch-None-None] \u001b[32mPASSED\u001b[0m\u001b[32m [ 82%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_patch[text_io_stream-patchX.patch-0-None] \u001b[32mPASSED\u001b[0m\u001b[32m [ 82%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_patch[text_io_stream-patch2.patch-None-None] \u001b[32mPASSED\u001b[0m\u001b[32m [ 82%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_patch[text_io_stream-patch3.patch-3-patch3] \u001b[32mPASSED\u001b[0m\u001b[32m [ 82%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_patch[binary_io_stream-patchX.patch-None-None] \u001b[32mPASSED\u001b[0m\u001b[32m [ 82%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_patch[binary_io_stream-patchX.patch-0-None] \u001b[32mPASSED\u001b[0m\u001b[32m [ 82%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_patch[binary_io_stream-patch2.patch-None-None] \u001b[32mPASSED\u001b[0m\u001b[32m [ 82%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_patch[binary_io_stream-patch3.patch-3-patch3] \u001b[32mPASSED\u001b[0m\u001b[32m [ 82%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_patch[content_string-patchX.patch-None-None] \u001b[32mPASSED\u001b[0m\u001b[32m [ 83%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_patch[content_string-patchX.patch-0-None] \u001b[32mPASSED\u001b[0m\u001b[32m [ 83%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_patch[content_string-patch2.patch-None-None] \u001b[32mPASSED\u001b[0m\u001b[32m [ 83%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_add_patch[content_string-patch3.patch-3-patch3] \u001b[32mPASSED\u001b[0m\u001b[32m [ 83%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_remove_patches[file_path] \u001b[32mPASSED\u001b[0m\u001b[32m [ 83%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_remove_patches[text_file] \u001b[32mPASSED\u001b[0m\u001b[32m [ 83%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_remove_patches[binary_file] \u001b[32mPASSED\u001b[0m\u001b[32m [ 83%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_remove_patches[text_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 83%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_remove_patches[binary_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 83%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_remove_patches[content_string] \u001b[32mPASSED\u001b[0m\u001b[32m [ 84%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_autorelease[file_path-1%{?dist}-False] \u001b[32mPASSED\u001b[0m\u001b[32m [ 84%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_autorelease[file_path-%{release_number}%{?dist}-False] \u001b[32mPASSED\u001b[0m\u001b[32m [ 84%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_autorelease[file_path-0.27.%{commitdate}git%{shortcommit}%{?dist}-False] \u001b[32mPASSED\u001b[0m\u001b[32m [ 84%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_autorelease[file_path-%autorelease-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 84%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_autorelease[file_path-%{autorelease}-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 84%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_autorelease[file_path-%autorelease -b 4 -s %{date}git%{shortcommit}-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 84%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_autorelease[file_path-%{?autorelease}%{!?autorelease:1%{?dist}}-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 84%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_autorelease[file_path-0.10.%{date}git%{shortcommit}.%autorelease-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 84%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_autorelease[file_path-%{obsrel}.%{autorelease}-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 85%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_autorelease[text_file-1%{?dist}-False] \u001b[32mPASSED\u001b[0m\u001b[32m [ 85%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_autorelease[text_file-%{release_number}%{?dist}-False] \u001b[32mPASSED\u001b[0m\u001b[32m [ 85%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_autorelease[text_file-0.27.%{commitdate}git%{shortcommit}%{?dist}-False] \u001b[32mPASSED\u001b[0m\u001b[32m [ 85%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_autorelease[text_file-%autorelease-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 85%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_autorelease[text_file-%{autorelease}-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 85%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_autorelease[text_file-%autorelease -b 4 -s %{date}git%{shortcommit}-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 85%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_autorelease[text_file-%{?autorelease}%{!?autorelease:1%{?dist}}-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 85%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_autorelease[text_file-0.10.%{date}git%{shortcommit}.%autorelease-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 85%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_autorelease[text_file-%{obsrel}.%{autorelease}-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 86%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_autorelease[binary_file-1%{?dist}-False] \u001b[32mPASSED\u001b[0m\u001b[32m [ 86%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_autorelease[binary_file-%{release_number}%{?dist}-False] \u001b[32mPASSED\u001b[0m\u001b[32m [ 86%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_autorelease[binary_file-0.27.%{commitdate}git%{shortcommit}%{?dist}-False] \u001b[32mPASSED\u001b[0m\u001b[32m [ 86%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_autorelease[binary_file-%autorelease-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 86%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_autorelease[binary_file-%{autorelease}-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 86%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_autorelease[binary_file-%autorelease -b 4 -s %{date}git%{shortcommit}-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 86%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_autorelease[binary_file-%{?autorelease}%{!?autorelease:1%{?dist}}-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 86%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_autorelease[binary_file-0.10.%{date}git%{shortcommit}.%autorelease-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 86%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_autorelease[binary_file-%{obsrel}.%{autorelease}-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 87%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_autorelease[text_io_stream-1%{?dist}-False] \u001b[32mPASSED\u001b[0m\u001b[32m [ 87%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_autorelease[text_io_stream-%{release_number}%{?dist}-False] \u001b[32mPASSED\u001b[0m\u001b[32m [ 87%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_autorelease[text_io_stream-0.27.%{commitdate}git%{shortcommit}%{?dist}-False] \u001b[32mPASSED\u001b[0m\u001b[32m [ 87%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_autorelease[text_io_stream-%autorelease-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 87%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_autorelease[text_io_stream-%{autorelease}-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 87%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_autorelease[text_io_stream-%autorelease -b 4 -s %{date}git%{shortcommit}-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 87%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_autorelease[text_io_stream-%{?autorelease}%{!?autorelease:1%{?dist}}-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 87%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_autorelease[text_io_stream-0.10.%{date}git%{shortcommit}.%autorelease-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 87%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_autorelease[text_io_stream-%{obsrel}.%{autorelease}-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 88%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_autorelease[binary_io_stream-1%{?dist}-False] \u001b[32mPASSED\u001b[0m\u001b[32m [ 88%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_autorelease[binary_io_stream-%{release_number}%{?dist}-False] \u001b[32mPASSED\u001b[0m\u001b[32m [ 88%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_autorelease[binary_io_stream-0.27.%{commitdate}git%{shortcommit}%{?dist}-False] \u001b[32mPASSED\u001b[0m\u001b[32m [ 88%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_autorelease[binary_io_stream-%autorelease-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 88%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_autorelease[binary_io_stream-%{autorelease}-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 88%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_autorelease[binary_io_stream-%autorelease -b 4 -s %{date}git%{shortcommit}-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 88%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_autorelease[binary_io_stream-%{?autorelease}%{!?autorelease:1%{?dist}}-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 88%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_autorelease[binary_io_stream-0.10.%{date}git%{shortcommit}.%autorelease-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 88%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_autorelease[binary_io_stream-%{obsrel}.%{autorelease}-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 89%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_autorelease[content_string-1%{?dist}-False] \u001b[32mPASSED\u001b[0m\u001b[32m [ 89%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_autorelease[content_string-%{release_number}%{?dist}-False] \u001b[32mPASSED\u001b[0m\u001b[32m [ 89%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_autorelease[content_string-0.27.%{commitdate}git%{shortcommit}%{?dist}-False] \u001b[32mPASSED\u001b[0m\u001b[32m [ 89%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_autorelease[content_string-%autorelease-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 89%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_autorelease[content_string-%{autorelease}-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 89%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_autorelease[content_string-%autorelease -b 4 -s %{date}git%{shortcommit}-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 89%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_autorelease[content_string-%{?autorelease}%{!?autorelease:1%{?dist}}-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 89%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_autorelease[content_string-0.10.%{date}git%{shortcommit}.%autorelease-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 89%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_autorelease[content_string-%{obsrel}.%{autorelease}-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 90%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_autochangelog[file_path] \u001b[32mPASSED\u001b[0m\u001b[32m [ 90%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_autochangelog[text_file] \u001b[32mPASSED\u001b[0m\u001b[32m [ 90%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_autochangelog[binary_file] \u001b[32mPASSED\u001b[0m\u001b[32m [ 90%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_autochangelog[text_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 90%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_autochangelog[binary_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 90%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_autochangelog[content_string] \u001b[32mPASSED\u001b[0m\u001b[32m [ 90%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_update_tag[file_path] \u001b[32mPASSED\u001b[0m\u001b[32m    [ 90%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_update_tag[text_file] \u001b[32mPASSED\u001b[0m\u001b[32m    [ 90%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_update_tag[binary_file] \u001b[32mPASSED\u001b[0m\u001b[32m  [ 91%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_update_tag[text_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 91%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_update_tag[binary_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 91%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_update_tag[content_string] \u001b[32mPASSED\u001b[0m\u001b[32m [ 91%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_multiple_instances[file_path] \u001b[32mPASSED\u001b[0m\u001b[32m [ 91%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_multiple_instances[text_file] \u001b[32mPASSED\u001b[0m\u001b[32m [ 91%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_multiple_instances[binary_file] \u001b[32mPASSED\u001b[0m\u001b[32m [ 91%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_multiple_instances[text_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 91%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_multiple_instances[binary_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 91%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_multiple_instances[content_string] \u001b[32mPASSED\u001b[0m\u001b[32m [ 92%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_includes[file_path] \u001b[32mPASSED\u001b[0m\u001b[32m      [ 92%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_includes[text_file] \u001b[32mPASSED\u001b[0m\u001b[32m      [ 92%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_includes[binary_file] \u001b[32mPASSED\u001b[0m\u001b[32m    [ 92%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_includes[text_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 92%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_includes[binary_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 92%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_includes[content_string] \u001b[32mPASSED\u001b[0m\u001b[32m [ 92%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_shell_expansions[file_path] \u001b[32mPASSED\u001b[0m\u001b[32m [ 92%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_shell_expansions[text_file] \u001b[32mPASSED\u001b[0m\u001b[32m [ 92%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_shell_expansions[binary_file] \u001b[32mPASSED\u001b[0m\u001b[32m [ 93%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_shell_expansions[text_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 93%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_shell_expansions[binary_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 93%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_shell_expansions[content_string] \u001b[32mPASSED\u001b[0m\u001b[32m [ 93%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_context_management[file_path] \u001b[32mPASSED\u001b[0m\u001b[32m [ 93%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_context_management[text_file] \u001b[32mPASSED\u001b[0m\u001b[32m [ 93%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_context_management[binary_file] \u001b[32mPASSED\u001b[0m\u001b[32m [ 93%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_context_management[text_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 93%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_context_management[binary_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 93%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_context_management[content_string] \u001b[32mPASSED\u001b[0m\u001b[32m [ 94%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_copy[file_path] \u001b[32mPASSED\u001b[0m\u001b[32m          [ 94%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_copy[text_file] \u001b[32mPASSED\u001b[0m\u001b[32m          [ 94%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_copy[binary_file] \u001b[32mPASSED\u001b[0m\u001b[32m        [ 94%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_copy[text_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m     [ 94%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_copy[binary_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m   [ 94%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_copy[content_string] \u001b[32mPASSED\u001b[0m\u001b[32m     [ 94%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_parse_if_necessary[file_path] \u001b[32mPASSED\u001b[0m\u001b[32m [ 94%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_parse_if_necessary[text_file] \u001b[32mPASSED\u001b[0m\u001b[32m [ 94%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_parse_if_necessary[binary_file] \u001b[32mPASSED\u001b[0m\u001b[32m [ 95%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_parse_if_necessary[text_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 95%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_parse_if_necessary[binary_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 95%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_parse_if_necessary[content_string] \u001b[32mPASSED\u001b[0m\u001b[32m [ 95%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_update_version[file_path] \u001b[32mPASSED\u001b[0m\u001b[32m [ 95%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_update_version[text_file] \u001b[32mPASSED\u001b[0m\u001b[32m [ 95%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_update_version[binary_file] \u001b[32mPASSED\u001b[0m\u001b[32m [ 95%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_update_version[text_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 95%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_update_version[binary_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 95%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_update_version[content_string] \u001b[32mPASSED\u001b[0m\u001b[32m [ 96%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_trailing_newline[file_path] \u001b[32mPASSED\u001b[0m\u001b[32m [ 96%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_trailing_newline[text_file] \u001b[32mPASSED\u001b[0m\u001b[32m [ 96%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_trailing_newline[binary_file] \u001b[32mPASSED\u001b[0m\u001b[32m [ 96%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_trailing_newline[text_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 96%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_trailing_newline[binary_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 96%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_trailing_newline[content_string] \u001b[32mPASSED\u001b[0m\u001b[32m [ 96%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_reload[file_path-False] \u001b[32mPASSED\u001b[0m\u001b[32m  [ 96%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_reload[file_path-True] \u001b[32mPASSED\u001b[0m\u001b[32m   [ 96%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_reload[text_file-False] \u001b[32mPASSED\u001b[0m\u001b[32m  [ 97%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_reload[text_file-True] \u001b[32mPASSED\u001b[0m\u001b[32m   [ 97%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_reload[binary_file-False] \u001b[32mPASSED\u001b[0m\u001b[32m [ 97%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_reload[binary_file-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 97%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_reload[text_io_stream-False] \u001b[32mPASSED\u001b[0m\u001b[32m [ 97%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_reload[text_io_stream-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 97%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_reload[binary_io_stream-False] \u001b[32mPASSED\u001b[0m\u001b[32m [ 97%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_reload[binary_io_stream-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 97%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_reload[content_string-False] \u001b[32mPASSED\u001b[0m\u001b[32m [ 97%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_reload[content_string-True] \u001b[32mPASSED\u001b[0m\u001b[32m [ 98%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_save_after_inode_change[file_path] \u001b[32mPASSED\u001b[0m\u001b[32m [ 98%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_save_after_inode_change[text_file] \u001b[32mPASSED\u001b[0m\u001b[32m [ 98%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_save_after_inode_change[binary_file] \u001b[32mPASSED\u001b[0m\u001b[32m [ 98%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_save_after_inode_change[text_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 98%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_save_after_inode_change[binary_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 98%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_save_after_inode_change[content_string] \u001b[32mPASSED\u001b[0m\u001b[32m [ 98%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_sanitize[file_path] \u001b[32mPASSED\u001b[0m\u001b[32m      [ 98%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_sanitize[text_file] \u001b[32mPASSED\u001b[0m\u001b[32m      [ 98%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_sanitize[binary_file] \u001b[32mPASSED\u001b[0m\u001b[32m    [ 99%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_sanitize[text_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 99%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_sanitize[binary_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 99%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_sanitize[content_string] \u001b[32mPASSED\u001b[0m\u001b[32m [ 99%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_circular_expansion[file_path] \u001b[32mPASSED\u001b[0m\u001b[32m [ 99%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_circular_expansion[text_file] \u001b[32mPASSED\u001b[0m\u001b[32m [ 99%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_circular_expansion[binary_file] \u001b[32mPASSED\u001b[0m\u001b[32m [ 99%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_circular_expansion[text_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 99%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_circular_expansion[binary_io_stream] \u001b[32mPASSED\u001b[0m\u001b[32m [ 99%]\u001b[0m",
                                "tests/integration/test_specfile.py::test_circular_expansion[content_string] \u001b[32mPASSED\u001b[0m\u001b[32m [100%]\u001b[0m",
                                "",
                                "---------- coverage: platform linux, python 3.14.5-final-0 -----------",
                                "Name                             Stmts   Miss  Cover   Missing",
                                "--------------------------------------------------------------",
                                "specfile/__init__.py                11      3    73%   12-14",
                                "specfile/changelog.py              205     26    87%   107, 115, 119, 132-133, 303, 307, 311, 315, 324-336, 339, 361, 364-365, 460-463",
                                "specfile/conditions.py              83     11    87%   49-50, 55-59, 145, 147-149",
                                "specfile/constants.py                8      0   100%",
                                "specfile/context_management.py      74      8    89%   66-68, 95, 99, 105, 125-128",
                                "specfile/exceptions.py              17      5    71%   19-23",
                                "specfile/formatter.py               92     10    89%   34, 36, 38, 78, 94, 107, 109, 112, 140-141",
                                "specfile/macro_definitions.py      186     43    77%   87, 101, 108-117, 179, 194-195, 200-206, 209-214, 218, 222, 231-245, 248, 283, 346-347",
                                "specfile/macros.py                 104      5    95%   33-35, 72, 77",
                                "specfile/options.py                324     68    79%   37, 63, 67, 85, 89, 97, 101, 106-110, 117, 121, 124-129, 135-136, 145-146, 193, 251, 311, 315, 317, 333, 349, 355, 380, 383-387, 392-397, 400-417, 434-435, 438-441, 444-447, 511, 514, 535-536, 541, 545",
                                "specfile/prep.py                   193     33    83%   65, 79, 89, 126-134, 183, 188, 195, 199, 219-220, 229-230, 233-238, 270, 275, 278, 286-288, 393-394",
                                "specfile/sanitizer.py              685     61    91%   252-253, 274, 363-364, 389, 398-399, 404-405, 414, 419, 431, 435-447, 467, 475, 533, 577, 594, 816, 821-822, 864-866, 873-878, 887-888, 918, 987-988, 1008-1015, 1049-1050, 1071-1072, 1078-1080",
                                "specfile/sections.py               181     29    84%   63, 78, 83, 90, 94, 114, 122, 164, 168, 182, 189-190, 195-201, 204-209, 212, 247, 279, 290-291",
                                "specfile/sourcelist.py              77     10    87%   53, 58, 76-78, 108, 112, 116, 120, 125",
                                "specfile/sources.py                311     39    87%   53-54, 90-92, 98, 152, 157-159, 169, 187-189, 195, 209, 214, 219, 224, 234, 273, 288, 303-305, 312, 316, 321, 327, 331, 334-339, 434, 463, 492, 644",
                                "specfile/spec_parser.py            206      8    96%   71, 145, 160, 163, 279-280, 321, 326",
                                "specfile/specfile.py               499     54    89%   103, 113, 117-118, 130, 150, 158, 211, 239-242, 251, 256, 264, 268, 303-304, 342-343, 357, 437-438, 440, 459-460, 507, 575, 649, 656, 664, 678, 706-707, 731-732, 801, 950-951, 1007, 1035, 1111-1112, 1119, 1126-1127, 1169-1178",
                                "specfile/tags.py                   289     55    81%   59, 67, 100, 103-105, 110, 114, 118, 122, 128, 134, 137-147, 158-160, 163-165, 238, 250, 262, 303, 358, 362, 366, 401-402, 419-420, 425-431, 434-439, 442, 480, 491-492, 510, 541",
                                "specfile/types.py                   11      5    55%   8-12, 19-20",
                                "specfile/utils.py                  217     59    73%   28, 31, 40-42, 46, 51, 56, 61, 66, 71, 74-76, 82, 99, 102, 106, 109, 112-116, 120, 125, 129-133, 137, 140, 144, 150, 156, 171, 176, 179, 183, 186, 189-193, 197, 206, 212-216, 220, 223, 227, 234, 240, 333",
                                "specfile/value_parser.py           314     21    93%   34, 41, 55, 59, 89, 96, 115-116, 124, 144, 151, 161, 168, 178, 201, 243, 247, 249, 374, 472-473",
                                "--------------------------------------------------------------",
                                "TOTAL                             4087    553    86%",
                                "",
                                "",
                                "\u001b[32m============================= \u001b[32m\u001b[1m903 passed\u001b[0m\u001b[32m in 52.16s\u001b[0m\u001b[32m =============================\u001b[0m"
                            ],
                            "zuul_log_id": "0a580a2a-0013-cfc5-4ec2-000000000006-1-container"
                        }
                    },
                    "task": {
                        "duration": {
                            "end": "2026-06-08T21:13:38.431501Z",
                            "start": "2026-06-08T21:12:44.871799Z"
                        },
                        "id": "0a580a2a-0013-cfc5-4ec2-000000000006",
                        "name": "Run unit, integration and functional tests"
                    }
                }
            ]
        }
    ],
    "stats": {
        "container": {
            "changed": 2,
            "failures": 0,
            "ignored": 0,
            "ok": 7,
            "rescued": 0,
            "skipped": 1,
            "unreachable": 0
        }
    },
    "trusted": false
}
]
