Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/autobuild/android.sh
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@
set -eu

# Some of the following version pinnings are semi-automatically checked for
# updates. Update .github/workflows/bump-dependencies.yaml when renaming those:
# updates. Update .github/workflows/bump-dependencies.yml when renaming those:
COMMANDLINETOOLS_VERSION=6858069
ANDROID_NDK_VERSION=r21d
ANDROID_PLATFORM=android-30
Expand Down
8 changes: 8 additions & 0 deletions .github/autobuild/ios-dependencies.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#!/bin/bash
# The following version pinnings are semi-automatically checked for updates.
# Verify .github/workflows/bump-dependencies.yml when changing those manually:

Comment thread
ann0see marked this conversation as resolved.
# Values are consumed by ios.sh and the dependency cache key.
# shellcheck disable=SC2034
AQTINSTALL_VERSION=3.3.0
QT_VERSION=5.15.2
18 changes: 10 additions & 8 deletions .github/autobuild/ios.sh
Original file line number Diff line number Diff line change
Expand Up @@ -48,10 +48,12 @@

set -eu

QT_DIR=/opt/qt
# The following version pinnings are semi-automatically checked for
# updates. Verify .github/workflows/bump-dependencies.yaml when changing those manually:
Comment thread
ann0see marked this conversation as resolved.
AQTINSTALL_VERSION=3.3.0
PROJECT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
readonly PROJECT_DIR
# shellcheck disable=SC1091
source "${PROJECT_DIR}/.github/autobuild/ios-dependencies.sh"

QT_DIR=${HOME}/qt

if [[ ! ${QT_VERSION:-} =~ [0-9]+\.[0-9]+\..* ]]; then
echo "Environment variable QT_VERSION must be set to a valid Qt version"
Expand All @@ -63,13 +65,13 @@ if [[ ! ${JAMULUS_BUILD_VERSION:-} =~ [0-9]+\.[0-9]+\.[0-9]+ ]]; then
fi

setup() {
if [[ -d "${QT_DIR}" ]]; then
# We may need to create the Qt installation directory and chown it to the runner user to fix permissions
sudo mkdir -p "${QT_DIR}"
sudo chown -R "$(whoami)" "${QT_DIR}"
if [[ -x "${QT_DIR}/${QT_VERSION}/ios/bin/qmake" ]]; then
echo "Using Qt installation from previous run (actions/cache)"
else
echo "Installing Qt"
# We may need to create the Qt installation directory and chown it to the runner user to fix permissions
sudo mkdir -p "${QT_DIR}"
sudo chown "$(whoami)" "${QT_DIR}"
# Create and enter virtual environment
python3 -m venv venv
# Must hide directory as it just gets created during execution of the previous command and cannot be found by shellcheck
Expand Down
9 changes: 9 additions & 0 deletions .github/autobuild/mac-dependencies_qt5.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
#!/bin/bash
# The following version pinnings are semi-automatically checked for updates.
# Verify .github/workflows/bump-dependencies.yml when changing those manually:

# Values are consumed by .github/autobuild/mac.sh, mac/deploy_mac.sh and the dependency cache key.
# shellcheck disable=SC2034
AQTINSTALL_VERSION=3.3.0
QT_VERSION=5.15.2
CREATEDMG_VERSION=1.3.0
9 changes: 9 additions & 0 deletions .github/autobuild/mac-dependencies_qt6.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
#!/bin/bash
# The following version pinnings are semi-automatically checked for updates.
# Verify .github/workflows/bump-dependencies.yml when changing those manually:

# Values are consumed by .github/autobuild/mac.sh, mac/deploy_mac.sh and the dependency cache key.
# shellcheck disable=SC2034
AQTINSTALL_VERSION=3.3.0
QT_VERSION=6.10.2
CREATEDMG_VERSION=1.3.0
14 changes: 9 additions & 5 deletions .github/autobuild/mac.sh
Original file line number Diff line number Diff line change
Expand Up @@ -48,10 +48,13 @@

set -eu

QT=${QT:-6}
PROJECT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
readonly PROJECT_DIR
# shellcheck disable=SC1090
source "${PROJECT_DIR}/.github/autobuild/mac-dependencies_qt${QT}.sh"

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we have a guarantee that ${QT} is safe and correct? I'd add an error check if the file exists before.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's set from the autobuild workflow file and, if not, defaults to 6 at the top of the file. If someone sets the wrong value, this command will safely crash the workflow.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd still like a guard to reject invalid values.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '%s\n' '== mac dependency scripts =='
fd -a -t f '^mac-dependencies_qt.*\.sh$' .github/autobuild -x sh -c 'printf "%s\n" "$1"' sh {}

printf '%s\n' '== QT assignments and mac.sh invocations in GitHub workflows =='
rg -n -C 3 --glob '*.yml' --glob '*.yaml' \
  '(^|[[:space:]])QT[=:]|mac\.sh|mac-dependencies_qt' .github

printf '%s\n' '== source sites for mac-dependencies scripts =='
rg -n -C 3 'source .*mac-dependencies_qt|mac-dependencies_qt' .github

Length of output: 5420


@ann0see, the guard is justified.

The workflow currently uses only QT=5 and QT=6. The repository contains only mac-dependencies_qt5.sh and mac-dependencies_qt6.sh. A wrong value fails at source, but the error does not state the supported values.

Add an allowlist before the source command:

QT=${QT:-6}
case "${QT}" in
    5|6) ;;
    *)
        echo "Environment variable QT must be 5 or 6"
        exit 1
        ;;
