From cadb28eb6517c0ada15ada77714f2bc77d1aed29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dylan=20A=C3=AFssi?= <dylan.aissi@collabora.com> Date: Thu, 17 Oct 2024 12:22:49 +0200 Subject: [PATCH 1/9] apertis-pkg-merge-upstream-to-downstreams: Don't print useless information while canceling pipelines MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Printing these values only creates noise in the log. Signed-off-by: Dylan Aïssi <dylan.aissi@collabora.com> --- tools/apertis-pkg-merge-upstream-to-downstreams | 2 -- 1 file changed, 2 deletions(-) diff --git a/tools/apertis-pkg-merge-upstream-to-downstreams b/tools/apertis-pkg-merge-upstream-to-downstreams index aca0aea..d265bed 100755 --- a/tools/apertis-pkg-merge-upstream-to-downstreams +++ b/tools/apertis-pkg-merge-upstream-to-downstreams @@ -117,7 +117,6 @@ def cancel_branch_context_pipeline(project_id, branch, token, project_url): try: res = urllib.request.urlopen(get_id_req) json_res = json.load(res) - print(json_res) latest_job_id = json_res["id"] except urllib.error.HTTPError as e: print("ERROR:", e.read().decode()) @@ -136,7 +135,6 @@ def cancel_branch_context_pipeline(project_id, branch, token, project_url): print(f"Canceling useless pipeline on {branch}") try: res = urllib.request.urlopen(cancel_req).read().decode("utf-8") - print(res) except urllib.error.HTTPError as e: print("ERROR:", e.read().decode()) -- GitLab From 63d1651a8e34876c2569c2d1babd54a44a01cd7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dylan=20A=C3=AFssi?= <dylan.aissi@collabora.com> Date: Thu, 17 Oct 2024 12:26:58 +0200 Subject: [PATCH 2/9] apertis-pkg-merge-upstream-to-downstreams: ensure merge request is created against the right project MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In case of a forked project, like we are doing with the test of the rebase, the GitLab API creates by default the MR against the original project instead of the forked project. To ensure the merge request is created against the forked project, we use the push option merge_request.target_project to overwrite the default behavior and to create the merge request against the forked project. See: https://docs.gitlab.com/ee/topics/git/commit.html#push-options-for-merge-requests Signed-off-by: Dylan Aïssi <dylan.aissi@collabora.com> --- .../apertis-pkg-merge-upstream-to-downstreams | 33 ++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/tools/apertis-pkg-merge-upstream-to-downstreams b/tools/apertis-pkg-merge-upstream-to-downstreams index d265bed..fdc31a0 100755 --- a/tools/apertis-pkg-merge-upstream-to-downstreams +++ b/tools/apertis-pkg-merge-upstream-to-downstreams @@ -183,6 +183,32 @@ def ensure_downstream_branch(project_url, downstream, dry_run): raise +def get_path_with_namespace(project_url): + url = urllib.parse.urlsplit(project_url) + project_id = urllib.parse.quote(removesuffix(url.path.strip("/"), ".git"), safe="") + # drop the inline auth data as urllib does not like it + auth, netloc_no_auth = url.netloc.split("@", 1) + token = auth.split(":", 1)[-1] + url = url._replace( + path=f"/api/v4/projects/{project_id}", + netloc=netloc_no_auth, + ) + project_metadata = url.geturl() + req_project_metadata = urllib.request.Request( + url=project_metadata, + headers={"PRIVATE-TOKEN": token}, + ) + try: + res = urllib.request.urlopen(req_project_metadata) + json_res = json.load(res) + path_with_namespace = json_res["path_with_namespace"] + except urllib.error.HTTPError as e: + print("ERROR:", e.read().decode()) + raise + + return path_with_namespace + + def push_merge_request( project_url, proposed_branch, upstream, downstream, auto_merge="", dry_run=False ): @@ -213,8 +239,11 @@ def push_merge_request( ensure_downstream_branch(project_url, downstream, dry_run) + project_path = get_path_with_namespace(project_url) + print( - f"Create merge request from '{proposed_branch}' to '{downstream}'", flush=True + f"Create merge request from '{proposed_branch}' to '{project_path}/{downstream}'", + flush=True, ) git_push_custom( "-o", @@ -224,6 +253,8 @@ def push_merge_request( "-o", f"merge_request.target={downstream}", "-o", + f"merge_request.target_project={project_path}", + "-o", f"merge_request.title={title}", project_url, f"{proposed_branch}:{proposed_branch}", -- GitLab From 6875540909ca9079cc3158130fe711741366784e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dylan=20A=C3=AFssi?= <dylan.aissi@collabora.com> Date: Mon, 2 Dec 2024 15:35:07 +0100 Subject: [PATCH 3/9] Make sure the returned value of an executed sh is still a RunningCommand object. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Debian has transitioned to python3.sh 2.x which now returns a true string breaking our tools. See: https://github.com/amoffat/sh/blob/develop/MIGRATION.md#return-value-now-a-true-string Signed-off-by: Dylan Aïssi <dylan.aissi@collabora.com> --- tools/apertis-pkg-merge-updates | 2 ++ tools/apertis-pkg-merge-upstream-to-downstreams | 8 +++++++- tools/apertis-pkg-pull-updates | 11 ++++++++++- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/tools/apertis-pkg-merge-updates b/tools/apertis-pkg-merge-updates index 93667b5..0158757 100755 --- a/tools/apertis-pkg-merge-updates +++ b/tools/apertis-pkg-merge-updates @@ -176,6 +176,7 @@ def main(): "merge", "--ff-only", rebase_tip, + _return_cmd=True, _ok_code=[0, 128], _out="/dev/stdout", _err="/dev/stderr", @@ -215,6 +216,7 @@ def main(): args.upstream, ":!debian/changelog", ":!debian/apertis/*", + _return_cmd=True, _ok_code=[0, 1], ) msg = [f"Sync from {args.upstream}."] diff --git a/tools/apertis-pkg-merge-upstream-to-downstreams b/tools/apertis-pkg-merge-upstream-to-downstreams index fdc31a0..fd363c4 100755 --- a/tools/apertis-pkg-merge-upstream-to-downstreams +++ b/tools/apertis-pkg-merge-upstream-to-downstreams @@ -91,6 +91,7 @@ def is_minor_change(upstream, downstream): downstream, ":!debian/changelog", ":!debian/apertis/*", + _return_cmd=True, _ok_code=[0, 1], ) return o.exit_code == 0 @@ -356,6 +357,7 @@ def main(): "--is-ancestor", upstream_branch, downstream_branch, + _return_cmd=True, _ok_code=[0, 1], ).exit_code == 0 @@ -435,7 +437,11 @@ def main(): conflicts.append(conflict) else: o = git( - "diff", "--quiet", f"HEAD..{downstream_branch}", _ok_code=[0, 1] + "diff", + "--quiet", + f"HEAD..{downstream_branch}", + _return_cmd=True, + _ok_code=[0, 1], ) if o.exit_code == 0: print(f"No merge required for {downstream_branch}, skipping ") diff --git a/tools/apertis-pkg-pull-updates b/tools/apertis-pkg-pull-updates index 3dbc341..9be3571 100755 --- a/tools/apertis-pkg-pull-updates +++ b/tools/apertis-pkg-pull-updates @@ -55,7 +55,15 @@ def parse_ref(ref: str) -> str: def is_ancestor(this: str, other: str): return ( - git("merge-base", "--is-ancestor", this, other, _ok_code=[0, 1]).exit_code == 0 + git( + "merge-base", + "--is-ancestor", + this, + other, + _return_cmd=True, + _ok_code=[0, 1], + ).exit_code + == 0 ) @@ -433,6 +441,7 @@ def main(): "merge", "--ff-only", local_version_branch, + _return_cmd=True, _out="/dev/stdout", _err="/dev/stderr", ) -- GitLab From 8cd73c23e146a351f5b4601eb7c58b0e40b0ea13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dylan=20A=C3=AFssi?= <dylan.aissi@collabora.com> Date: Thu, 20 Feb 2025 11:51:40 +0100 Subject: [PATCH 4/9] Keep compatibility with python3.sh 1.x, by using _return_cmd only when required. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit python3.sh 1.x is not compatible with _return_cmd, so we should only use it with an higher version of python3.sh. Signed-off-by: Dylan Aïssi <dylan.aissi@collabora.com> --- tools/apertis-pkg-merge-updates | 6 ++++-- tools/apertis-pkg-merge-upstream-to-downstreams | 12 ++++++++---- tools/apertis-pkg-pull-updates | 7 +++++-- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/tools/apertis-pkg-merge-updates b/tools/apertis-pkg-merge-updates index 0158757..78070a6 100755 --- a/tools/apertis-pkg-merge-updates +++ b/tools/apertis-pkg-merge-updates @@ -15,10 +15,12 @@ from pathlib import Path from debian.changelog import Changelog, VersionError, format_date from debian.debian_support import Version +from sh import __version__ as sh_version from sh.contrib import git APERTIS_CI_NAME = "Apertis CI" APERTIS_CI_EMAIL = "devel@lists.apertis.org" +RETURN_CMD = {} if sh_version.startswith("1.") else {"_return_cmd": True} def git_dir() -> str: @@ -176,7 +178,7 @@ def main(): "merge", "--ff-only", rebase_tip, - _return_cmd=True, + **RETURN_CMD, _ok_code=[0, 128], _out="/dev/stdout", _err="/dev/stderr", @@ -216,7 +218,7 @@ def main(): args.upstream, ":!debian/changelog", ":!debian/apertis/*", - _return_cmd=True, + **RETURN_CMD, _ok_code=[0, 1], ) msg = [f"Sync from {args.upstream}."] diff --git a/tools/apertis-pkg-merge-upstream-to-downstreams b/tools/apertis-pkg-merge-upstream-to-downstreams index fd363c4..8927cdb 100755 --- a/tools/apertis-pkg-merge-upstream-to-downstreams +++ b/tools/apertis-pkg-merge-upstream-to-downstreams @@ -16,9 +16,13 @@ import urllib.parse import urllib.request from functools import partial -from sh import ErrorReturnCode, ErrorReturnCode_2, apertis_pkg_merge_updates, echo +from sh import ErrorReturnCode, ErrorReturnCode_2 +from sh import __version__ as sh_version +from sh import apertis_pkg_merge_updates, echo from sh.contrib import git +RETURN_CMD = {} if sh_version.startswith("1.") else {"_return_cmd": True} + @dataclasses.dataclass class Conflict: @@ -91,7 +95,7 @@ def is_minor_change(upstream, downstream): downstream, ":!debian/changelog", ":!debian/apertis/*", - _return_cmd=True, + **RETURN_CMD, _ok_code=[0, 1], ) return o.exit_code == 0 @@ -357,7 +361,7 @@ def main(): "--is-ancestor", upstream_branch, downstream_branch, - _return_cmd=True, + **RETURN_CMD, _ok_code=[0, 1], ).exit_code == 0 @@ -440,7 +444,7 @@ def main(): "diff", "--quiet", f"HEAD..{downstream_branch}", - _return_cmd=True, + **RETURN_CMD, _ok_code=[0, 1], ) if o.exit_code == 0: diff --git a/tools/apertis-pkg-pull-updates b/tools/apertis-pkg-pull-updates index 9be3571..7f71c77 100755 --- a/tools/apertis-pkg-pull-updates +++ b/tools/apertis-pkg-pull-updates @@ -23,8 +23,11 @@ from itertools import chain import yaml from debian.changelog import Changelog from debian.debian_support import Version +from sh import __version__ as sh_version from sh.contrib import git +RETURN_CMD = {} if sh_version.startswith("1.") else {"_return_cmd": True} + def debian_branch(suite): return "debian/" + suite @@ -60,7 +63,7 @@ def is_ancestor(this: str, other: str): "--is-ancestor", this, other, - _return_cmd=True, + **RETURN_CMD, _ok_code=[0, 1], ).exit_code == 0 @@ -441,7 +444,7 @@ def main(): "merge", "--ff-only", local_version_branch, - _return_cmd=True, + **RETURN_CMD, _out="/dev/stdout", _err="/dev/stderr", ) -- GitLab From 6693c327c718d9b2bb421d3942a8409068f6e9e9 Mon Sep 17 00:00:00 2001 From: Walter Lozano <walter.lozano@collabora.com> Date: Fri, 18 Oct 2024 14:18:43 -0300 Subject: [PATCH 5/9] Release apertis-dev-tools version 0.2026.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Walter Lozano <walter.lozano@collabora.com> Signed-off-by: Dylan Aïssi <dylan.aissi@collabora.com> --- debian/changelog | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/debian/changelog b/debian/changelog index d1ed623..577acc8 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,22 @@ +apertis-dev-tools (0.2026.0) apertis; urgency=medium + + * apertis-pkg-merge-upstream-to-downstreams: + - Don't print useless information while canceling pipelines. + - ensure merge request is created against the right project: + In case of a forked project, like we are doing with the test of the + rebase, the GitLab API creates by default the MR against the original + project instead of the forked project. To ensure the merge request is + created against the forked project, we use the push option + merge_request.target_project to overwrite the default behavior and to + create the merge request against the forked project. + * Use upstream recommended workaround to still return a RunningCommand object + of an executed sh command. This is required due to a breaking change in + python3-sh 2.x. + * Keep compatibility with python3-sh 1.x, by using _return_cmd + only when required. + + -- Walter Lozano <walter.lozano@collabora.com> Wed, 19 Feb 2025 13:55:39 +0100 + apertis-dev-tools (0.2024.19) apertis; urgency=medium * ci-license-scan: Add proposed whitelist. -- GitLab From 90900ab6196caa01da6a7e825f3223893a92a0bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dylan=20A=C3=AFssi?= <dylan.aissi@collabora.com> Date: Tue, 25 Feb 2025 09:45:39 +0100 Subject: [PATCH 6/9] import-debian-package: stop using a PosixPath object as context manager MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is no longer supported since Python 3.13 and leads to the following error: Traceback (most recent call last): File "/builds/pkg/apertis-dev-tools/tests/import-debian-package/../../tools/import-debian-package", line 681, in <module> main(sys.argv) ~~~~^^^^^^^^^^ File "/builds/pkg/apertis-dev-tools/tests/import-debian-package/../../tools/import-debian-package", line 666, in main do_import(args) ~~~~~~~~~^^^^^^ File "/builds/pkg/apertis-dev-tools/tests/import-debian-package/../../tools/import-debian-package", line 396, in do_import with ensure_dir_or_none(args.cache_dir) or TemporaryDirectory() as downloaddir: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ TypeError: 'PosixPath' object does not support the context manager protocol Signed-off-by: Dylan Aïssi <dylan.aissi@collabora.com> --- tools/import-debian-package | 54 ++++++++++++++++++++----------------- 1 file changed, 29 insertions(+), 25 deletions(-) diff --git a/tools/import-debian-package b/tools/import-debian-package index bad0725..eda6a47 100755 --- a/tools/import-debian-package +++ b/tools/import-debian-package @@ -19,7 +19,7 @@ import sys from functools import lru_cache from gettext import gettext as _ from pathlib import Path -from tempfile import TemporaryDirectory +from tempfile import TemporaryDirectory, mkdtemp from typing import Mapping, Optional from urllib.error import HTTPError, URLError from urllib.parse import quote @@ -393,32 +393,36 @@ def do_import(args): if parse_ref(apertis_tag): raise Abort(f"Apertis tag {apertis_tag} already exists, cannot continue") - with ensure_dir_or_none(args.cache_dir) or TemporaryDirectory() as downloaddir: - if args.import_local_dsc: - logging.info(f"Overlaying Apertis package version {version}") - downloaded = args.import_local_dsc.name - else: - logging.info("Fetching the package information") + downloaddir = ( + ensure_dir_or_none(args.cache_dir) + if ensure_dir_or_none(args.cache_dir) is not None + else mkdtemp() + ) + if args.import_local_dsc: + logging.info(f"Overlaying Apertis package version {version}") + downloaded = args.import_local_dsc.name + else: + logging.info("Fetching the package information") - cached_dsc = get_cached_dsc(package, version, args.cache_dir) + cached_dsc = get_cached_dsc(package, version, args.cache_dir) - try: - url = args.mirror.rstrip("/") + get_debian_dsc_path(package, version) - except KeyboardInterrupt: - raise - except (KeyError, HTTPError, URLError): - if not cached_dsc: - raise Abort( - f"Unable to download source package {package} version {version}" - ) - else: - logging.warning( - f"Unable to download source package {package} version {version}, but found cached .dsc" - ) - url = cached_dsc - - downloaded = fetch(package, version, url, downloaddir, cached_dsc) - import_debian_dsc(args, downloaded, upstream, downstream, version) + try: + url = args.mirror.rstrip("/") + get_debian_dsc_path(package, version) + except KeyboardInterrupt: + raise + except (KeyError, HTTPError, URLError): + if not cached_dsc: + raise Abort( + f"Unable to download source package {package} version {version}" + ) + else: + logging.warning( + f"Unable to download source package {package} version {version}, but found cached .dsc" + ) + url = cached_dsc + + downloaded = fetch(package, version, url, downloaddir, cached_dsc) + import_debian_dsc(args, downloaded, upstream, downstream, version) if args.dsc: d = deb822.Dsc(args.dsc) -- GitLab From 16703947b09f3ff79ae256bb233810b12cda6a46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dylan=20A=C3=AFssi?= <dylan.aissi@collabora.com> Date: Tue, 25 Feb 2025 09:48:50 +0100 Subject: [PATCH 7/9] Release apertis-dev-tools version 0.2026.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Dylan Aïssi <dylan.aissi@collabora.com> --- debian/changelog | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/debian/changelog b/debian/changelog index 577acc8..89e9125 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,10 @@ +apertis-dev-tools (0.2026.1) apertis; urgency=medium + + * import-debian-package: stop using a PosixPath object as context manager. + This is no longer supported since Python 3.13 and triggers an error. + + -- Dylan Aïssi <dylan.aissi@collabora.com> Tue, 25 Feb 2025 09:47:11 +0100 + apertis-dev-tools (0.2026.0) apertis; urgency=medium * apertis-pkg-merge-upstream-to-downstreams: -- GitLab From f4f0864bf9fd062095f867026c420a2a5517974b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dylan=20A=C3=AFssi?= <dylan.aissi@collabora.com> Date: Tue, 25 Feb 2025 09:26:59 +0000 Subject: [PATCH 8/9] Refresh the automatically detected licensing information MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Dylan Aïssi <dylan.aissi@collabora.com> --- debian/apertis/copyright | 34 ++++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/debian/apertis/copyright b/debian/apertis/copyright index 6295646..e047cea 100644 --- a/debian/apertis/copyright +++ b/debian/apertis/copyright @@ -8,14 +8,6 @@ Files: debian/* Copyright: 2012-2024, Collabora Ltd. License: MPL-2.0 -Files: tests/* -Copyright: 2012-2024, Collabora Ltd. -License: MPL-2.0 - -Files: tools/* -Copyright: 2019-2022, 2024, Collabora Ltd -License: MPL-2.0 - Files: doc/* Copyright: 2012-2023 Collabora Ltd. License: MPL-2.0 @@ -24,6 +16,22 @@ License: MPL-2.0 On Debian systems, the complete text of the Mozilla Public License Version 2.0 can be found in /usr/share/common-licenses/MPL-2.0. +Files: tests/import-debian-package/common.sh +Copyright: 2012-2024, Collabora Ltd. +License: MPL-2.0 + +Files: tests/test-configure + tests/test-download + tests/test-install + tests/test-installed + tests/test-latest + tests/test-uninstall + tests/test-update + tests/test-verify + tests/test_util.py +Copyright: 2012-2024, Collabora Ltd. +License: MPL-2.0 + Files: tools/ade tools/deb-git-version-gen tools/devroot-enter @@ -32,6 +40,16 @@ Files: tools/ade Copyright: 2012-2024, Collabora Ltd. License: MPL-2.0 +Files: tools/apertis-abi-compare + tools/apertis-pkg-merge-updates + tools/apertis-pkg-merge-upstream-to-downstreams + tools/apertis-pkg-pull-updates + tools/ci-buildpackage + tools/ci-license-scan + tools/gitlab-cancel-outdated-pipelines +Copyright: 2019-2022, 2024, Collabora Ltd +License: MPL-2.0 + Files: tools/mountimage Copyright: 2023, Thomas Mittelstaedt <thomas.mittelstaedt@de.bosch.com> License: MPL-2.0 -- GitLab From f6e82b6b54e77fcf0a0e088876fa14215764f825 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dylan=20A=C3=AFssi?= <dylan.aissi@collabora.com> Date: Tue, 25 Feb 2025 09:37:41 +0000 Subject: [PATCH 9/9] Refresh the automatically detected licensing information MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Dylan Aïssi <dylan.aissi@collabora.com> --- debian/apertis/copyright | 34 ++++++++-------------------------- 1 file changed, 8 insertions(+), 26 deletions(-) diff --git a/debian/apertis/copyright b/debian/apertis/copyright index e047cea..6295646 100644 --- a/debian/apertis/copyright +++ b/debian/apertis/copyright @@ -8,6 +8,14 @@ Files: debian/* Copyright: 2012-2024, Collabora Ltd. License: MPL-2.0 +Files: tests/* +Copyright: 2012-2024, Collabora Ltd. +License: MPL-2.0 + +Files: tools/* +Copyright: 2019-2022, 2024, Collabora Ltd +License: MPL-2.0 + Files: doc/* Copyright: 2012-2023 Collabora Ltd. License: MPL-2.0 @@ -16,22 +24,6 @@ License: MPL-2.0 On Debian systems, the complete text of the Mozilla Public License Version 2.0 can be found in /usr/share/common-licenses/MPL-2.0. -Files: tests/import-debian-package/common.sh -Copyright: 2012-2024, Collabora Ltd. -License: MPL-2.0 - -Files: tests/test-configure - tests/test-download - tests/test-install - tests/test-installed - tests/test-latest - tests/test-uninstall - tests/test-update - tests/test-verify - tests/test_util.py -Copyright: 2012-2024, Collabora Ltd. -License: MPL-2.0 - Files: tools/ade tools/deb-git-version-gen tools/devroot-enter @@ -40,16 +32,6 @@ Files: tools/ade Copyright: 2012-2024, Collabora Ltd. License: MPL-2.0 -Files: tools/apertis-abi-compare - tools/apertis-pkg-merge-updates - tools/apertis-pkg-merge-upstream-to-downstreams - tools/apertis-pkg-pull-updates - tools/ci-buildpackage - tools/ci-license-scan - tools/gitlab-cancel-outdated-pipelines -Copyright: 2019-2022, 2024, Collabora Ltd -License: MPL-2.0 - Files: tools/mountimage Copyright: 2023, Thomas Mittelstaedt <thomas.mittelstaedt@de.bosch.com> License: MPL-2.0 -- GitLab