diff --git a/.gitignore b/.gitignore index ca2178b..755cd34 100644 --- a/.gitignore +++ b/.gitignore @@ -48,4 +48,8 @@ app.*.map.json android/key.properties windows/installer/* bugreport* -!downloads/* \ No newline at end of file +!downloads/* +android/builds.json +macos/builds.json +ios/builds.json +windows/busylight-buddy-windows-installer-builder.iss \ No newline at end of file diff --git a/android/flutter-build-apk.ps1 b/android/flutter-build-apk.ps1 index db768ac..f523b09 100644 --- a/android/flutter-build-apk.ps1 +++ b/android/flutter-build-apk.ps1 @@ -1,23 +1,93 @@ -$buildType = if ($args[0]) { $args[0] } else { "debug" } + +<# +.SYNOPSIS + Builds a Flutter APK with versioning support. + +.DESCRIPTION + This script builds a Flutter APK, manages build numbers, and renames output files. + +.PARAMETER buildType + The build type (release or debug). Default is "release". + +.PARAMETER buildName + The build name (version). Default is "0.0.0". + +.EXAMPLE + .\flutter-build-apk.ps1 -buildType debug -buildName 1.0.0 + Builds a debug APK with version 1.0.0. +#> + +[CmdletBinding()] +param ( + [string]$buildType = "release", # Default value is "release" + [string]$buildName = "0.0.0" # Default value is "0.0.0" +) + +$buildsRef = "builds.json" + +# Check if the file exists +if (-not (Test-Path -Path $buildsRef)) { + # Create the file if it doesn't exist + New-Item -Path $buildsRef -ItemType File + $buildsMap = @{ + $buildName = 0 + } + $buildsMap | ConvertTo-Json | Out-File $buildsRef + Write-Output "File created: $buildsRef" +} else { + Write-Output "File already exists: $buildsRef" +} + +# Read the JSON file and convert it to a hashtable +$jsonContent = Get-Content $buildsRef -Raw | ConvertFrom-Json +$buildsMap = @{} +$jsonContent.PSObject.Properties | ForEach-Object { + $buildsMap[$_.Name] = $_.Value +} + +if ($buildsMap.ContainsKey($buildName)) { + Write-Output "Build exists: $buildName" + $buildNumber = $buildsMap[$buildName] + $buildNumber++ + Write-Output "Next build number for ${buildName}: $buildNumber" + $buildsMap[$buildName] = $buildNumber +} +else { + $buildsMap[$buildName] = 1 +} + +$buildsMap | ConvertTo-Json | Out-File $buildsRef + + $apkDir = "..\build\app\outputs\flutter-apk" $baseName = "org.igox.apps.android.busylight-buddy" -flutter build apk --$buildType +# Build an array for arguments +$flutterArgs = @( + "--$buildType", + "--build-name=$buildName", + "--build-number=$buildNumber", + "--target-platform=android-arm,android-arm64,android-x64" +) + +Write-Output "Building APK with arguments: $($flutterArgs -join ' ')" + +& flutter build apk @flutterArgs # Rename APK -$oldApk = "$apkDir\app-$buildType.apk" -$newApk = "$apkDir\$baseName-$buildType.apk" +$oldApk = "$apkDir\app-${buildType}.apk" +$newApk = "$apkDir\$baseName-${buildType}.apk" if (Test-Path $oldApk) { if (Test-Path $newApk) { Remove-Item $newApk -Force } - Rename-Item -Path $oldApk -NewName "$baseName-$buildType.apk" - Write-Host "APK renamed to: $baseName-$buildType.apk" + Rename-Item -Path $oldApk -NewName "$baseName-${buildType}.apk" + Write-Host "APK renamed to: $baseName-${buildType}.apk" } # Rename SHA1 (if exists) -$oldSha1 = "$apkDir\app-$buildType.apk.sha1" -$newSha1 = "$apkDir\$baseName-$buildType.apk.sha1" +$oldSha1 = "$apkDir\app-${buildType}.apk.sha1" +$newSha1 = "$apkDir\$baseName-${buildType}.apk.sha1" if (Test-Path $oldSha1) { if (Test-Path $newSha1) { Remove-Item $newSha1 -Force } - Rename-Item -Path $oldSha1 -NewName "$baseName-$buildType.apk.sha1" - Write-Host "SHA1 renamed to: $baseName-$buildType.apk.sha1" + Rename-Item -Path $oldSha1 -NewName "$baseName-${buildType}.apk.sha1" + Write-Host "SHA1 renamed to: $baseName-${buildType}.apk.sha1" } \ No newline at end of file diff --git a/android/flutter-build-apk.sh b/android/flutter-build-apk.sh index 4d6cbf9..0bb9a1b 100755 --- a/android/flutter-build-apk.sh +++ b/android/flutter-build-apk.sh @@ -1,24 +1,90 @@ #!/bin/bash -BUILD_TYPE=${1:-debug} -APK_DIR="../build/app/outputs/flutter-apk" -BASE_NAME="org.igox.apps.android.busylight-buddy" -flutter build apk --$BUILD_TYPE +# Default values +buildType="release" +buildName="0.0.0" +buildsRef="builds.json" + +# Help message +show_help() { + echo "Usage: $0 [-t buildType] [-n buildName]" + echo "Builds a Flutter APK with versioning support." + echo "" + echo "Options:" + echo " -t, --buildType Build type (release or debug). Default: release" + echo " -n, --buildName Build name (version). Default: 0.0.0" + echo " -h, --help Show this help message" + exit 0 +} + +# Parse command-line arguments +while [[ "$#" -gt 0 ]]; do + case $1 in + -t|--buildType) buildType="$2"; shift ;; + -n|--buildName) buildName="$2"; shift ;; + -h|--help) show_help ;; + *) echo "Unknown parameter: $1"; show_help; exit 1 ;; + esac + shift +done + +# Check if builds.json exists +if [ ! -f "$buildsRef" ]; then + echo "File created: $buildsRef" + echo "{\"$buildName\": 0}" > "$buildsRef" +else + echo "File already exists: $buildsRef" +fi + +# Read the JSON file +buildsMap=$(cat "$buildsRef") + +# Check if buildName exists in the JSON +if jq -e --arg key "$buildName" 'has($key)' <<< "$buildsMap" > /dev/null; then + echo "Build exists: $buildName" + buildNumber=$(jq --arg key "$buildName" '.[$key]' <<< "$buildsMap") + buildNumber=$((buildNumber + 1)) + echo "Next build number for $buildName: $buildNumber" + buildsMap=$(jq --arg key "$buildName" --argjson value "$buildNumber" '.[$key] = $value' <<< "$buildsMap") +else + echo "New build: $buildName, starting at build number: 1" + buildNumber=1 + buildsMap=$(jq --arg key "$buildName" --argjson value "$buildNumber" '.[$key] = $value' <<< "$buildsMap") +fi + +# Save the updated JSON back to the file +echo "$buildsMap" > "$buildsRef" + +# Define paths +apkDir="../build/app/outputs/flutter-apk" +baseName="org.igox.apps.android.busylight-buddy" + +# Build APK +echo "Building APK with arguments: --$buildType --build-name=$buildName --build-number=$buildNumber --target-platform=android-arm,android-arm64,android-x64" +flutter build apk --"$buildType" --build-name="$buildName" --build-number="$buildNumber" --target-platform=android-arm,android-arm64,android-x64 # Rename APK -OLD_APK="$APK_DIR/app-$BUILD_TYPE.apk" -NEW_APK="$APK_DIR/$BASE_NAME-$BUILD_TYPE.apk" -if [ -f "$OLD_APK" ]; then - [ -f "$NEW_APK" ] && rm -f "$NEW_APK" - mv "$OLD_APK" "$NEW_APK" - echo "APK renamed to: $BASE_NAME-$BUILD_TYPE.apk" +oldApk="$apkDir/app-$buildType.apk" +newApk="$apkDir/$baseName-$buildType.apk" +if [ -f "$oldApk" ]; then + if [ -f "$newApk" ]; then + rm -f "$newApk" + fi + mv "$oldApk" "$newApk" + echo "APK renamed to: $baseName-$buildType.apk" +else + echo "Warning: APK not found at $oldApk" fi # Rename SHA1 (if exists) -OLD_SHA1="$APK_DIR/app-$BUILD_TYPE.apk.sha1" -NEW_SHA1="$APK_DIR/$BASE_NAME-$BUILD_TYPE.apk.sha1" -if [ -f "$OLD_SHA1" ]; then - [ -f "$NEW_SHA1" ] && rm -f "$NEW_SHA1" - mv "$OLD_SHA1" "$NEW_SHA1" - echo "SHA1 renamed to: $BASE_NAME-$BUILD_TYPE.apk.sha1" +oldSha1="$apkDir/app-$buildType.apk.sha1" +newSha1="$apkDir/$baseName-$buildType.apk.sha1" +if [ -f "$oldSha1" ]; then + if [ -f "$newSha1" ]; then + rm -f "$newSha1" + fi + mv "$oldSha1" "$newSha1" + echo "SHA1 renamed to: $baseName-$buildType.apk.sha1" +else + echo "Warning: SHA1 not found at $oldSha1" fi \ No newline at end of file diff --git a/ios/flutter-build-ios.sh b/ios/flutter-build-ios.sh new file mode 100755 index 0000000..e7a32f6 --- /dev/null +++ b/ios/flutter-build-ios.sh @@ -0,0 +1,60 @@ +#!/bin/bash + +# Default values +buildType="release" +buildName="0.0.0" +buildsRef="builds.json" + +# Help message +show_help() { + echo "Usage: $0 [-t buildType] [-n buildName]" + echo "Builds a Flutter iOS application with versioning support." + echo "" + echo "Options:" + echo " -t, --buildType Build type (release or debug). Default: release" + echo " -n, --buildName Build name (version). Default: 0.0.0" + echo " -h, --help Show this help message" + exit 0 +} + +# Parse command-line arguments +while [[ "$#" -gt 0 ]]; do + case $1 in + -t|--buildType) buildType="$2"; shift ;; + -n|--buildName) buildName="$2"; shift ;; + -h|--help) show_help ;; + *) echo "Unknown parameter: $1"; show_help; exit 1 ;; + esac + shift +done + +# Check if builds.json exists +if [ ! -f "$buildsRef" ]; then + echo "File created: $buildsRef" + echo "{\"$buildName\": 0}" > "$buildsRef" +else + echo "File already exists: $buildsRef" +fi + +# Read the JSON file +buildsMap=$(cat "$buildsRef") + +# Check if buildName exists in the JSON +if jq -e --arg key "$buildName" 'has($key)' <<< "$buildsMap" > /dev/null; then + echo "Build exists: $buildName" + buildNumber=$(jq --arg key "$buildName" '.[$key]' <<< "$buildsMap") + buildNumber=$((buildNumber + 1)) + echo "Next build number for $buildName: $buildNumber" + buildsMap=$(jq --arg key "$buildName" --argjson value "$buildNumber" '.[$key] = $value' <<< "$buildsMap") +else + echo "New build: $buildName, starting at build number: 1" + buildNumber=1 + buildsMap=$(jq --arg key "$buildName" --argjson value "$buildNumber" '.[$key] = $value' <<< "$buildsMap") +fi + +# Save the updated JSON back to the file +echo "$buildsMap" > "$buildsRef" + +# Build iOS application +echo "Building iOS application with arguments: --$buildType --build-name=$buildName --build-number=$buildNumber" +flutter build ios --"$buildType" --build-name="$buildName" --build-number="$buildNumber" \ No newline at end of file diff --git a/macos/flutter-build-macos.sh b/macos/flutter-build-macos.sh new file mode 100755 index 0000000..fe90891 --- /dev/null +++ b/macos/flutter-build-macos.sh @@ -0,0 +1,60 @@ +#!/bin/bash + +# Default values +buildType="release" +buildName="0.0.0" +buildsRef="builds.json" + +# Help message +show_help() { + echo "Usage: $0 [-t buildType] [-n buildName]" + echo "Builds a Flutter macOS application with versioning support." + echo "" + echo "Options:" + echo " -t, --buildType Build type (release or debug). Default: release" + echo " -n, --buildName Build name (version). Default: 0.0.0" + echo " -h, --help Show this help message" + exit 0 +} + +# Parse command-line arguments +while [[ "$#" -gt 0 ]]; do + case $1 in + -t|--buildType) buildType="$2"; shift ;; + -n|--buildName) buildName="$2"; shift ;; + -h|--help) show_help ;; + *) echo "Unknown parameter: $1"; show_help; exit 1 ;; + esac + shift +done + +# Check if builds.json exists +if [ ! -f "$buildsRef" ]; then + echo "File created: $buildsRef" + echo "{\"$buildName\": 0}" > "$buildsRef" +else + echo "File already exists: $buildsRef" +fi + +# Read the JSON file +buildsMap=$(cat "$buildsRef") + +# Check if buildName exists in the JSON +if jq -e --arg key "$buildName" 'has($key)' <<< "$buildsMap" > /dev/null; then + echo "Build exists: $buildName" + buildNumber=$(jq --arg key "$buildName" '.[$key]' <<< "$buildsMap") + buildNumber=$((buildNumber + 1)) + echo "Next build number for $buildName: $buildNumber" + buildsMap=$(jq --arg key "$buildName" --argjson value "$buildNumber" '.[$key] = $value' <<< "$buildsMap") +else + echo "New build: $buildName, starting at build number: 1" + buildNumber=1 + buildsMap=$(jq --arg key "$buildName" --argjson value "$buildNumber" '.[$key] = $value' <<< "$buildsMap") +fi + +# Save the updated JSON back to the file +echo "$buildsMap" > "$buildsRef" + +# Build macOS application +echo "Building macOS application with arguments: --$buildType --build-name=$buildName --build-number=$buildNumber" +flutter build macos --"$buildType" --build-name="$buildName" --build-number="$buildNumber" \ No newline at end of file diff --git a/windows/build-installer.ps1 b/windows/build-installer.ps1 deleted file mode 100644 index d3cf9f3..0000000 --- a/windows/build-installer.ps1 +++ /dev/null @@ -1,6 +0,0 @@ -cd $PSScriptRoot - -# Build the Windows application using Flutter -flutter build windows --release -# Build the Windows installer using Inno Setup Compiler (ISCC.exe) -ISCC.exe ./busylight-buddy-windows-installer-builder.iss \ No newline at end of file diff --git a/windows/build-windows-installer.ps1 b/windows/build-windows-installer.ps1 new file mode 100644 index 0000000..3f87de3 --- /dev/null +++ b/windows/build-windows-installer.ps1 @@ -0,0 +1,55 @@ +<# +.SYNOPSIS + Builds a Flutter Windows installer with versioning support. + +.DESCRIPTION + This script builds a Flutter Windows application and creates an installer using Inno Setup. + +.PARAMETER buildType + The build type (release or debug). Default is "release". + +.PARAMETER buildName + The build name (version). Default is "0.0.0". + +.EXAMPLE + .\build-windows-installer.ps1 -buildType debug -buildName 1.0.0 + Builds a debug Windows application with version 1.0.0. +#> + +[CmdletBinding()] +param ( + [string]$buildType = "release", # Default value is "release" + [string]$buildName = "0.0.0" # Default value is "0.0.0" +) + +$buildNumber = "$(Get-Date -Format 'yyyyMMddHHmmss')" + +# Define the file path and the new version value +$issTplFile = "./busylight-buddy-windows-installer-builder.iss.tpl" +$issFile = "./busylight-buddy-windows-installer-builder.iss" + +cd $PSScriptRoot + +# Build an array for arguments +$flutterArgs = @( + "--$buildType", + "--build-name=$buildName", + "--build-number=$buildNumber" +) + +Write-Output "Building Windows application with arguments: $($flutterArgs -join ' ')" + +# Build the Windows application using Flutter +flutter build windows @flutterArgs + +# Build the Windows installer using Inno Setup Compiler (ISCC.exe) +# Read the content of Inno Setup template file +$content = Get-Content -Path $issTplFile -Raw + +# Replace the placeholder with the new version value +$updatedContent = $content -replace '%%MyAppVersion%%', $buildName + +# Write the updated content back to Inno Setup file +$updatedContent | Set-Content -Path $issFile + +ISCC.exe $issFile \ No newline at end of file diff --git a/windows/busylight-buddy-windows-installer-builder.iss b/windows/busylight-buddy-windows-installer-builder.iss.tpl similarity index 98% rename from windows/busylight-buddy-windows-installer-builder.iss rename to windows/busylight-buddy-windows-installer-builder.iss.tpl index 0075ade..e04f5f4 100644 --- a/windows/busylight-buddy-windows-installer-builder.iss +++ b/windows/busylight-buddy-windows-installer-builder.iss.tpl @@ -3,7 +3,7 @@ ; Non-commercial use only #define MyAppName "BusyLight Buddy" -#define MyAppVersion "0.0.1" +#define MyAppVersion "%%MyAppVersion%%" #define MyAppPublisher "iGoX" #define MyAppURL "https://github.com/igox/busylight-buddy" #define MyAppExeName "busylight_buddy.exe"