esac

This makes the supported interface explicit and prevents unexpected dependency-script paths.

You are interacting with an AI system.

@pljones pljones Sep 4, 2026

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No, it makes a claim that's unjustified. If there were a mac-dependencies_qtFOO.sh and you passed QT=FOO, that would be valid. The range of valid values is defined only by the list of files matching the pattern mac-dependencies_qt(.+)\.sh in the .githhub/autobuild directory. It could [[ -r ...path${QT}.sh ]] || { echo "Bad value for QT - look in .githhub/autobuild"; exit 1; }. But that's essentially what "file not found" tells you.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seems like the humans are having a chat. I'll hop back into my burrow for now. If you need me again, just tag @coderabbitai in a new comment, and I'll come hopping out!

@pljones pljones Sep 5, 2026

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The point being, someone could rename ios-depenedencies.sh to something unexpected and get the same error as changing the QT value to something invalid. Both require intervention and the diff to the existing code would show the cause.


QT_DIR=~/qt
# The following version pinnings are semi-automatically checked for
# updates. Verify .github/workflows/bump-dependencies.yaml when changing those manually:
AQTINSTALL_VERSION=3.3.0

TARGET_ARCHS="${TARGET_ARCHS:-}"

Expand All @@ -65,7 +68,8 @@ if [[ ! ${JAMULUS_BUILD_VERSION:-} =~ [0-9]+\.[0-9]+\.[0-9]+ ]]; then
fi

