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-10-23 20:28:39 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/openQA (Old) and /work/SRC/openSUSE:Factory/.openQA.new.2252680 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "openQA" Fri Oct 23 20:28:39 2026 rev:897 rq:1387213 version:5.1792679797.1d1b53d2 Changes: -------- --- /work/SRC/openSUSE:Factory/openQA/openQA.changes 2026-10-22 15:54:58.719879809 +0200 +++ /work/SRC/openSUSE:Factory/.openQA.new.2252680/openQA.changes 2026-10-23 20:29:32.078691930 +0200 @@ -1,0 +2,25 @@ +Thu Oct 22 14:39:18 UTC 2026 - [email protected] + +- Update to version 5.1792679797.1d1b53d2: + * chore(deps-dev): bump stylelint from 17.14.1 to 17.16.0 (#8011) + * chore(deps): Remove unused dependency SQL::SplitStatement + * refactor(OpenQA::Files): Remove dead code + +------------------------------------------------------------------- +Thu Oct 22 05:22:00 UTC 2026 - [email protected] + +- Update to version 5.1792643104.8298c14a: + * chore(deps-dev): bump fastq from 1.20.1 to 1.20.3 (#8007) + +------------------------------------------------------------------- +Thu Oct 22 02:48:29 UTC 2026 - [email protected] + +- Update to version 5.1792617696.d7563f0b: + * feat: Improve use of the tempfile-move pattern + * refactor: Ensure common file permissions in `OpenQA::Downloader` + * feat: Ensure cached assets have 0644 permissions + * refactor(tests): Rename test to reflect topic + * refactor(tests): Remove unused imports + * fix(etc): remove specific auto_clone_regex definition + +------------------------------------------------------------------- Old: ---- openQA-5.1792607148.117af9ef.obscpio New: ---- openQA-5.1792679797.1d1b53d2.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ openQA-client-test.spec ++++++ --- /var/tmp/diff_new_pack.DuUWLa/_old 2026-10-23 20:29:33.570754510 +0200 +++ /var/tmp/diff_new_pack.DuUWLa/_new 2026-10-23 20:29:33.572754594 +0200 @@ -18,7 +18,7 @@ %define short_name openQA-client Name: %{short_name}-test -Version: 5.1792607148.117af9ef +Version: 5.1792679797.1d1b53d2 Release: 0 Summary: Test package for %{short_name} License: GPL-2.0-or-later ++++++ openQA-test.spec ++++++ --- /var/tmp/diff_new_pack.DuUWLa/_old 2026-10-23 20:29:33.595755558 +0200 +++ /var/tmp/diff_new_pack.DuUWLa/_new 2026-10-23 20:29:33.596755600 +0200 @@ -18,7 +18,7 @@ %define short_name openQA Name: %{short_name}-test -Version: 5.1792607148.117af9ef +Version: 5.1792679797.1d1b53d2 Release: 0 Summary: Test package for openQA License: GPL-2.0-or-later ++++++ openQA-worker-test.spec ++++++ --- /var/tmp/diff_new_pack.DuUWLa/_old 2026-10-23 20:29:33.619756565 +0200 +++ /var/tmp/diff_new_pack.DuUWLa/_new 2026-10-23 20:29:33.620756607 +0200 @@ -18,7 +18,7 @@ %define short_name openQA-worker Name: %{short_name}-test -Version: 5.1792607148.117af9ef +Version: 5.1792679797.1d1b53d2 Release: 0 Summary: Test package for %{short_name} License: GPL-2.0-or-later ++++++ openQA.spec ++++++ --- /var/tmp/diff_new_pack.DuUWLa/_old 2026-10-23 20:29:33.648757781 +0200 +++ /var/tmp/diff_new_pack.DuUWLa/_new 2026-10-23 20:29:33.650757865 +0200 @@ -104,7 +104,7 @@ %define devel_requires %devel_no_selenium_requires chromedriver Name: openQA -Version: 5.1792607148.117af9ef +Version: 5.1792679797.1d1b53d2 Release: 0 Summary: Framework for automated system-level testing (web-frontend, scheduler and tools) Group: Development/Tools/Other @@ -127,7 +127,6 @@ %requires_eq perl-Mojolicious-Plugin-AssetPack Recommends: %{name}-local-db Requires(post): coreutils -Requires(post): perl(SQL::SplitStatement) Recommends: apache2 Recommends: apparmor-profiles Recommends: apparmor-utils @@ -202,7 +201,7 @@ %package worker Summary: The openQA worker Group: Development/Tools/Other -%define worker_requires_including_uncovered_in_tests %worker_requires perl(SQL::SplitStatement) +%define worker_requires_including_uncovered_in_tests %worker_requires Requires: %{worker_requires_including_uncovered_in_tests} # FIXME: use proper Requires(pre/post/preun/...) PreReq: openQA-common = %{version} ++++++ node_modules.obscpio ++++++ Binary files old/@csstools-css-calc-3.2.1.tgz and new/@csstools-css-calc-3.2.1.tgz differ Binary files old/@csstools-css-calc-3.4.3.tgz and new/@csstools-css-calc-3.4.3.tgz differ Binary files old/@csstools-css-parser-algorithms-4.0.0.tgz and new/@csstools-css-parser-algorithms-4.0.0.tgz differ Binary files old/@csstools-css-parser-algorithms-4.0.2.tgz and new/@csstools-css-parser-algorithms-4.0.2.tgz differ Binary files old/@csstools-css-syntax-patches-for-csstree-1.1.15.tgz and new/@csstools-css-syntax-patches-for-csstree-1.1.15.tgz differ Binary files old/@csstools-css-syntax-patches-for-csstree-1.1.7.tgz and new/@csstools-css-syntax-patches-for-csstree-1.1.7.tgz differ Binary files old/@csstools-css-tokenizer-4.0.0.tgz and new/@csstools-css-tokenizer-4.0.0.tgz differ Binary files old/@csstools-css-tokenizer-4.0.2.tgz and new/@csstools-css-tokenizer-4.0.2.tgz differ Binary files old/@csstools-selector-resolve-nested-4.0.0.tgz and new/@csstools-selector-resolve-nested-4.0.0.tgz differ Binary files old/@csstools-selector-resolve-nested-4.0.2.tgz and new/@csstools-selector-resolve-nested-4.0.2.tgz differ Binary files old/colord-2.10.0.tgz and new/colord-2.10.0.tgz differ Binary files old/colord-2.9.3.tgz and new/colord-2.9.3.tgz differ Binary files old/fastq-1.20.1.tgz and new/fastq-1.20.1.tgz differ Binary files old/fastq-1.20.3.tgz and new/fastq-1.20.3.tgz differ Binary files old/ignore-7.0.12.tgz and new/ignore-7.0.12.tgz differ Binary files old/stylelint-17.14.1.tgz and new/stylelint-17.14.1.tgz differ Binary files old/stylelint-17.16.0.tgz and new/stylelint-17.16.0.tgz differ ++++++ node_modules.spec.inc ++++++ --- /var/tmp/diff_new_pack.DuUWLa/_old 2026-10-23 20:29:34.237782486 +0200 +++ /var/tmp/diff_new_pack.DuUWLa/_new 2026-10-23 20:29:34.240782612 +0200 @@ -2,12 +2,12 @@ Source1001: https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz#/@babel-helper-validator-identifier-7.29.7.tgz Source1002: https://registry.npmjs.org/@cacheable/memory/-/memory-2.2.0.tgz#/@cacheable-memory-2.2.0.tgz Source1003: https://registry.npmjs.org/@cacheable/utils/-/utils-2.5.0.tgz#/@cacheable-utils-2.5.0.tgz -Source1004: https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.2.1.tgz#/@csstools-css-calc-3.2.1.tgz -Source1005: https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-4.0.0.tgz#/@csstools-css-parser-algorithms-4.0.0.tgz -Source1006: https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.7.tgz#/@csstools-css-syntax-patches-for-csstree-1.1.7.tgz -Source1007: https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-4.0.0.tgz#/@csstools-css-tokenizer-4.0.0.tgz +Source1004: https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.4.3.tgz#/@csstools-css-calc-3.4.3.tgz +Source1005: https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-4.0.2.tgz#/@csstools-css-parser-algorithms-4.0.2.tgz +Source1006: https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.15.tgz#/@csstools-css-syntax-patches-for-csstree-1.1.15.tgz +Source1007: https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-4.0.2.tgz#/@csstools-css-tokenizer-4.0.2.tgz Source1008: https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-5.0.0.tgz#/@csstools-media-query-list-parser-5.0.0.tgz -Source1009: https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-4.0.0.tgz#/@csstools-selector-resolve-nested-4.0.0.tgz +Source1009: https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-4.0.2.tgz#/@csstools-selector-resolve-nested-4.0.2.tgz Source1010: https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-6.0.0.tgz#/@csstools-selector-specificity-6.0.0.tgz Source1011: https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz#/@eslint-community-eslint-utils-4.10.1.tgz Source1012: https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz#/@eslint-community-regexpp-4.12.2.tgz @@ -55,7 +55,7 @@ Source1054: https://registry.npmjs.org/chosen-js/-/chosen-js-1.8.7.tgz#/chosen-js-1.8.7.tgz Source1055: https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz#/color-convert-2.0.1.tgz Source1056: https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz#/color-name-1.1.4.tgz -Source1057: https://registry.npmjs.org/colord/-/colord-2.9.3.tgz#/colord-2.9.3.tgz +Source1057: https://registry.npmjs.org/colord/-/colord-2.10.0.tgz#/colord-2.10.0.tgz Source1058: https://registry.npmjs.org/commander/-/commander-7.2.0.tgz#/commander-7.2.0.tgz Source1059: https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.2.tgz#/cosmiconfig-9.0.2.tgz Source1060: https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz#/cross-spawn-7.0.6.tgz @@ -122,7 +122,7 @@ Source1121: https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#/fast-levenshtein-2.0.6.tgz Source1122: https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.7.tgz#/fast-uri-3.1.7.tgz Source1123: https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#/fastest-levenshtein-1.0.16.tgz -Source1124: https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz#/fastq-1.20.1.tgz +Source1124: https://registry.npmjs.org/fastq/-/fastq-1.20.3.tgz#/fastq-1.20.3.tgz Source1125: https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-11.1.5.tgz#/file-entry-cache-11.1.5.tgz Source1126: https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz#/file-entry-cache-8.0.0.tgz Source1127: https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz#/fill-range-7.1.1.tgz @@ -146,110 +146,111 @@ Source1145: https://registry.npmjs.org/html-tags/-/html-tags-5.1.0.tgz#/html-tags-5.1.0.tgz Source1146: https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz#/iconv-lite-0.6.3.tgz Source1147: https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz#/ignore-5.3.2.tgz -Source1148: https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz#/ignore-7.0.5.tgz -Source1149: https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz#/import-fresh-3.3.1.tgz -Source1150: https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz#/import-meta-resolve-4.2.0.tgz -Source1151: https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz#/imurmurhash-0.1.4.tgz -Source1152: https://registry.npmjs.org/ini/-/ini-1.3.8.tgz#/ini-1.3.8.tgz -Source1153: https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz#/internmap-2.0.3.tgz -Source1154: https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz#/is-arrayish-0.2.1.tgz -Source1155: https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz#/is-extglob-2.1.1.tgz -Source1156: https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#/is-fullwidth-code-point-3.0.0.tgz -Source1157: https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz#/is-glob-4.0.3.tgz -Source1158: https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz#/is-number-7.0.0.tgz -Source1159: https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz#/is-path-inside-4.0.0.tgz -Source1160: https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz#/is-plain-object-5.0.0.tgz -Source1161: https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz#/isexe-2.0.0.tgz -Source1162: https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz#/jquery-3.7.1.tgz -Source1163: https://registry.npmjs.org/jquery/-/jquery-4.0.0.tgz#/jquery-4.0.0.tgz -Source1164: https://registry.npmjs.org/jquery-ujs/-/jquery-ujs-1.2.3.tgz#/jquery-ujs-1.2.3.tgz -Source1165: https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz#/js-tokens-4.0.0.tgz -Source1166: https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz#/js-yaml-4.3.2.tgz -Source1167: https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz#/json-buffer-3.0.1.tgz -Source1168: https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#/json-parse-even-better-errors-2.3.1.tgz -Source1169: https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#/json-schema-traverse-0.4.1.tgz -Source1170: https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#/json-schema-traverse-1.0.0.tgz -Source1171: https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#/json-stable-stringify-without-jsonify-1.0.1.tgz -Source1172: https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz#/keyv-4.5.4.tgz -Source1173: https://registry.npmjs.org/keyv/-/keyv-5.6.0.tgz#/keyv-5.6.0.tgz -Source1174: https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz#/kind-of-6.0.3.tgz -Source1175: https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.37.0.tgz#/known-css-properties-0.37.0.tgz -Source1176: https://registry.npmjs.org/levn/-/levn-0.4.1.tgz#/levn-0.4.1.tgz -Source1177: https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz#/lines-and-columns-1.2.4.tgz -Source1178: https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz#/locate-path-6.0.0.tgz -Source1179: https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz#/lodash-4.18.1.tgz -Source1180: https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz#/lodash.truncate-4.4.2.tgz -Source1181: https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-4.0.0.tgz#/mathml-tag-names-4.0.0.tgz -Source1182: https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz#/mdn-data-2.27.1.tgz -Source1183: https://registry.npmjs.org/meow/-/meow-14.1.0.tgz#/meow-14.1.0.tgz -Source1184: https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz#/merge2-1.4.1.tgz -Source1185: https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz#/micromatch-4.0.8.tgz -Source1186: https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz#/minimatch-10.2.4.tgz -Source1187: https://registry.npmjs.org/ms/-/ms-2.1.3.tgz#/ms-2.1.3.tgz -Source1188: https://registry.npmjs.org/nanoid/-/nanoid-3.3.20.tgz#/nanoid-3.3.20.tgz -Source1189: https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz#/natural-compare-1.4.0.tgz -Source1190: https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz#/normalize-path-3.0.0.tgz -Source1191: https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz#/optionator-0.9.4.tgz -Source1192: https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz#/p-limit-3.1.0.tgz -Source1193: https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz#/p-locate-5.0.0.tgz -Source1194: https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz#/parent-module-1.0.1.tgz -Source1195: https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz#/parse-json-5.2.0.tgz -Source1196: https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz#/path-exists-4.0.0.tgz -Source1197: https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz#/path-key-3.1.1.tgz -Source1198: https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz#/picocolors-1.1.1.tgz -Source1199: https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz#/picomatch-2.3.2.tgz -Source1200: https://registry.npmjs.org/postcss/-/postcss-8.5.30.tgz#/postcss-8.5.30.tgz -Source1201: https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz#/postcss-media-query-parser-0.2.3.tgz -Source1202: https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz#/postcss-resolve-nested-selector-0.1.6.tgz -Source1203: https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.1.0.tgz#/postcss-safe-parser-7.1.0.tgz -Source1204: https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.9.tgz#/postcss-scss-4.0.9.tgz -Source1205: https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.6.tgz#/postcss-selector-parser-7.1.6.tgz -Source1206: https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#/postcss-value-parser-4.2.0.tgz -Source1207: https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz#/prelude-ls-1.2.1.tgz -Source1208: https://registry.npmjs.org/prettier/-/prettier-3.9.6.tgz#/prettier-3.9.6.tgz -Source1209: https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.1.tgz#/prettier-linter-helpers-1.0.1.tgz -Source1210: https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz#/punycode-2.3.1.tgz -Source1211: https://registry.npmjs.org/qified/-/qified-0.10.1.tgz#/qified-0.10.1.tgz -Source1212: https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz#/queue-microtask-1.2.3.tgz -Source1213: https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz#/require-from-string-2.0.2.tgz -Source1214: https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz#/resolve-from-4.0.0.tgz -Source1215: https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz#/reusify-1.1.0.tgz -Source1216: https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.3.tgz#/robust-predicates-3.0.3.tgz -Source1217: https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz#/run-parallel-1.2.0.tgz -Source1218: https://registry.npmjs.org/rw/-/rw-1.3.3.tgz#/rw-1.3.3.tgz -Source1219: https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz#/safer-buffer-2.1.2.tgz -Source1220: https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz#/shebang-command-2.0.0.tgz -Source1221: https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz#/shebang-regex-3.0.0.tgz -Source1222: https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz#/signal-exit-4.1.0.tgz -Source1223: https://registry.npmjs.org/slash/-/slash-5.1.0.tgz#/slash-5.1.0.tgz -Source1224: https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz#/slice-ansi-4.0.0.tgz -Source1225: https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.2.tgz#/source-map-js-1.2.2.tgz -Source1226: https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz#/string-width-4.2.3.tgz -Source1227: https://registry.npmjs.org/string-width/-/string-width-8.2.2.tgz#/string-width-8.2.2.tgz -Source1228: https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz#/strip-ansi-6.0.1.tgz -Source1229: https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz#/strip-ansi-7.2.0.tgz -Source1230: https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz#/style-search-0.1.0.tgz -Source1231: https://registry.npmjs.org/stylelint/-/stylelint-17.14.1.tgz#/stylelint-17.14.1.tgz -Source1232: https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-18.0.0.tgz#/stylelint-config-recommended-18.0.0.tgz -Source1233: https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-17.0.1.tgz#/stylelint-config-recommended-scss-17.0.1.tgz -Source1234: https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-40.0.0.tgz#/stylelint-config-standard-40.0.0.tgz -Source1235: https://registry.npmjs.org/stylelint-config-standard-scss/-/stylelint-config-standard-scss-17.0.0.tgz#/stylelint-config-standard-scss-17.0.0.tgz -Source1236: https://registry.npmjs.org/stylelint-prettier/-/stylelint-prettier-5.0.3.tgz#/stylelint-prettier-5.0.3.tgz -Source1237: https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-7.0.0.tgz#/stylelint-scss-7.0.0.tgz -Source1238: https://registry.npmjs.org/supports-color/-/supports-color-10.2.2.tgz#/supports-color-10.2.2.tgz -Source1239: https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-4.5.0.tgz#/supports-hyperlinks-4.5.0.tgz -Source1240: https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz#/svg-tags-1.0.0.tgz -Source1241: https://registry.npmjs.org/synckit/-/synckit-0.11.13.tgz#/synckit-0.11.13.tgz -Source1242: https://registry.npmjs.org/table/-/table-6.9.0.tgz#/table-6.9.0.tgz -Source1243: https://registry.npmjs.org/timeago.js/-/timeago.js-4.0.2.tgz#/timeago.js-4.0.2.tgz -Source1244: https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz#/to-regex-range-5.0.1.tgz -Source1245: https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz#/type-check-0.4.0.tgz -Source1246: https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.4.0.tgz#/unicorn-magic-0.4.0.tgz -Source1247: https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz#/uri-js-4.4.1.tgz -Source1248: https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz#/util-deprecate-1.0.2.tgz -Source1249: https://registry.npmjs.org/which/-/which-1.3.1.tgz#/which-1.3.1.tgz -Source1250: https://registry.npmjs.org/which/-/which-2.0.2.tgz#/which-2.0.2.tgz -Source1251: https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz#/word-wrap-1.2.5.tgz -Source1252: https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-7.0.1.tgz#/write-file-atomic-7.0.1.tgz -Source1253: https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz#/yocto-queue-0.1.0.tgz +Source1148: https://registry.npmjs.org/ignore/-/ignore-7.0.12.tgz#/ignore-7.0.12.tgz +Source1149: https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz#/ignore-7.0.5.tgz +Source1150: https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz#/import-fresh-3.3.1.tgz +Source1151: https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz#/import-meta-resolve-4.2.0.tgz +Source1152: https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz#/imurmurhash-0.1.4.tgz +Source1153: https://registry.npmjs.org/ini/-/ini-1.3.8.tgz#/ini-1.3.8.tgz +Source1154: https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz#/internmap-2.0.3.tgz +Source1155: https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz#/is-arrayish-0.2.1.tgz +Source1156: https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz#/is-extglob-2.1.1.tgz +Source1157: https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#/is-fullwidth-code-point-3.0.0.tgz +Source1158: https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz#/is-glob-4.0.3.tgz +Source1159: https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz#/is-number-7.0.0.tgz +Source1160: https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz#/is-path-inside-4.0.0.tgz +Source1161: https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz#/is-plain-object-5.0.0.tgz +Source1162: https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz#/isexe-2.0.0.tgz +Source1163: https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz#/jquery-3.7.1.tgz +Source1164: https://registry.npmjs.org/jquery/-/jquery-4.0.0.tgz#/jquery-4.0.0.tgz +Source1165: https://registry.npmjs.org/jquery-ujs/-/jquery-ujs-1.2.3.tgz#/jquery-ujs-1.2.3.tgz +Source1166: https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz#/js-tokens-4.0.0.tgz +Source1167: https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz#/js-yaml-4.3.2.tgz +Source1168: https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz#/json-buffer-3.0.1.tgz +Source1169: https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#/json-parse-even-better-errors-2.3.1.tgz +Source1170: https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#/json-schema-traverse-0.4.1.tgz +Source1171: https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#/json-schema-traverse-1.0.0.tgz +Source1172: https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#/json-stable-stringify-without-jsonify-1.0.1.tgz +Source1173: https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz#/keyv-4.5.4.tgz +Source1174: https://registry.npmjs.org/keyv/-/keyv-5.6.0.tgz#/keyv-5.6.0.tgz +Source1175: https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz#/kind-of-6.0.3.tgz +Source1176: https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.37.0.tgz#/known-css-properties-0.37.0.tgz +Source1177: https://registry.npmjs.org/levn/-/levn-0.4.1.tgz#/levn-0.4.1.tgz +Source1178: https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz#/lines-and-columns-1.2.4.tgz +Source1179: https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz#/locate-path-6.0.0.tgz +Source1180: https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz#/lodash-4.18.1.tgz +Source1181: https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz#/lodash.truncate-4.4.2.tgz +Source1182: https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-4.0.0.tgz#/mathml-tag-names-4.0.0.tgz +Source1183: https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz#/mdn-data-2.27.1.tgz +Source1184: https://registry.npmjs.org/meow/-/meow-14.1.0.tgz#/meow-14.1.0.tgz +Source1185: https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz#/merge2-1.4.1.tgz +Source1186: https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz#/micromatch-4.0.8.tgz +Source1187: https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz#/minimatch-10.2.4.tgz +Source1188: https://registry.npmjs.org/ms/-/ms-2.1.3.tgz#/ms-2.1.3.tgz +Source1189: https://registry.npmjs.org/nanoid/-/nanoid-3.3.20.tgz#/nanoid-3.3.20.tgz +Source1190: https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz#/natural-compare-1.4.0.tgz +Source1191: https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz#/normalize-path-3.0.0.tgz +Source1192: https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz#/optionator-0.9.4.tgz +Source1193: https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz#/p-limit-3.1.0.tgz +Source1194: https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz#/p-locate-5.0.0.tgz +Source1195: https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz#/parent-module-1.0.1.tgz +Source1196: https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz#/parse-json-5.2.0.tgz +Source1197: https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz#/path-exists-4.0.0.tgz +Source1198: https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz#/path-key-3.1.1.tgz +Source1199: https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz#/picocolors-1.1.1.tgz +Source1200: https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz#/picomatch-2.3.2.tgz +Source1201: https://registry.npmjs.org/postcss/-/postcss-8.5.30.tgz#/postcss-8.5.30.tgz +Source1202: https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz#/postcss-media-query-parser-0.2.3.tgz +Source1203: https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz#/postcss-resolve-nested-selector-0.1.6.tgz +Source1204: https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.1.0.tgz#/postcss-safe-parser-7.1.0.tgz +Source1205: https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.9.tgz#/postcss-scss-4.0.9.tgz +Source1206: https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.6.tgz#/postcss-selector-parser-7.1.6.tgz +Source1207: https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#/postcss-value-parser-4.2.0.tgz +Source1208: https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz#/prelude-ls-1.2.1.tgz +Source1209: https://registry.npmjs.org/prettier/-/prettier-3.9.6.tgz#/prettier-3.9.6.tgz +Source1210: https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.1.tgz#/prettier-linter-helpers-1.0.1.tgz +Source1211: https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz#/punycode-2.3.1.tgz +Source1212: https://registry.npmjs.org/qified/-/qified-0.10.1.tgz#/qified-0.10.1.tgz +Source1213: https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz#/queue-microtask-1.2.3.tgz +Source1214: https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz#/require-from-string-2.0.2.tgz +Source1215: https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz#/resolve-from-4.0.0.tgz +Source1216: https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz#/reusify-1.1.0.tgz +Source1217: https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.3.tgz#/robust-predicates-3.0.3.tgz +Source1218: https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz#/run-parallel-1.2.0.tgz +Source1219: https://registry.npmjs.org/rw/-/rw-1.3.3.tgz#/rw-1.3.3.tgz +Source1220: https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz#/safer-buffer-2.1.2.tgz +Source1221: https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz#/shebang-command-2.0.0.tgz +Source1222: https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz#/shebang-regex-3.0.0.tgz +Source1223: https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz#/signal-exit-4.1.0.tgz +Source1224: https://registry.npmjs.org/slash/-/slash-5.1.0.tgz#/slash-5.1.0.tgz +Source1225: https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz#/slice-ansi-4.0.0.tgz +Source1226: https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.2.tgz#/source-map-js-1.2.2.tgz +Source1227: https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz#/string-width-4.2.3.tgz +Source1228: https://registry.npmjs.org/string-width/-/string-width-8.2.2.tgz#/string-width-8.2.2.tgz +Source1229: https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz#/strip-ansi-6.0.1.tgz +Source1230: https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz#/strip-ansi-7.2.0.tgz +Source1231: https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz#/style-search-0.1.0.tgz +Source1232: https://registry.npmjs.org/stylelint/-/stylelint-17.16.0.tgz#/stylelint-17.16.0.tgz +Source1233: https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-18.0.0.tgz#/stylelint-config-recommended-18.0.0.tgz +Source1234: https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-17.0.1.tgz#/stylelint-config-recommended-scss-17.0.1.tgz +Source1235: https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-40.0.0.tgz#/stylelint-config-standard-40.0.0.tgz +Source1236: https://registry.npmjs.org/stylelint-config-standard-scss/-/stylelint-config-standard-scss-17.0.0.tgz#/stylelint-config-standard-scss-17.0.0.tgz +Source1237: https://registry.npmjs.org/stylelint-prettier/-/stylelint-prettier-5.0.3.tgz#/stylelint-prettier-5.0.3.tgz +Source1238: https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-7.0.0.tgz#/stylelint-scss-7.0.0.tgz +Source1239: https://registry.npmjs.org/supports-color/-/supports-color-10.2.2.tgz#/supports-color-10.2.2.tgz +Source1240: https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-4.5.0.tgz#/supports-hyperlinks-4.5.0.tgz +Source1241: https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz#/svg-tags-1.0.0.tgz +Source1242: https://registry.npmjs.org/synckit/-/synckit-0.11.13.tgz#/synckit-0.11.13.tgz +Source1243: https://registry.npmjs.org/table/-/table-6.9.0.tgz#/table-6.9.0.tgz +Source1244: https://registry.npmjs.org/timeago.js/-/timeago.js-4.0.2.tgz#/timeago.js-4.0.2.tgz +Source1245: https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz#/to-regex-range-5.0.1.tgz +Source1246: https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz#/type-check-0.4.0.tgz +Source1247: https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.4.0.tgz#/unicorn-magic-0.4.0.tgz +Source1248: https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz#/uri-js-4.4.1.tgz +Source1249: https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz#/util-deprecate-1.0.2.tgz +Source1250: https://registry.npmjs.org/which/-/which-1.3.1.tgz#/which-1.3.1.tgz +Source1251: https://registry.npmjs.org/which/-/which-2.0.2.tgz#/which-2.0.2.tgz +Source1252: https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz#/word-wrap-1.2.5.tgz +Source1253: https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-7.0.1.tgz#/write-file-atomic-7.0.1.tgz +Source1254: https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz#/yocto-queue-0.1.0.tgz ++++++ openQA-5.1792607148.117af9ef.obscpio -> openQA-5.1792679797.1d1b53d2.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1792607148.117af9ef/dist/rpm/openQA.spec new/openQA-5.1792679797.1d1b53d2/dist/rpm/openQA.spec --- old/openQA-5.1792607148.117af9ef/dist/rpm/openQA.spec 2026-10-21 20:25:48.000000000 +0200 +++ new/openQA-5.1792679797.1d1b53d2/dist/rpm/openQA.spec 2026-10-22 16:36:37.000000000 +0200 @@ -128,7 +128,6 @@ %requires_eq perl-Mojolicious-Plugin-AssetPack Recommends: %{name}-local-db Requires(post): coreutils -Requires(post): perl(SQL::SplitStatement) Recommends: apache2 Recommends: apparmor-profiles Recommends: apparmor-utils @@ -203,7 +202,7 @@ %package worker Summary: The openQA worker Group: Development/Tools/Other -%define worker_requires_including_uncovered_in_tests %worker_requires perl(SQL::SplitStatement) +%define worker_requires_including_uncovered_in_tests %worker_requires Requires: %{worker_requires_including_uncovered_in_tests} # FIXME: use proper Requires(pre/post/preun/...) PreReq: openQA-common = %{version} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1792607148.117af9ef/etc/openqa/openqa.ini new/openQA-5.1792679797.1d1b53d2/etc/openqa/openqa.ini --- old/openQA-5.1792607148.117af9ef/etc/openqa/openqa.ini 2026-10-21 20:25:48.000000000 +0200 +++ new/openQA-5.1792679797.1d1b53d2/etc/openqa/openqa.ini 2026-10-22 16:36:37.000000000 +0200 @@ -106,7 +106,7 @@ ## Causes jobs reported as incomplete by the worker to be cloned automatically when the ## reason matches; set to 0 to disable -#auto_clone_regex = ^(cache failure: |terminated prematurely: |api failure: Failed to register .* 503|backend died: .*VNC.*(timeout|timed out|refused)|QEMU terminated: Failed to allocate KVM HPT of order 25.* Cannot allocate memory|timeout: setup exceeded MAX_SETUP_TIME|backend died: Open vSwitch command .* failed: org\.freedesktop\.DBus\.Error\.NoReply) +#auto_clone_regex = ^(cache failure: |terminated prematurely: |api failure: Failed to register .* 503|backend died: .*VNC.*(timeout|timed out|refused)|QEMU terminated: Failed to allocate KVM HPT of order 25.* Cannot allocate memory|timeout: setup exceeded MAX_SETUP_TIME|backend died: Open vSwitch command .* failed:) ## The maximum amount of times a job will be restarted if the auto_clone_regex matches #auto_clone_limit = 20 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1792607148.117af9ef/lib/OpenQA/Constants.pm new/openQA-5.1792679797.1d1b53d2/lib/OpenQA/Constants.pm --- old/openQA-5.1792607148.117af9ef/lib/OpenQA/Constants.pm 2026-10-21 20:25:48.000000000 +0200 +++ new/openQA-5.1792679797.1d1b53d2/lib/OpenQA/Constants.pm 2026-10-22 16:36:37.000000000 +0200 @@ -22,6 +22,8 @@ use constant DEFAULT_UPLOAD_CHUNK_SIZE => 10_000_000; +use constant DOWNLOAD_PERMISSION => $ENV{OPENQA_DOWNLOAD_PERMISSION} // 0644; + # Define worker commands; used to validate and differentiate commands use constant { # stop the current job(s), do *not* upload logs and assets @@ -139,6 +141,7 @@ JOBS_OVERVIEW_SEARCH_CRITERIA BUILD_SORT_BY_NAME BUILD_SORT_BY_NEWEST_JOB BUILD_SORT_BY_OLDEST_JOB VNCPORT_OFFSET VNC_PORT + DOWNLOAD_PERMISSION ); 1; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1792607148.117af9ef/lib/OpenQA/Downloader.pm new/openQA-5.1792679797.1d1b53d2/lib/OpenQA/Downloader.pm --- old/openQA-5.1792607148.117af9ef/lib/OpenQA/Downloader.pm 2026-10-21 20:25:48.000000000 +0200 +++ new/openQA-5.1792679797.1d1b53d2/lib/OpenQA/Downloader.pm 2026-10-22 16:36:37.000000000 +0200 @@ -7,6 +7,7 @@ use Mojo::Loader 'load_class'; use Mojo::File 'path'; use Mojo::URL; +use OpenQA::Constants 'DOWNLOAD_PERMISSION'; use OpenQA::UserAgent; use OpenQA::Utils 'human_readable_size'; use Time::HiRes 'sleep'; @@ -75,7 +76,8 @@ my $ua = $self->ua; my $log = $self->log; - my $file = path($target)->basename; + $target = path($target); + my $file = $target->basename; $log->info(qq{Downloading "$file" from "$url"}); # Assets might be deleted by a sysadmin @@ -89,8 +91,9 @@ my $code = $res->code; my $error = $res->error // {message => 'Unknown error'}; if (defined $code && $code == HTTP_NOT_MODIFIED) { + $target->chmod(DOWNLOAD_PERMISSION) if my $exists = -e $target; $options->{on_unchanged}->() if $options->{on_unchanged}; - return (undef, -e $target ? undef : $error->{message}); + return (undef, $exists ? undef : $error->{message}); } if (!$res->is_success) { @@ -112,7 +115,6 @@ my $tempfile = path($ENV{MOJO_TMPDIR}, Mojo::URL->new($url)->path->parts->[-1])->to_string; $log->info(qq{Extracting "$tempfile" to "$target"}); $asset->move_to($tempfile); - $target = path($target); $err = $self->_extract_asset($tempfile, $target); unlink $tempfile; if ($err) { @@ -124,7 +126,10 @@ } } } - else { $asset->move_to($target) } + else { + $asset->move_to($target); + $target->chmod(DOWNLOAD_PERMISSION); + } $options->{on_success}->($res) if $options->{on_success}; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1792607148.117af9ef/lib/OpenQA/Files.pm new/openQA-5.1792679797.1d1b53d2/lib/OpenQA/Files.pm --- old/openQA-5.1792607148.117af9ef/lib/OpenQA/Files.pm 2026-10-21 20:25:48.000000000 +0200 +++ new/openQA-5.1792679797.1d1b53d2/lib/OpenQA/Files.pm 2026-10-22 16:36:37.000000000 +0200 @@ -7,7 +7,6 @@ use Digest::SHA 'sha1_base64'; use Mojo::File 'path'; use OpenQA::File; -use Mojo::Exception; sub join ($self) { return join '', map { $_->read } $self->each; @@ -32,46 +31,4 @@ return $self->each(sub ($file, $i) { $file->prepare }); } -sub write_chunks ($class, $chunk_path, $file) { - return Mojo::File->new($chunk_path)->list_tree()->sort->each( - sub { - my $chunk = OpenQA::File->deserialize($_->slurp); - $chunk->decode_content; # Decode content before writing it - $chunk->write_content($file); - }); -} - -sub write_verify_chunks ($class, $chunk_path, $file) { - $class->write_chunks($chunk_path => $file); - return $class->verify_chunks($chunk_path => $file); -} - -sub spew ($self, $dir) { - return $self->each( - sub { - $_->prepare; # Prepare your data first before serializing - Mojo::File->new($dir, $_->index)->spew($_->serialize); - }); -} - -sub verify_chunks ($class, $chunk_path, $verify_file) { - my $sum; - for (Mojo::File->new($chunk_path)->list_tree()->each) { - my $chunk = OpenQA::File->deserialize($_->slurp); - - $chunk->decode_content; - $sum = $chunk->total_cksum if !$sum; - return Mojo::Exception->new( - 'Chunk: ' . $chunk->id() . ' differs in total checksum, expected $sum given ' . $chunk->total_cksum) - if $sum ne $chunk->total_cksum; - return Mojo::Exception->new("Can't verify written data from chunk") - unless $chunk->verify_content($verify_file); - } - - my $final_sum = OpenQA::File->file_digest(Mojo::File->new($verify_file)->to_string); - return Mojo::Exception->new("Total checksum failed: expected $sum, computed " . $final_sum) - if $sum ne $final_sum; - return undef; -} - 1; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1792607148.117af9ef/lib/OpenQA/Schema/Result/JobModules.pm new/openQA-5.1792679797.1d1b53d2/lib/OpenQA/Schema/Result/JobModules.pm --- old/openQA-5.1792607148.117af9ef/lib/OpenQA/Schema/Result/JobModules.pm 2026-10-21 20:25:48.000000000 +0200 +++ new/openQA-5.1792679797.1d1b53d2/lib/OpenQA/Schema/Result/JobModules.pm 2026-10-22 16:36:37.000000000 +0200 @@ -5,6 +5,7 @@ use Mojo::Base 'DBIx::Class::Core', -signatures; +use OpenQA::Constants qw(DOWNLOAD_PERMISSION); use OpenQA::Jobs::Constants; use Mojo::JSON qw(decode_json encode_json); use Mojo::File qw(path tempfile); @@ -206,7 +207,8 @@ my $dir = $self->job->result_dir; my $tmpfile = tempfile(DIR => $dir); - $tmpfile->spew(encode_json($results))->chmod(0644)->move_to(path($dir, 'details-' . $self->name . '.json')); + $tmpfile->spew(encode_json($results)); + $tmpfile->chmod(DOWNLOAD_PERMISSION)->move_to(path($dir, 'details-' . $self->name . '.json')); } # incorporate textual step data into details JSON @@ -237,7 +239,7 @@ my $new_file_contents = encode_json($results); my $tmpfile = tempfile(DIR => $file->dirname); $tmpfile->spew($new_file_contents); - $tmpfile->chmod(0644)->move_to($file); + $tmpfile->chmod(DOWNLOAD_PERMISSION)->move_to($file); # cleanup incorporated files for my $step (@$details) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1792607148.117af9ef/lib/OpenQA/Schema/Result/Jobs.pm new/openQA-5.1792679797.1d1b53d2/lib/OpenQA/Schema/Result/Jobs.pm --- old/openQA-5.1792607148.117af9ef/lib/OpenQA/Schema/Result/Jobs.pm 2026-10-21 20:25:48.000000000 +0200 +++ new/openQA-5.1792679797.1d1b53d2/lib/OpenQA/Schema/Result/Jobs.pm 2026-10-22 16:36:37.000000000 +0200 @@ -14,6 +14,7 @@ qw(run_cmd_with_log_return_error needledir testcasedir git_commit_url find_video_files) ); use OpenQA::App; +use OpenQA::Constants qw(DOWNLOAD_PERMISSION); use OpenQA::Jobs::Constants; use OpenQA::JobDependencies::Constants; use OpenQA::Markdown 'markdown_to_html'; @@ -1406,8 +1407,7 @@ # Worker and WebUI are on the same host (much faster) if ($local) { path($local)->copy_to($temp_final_file); - $temp_final_file->move_to($final_file); - chmod 0644, $final_file; + $temp_final_file->move_to($final_file)->chmod(DOWNLOAD_PERMISSION); $temp_chunk_folder->remove_tree; return 0, $fname, $type, 1; } @@ -1441,11 +1441,7 @@ $temp_chunk_folder->remove_tree && die Mojo::Exception->new("Checksum mismatch expected $sum got: $real_sum (weak check on last bytes)") unless $sum eq $real_sum; - - $temp_final_file->move_to($final_file); - - chmod 0644, $final_file; - + $temp_final_file->move_to($final_file)->chmod(DOWNLOAD_PERMISSION); $temp_chunk_folder->remove_tree; } $chunk->content(\undef); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1792607148.117af9ef/lib/OpenQA/Setup.pm new/openQA-5.1792679797.1d1b53d2/lib/OpenQA/Setup.pm --- old/openQA-5.1792607148.117af9ef/lib/OpenQA/Setup.pm 2026-10-21 20:25:48.000000000 +0200 +++ new/openQA-5.1792679797.1d1b53d2/lib/OpenQA/Setup.pm 2026-10-22 16:36:37.000000000 +0200 @@ -147,7 +147,7 @@ auto_duplicate_stale_jobs => 1, search_results_limit => 50000, auto_clone_regex => -'^(cache failure: |terminated prematurely: |api failure: Failed to register .* 503|backend died: .*VNC.*(timeout|timed out|refused)|QEMU terminated: Failed to allocate KVM HPT of order 25.* Cannot allocate memory|backend died: Open vSwitch command .* failed: org\.freedesktop\.DBus\.Error\.NoReply)', +'^(cache failure: |terminated prematurely: |api failure: Failed to register .* 503|backend died: .*VNC.*(timeout|timed out|refused)|QEMU terminated: Failed to allocate KVM HPT of order 25.* Cannot allocate memory|backend died: Open vSwitch command .* failed:)', auto_clone_limit => 20, force_result_regex => '', parallel_children_collapsable_results => join(' ', OK_RESULTS), diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1792607148.117af9ef/lib/OpenQA/Task/Asset/Download.pm new/openQA-5.1792679797.1d1b53d2/lib/OpenQA/Task/Asset/Download.pm --- old/openQA-5.1792607148.117af9ef/lib/OpenQA/Task/Asset/Download.pm 2026-10-21 20:25:48.000000000 +0200 +++ new/openQA-5.1792679797.1d1b53d2/lib/OpenQA/Task/Asset/Download.pm 2026-10-22 16:36:37.000000000 +0200 @@ -79,10 +79,7 @@ my $downloader = OpenQA::Downloader->new(log => $ctx, tmpdir => $ENV{MOJO_TMPDIR}); my $options = { extract => $do_extract, - on_success => sub { - chmod 0644, $assetpath; - $ctx->debug(qq{Download of "$assetpath" successful}); - } + on_success => sub { $ctx->debug(qq{Download of "$assetpath" successful}) }, }; return _create_symlinks($job, $ctx, $assetpath, \@other_destinations) unless my $err = $downloader->download($url, $assetpath, $options); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1792607148.117af9ef/lib/OpenQA/Worker/Job.pm new/openQA-5.1792679797.1d1b53d2/lib/OpenQA/Worker/Job.pm --- old/openQA-5.1792607148.117af9ef/lib/OpenQA/Worker/Job.pm 2026-10-21 20:25:48.000000000 +0200 +++ new/openQA-5.1792679797.1d1b53d2/lib/OpenQA/Worker/Job.pm 2026-10-22 16:36:37.000000000 +0200 @@ -6,7 +6,7 @@ use OpenQA::Constants qw(DEFAULT_MAX_JOB_TIME DEFAULT_UPLOAD_CHUNK_SIZE DEFAULT_MAX_SETUP_TIME WORKER_COMMAND_ABORT WORKER_COMMAND_QUIT WORKER_COMMAND_CANCEL WORKER_COMMAND_OBSOLETE WORKER_SR_BROKEN WORKER_SR_SETUP_FAILURE - WORKER_SR_API_FAILURE WORKER_SR_TIMEOUT WORKER_SR_DONE WORKER_SR_DIED); + WORKER_SR_API_FAILURE WORKER_SR_TIMEOUT WORKER_SR_DONE WORKER_SR_DIED DOWNLOAD_PERMISSION); use OpenQA::Jobs::Constants; use OpenQA::Worker::Engines::isotovideo; use OpenQA::Worker::Isotovideo::Client; @@ -991,7 +991,7 @@ $ua->upload->once( 'upload_local.prepare' => sub ($upload) { log_info("$filename: local upload (no chunks needed)", channels => \@channels_worker_only, default => 1); - chmod 0644, $file; + chmod DOWNLOAD_PERMISSION, $file; }); $ua->upload->once( 'upload_chunk.prepare' => sub ($upload, $pieces) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1792607148.117af9ef/package-lock.json new/openQA-5.1792679797.1d1b53d2/package-lock.json --- old/openQA-5.1792607148.117af9ef/package-lock.json 2026-10-21 20:25:48.000000000 +0200 +++ new/openQA-5.1792679797.1d1b53d2/package-lock.json 2026-10-22 16:36:37.000000000 +0200 @@ -29,7 +29,7 @@ "eslint-plugin-prettier": "^5.5.5", "globals": "^17.13.0", "prettier": "^3.9.6", - "stylelint": "^17.14.1", + "stylelint": "^17.16.0", "stylelint-config-standard-scss": "^17.0.0", "stylelint-prettier": "^5.0.3" } @@ -121,9 +121,9 @@ } }, "node_modules/@csstools/css-calc": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.2.1.tgz", - "integrity": "sha512-DtdHlgXh5ZkA43cwBcAm+huzgJiwx3ZTWVjBs94kwz2xKqSimDA3lBgCjphYgwgVUMWatSM0pDd8TILB1yrVVg==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.4.3.tgz", + "integrity": "sha512-iex20d8CHVkyvg6B7UKV7uHnI2Bqo9g+EFfT9E0y+GvTvhZ/DwONJ+9aKb1dlqm0ZiGsL5RXjp0fCoJYnkeDjA==", "dev": true, "funding": [ { @@ -140,14 +140,14 @@ "node": ">=20.19.0" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^4.0.0", - "@csstools/css-tokenizer": "^4.0.0" + "@csstools/css-parser-algorithms": "^4.0.2", + "@csstools/css-tokenizer": "^4.0.2" } }, "node_modules/@csstools/css-parser-algorithms": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-4.0.0.tgz", - "integrity": "sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-4.0.2.tgz", + "integrity": "sha512-40cSKyMvK+tq4qz6Awrlye2WGuOKt3FwPgtGg6KTfbHOWNw+Rk1rzbAtZnZ6IBhsY491HLRnDXwoyBAijmmILA==", "dev": true, "funding": [ { @@ -164,13 +164,13 @@ "node": ">=20.19.0" }, "peerDependencies": { - "@csstools/css-tokenizer": "^4.0.0" + "@csstools/css-tokenizer": "^4.0.2" } }, "node_modules/@csstools/css-syntax-patches-for-csstree": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.7.tgz", - "integrity": "sha512-fQ+05118eQS1cofO3aJpB5efgpBZMvIzwr/sbC8kDLVA5XLG8q1kJV5yzrUAI1f7lvhPnm8fgIjzFB8/O/5Dig==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.15.tgz", + "integrity": "sha512-J0u7HkVl2nzSlhsiTOp4AmwcUQ3D+mGEEKfBy/7To5/y7F2OHwyLrXfrhR0SMgr4p5Lo+eaMVSeai24zUcBIxA==", "dev": true, "funding": [ { @@ -193,9 +193,9 @@ } }, "node_modules/@csstools/css-tokenizer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-4.0.0.tgz", - "integrity": "sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-4.0.2.tgz", + "integrity": "sha512-OoKoR0f76dCY666JlcbhmVTs2drYj1GUXZTYTcbUgJjh9Nv41aFfZ21bPQTERm5+L5cBDo466NltB2lplS5GBw==", "dev": true, "funding": [ { @@ -237,9 +237,9 @@ } }, "node_modules/@csstools/selector-resolve-nested": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-4.0.0.tgz", - "integrity": "sha512-9vAPxmp+Dx3wQBIUwc1v7Mdisw1kbbaGqXUM8QLTgWg7SoPGYtXBsMXvsFs/0Bn5yoFhcktzxNZGNaUt0VjgjA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-4.0.2.tgz", + "integrity": "sha512-JpjNBJFA+4OnAHKRK4AMp8xrYyLhI9XapOeBlP2PhRU/IylSw+1ep3BFNTksBJnrTS3KT6kqKNVfpzLLwZUW5Q==", "dev": true, "funding": [ { @@ -824,9 +824,9 @@ "license": "MIT" }, "node_modules/colord": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.10.0.tgz", + "integrity": "sha512-AidJptpBJmjTclAp9BkLwJi0T93fo5epJnbaZslpg6QVzpHjAiveF55mE9AcUJiGMqRHgMDY8soMsQtuNYMHfw==", "dev": true, "license": "MIT" }, @@ -1719,9 +1719,9 @@ } }, "node_modules/fastq": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", - "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.3.tgz", + "integrity": "sha512-XKv5nnLs6nLF71NgiKJLIZFLkPyIEuOselLG7ujZnGrRfQK8HpvY+WqKhAJUAdLomwVHErVS4LfxFlPq0/FTAw==", "dev": true, "license": "ISC", "dependencies": { @@ -2907,9 +2907,9 @@ "license": "ISC" }, "node_modules/stylelint": { - "version": "17.14.1", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-17.14.1.tgz", - "integrity": "sha512-xVQwyiuxALUBNB2fBe0tmNemg9KqLtdj3T64mioFDar79B2cU8LIyz+3KL6LdiHs9NkeNfwxpKSaIVOY8f112g==", + "version": "17.16.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-17.16.0.tgz", + "integrity": "sha512-ejlWnbJ13x1GU32+zZXa6sYQJsKKkwSdv2B4rAdO3OWdEmvhSJKcXi5pOphQYSzyaj1kXpuGJr7pcMBNfDIuPw==", "dev": true, "funding": [ { @@ -2923,14 +2923,14 @@ ], "license": "MIT", "dependencies": { - "@csstools/css-calc": "^3.2.1", + "@csstools/css-calc": "^3.3.0", "@csstools/css-parser-algorithms": "^4.0.0", - "@csstools/css-syntax-patches-for-csstree": "^1.1.6", + "@csstools/css-syntax-patches-for-csstree": "^1.1.9", "@csstools/css-tokenizer": "^4.0.0", "@csstools/media-query-list-parser": "^5.0.0", - "@csstools/selector-resolve-nested": "^4.0.0", + "@csstools/selector-resolve-nested": "^4.0.1", "@csstools/selector-specificity": "^6.0.0", - "colord": "^2.9.3", + "colord": "^2.10.0", "cosmiconfig": "^9.0.2", "css-functions-list": "^3.3.3", "css-tree": "^3.2.1", @@ -2939,21 +2939,21 @@ "fastest-levenshtein": "^1.0.16", "file-entry-cache": "^11.1.5", "global-modules": "^2.0.0", - "globby": "^16.2.1", + "globby": "^16.2.4", "globjoin": "^0.1.4", "html-tags": "^5.1.0", - "ignore": "^7.0.5", + "ignore": "^7.0.6", "import-meta-resolve": "^4.2.0", "mathml-tag-names": "^4.0.0", "meow": "^14.1.0", "micromatch": "^4.0.8", "normalize-path": "^3.0.0", "picocolors": "^1.1.1", - "postcss": "^8.5.16", + "postcss": "^8.5.26", "postcss-safe-parser": "^7.0.1", - "postcss-selector-parser": "^7.1.4", + "postcss-selector-parser": "^7.1.5", "postcss-value-parser": "^4.2.0", - "string-width": "^8.2.1", + "string-width": "^8.2.2", "supports-hyperlinks": "^4.5.0", "svg-tags": "^1.0.0", "table": "^6.9.0", @@ -3125,9 +3125,9 @@ } }, "node_modules/stylelint/node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.12.tgz", + "integrity": "sha512-/8UvqAPU9DGTI9k4mxtf49U37Isfwr8Uts96+SBHIkFxPJnHS0Ew4f00sM4Scd8V8EjM0jUNtVDdv1kPdt35lg==", "dev": true, "license": "MIT", "engines": { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1792607148.117af9ef/package.json new/openQA-5.1792679797.1d1b53d2/package.json --- old/openQA-5.1792607148.117af9ef/package.json 2026-10-21 20:25:48.000000000 +0200 +++ new/openQA-5.1792679797.1d1b53d2/package.json 2026-10-22 16:36:37.000000000 +0200 @@ -19,7 +19,7 @@ "eslint-plugin-prettier": "^5.5.5", "globals": "^17.13.0", "prettier": "^3.9.6", - "stylelint": "^17.14.1", + "stylelint": "^17.16.0", "stylelint-config-standard-scss": "^17.0.0", "stylelint-prettier": "^5.0.3" }, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1792607148.117af9ef/t/25-cache-service.t new/openQA-5.1792679797.1d1b53d2/t/25-cache-service.t --- old/openQA-5.1792607148.117af9ef/t/25-cache-service.t 2026-10-21 20:25:48.000000000 +0200 +++ new/openQA-5.1792679797.1d1b53d2/t/25-cache-service.t 2026-10-22 16:36:37.000000000 +0200 @@ -94,6 +94,8 @@ wait_for_or_bail_out { $cache_client->status($asset_request)->is_processed } 'asset'; } ok $cache_client->asset_exists('localhost', $asset), "Asset $asset downloaded"; + is sprintf('%04o', (stat $cache_client->asset_path('localhost', $asset))[2] & 07777), '0644', + "Asset $asset has 0644 permissions"; ok $asset_request->minion_id, 'Minion job id recorded in the request object' or die always_explain $asset_request; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1792607148.117af9ef/t/25-cache.t new/openQA-5.1792679797.1d1b53d2/t/25-cache.t --- old/openQA-5.1792607148.117af9ef/t/25-cache.t 2026-10-21 20:25:48.000000000 +0200 +++ new/openQA-5.1792679797.1d1b53d2/t/25-cache.t 2026-10-22 16:36:37.000000000 +0200 @@ -238,14 +238,17 @@ like $cache_log, qr/Download of ".*sle-12-SP3-x86_64-0368-200.*" successful \([\d\.]+ \w+\/s\), new cache size is 1024/, 'Full download logged'; like $cache_log, qr/Size of .* is 1024 Byte, with ETag "andi \$a3, \$t1, 41399"/, 'Etag and size are logged'; -ok -e $cachedir->child($host, '[email protected]'), 'Asset exist in cache'; -is $cache->asset($cachedir->child($host, '[email protected]')->to_string)->{pending}, 0, - 'Pending flag unset after download'; +ok -e (my $cached_asset = $cachedir->child($host, '[email protected]')), 'Asset exist in cache'; +is sprintf('%04o', (stat $cached_asset)[2] & 07777), '0644', 'Cached asset has 0644 permissions'; +is $cache->asset($cached_asset->to_string)->{pending}, 0, 'Pending flag unset after download'; $cache_log = ''; +chmod 0600, $cached_asset; $cache->get_asset($host, {id => 922756}, 'hdd', '[email protected]'); like $cache_log, qr/Downloading "sle-12-SP3-x86_64-0368-200\@64bit.qcow2" from/, 'Asset download attempt'; like $cache_log, qr/Content of ".*0368-200\@64bit.qcow2" has not changed, updating last use/, 'Content has not changed'; +is sprintf('%04o', (stat $cached_asset)[2] & 07777), '0644', + 'Cached asset permissions updated to 0644 on unchanged check'; $cache_log = ''; $cache->get_asset($host, {id => 922756}, 'hdd', '[email protected]'); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1792607148.117af9ef/t/31-client.t new/openQA-5.1792679797.1d1b53d2/t/31-client.t --- old/openQA-5.1792607148.117af9ef/t/31-client.t 2026-10-21 20:25:48.000000000 +0200 +++ new/openQA-5.1792679797.1d1b53d2/t/31-client.t 2026-10-22 16:36:37.000000000 +0200 @@ -9,13 +9,10 @@ use Test::Mojo; use Test::MockModule; -use Test::MockObject; use Test::Mock::Time; use Test::Output; use Test::Warnings ':report_warnings'; use OpenQA::Client; -use OpenQA::WebAPI; -use OpenQA::Test::Case; use OpenQA::Test::FakeWorker; use OpenQA::Scheduler::Client; use OpenQA::WebSockets::Client; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1792607148.117af9ef/t/31-client_file.t new/openQA-5.1792679797.1d1b53d2/t/31-client_file.t --- old/openQA-5.1792607148.117af9ef/t/31-client_file.t 2026-10-21 20:25:48.000000000 +0200 +++ new/openQA-5.1792679797.1d1b53d2/t/31-client_file.t 1970-01-01 01:00:00.000000000 +0100 @@ -1,197 +0,0 @@ -#!/usr/bin/env perl -# Copyright SUSE LLC -# SPDX-License-Identifier: GPL-2.0-or-later - -use Test::Most; -use Mojo::Base -signatures; -use Test::Warnings ':report_warnings'; - -use FindBin; -use lib "$FindBin::Bin/lib", "$FindBin::Bin/../external/os-autoinst-common/lib"; -use OpenQA::Client; -use OpenQA::File; -use Digest::SHA 'sha1_base64'; -use Mojo::File qw(path tempfile tempdir); -use OpenQA::Test::TimeLimit '15'; - -sub file_path (@args) { OpenQA::File->new(file => path(@args)) } - -subtest 'base' => sub { - my $file = file_path($FindBin::Bin, 'data', 'ltp_test_result_format.json'); - ok $file->end; - $file->read; - my $content = $file->content(); - $file->encode_content(); - isnt $file->content(), $content or die always_explain $file; - $file->decode_content(); - is $file->content(), $content, 'decoded content match to original one' or die 'Horrible thing would happen'; -}; - -subtest 'split/join' => sub { - my $size = file_path($FindBin::Bin, 'data', 'ltp_test_result_format.json')->size; - - is $size, 6991, 'size matches'; - - is OpenQA::File::_chunk_size(20, 10), 2, 'calculated chunk match'; - is OpenQA::File::_chunk_size(21, 10), 3; - is OpenQA::File::_chunk_size(29, 10), 3; - is OpenQA::File::_chunk_size(30, 10), 3; - is OpenQA::File::_chunk_size(31, 10), 4; - - my $pieces = file_path($FindBin::Bin, 'data', 'ltp_test_result_format.json')->split(2000); - - is $pieces->last->end, $size, 'Last piece end must match with size'; - - is $pieces->join(), path($FindBin::Bin, 'data', 'ltp_test_result_format.json')->slurp, 'Content match' - or die always_explain $pieces; - - is $pieces->generate_sum(), sha1_base64(path($FindBin::Bin, 'data', 'ltp_test_result_format.json')->slurp), - 'SHA-1 match' - or die always_explain $pieces; - - my $t_file = tempfile(); - $pieces->write($t_file); - - is $t_file->slurp, path($FindBin::Bin, 'data', 'ltp_test_result_format.json')->slurp, - 'Composed content is same as original' - or die always_explain $pieces; - - my @serialized = $pieces->serialize(); - is scalar @serialized, $pieces->size(), 'Serialized number of files match'; - # Send over the net .. - my $des_pieces = OpenQA::Files->deserialize(@serialized); #recompose - - - is_deeply $des_pieces, $pieces or die always_explain $des_pieces; - - is $des_pieces->join(), path($FindBin::Bin, 'data', 'ltp_test_result_format.json')->slurp, 'Content match' - or die always_explain $des_pieces; - - is $des_pieces->generate_sum(), - sha1_base64(path($FindBin::Bin, 'data', 'ltp_test_result_format.json')->slurp), 'SHA-1 match' - or die always_explain $des_pieces; - - ok $des_pieces->is_sum(sha1_base64(path($FindBin::Bin, 'data', 'ltp_test_result_format.json')->slurp)); -}; - - -subtest 'recompose in-place' => sub { - my $original = file_path($FindBin::Bin, 'data', 'ltp_test_result_format.json'); - - my $pieces = $original->split(103); - - my $t_dir = tempdir(); - my $copied_file = tempfile(); - - - # Save pieces to disk - $_->prepare && Mojo::File->new($t_dir, $_->index)->spew($_->serialize) for $pieces->each(); - #$pieces->prepare(); it will call prepare for each one - - is $t_dir->list_tree->size, $pieces->last->total; - - # Write piece-by-piece to another file. - $t_dir->list_tree->shuffle->each( - sub { - my $chunk = OpenQA::File->deserialize(path($_)->slurp); - $chunk->decode_content; - $chunk->write_content($copied_file); - }); - - my $sha; - $t_dir->list_tree->shuffle->each( - sub { - my $chunk = OpenQA::File->deserialize(path($_)->slurp); - $chunk->decode_content; - is $chunk->verify_content($copied_file), 1, 'chunk: ' . $chunk->index . ' verified'; - $sha = $chunk->total_cksum; - }); - - is $sha, OpenQA::File->file_digest($copied_file->to_string), 'SHA-1 Matches'; - - is $original->file->slurp, path($copied_file)->slurp, 'Same content'; - - $pieces->first->content('42')->write_content($copied_file); #Let's simulate a writing error - isnt $sha, sha1_base64(path($copied_file)->slurp), 'SHA-1 Are not matching anymore'; - isnt $original->file->slurp, path($copied_file)->slurp, 'Not same content'; - - my $chunk = OpenQA::File->deserialize(path($t_dir->list_tree->first)->slurp); - ok !$chunk->verify_content($copied_file), 'chunk NOT verified'; -}; - -subtest 'prepare_chunks' => sub { - my $original = file_path($FindBin::Bin, 'data', 'ltp_test_result_format.json'); - - my $pieces = $original->split(10); - - $pieces->prepare; - - ok $_->cksum, 'Checksum present for ' . $_->index for $pieces->each; -}; - -subtest 'verify_chunks' => sub { - my $original = file_path($FindBin::Bin, 'data', 'ltp_test_result_format.json'); - - my $pieces = $original->split(100000); - - my $t_dir = tempdir(); - my $copied_file = tempfile(); - - # Save pieces to disk - $pieces->spew($t_dir); - - is $t_dir->list_tree->size, $pieces->last->total; - - OpenQA::Files->write_chunks($t_dir => $copied_file); - - is +OpenQA::Files->verify_chunks($t_dir => $copied_file), undef, 'Verify chunks passes'; - $copied_file->spew(''); - - is +OpenQA::Files->verify_chunks($t_dir => $copied_file)->message(), - 'Can\'t verify written data from chunk', - 'Cannot verify chunks passes'; - is $copied_file->slurp, '', 'File is empty now'; - - is +OpenQA::Files->write_verify_chunks($t_dir => $copied_file), undef, 'Write and verify passes'; - - is $original->file->slurp, path($copied_file)->slurp, 'Same content'; - - $pieces->first->content('42')->write_content($copied_file); #Let's simulate a writing error - like +OpenQA::Files->verify_chunks($t_dir => $copied_file), - qr/^Can't verify written data from chunk/, - 'Verify chunks fail'; - isnt $original->file->slurp, path($copied_file)->slurp, 'Not same content'; -}; - -sub compare ($file, $chunk_size) { - my $original = file_path($FindBin::Bin, 'data', $file); - my $pieces = $original->split($chunk_size); - - is OpenQA::File::_chunk_size($original->size, $chunk_size), $pieces->size, 'Size and pieces matches!'; - - for my $i (1 .. $pieces->size) { - my $piece = $original->get_piece($i => $chunk_size); - my $from_split = $pieces->get($i - 1); - is_deeply $piece, $from_split, 'Structs are matching'; - - $piece->prepare(); - $from_split->prepare(); - - ok $piece->verify_content($original->file->to_string), 'Chunk verified'; - ok $from_split->verify_content($original->file->to_string), 'Chunk verified'; - - is_deeply $piece, $from_split, 'Structs are matching after prepare()'; - } -} - -subtest 'get_piece' => sub { - my $file = 'ltp_test_result_format.json'; - my $size = file_path($FindBin::Bin, 'data', $file)->size; - - compare($file => 1); - compare($file => 10); - compare($file => 21); - compare($file => $size); -}; - -done_testing(); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1792607148.117af9ef/t/47-openqa-file.t new/openQA-5.1792679797.1d1b53d2/t/47-openqa-file.t --- old/openQA-5.1792607148.117af9ef/t/47-openqa-file.t 1970-01-01 01:00:00.000000000 +0100 +++ new/openQA-5.1792679797.1d1b53d2/t/47-openqa-file.t 2026-10-22 16:36:37.000000000 +0200 @@ -0,0 +1,162 @@ +#!/usr/bin/env perl +# Copyright SUSE LLC +# SPDX-License-Identifier: GPL-2.0-or-later + +use Test::Most; +use Mojo::Base -signatures; +use Test::Warnings ':report_warnings'; + +use FindBin; +use lib "$FindBin::Bin/lib", "$FindBin::Bin/../external/os-autoinst-common/lib"; +use OpenQA::File; +use Digest::SHA 'sha1_base64'; +use Mojo::File qw(path tempfile tempdir); +use OpenQA::Test::TimeLimit '15'; + +sub file_path (@args) { OpenQA::File->new(file => path(@args)) } + +subtest 'base' => sub { + my $file = file_path($FindBin::Bin, 'data', 'ltp_test_result_format.json'); + ok $file->end; + $file->read; + my $content = $file->content(); + $file->encode_content(); + isnt $file->content(), $content or die always_explain $file; + $file->decode_content(); + is $file->content(), $content, 'decoded content match to original one' or die 'Horrible thing would happen'; +}; + +subtest 'split/join' => sub { + my $size = file_path($FindBin::Bin, 'data', 'ltp_test_result_format.json')->size; + + is $size, 6991, 'size matches'; + + is OpenQA::File::_chunk_size(20, 10), 2, 'calculated chunk match'; + is OpenQA::File::_chunk_size(21, 10), 3; + is OpenQA::File::_chunk_size(29, 10), 3; + is OpenQA::File::_chunk_size(30, 10), 3; + is OpenQA::File::_chunk_size(31, 10), 4; + + my $pieces = file_path($FindBin::Bin, 'data', 'ltp_test_result_format.json')->split(2000); + + is $pieces->last->end, $size, 'Last piece end must match with size'; + + is $pieces->join(), path($FindBin::Bin, 'data', 'ltp_test_result_format.json')->slurp, 'Content match' + or die always_explain $pieces; + + is $pieces->generate_sum(), sha1_base64(path($FindBin::Bin, 'data', 'ltp_test_result_format.json')->slurp), + 'SHA-1 match' + or die always_explain $pieces; + + my $t_file = tempfile(); + $pieces->write($t_file); + + is $t_file->slurp, path($FindBin::Bin, 'data', 'ltp_test_result_format.json')->slurp, + 'Composed content is same as original' + or die always_explain $pieces; + + my @serialized = $pieces->serialize(); + is scalar @serialized, $pieces->size(), 'Serialized number of files match'; + # Send over the net .. + my $des_pieces = OpenQA::Files->deserialize(@serialized); #recompose + + + is_deeply $des_pieces, $pieces or die always_explain $des_pieces; + + is $des_pieces->join(), path($FindBin::Bin, 'data', 'ltp_test_result_format.json')->slurp, 'Content match' + or die always_explain $des_pieces; + + is $des_pieces->generate_sum(), + sha1_base64(path($FindBin::Bin, 'data', 'ltp_test_result_format.json')->slurp), 'SHA-1 match' + or die always_explain $des_pieces; + + ok $des_pieces->is_sum(sha1_base64(path($FindBin::Bin, 'data', 'ltp_test_result_format.json')->slurp)); +}; + + +subtest 'recompose in-place' => sub { + my $original = file_path($FindBin::Bin, 'data', 'ltp_test_result_format.json'); + + my $pieces = $original->split(103); + + my $t_dir = tempdir(); + my $copied_file = tempfile(); + + + # Save pieces to disk + $_->prepare && Mojo::File->new($t_dir, $_->index)->spew($_->serialize) for $pieces->each(); + #$pieces->prepare(); it will call prepare for each one + + is $t_dir->list_tree->size, $pieces->last->total; + + # Write piece-by-piece to another file. + $t_dir->list_tree->shuffle->each( + sub { + my $chunk = OpenQA::File->deserialize(path($_)->slurp); + $chunk->decode_content; + $chunk->write_content($copied_file); + }); + + my $sha; + $t_dir->list_tree->shuffle->each( + sub { + my $chunk = OpenQA::File->deserialize(path($_)->slurp); + $chunk->decode_content; + is $chunk->verify_content($copied_file), 1, 'chunk: ' . $chunk->index . ' verified'; + $sha = $chunk->total_cksum; + }); + + is $sha, OpenQA::File->file_digest($copied_file->to_string), 'SHA-1 Matches'; + + is $original->file->slurp, path($copied_file)->slurp, 'Same content'; + + $pieces->first->content('42')->write_content($copied_file); #Let's simulate a writing error + isnt $sha, sha1_base64(path($copied_file)->slurp), 'SHA-1 Are not matching anymore'; + isnt $original->file->slurp, path($copied_file)->slurp, 'Not same content'; + + my $chunk = OpenQA::File->deserialize(path($t_dir->list_tree->first)->slurp); + ok !$chunk->verify_content($copied_file), 'chunk NOT verified'; +}; + +subtest 'prepare_chunks' => sub { + my $original = file_path($FindBin::Bin, 'data', 'ltp_test_result_format.json'); + + my $pieces = $original->split(10); + + $pieces->prepare; + + ok $_->cksum, 'Checksum present for ' . $_->index for $pieces->each; +}; + +sub compare ($file, $chunk_size) { + my $original = file_path($FindBin::Bin, 'data', $file); + my $pieces = $original->split($chunk_size); + + is OpenQA::File::_chunk_size($original->size, $chunk_size), $pieces->size, 'Size and pieces matches!'; + + for my $i (1 .. $pieces->size) { + my $piece = $original->get_piece($i => $chunk_size); + my $from_split = $pieces->get($i - 1); + is_deeply $piece, $from_split, 'Structs are matching'; + + $piece->prepare(); + $from_split->prepare(); + + ok $piece->verify_content($original->file->to_string), 'Chunk verified'; + ok $from_split->verify_content($original->file->to_string), 'Chunk verified'; + + is_deeply $piece, $from_split, 'Structs are matching after prepare()'; + } +} + +subtest 'get_piece' => sub { + my $file = 'ltp_test_result_format.json'; + my $size = file_path($FindBin::Bin, 'data', $file)->size; + + compare($file => 1); + compare($file => 10); + compare($file => 21); + compare($file => $size); +}; + +done_testing(); ++++++ openQA.obsinfo ++++++ --- /var/tmp/diff_new_pack.DuUWLa/_old 2026-10-23 20:29:46.110280526 +0200 +++ /var/tmp/diff_new_pack.DuUWLa/_new 2026-10-23 20:29:46.113280652 +0200 @@ -1,5 +1,5 @@ name: openQA -version: 5.1792607148.117af9ef -mtime: 1792607148 -commit: 117af9ef0fc009cf9afa792d2e3915730183000f +version: 5.1792679797.1d1b53d2 +mtime: 1792679797 +commit: 1d1b53d26d29215398b1928f21c7ade1434e5313
