Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package openQA for openSUSE:Factory checked in at 2026-06-02 16:02:38 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/openQA (Old) and /work/SRC/openSUSE:Factory/.openQA.new.1937 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "openQA" Tue Jun 2 16:02:38 2026 rev:849 rq:1356438 version:5.1780322162.c1836389 Changes: -------- --- /work/SRC/openSUSE:Factory/openQA/openQA.changes 2026-05-27 16:16:06.838833469 +0200 +++ /work/SRC/openSUSE:Factory/.openQA.new.1937/openQA.changes 2026-06-02 16:03:50.049722615 +0200 @@ -1,0 +2,17 @@ +Mon Jun 01 13:56:13 UTC 2026 - [email protected] + +- Update to version 5.1780322162.c1836389: + * refactor: Use more readable regex in `process-docs` + * refactor: Turn `process-docs` into proper style-checked Perl script + * feat: Add Makefile target to tidy Shell code + * docs: Fix links in documentation generated via `generate-docs` + * fix(openqa-clone-job): Allow empty API key/secret for auth.method=None + * fix(spec): Supplement bash-completion subpackage against bash-completion + * docs: Fix broken list under "Further systemd …" and wrap consistently + * docs: Fix example config for `git_auto_commit` + * docs: Wrap lines consistently under "Terms and variables …" + * docs: Fix wrapping in "Triggering tests …" section and below + * docs: Remove Git conflict markers that were missed by b51c609679 + * feat: watch worker auto-restart systemd drop-ins for reloads + +------------------------------------------------------------------- Old: ---- openQA-5.1779808735.8c9bd805.obscpio New: ---- openQA-5.1780322162.c1836389.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ openQA-client-test.spec ++++++ --- /var/tmp/diff_new_pack.CiXoD8/_old 2026-06-02 16:03:51.261772877 +0200 +++ /var/tmp/diff_new_pack.CiXoD8/_new 2026-06-02 16:03:51.265773043 +0200 @@ -18,7 +18,7 @@ %define short_name openQA-client Name: %{short_name}-test -Version: 5.1779808735.8c9bd805 +Version: 5.1780322162.c1836389 Release: 0 Summary: Test package for %{short_name} License: GPL-2.0-or-later ++++++ openQA-devel-test.spec ++++++ --- /var/tmp/diff_new_pack.CiXoD8/_old 2026-06-02 16:03:51.297774370 +0200 +++ /var/tmp/diff_new_pack.CiXoD8/_new 2026-06-02 16:03:51.301774536 +0200 @@ -18,7 +18,7 @@ %define short_name openQA-devel Name: %{short_name}-test -Version: 5.1779808735.8c9bd805 +Version: 5.1780322162.c1836389 Release: 0 Summary: Test package for %{short_name} License: GPL-2.0-or-later ++++++ openQA-test.spec ++++++ --- /var/tmp/diff_new_pack.CiXoD8/_old 2026-06-02 16:03:51.337776029 +0200 +++ /var/tmp/diff_new_pack.CiXoD8/_new 2026-06-02 16:03:51.341776195 +0200 @@ -18,7 +18,7 @@ %define short_name openQA Name: %{short_name}-test -Version: 5.1779808735.8c9bd805 +Version: 5.1780322162.c1836389 Release: 0 Summary: Test package for openQA License: GPL-2.0-or-later ++++++ openQA-worker-test.spec ++++++ --- /var/tmp/diff_new_pack.CiXoD8/_old 2026-06-02 16:03:51.377777688 +0200 +++ /var/tmp/diff_new_pack.CiXoD8/_new 2026-06-02 16:03:51.377777688 +0200 @@ -18,7 +18,7 @@ %define short_name openQA-worker Name: %{short_name}-test -Version: 5.1779808735.8c9bd805 +Version: 5.1780322162.c1836389 Release: 0 Summary: Test package for %{short_name} License: GPL-2.0-or-later ++++++ openQA.spec ++++++ --- /var/tmp/diff_new_pack.CiXoD8/_old 2026-06-02 16:03:51.425779678 +0200 +++ /var/tmp/diff_new_pack.CiXoD8/_new 2026-06-02 16:03:51.425779678 +0200 @@ -104,7 +104,7 @@ %define devel_requires %devel_no_selenium_requires chromedriver Name: openQA -Version: 5.1779808735.8c9bd805 +Version: 5.1780322162.c1836389 Release: 0 Summary: Framework for automated system-level testing (web-frontend, scheduler and tools) Group: Development/Tools/Other @@ -347,7 +347,7 @@ Summary: Bash Completion for %{name} Group: Development/Tools/Other Requires: bash-completion -Supplements: (%{name}-client and bash) +Supplements: (%{name}-client and bash-completion) %description client-bash-completion The official bash completion script for openqa-cli. ++++++ openQA-5.1779808735.8c9bd805.obscpio -> openQA-5.1780322162.c1836389.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1779808735.8c9bd805/Makefile new/openQA-5.1780322162.c1836389/Makefile --- old/openQA-5.1779808735.8c9bd805/Makefile 2026-05-26 17:18:55.000000000 +0200 +++ new/openQA-5.1780322162.c1836389/Makefile 2026-06-01 15:56:02.000000000 +0200 @@ -470,8 +470,13 @@ @command -v ruff >/dev/null 2>&1 || echo "Command 'ruff' not found, can not format python code" @if [ -n "$(pyfiles)" ]; then ruff format $(pyfiles); fi +.PHONY: tidy-sh +tidy-sh: ## Format shell scripts with shfmt + @command -v shfmt >/dev/null 2>&1 || echo "Command 'shfmt' not found, can not format shell code" + shfmt --write -i 4 -bn -ci -sr $(shellfiles) + .PHONY: tidy -tidy: tidy-js tidy-perl tidy-python ## Format JavaScript, Perl and Python code +tidy: tidy-js tidy-perl tidy-python tidy-sh ## Format JavaScript, Perl, Python and Shell code .PHONY: test-containers-compose test-containers-compose: ## Run docker-compose tests diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1779808735.8c9bd805/dist/rpm/openQA.spec new/openQA-5.1780322162.c1836389/dist/rpm/openQA.spec --- old/openQA-5.1779808735.8c9bd805/dist/rpm/openQA.spec 2026-05-26 17:18:55.000000000 +0200 +++ new/openQA-5.1780322162.c1836389/dist/rpm/openQA.spec 2026-06-01 15:56:02.000000000 +0200 @@ -348,7 +348,7 @@ Summary: Bash Completion for %{name} Group: Development/Tools/Other Requires: bash-completion -Supplements: (%{name}-client and bash) +Supplements: (%{name}-client and bash-completion) %description client-bash-completion The official bash completion script for openqa-cli. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1779808735.8c9bd805/docs/Installing.md new/openQA-5.1780322162.c1836389/docs/Installing.md --- old/openQA-5.1779808735.8c9bd805/docs/Installing.md 2026-05-26 17:18:55.000000000 +0200 +++ new/openQA-5.1780322162.c1836389/docs/Installing.md 2026-06-01 15:56:02.000000000 +0200 @@ -878,7 +878,7 @@ ``` ini [scm git] -git_auto_commit = yes|no|'' +git_auto_commit = yes|no git_auto_clone = yes|no git_auto_update = yes|no checkout_needles_sha = yes|no @@ -1074,29 +1074,28 @@ The following information is partially openSUSE specific. The `openQA-worker` package provides further systemd units: -- `[email protected]`: standard worker service, this is the default and `[email protected]` is just a symlink to this service +- `[email protected]`: standard worker service, this is the default + and `[email protected]` is just a symlink to this service - `[email protected]`: see [enabling snapshots](WritingTests.md#snapshots-for-each-module) - - `[email protected]`: worker that restarts automatically after processing assigned jobs - - `openqa-worker-cacheservice`/`openqa-worker-cacheservice-minion`: services for [the asset cache](Installing.md#asset-caching) - - `openqa-worker.target` - - Starts `[email protected]` (but no other worker units) when started. - - The number of started worker slots depends on the pool directories present - under `/var/lib/openqa/pool`. This information is determined via a systemd generator and can be refreshed via `systemctl daemon-reload`. - Stops `[email protected]` and other units conflicting with `[email protected]` when started. - + under `/var/lib/openqa/pool`. This information is determined via a systemd + generator and can be refreshed via `systemctl daemon-reload`. + - Stops `[email protected]` and other units conflicting with + `[email protected]` when started. - Stops/restarts **all** worker units when stopped/restarted. - - - Is restarted automatically when the `openQA-worker` package is updated (unless `DISABLE_RESTART_ON_UPDATE="yes"` is set in `/etc/sysconfig/services`). -- `[email protected]`: allows to restart the worker service - automatically on configuration changes without interrupting jobs (see next - section for details) + - Is restarted automatically when the `openQA-worker` package is updated + (unless `DISABLE_RESTART_ON_UPDATE="yes"` is set in + `/etc/sysconfig/services`). +- `[email protected]`: allows to restart the worker + service automatically on configuration changes without interrupting jobs (see + next section for details) #### Stopping/restarting workers without interrupting currently running jobs @@ -1892,8 +1891,7 @@ `git_auto_clone` enabled, openQA will create a checkout of the repository under the mentioned default location if it does not already exist -<<<<<<< HEAD -### Further notes +#### Further notes - The mentioned `git_auto_clone` setting is part of the general [Git support](Installing.md#setting-up-git-support) and works best if used consistently. If e.g. only specifying a Git URL for `CASEDIR` but not for @@ -1904,18 +1902,14 @@ with e.g. `CASEDIR=https://github.com/…/…-distri-opensuse.git` and `DISTRI=microos` but no `NEEDLES_DIR`, needles will be missing despite being present for `DISTRI=opensuse`. -||||||| parent of 642ae58d5 (docs: show document levels in generated TOC) -### Further notes -======= -#### Further notes ->>>>>>> 642ae58d5 (docs: show document levels in generated TOC) -- Setting the test variables has only an influence on os-autoinst. The web UI on the other hand always relies - on the directory structure described above. For the exact details how these paths are computed by the web UI - have a look at `lib/OpenQA/Utils.pm`. +- Setting the test variables has only an influence on os-autoinst. The web UI on + the other hand always relies on the directory structure described above. For + the exact details how these paths are computed by the web UI have a look at + `lib/OpenQA/Utils.pm`. -- When enabling the worker cache, parts of the usual "share directory" are located in the specified cache - directory on the worker host. +- When enabling the worker cache, parts of the usual "share directory" are + located in the specified cache directory on the worker host. ## Automatic installation of the operating systems for openQA machines diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1779808735.8c9bd805/docs/WritingTests.md new/openQA-5.1780322162.c1836389/docs/WritingTests.md --- old/openQA-5.1779808735.8c9bd805/docs/WritingTests.md 2026-05-26 17:18:55.000000000 +0200 +++ new/openQA-5.1780322162.c1836389/docs/WritingTests.md 2026-06-01 15:56:02.000000000 +0200 @@ -2178,10 +2178,15 @@ > - If only one of `CASEDIR` or `NEEDLES_DIR` is customized the other variable > will still be initialized to point to the default repository. > - A relative `NEEDLES_DIR` is treated to be relative to the default `CASEDIR` -> (even if `CASEDIR` is customized). To have it treated to be relative to the > custom `CASEDIR`, prefix the relative path with `%CASEDIR%/`. So specifying > e.g. `CASEDIR=https://github.com/…` and `NEEDLES_DIR=%%CASEDIR%%/the-needles` -> will lead to `%CASEDIR%` being substituted with the path of the Git checkout > created for the custom `CASEDIR`. That results in needles found in +> (even if `CASEDIR` is customized). To have it treated to be relative to the +> custom `CASEDIR`, prefix the relative path with `%CASEDIR%/`. So specifying +> e.g. `CASEDIR=https://github.com/…` and `NEEDLES_DIR=%%CASEDIR%%/the-needles` +> will lead to `%CASEDIR%` being substituted with the path of the Git checkout +> created for the custom `CASEDIR`. That results in needles found in > <https://github.com/…/tree/…/the-needles> to be used. Note that double -> `%`-signs are to avoid variable substitution. When using `curl`, you need to > escape the `%`-sign as `%25` **in addition**. A helper script `openqa-clone-custom-git-refspec` is available for +> `%`-signs are to avoid variable substitution. When using `curl`, you need to +> escape the `%`-sign as `%25` **in addition**. +> A helper script `openqa-clone-custom-git-refspec` is available for > convenience that supports some combinations. To clone one job within a remote instance based on an open github pull request @@ -2193,12 +2198,15 @@ openqa-clone-custom-git-refspec https://github.com/os-autoinst/os-autoinst-distri-opensuse/pull/6649 https://openqa.opensuse.org/tests/839191 -As noted above, customizing `CASEDIR` does **not** mean needles will be loaded from there, even if the repository specified as `CASEDIR` contains needles. To load needles from that repository, it needs to be specified as `NEEDLES_DIR` as +As noted above, customizing `CASEDIR` does **not** mean needles will be loaded +from there, even if the repository specified as `CASEDIR` contains needles. To +load needles from that repository, it needs to be specified as `NEEDLES_DIR` as described in the note above. Keep in mind that if `PRODUCTDIR` is overwritten as well, it might not relate to the state of the specified git refspec that is passed via the command line -parameter to `openqa-clone-custom-git-refspec` or via the `PRODUCTDIR` variable to `openqa-clone-job`. Both can still be used when overwriting `PRODUCTDIR`, but +parameter to `openqa-clone-custom-git-refspec` or via the `PRODUCTDIR` variable +to `openqa-clone-job`. Both can still be used when overwriting `PRODUCTDIR`, but special care must be taken if the schedule is modified (then it is safer to manually specify the schedule via the `SCHEDULE` variable). @@ -2238,7 +2246,9 @@ > These examples show how API credentials are supplied. It is important to > note that using `on:pull_request` would only work for PRs created on the main > repository but not for PRs created from forks. Therefore -> `on:pull_request_target` is used instead. To still run the tests on the PR > version the variables under `github.event.pull_request.head.*` are utilized > (instead of e.g. just `$GITHUB_REF`). +> `on:pull_request_target` is used instead. To still run the tests on the PR +> version the variables under `github.event.pull_request.head.*` are utilized +> (instead of e.g. just `$GITHUB_REF`). > **NOTE:** > Due to the use of `on:pull_request_target` the scenario definitions are diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1779808735.8c9bd805/lib/OpenQA/Script/CloneJob.pm new/openQA-5.1780322162.c1836389/lib/OpenQA/Script/CloneJob.pm --- old/openQA-5.1779808735.8c9bd805/lib/OpenQA/Script/CloneJob.pm 2026-05-26 17:18:55.000000000 +0200 +++ new/openQA-5.1780322162.c1836389/lib/OpenQA/Script/CloneJob.pm 2026-06-01 15:56:02.000000000 +0200 @@ -270,8 +270,6 @@ options => $options ); my $local = $command->client($local_url)->max_redirects(3); - die "API key/secret for '$options->{host}' missing. Check out '$0 --help' for the config file syntax/lookup.\n" - if !$options->{'export-command'} && !($local->apikey && $local->apisecret); # configure the default for the number of retries and use exponential backoff by default $options->{retry} //= 5; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1779808735.8c9bd805/systemd/[email protected] new/openQA-5.1780322162.c1836389/systemd/[email protected] --- old/openQA-5.1779808735.8c9bd805/systemd/[email protected] 2026-05-26 17:18:55.000000000 +0200 +++ new/openQA-5.1780322162.c1836389/systemd/[email protected] 2026-06-01 15:56:02.000000000 +0200 @@ -9,6 +9,7 @@ PathChanged=/etc/openqa/workers.ini.d PathChanged=/etc/openqa/client.conf PathChanged=/etc/openqa/client.conf.d +PathChanged=/etc/systemd/system/[email protected] [Install] WantedBy=multi-user.target diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1779808735.8c9bd805/t/35-script_clone_job.t new/openQA-5.1780322162.c1836389/t/35-script_clone_job.t --- old/openQA-5.1779808735.8c9bd805/t/35-script_clone_job.t 2026-05-26 17:18:55.000000000 +0200 +++ new/openQA-5.1780322162.c1836389/t/35-script_clone_job.t 2026-06-01 15:56:02.000000000 +0200 @@ -399,11 +399,7 @@ my %options = (host => 'foo', from => 'bar', 'clone-children' => 1, 'skip-download' => 1, verbose => 1, args => ['FOO=bar']); - throws_ok { clone_jobs(42, \%options) } qr|API key/secret for 'foo' missing|, 'dies on missing API credentials'; - $options{apikey} = $options{apisecret} = 'bar'; - combined_like { clone_jobs(42, \%options) } qr|parent.*main.*child|s, 'verbose output printed'; - ok $tx_handled, 'transaction handled'; my $check_common_post_args = sub ($test_suffix = '') { is scalar @post_args, 1, 'exactly one post call made' or return undef; @@ -415,7 +411,24 @@ is delete $params->{'group_id:42'}, 21, 'group of 42 preserved'; return $params; }; + subtest 'post args with no API key' => sub { + @post_args = (); + $options{apikey} = $options{apisecret} = 'bar'; + combined_like { clone_jobs(42, \%options) } qr|parent.*main.*child|s, 'clone without API key'; + ok $tx_handled, 'transaction handled'; + my $params = $check_common_post_args->() or return; + is delete $params->{'FOO:42'}, 'bar', 'setting passed to main job'; + is delete $params->{'TEST:43'}, 'child', 'child job 43 cloned'; + is delete $params->{'FOO:43'}, 'bar', 'setting passed to child job'; + is delete $params->{'_START_AFTER:43'}, '42', 'child job cloned to start after main job 42'; + is delete $params->{"CLONED_FROM:$_"}, "https://bar/tests/$_", "CLONED_FROM set ($_)" for 41, 42, 43; + is scalar keys %$params, 0, 'exactly 3 jobs posted, so no further settings'; + } or always_explain \@post_args; subtest 'post args' => sub { + @post_args = (); + $options{apikey} = $options{apisecret} = 'bar'; + combined_like { clone_jobs(42, \%options) } qr|parent.*main.*child|s, 'verbose output printed - with API key'; + ok $tx_handled, 'transaction handled'; my $params = $check_common_post_args->() or return; is delete $params->{'FOO:42'}, 'bar', 'setting passed to main job'; is delete $params->{'TEST:43'}, 'child', 'child job 43 cloned'; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1779808735.8c9bd805/t/40-openqa-clone-job.t new/openQA-5.1780322162.c1836389/t/40-openqa-clone-job.t --- old/openQA-5.1779808735.8c9bd805/t/40-openqa-clone-job.t 2026-05-26 17:18:55.000000000 +0200 +++ new/openQA-5.1780322162.c1836389/t/40-openqa-clone-job.t 2026-06-01 15:56:02.000000000 +0200 @@ -35,9 +35,6 @@ like warning { throws_ok { main::main() } qr/missing job reference/, 'hit for mandatory parameter'; }, qr{Unknown option: invalid-arg}, 'expected warning'; - - @ARGV = 'http://openqa.local.foo/t1'; - throws_ok { main::main() } qr|API key/secret for 'localhost' missing|, 'fails without API key/secret'; }; subtest errors => sub { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1779808735.8c9bd805/tools/generate-docs new/openQA-5.1780322162.c1836389/tools/generate-docs --- old/openQA-5.1779808735.8c9bd805/tools/generate-docs 2026-05-26 17:18:55.000000000 +0200 +++ new/openQA-5.1780322162.c1836389/tools/generate-docs 2026-06-01 15:56:02.000000000 +0200 @@ -25,10 +25,9 @@ syntax_highlight_opt="--syntax-highlighting=pygments" fi -perl -ne 'if (/^include::([^\]]+)\[\]/) { open my $f, "<", $1 or die $!; print while <$f>; close $f } else { print }' index.md \ - | pandoc -s -f gfm -o build/index.html \ - --template=template.html \ - -c style.css \ - $syntax_highlight_opt \ - --metadata title="openQA Documentation" \ - --toc --number-sections +../tools/process-docs | pandoc -s -f gfm -o build/index.html \ + --template=template.html \ + -c style.css \ + $syntax_highlight_opt \ + --metadata title="openQA Documentation" \ + --toc --number-sections diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1779808735.8c9bd805/tools/generate-documentation new/openQA-5.1780322162.c1836389/tools/generate-documentation --- old/openQA-5.1779808735.8c9bd805/tools/generate-documentation 2026-05-26 17:18:55.000000000 +0200 +++ new/openQA-5.1780322162.c1836389/tools/generate-documentation 2026-06-01 15:56:02.000000000 +0200 @@ -230,11 +230,10 @@ fi [[ ${formats[pdf]} ]] \ - && perl -e 'sub p{my $f=shift;open my $h,"<",$f or die $!;while(<$h>){if(/^include::([^\]]+)\[\]/){p($1)}else{s/\[([^\]]+)\]\([\w-]+\.md(#[\w-]+)\)/[$1]($2)/g;s/\[([^\]]+)\]\(([\w-]+)\.md\)/"[$1](#".lc($2).")"/ge;print}}}p("index.md")' \ - | pandoc -s -f gfm -o "${tmpwd}"/output/openqa-documentation-"${verbose_doc_name}".pdf --pdf-engine=weasyprint --number-sections + && ../tools/process-docs | pandoc -s -f gfm -o "${tmpwd}"/output/openqa-documentation-"${verbose_doc_name}".pdf \ + --pdf-engine=weasyprint --number-sections [[ ${formats[html]} ]] \ - && perl -e 'sub p{my $f=shift;open my $h,"<",$f or die $!;while(<$h>){if(/^include::([^\]]+)\[\]/){p($1)}else{s/\[([^\]]+)\]\([\w-]+\.md(#[\w-]+)\)/[$1]($2)/g;s/\[([^\]]+)\]\(([\w-]+)\.md\)/"[$1](#".lc($2).")"/ge;print}}}p("index.md")' \ - | pandoc -s -f gfm -o "${tmpwd}"/output/openqa-documentation-"${verbose_doc_name}".html \ + && ../tools/process-docs | pandoc -s -f gfm -o "${tmpwd}"/output/openqa-documentation-"${verbose_doc_name}".html \ --template=template.html \ -c style.css \ --embed-resources --standalone \ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1779808735.8c9bd805/tools/process-docs new/openQA-5.1780322162.c1836389/tools/process-docs --- old/openQA-5.1779808735.8c9bd805/tools/process-docs 1970-01-01 01:00:00.000000000 +0100 +++ new/openQA-5.1780322162.c1836389/tools/process-docs 2026-06-01 15:56:02.000000000 +0200 @@ -0,0 +1,20 @@ +#!/bin/perl + +use strict; +use warnings; +use experimental 'signatures'; + +sub process_file ($file) { + open my $handle, '<', $file or die $!; + while (my $line = <$handle>) { + if ($line =~ /^include::([^\]]+)\[\]/) { process_file($1) } + else { + $line =~ s/\[([^\]]+)\]\([\w-]+\.md(#[\w-]+)\)/[$1]($2)/g; + $line =~ s/\[([^\]]+)\]\(([\w-]+)\.md\)/[$1](#\L$2\E)/g; + print $line; + } + } + close $handle; +} + +process_file('index.md'); ++++++ openQA.obsinfo ++++++ --- /var/tmp/diff_new_pack.CiXoD8/_old 2026-06-02 16:04:05.630368722 +0200 +++ /var/tmp/diff_new_pack.CiXoD8/_new 2026-06-02 16:04:05.634368888 +0200 @@ -1,5 +1,5 @@ name: openQA -version: 5.1779808735.8c9bd805 -mtime: 1779808735 -commit: 8c9bd8052f65195f587f27fb5bee6b5111c2ef05 +version: 5.1780322162.c1836389 +mtime: 1780322162 +commit: c18363899cbe127225717f0b5bed136d8ddcc8f7