setup() {
if [[ -d "${QT_DIR}" ]]; then
if [[ -x "${QT_DIR}/${QT_VERSION}/macos/bin/qmake" &&
-x "${QT_DIR}/${QT_VERSION}/macos/bin/macdeployqt" ]]; then
echo "Using Qt installation from previous run (actions/cache)"
else
echo "Installing Qt..."
Expand Down Expand Up @@ -194,7 +198,7 @@ build_app_as_dmg_installer() {
if prepare_signing; then
BUILD_ARGS=("-s" "${MACOS_CERTIFICATE_DEV_ID_APPLICATION_ID}" "-a" "${MAC_STORE_APP_CERT_ID}" "-i" "${MACOS_CERTIFICATE_INST_DISTRIBUTION_ID}" "-k" "${KEYCHAIN_PASSWORD}")
fi
TARGET_ARCHS="${TARGET_ARCHS}" ./mac/deploy_mac.sh "${BUILD_ARGS[@]}"
QT=${QT} TARGET_ARCHS="${TARGET_ARCHS}" ./mac/deploy_mac.sh "${BUILD_ARGS[@]}"
}

pass_artifact_to_job() {
Expand Down
19 changes: 19 additions & 0 deletions .github/autobuild/windows-dependencies.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# The following version pinnings are semi-automatically checked for updates.
# Verify .github/workflows/bump-dependencies.yml when changing those manually:

# Values are consumed by .github/autobuild/windows.ps1, windows/deploy_windows.ps1 and the dependency cache key.
$Qt32Version = "5.15.2"
$Qt64Version = "6.10.2"
$QtCompile32 = "msvc2019"
$QtCompile64 = "msvc2022"
$AqtinstallVersion = "3.3.0"
$JackVersion = "1.9.22"
$JomVersion = "1.1.2"

# Important:
# - Do not update ASIO SDK without checking for license-related changes.
# - Do not copy (parts of) the ASIO SDK into the Jamulus source tree without
# further consideration as it would make the license situation more complicated.
Comment thread
ann0see marked this conversation as resolved.
$AsioSDKVersion = "ASIO-SDK_2.3.4_2025-10-15"

$NsisVersion = "3.12"
23 changes: 10 additions & 13 deletions .github/autobuild/windows.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -68,15 +68,11 @@ $ProgressPreference = 'SilentlyContinue'
$QtDir = 'C:\Qt'
$ChocoCacheDir = 'C:\ChocoCache'
$DownloadCacheDir = 'C:\AutobuildCache'
# The following version pinnings are semi-automatically checked for
# updates. Verify .github/workflows/bump-dependencies.yaml when changing those manually:
$Qt32Version = "5.15.2"
$Qt64Version = "6.10.2"
$AqtinstallVersion = "3.3.0"
$JackVersion = "1.9.22"
$Msvc32Version = "win32_msvc2019"
$Msvc64Version = "win64_msvc2022_64"
$JomVersion = "1.1.2"
$DependencySuffix = ''
. "$PSScriptRoot\windows-dependencies.ps1"

$Msvc32Version = "${QtCompile32}"
$Msvc64Version = "${QtCompile64}_64"

# Compose JACK download urls
$JackBaseUrl = "https://github.com/jackaudio/jack2-releases/releases/download/v${JackVersion}/jack2-win"
Expand Down Expand Up @@ -150,7 +146,8 @@ Function Install-Qt

Function Ensure-Qt
{
if ( Test-Path -Path $QtDir )
if ( (Test-Path -Path "$QtDir\$Qt32Version\${Msvc32Version}\bin\qmake.exe" -PathType Leaf) -and
(Test-Path -Path "$QtDir\$Qt64Version\${Msvc64Version}\bin\qmake.exe" -PathType Leaf) )
{
echo "Using Qt installation from previous run (actions/cache)"
return
Expand All @@ -165,10 +162,10 @@ Function Ensure-Qt
}

echo "Get Qt 64 bit..."
Install-Qt "${Qt64Version}" "${Msvc64Version}"
Install-Qt "${Qt64Version}" "win64_${Msvc64Version}"

echo "Get Qt 32 bit..."
Install-Qt "${Qt32Version}" "${Msvc32Version}"
Install-Qt "${Qt32Version}" "win32_${Msvc32Version}"
}

Function Ensure-jom
Expand Down Expand Up @@ -238,7 +235,7 @@ Function Build-App-With-Installer
{
$ExtraArgs += ("-BuildOption", $BuildOption)
}
powershell ".\windows\deploy_windows.ps1" "C:\Qt\${Qt32Version}" "C:\Qt\${Qt64Version}" @ExtraArgs
powershell ".\windows\deploy_windows.ps1" @ExtraArgs
if ( !$? )
{
throw "deploy_windows.ps1 failed with exit code $LastExitCode"
Expand Down
34 changes: 28 additions & 6 deletions .github/workflows/autobuild.yml
Original file line number Diff line number Diff line change
Expand Up @@ -226,47 +226,52 @@ jobs:
- config_name: MacOS (artifacts)
target_os: macos
building_on_os: macos-15
base_command: QT_VERSION=6.10.2 SIGN_IF_POSSIBLE=1 TARGET_ARCHS="x86_64 arm64" ./.github/autobuild/mac.sh
base_command: QT=6 SIGN_IF_POSSIBLE=1 TARGET_ARCHS="x86_64 arm64" ./.github/autobuild/mac.sh
# Disable CodeQL on mac as it interferes with signing the binaries (signing hangs, see #2563 and #2564)
run_codeql: false
xcode_version: 16.3.0
dependency_cache_key: qt6
is_main_build_target: true

# Reminder: If Legacy is removed, be sure to add a dedicated job for CodeQL again.
- config_name: MacOS Legacy (artifacts+CodeQL)
target_os: macos
building_on_os: macos-15-intel
base_command: QT_VERSION=5.15.2 SIGN_IF_POSSIBLE=0 ARTIFACT_SUFFIX=_legacy ./.github/autobuild/mac.sh
base_command: QT=5 SIGN_IF_POSSIBLE=0 ARTIFACT_SUFFIX=_legacy ./.github/autobuild/mac.sh
# Enable CodeQL on mac legacy as this version does not get signed
run_codeql: true
# macos-15-intel ships with Xcode 16.x; while Qt5 is older, Xcode 16 still supports building it
# https://developer.apple.com/support/xcode/
# https://xcodereleases.com/
xcode_version: 16.3.0
dependency_cache_key: qt5
is_main_build_target: true

- config_name: iOS (artifacts)
target_os: ios
building_on_os: macos-15
base_command: QT_VERSION=5.15.2 ./.github/autobuild/ios.sh
base_command: ./.github/autobuild/ios.sh
# Build failed with CodeQL enabled when last tested 03/2022 (#2490).
# There are no hints that iOS is supposed to be supported by CodeQL.
# Therefore, disable it:
run_codeql: false
xcode_version: 26.2
dependency_cache_key: ios

- config_name: Windows (artifact+codeQL)
target_os: windows
building_on_os: windows-2025
base_command: powershell .\.github\autobuild\windows.ps1 -Stage
run_codeql: true
dependency_cache_key: asio
is_main_build_target: true

- config_name: Windows JACK (artifact)
target_os: windows
building_on_os: windows-2025
base_command: powershell .\.github\autobuild\windows.ps1 -BuildOption jackonwindows -Stage
run_codeql: false
dependency_cache_key: jack

# This injects the build_all_targets information into each matrix output:
build_all_targets:
Expand Down Expand Up @@ -294,13 +299,29 @@ jobs:
fetch-depth: ${{ matrix.config.checkout_fetch_depth || '1' }}

- name: Cache Mac dependencies
if: matrix.config.target_os == 'macos'
if: matrix.config.target_os == 'macos' && matrix.config.dependency_cache_key == 'qt6'
uses: actions/cache@v6
with:
path: |
~/qt
~/Library/Cache/jamulus-dependencies
key: ${{ matrix.config.target_os }}-${{ hashFiles('.github/workflows/autobuild.yml', '.github/autobuild/mac.sh', 'mac/deploy_mac.sh') }}-${{ matrix.config.base_command }}
key: ${{ matrix.config.target_os }}-${{ hashFiles('.github/autobuild/mac-dependencies_qt6.sh') }}-${{ matrix.config.dependency_cache_key }}

- name: Cache Mac Legacy dependencies
if: matrix.config.target_os == 'macos' && matrix.config.dependency_cache_key == 'qt5'
uses: actions/cache@v6
with:
path: |
~/qt
~/Library/Cache/jamulus-dependencies
key: ${{ matrix.config.target_os }}-${{ hashFiles('.github/autobuild/mac-dependencies_qt5.sh') }}-${{ matrix.config.dependency_cache_key }}

- name: Cache iOS dependencies
if: matrix.config.target_os == 'ios'
uses: actions/cache@v6
with:
path: ~/qt
key: ${{ matrix.config.target_os }}-${{ hashFiles('.github/autobuild/ios-dependencies.sh') }}-${{ matrix.config.dependency_cache_key }}

- name: Cache Windows dependencies
if: matrix.config.target_os == 'windows'
Expand All @@ -312,7 +333,7 @@ jobs:
C:\AutobuildCache
${{ github.workspace }}\libs\NSIS\NSIS-source
${{ github.workspace }}\libs\ASIOSDK2
key: ${{ matrix.config.target_os }}-${{ hashFiles('.github/workflows/autobuild.yml', '.github/autobuild/windows.ps1', 'windows/deploy_windows.ps1') }}-${{ matrix.config.base_command }}
key: ${{ matrix.config.target_os }}-${{ hashFiles('.github/autobuild/windows-dependencies.ps1') }}-${{ matrix.config.dependency_cache_key }}

- name: Cache Android dependencies
if: matrix.config.target_os == 'android'
Expand Down Expand Up @@ -359,6 +380,7 @@ jobs:
NOTARIZATION_PASSWORD: ${{ secrets.NOTARIZATION_PASSWORD }}
KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }}
MACOS_CA_PUBLICKEY: ${{ secrets.MACOS_CA_PUBKEY }}

- name: Post-Build for ${{ matrix.config.config_name }}
id: get-artifacts
run: ${{ matrix.config.base_command }} get-artifacts
Expand Down
35 changes: 18 additions & 17 deletions .github/workflows/bump-dependencies.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,51 +36,50 @@ jobs:
fail-fast: false
matrix:
components:

- name: aqt
# not Changelog-worthy
get_upstream_version: GH_REPO=miurahr/aqtinstall gh release view --json tagName --jq .tagName | sed -re 's/^v//'
# The following regexps capture both the *nix and the Windows variable syntax (different case, underscore):
local_version_regex: (.*AQTINSTALL_?VERSION\s*=\s*"?)([0-9.]*)("?.*)
# Capture the POSIX-style and PowerShell assignments used by the dependency files.
local_version_regex: ^(AQTINSTALL_VERSION=|\$AqtinstallVersion = \")([0-9.]+)(|\")$

- name: create-dmg
changelog_name: create-dmg (macOS)
get_upstream_version: GH_REPO=create-dmg/create-dmg gh release view --json tagName --jq .tagName | sed -re 's/^v//'
local_version_regex: (.*CREATEDMG_VERSION\s*=\s*"?)([0-9.]*)("?.*)
local_version_regex: ^(CREATEDMG_VERSION=)([0-9.]+)()$

- name: Qt6
changelog_name: bundled Qt6
get_upstream_version: |
latest_minor="$(curl -s https://download.qt.io/official_releases/qt/ | grep -oP 'href="\K[0-9.]+(?=/")' | sort --reverse --version-sort | head -n1)";
curl -s https://download.qt.io/official_releases/qt/"${latest_minor}"/ | grep -oP 'href="\K[0-9.]+(?=/")' | sort --reverse --version-sort | head -n1
# The following regex captures both the *nix and the Windows variable syntax (different case, underscore):
local_version_regex: (.*QT[0-9_]+VERSION\s*=\s*"?)(6\.[0-9.]+)("?.*)
local_version_regex: ^(QT_VERSION=|\$Qt64Version = \")(6\.[0-9.]+)(|\")$

- name: jack
changelog_name: bundled JACK (Windows-only)
get_upstream_version: GH_REPO=jackaudio/jack2-releases gh release view --json tagName --jq .tagName | sed -re 's/^v//'
local_version_regex: (.*JackVersion\s*=\s*"?)([0-9.]+)("?.*)
local_version_regex: ^(\$JackVersion = \")([^"]+)(\")$

- name: choco-jom
# not Changelog-worthy
get_upstream_version: |
curl -sL "https://community.chocolatey.org/api/v2/FindPackagesById()?id='jom'" |
grep -oP '(?<=<d:Version>)[^<]+' | sort --version-sort | tail -n1
local_version_regex: (.*JomVersion\s*=\s*"?)([0-9.]+)("?.*)
local_version_regex: ^(\$JomVersion = \")([^"]+)(\")$

- name: NSIS
changelog_name: Windows Installer base (NSIS)
get_upstream_version: |
curl -s -o /dev/null --location --range 0-5 --write-out '%{url_effective}' https://sourceforge.net/projects/nsis/files/latest/download |
grep -oP '.*/nsis-\K[0-9.]+(?=-setup\.)'
# This pattern is a bit special as it has to match twice in a single line.
# Therefore, we have to be very careful to avoid consuming too much pattern space.
# This is why a positive lookahead is used instead of direct matching:
local_version_regex: (.*"nsis-|.*\/NSIS.20.\/|\/nsis-)([0-9.]+)(".*|(?=\/nsis-)|\.zip.*)
local_version_regex: ^(\$NsisVersion = \")([^"]+)(\")$

- name: ASIO-SDK
changelog_name: ASIO SDK (Windows-only)
get_upstream_version: |
curl -s -o /dev/null --location --range 0-5 --write-out '%{url_effective}' https://www.steinberg.net/asiosdk |
grep -oP '.*\K(?:ASIO-SDK|asiosdk)_.*(?=\.zip)'
local_version_regex: (.*["\/])((?:ASIO-SDK|asiosdk)_[^"]+?)(".*|\.zip.*)
local_version_regex: ^(\$AsioSDKVersion = \")([^"]+)(\")$

steps:
- uses: actions/checkout@v7
Expand All @@ -91,9 +90,12 @@ jobs:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
set -eu
files=( .github/{autobuild,workflows}/* windows/*.ps1 mac/*.sh )
files=( .github/autobuild/*-dependencies{,_qt[56]}.* )
echo "files: (${files[@]})"
upstream_version="$(${{ matrix.components.get_upstream_version }})"
local_version="$(perl -nle 'print "$2" if /${{ matrix.components.local_version_regex }}/i' "${files[@]}" | sort --reverse --version-sort | head -n1)"
echo "upstream version: {${upstream_version}}"
local_version="$(perl -nle 'print "$2" if /${{ matrix.components.local_version_regex }}/' "${files[@]}" | sort --reverse --version-sort | head -n1)"
Comment thread
coderabbitai[bot] marked this conversation as resolved.
echo "local version: {${local_version}}"
if [[ -z "$upstream_version" ]]; then
echo "failed to extract upstream version"
exit 1
Expand All @@ -106,13 +108,12 @@ jobs:
echo "upstream ${{ matrix.components.name }} (${upstream_version}) matches local ${{ matrix.components.name }} (${local_version})"
exit 0
fi
echo "upstream ${{ matrix.components.name }} (${upstream_version}) is different than local ${{ matrix.components.name }} (${local_version}), creating PR"
echo "upstream ${{ matrix.components.name }} (${upstream_version}) does not match local ${{ matrix.components.name }} (${local_version}), creating PR"
git config --global user.email "actions@github.com"
git config --global user.name "github-actions[bot]"
pr_branch=ci/bump-dependencies/${{ matrix.components.name }}
git checkout -b "${pr_branch}"
# sed does not support replacements with overlapping or lookahead patterns as is the case with NSIS.
# Therefore, use perl instead:
# Use Perl so the replacement can preserve the prefix and suffix captured by each component regex.
perl -pe 's/${{ matrix.components.local_version_regex }}/${1}'"${upstream_version}"'${3}/gi' -i "${files[@]}"
git add .
title="Build: Bump ${{ matrix.components.name }} from ${local_version} to ${upstream_version}"
Expand Down
Loading
Loading