Skip to content
Merged
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
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
7 changes: 7 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,10 @@ ktlint_standard_final-newline = disabled
ktlint_standard_class-naming = disabled
ktlint_standard_function-naming = disabled
ktlint_standard_no-wildcard-imports = disabled

# Build output (Compose-generated resources and friends) is never committed
# and is not ktlint-formatted; this keeps bare `ktlint` runs clean.
[**/build/**]
ktlint_standard = disabled
[build/**]
ktlint_standard = disabled
6 changes: 6 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# Android emulator / local development. Copy to .env (ignored by Git).
# Physical device: use your PC's LAN address instead of 10.0.2.2.
# Entra IDs are public identifiers; NEVER put a client secret in a mobile project.
MERGEN_API_ORIGIN=http://10.0.2.2:3001
MERGEN_ENTRA_CLIENT_ID=
MERGEN_ENTRA_TENANT_ID=
6 changes: 3 additions & 3 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ Closes #

## Verification

- [ ] `./gradlew :composeApp:compileDebugKotlinAndroid`
- [ ] `./gradlew :composeApp:testDebugUnitTest`
- [ ] `./gradlew :composeApp:lintDebug`
- [ ] `gradle :composeApp:compileDebugKotlinAndroid`
- [ ] `gradle :composeApp:testDebugUnitTest`
- [ ] `gradle :composeApp:lintDebug`
- [ ] Screenshots or a screen recording — if the UI changed (Android and/or iOS)
32 changes: 17 additions & 15 deletions .github/workflows/checks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ name: Checks

on:
push:
branches: ["main"]
branches: [ "main" ]
pull_request:
branches: ["main"]
branches: [ "main" ]

concurrency:
group: checks-${{ github.ref }}
Expand All @@ -20,34 +20,36 @@ jobs:

steps:
- name: Checkout
uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false

- name: Set up JDK 21
uses: actions/setup-java@cf277c60eb25467037889841efdb72551f06f6c3 # v4.9.1
# Tools come from mise.toml; android-sdk stays out so the runner's
# preinstalled Android SDK (and its ANDROID_HOME) is used.
- name: Set up tools (mise)
uses: jdx/mise-action@9b200bcecbfd6303e69a4a261b2e09e3757440a7 # v5.2.0
with:
distribution: temurin
java-version: "21"
install_args: java gradle

- name: Set up Gradle
uses: gradle/actions/setup-gradle@748248ddd2a24f49513d8f472f81c3a07d4d50e1 # v4.4.4

- name: Make Gradle executable
run: chmod +x ./gradlew
uses: gradle/actions/setup-gradle@3f5f9adaf7d9fecd50b5935e54106014257a94e6 # v6.4.0
with:
# v6 defaults to Gradle's proprietary cache service; keep the old
# actions/cache-based behavior.
cache-provider: basic

- name: Compile
run: ./gradlew :composeApp:compileDebugKotlinAndroid
run: gradle :composeApp:compileDebugKotlinAndroid

- name: Unit tests
run: ./gradlew :composeApp:testDebugUnitTest
run: gradle :composeApp:testDebugUnitTest

- name: Android Lint
run: ./gradlew :composeApp:lintDebug
run: gradle :composeApp:lintDebug

- name: Upload test reports
if: always()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: test-reports
path: composeApp/build/reports/tests/
Expand Down
27 changes: 19 additions & 8 deletions .github/workflows/closed-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ on:
description: Which platform to release
required: true
type: choice
options: [ios, android, both]
options: [ ios, android, both ]
run_id:
description: "Build run id (default: latest completed run that has the required artifact)"
required: false
Expand Down Expand Up @@ -39,7 +39,7 @@ jobs:

steps:
- name: Download Android AAB
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
with:
name: mergen-android-aab
path: artifacts
Expand All @@ -64,23 +64,34 @@ jobs:

steps:
- name: Checkout
uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false

- name: Download iOS IPA
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
with:
name: mergen-ios-ipa
path: artifacts
run-id: ${{ needs.resolve-build.outputs.run_id }}
github-token: ${{ github.token }}

- name: Set up Ruby
uses: ruby/setup-ruby@e8944e80fb94b20106697132f8c20c665fab29e9 # v1.325.0
- name: Set up tools (mise)
uses: jdx/mise-action@9b200bcecbfd6303e69a4a261b2e09e3757440a7 # v5.2.0
with:
ruby-version: "3.3"
bundler-cache: true
install_args: ruby

- name: Cache gems
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
with:
path: vendor/bundle
key: ${{ runner.os }}-gems-${{ hashFiles('Gemfile.lock') }}
restore-keys: ${{ runner.os }}-gems-

- name: Install fastlane
run: |
bundle config set --local path vendor/bundle
bundle install --jobs 4 --retry 3

- name: Write App Store Connect API key
env:
Expand Down
39 changes: 39 additions & 0 deletions .github/workflows/dependency-submission.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
name: Dependency Submission (Gradle)

on:
push:
branches: [ "**" ]

permissions:
contents: write

jobs:
submit-gradle:
runs-on: ubuntu-latest

steps:
- name: Checkout
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false

# Tools come from mise.toml (source of truth).
- name: Set up tools (mise)
uses: jdx/mise-action@9b200bcecbfd6303e69a4a261b2e09e3757440a7 # v5.2.0
with:
install_args: java gradle

- name: Read the mise-pinned Gradle version
id: gradle
run: echo "version=$(mise current gradle)" >> "$GITHUB_OUTPUT"

- name: Generate and submit dependency graph
uses: gradle/actions/dependency-submission@3f5f9adaf7d9fecd50b5935e54106014257a94e6 # v6.4.0
with:
# The action requires the wrapper or an explicit version; the version
# comes from mise.toml. The distribution download is cached by the
# action between runs.
gradle-version: ${{ steps.gradle.outputs.version }}
# v6 defaults to Gradle's proprietary cache service; keep the old
# actions/cache-based behavior.
cache-provider: basic
27 changes: 19 additions & 8 deletions .github/workflows/dev-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ on:
description: Which platform to release
required: true
type: choice
options: [ios, android, both]
options: [ ios, android, both ]
run_id:
description: "Build run id (default: latest completed run that has the required artifact)"
required: false
Expand Down Expand Up @@ -39,7 +39,7 @@ jobs:

steps:
- name: Download Android AAB
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
with:
name: mergen-android-aab
path: artifacts
Expand All @@ -64,23 +64,34 @@ jobs:

steps:
- name: Checkout
uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false

- name: Download iOS IPA
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
with:
name: mergen-ios-ipa
path: artifacts
run-id: ${{ needs.resolve-build.outputs.run_id }}
github-token: ${{ github.token }}

- name: Set up Ruby
uses: ruby/setup-ruby@e8944e80fb94b20106697132f8c20c665fab29e9 # v1.325.0
- name: Set up tools (mise)
uses: jdx/mise-action@9b200bcecbfd6303e69a4a261b2e09e3757440a7 # v5.2.0
with:
ruby-version: "3.3"
bundler-cache: true
install_args: ruby

- name: Cache gems
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
with:
path: vendor/bundle
key: ${{ runner.os }}-gems-${{ hashFiles('Gemfile.lock') }}
restore-keys: ${{ runner.os }}-gems-

- name: Install fastlane
run: |
bundle config set --local path vendor/bundle
bundle install --jobs 4 --retry 3

- name: Write App Store Connect API key
env:
Expand Down
47 changes: 24 additions & 23 deletions .github/workflows/developer-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,21 +28,25 @@ jobs:

steps:
- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1

- name: Set up Java
uses: actions/setup-java@v4
# Tools come from mise.toml; android-sdk stays out so the runner's
# preinstalled Android SDK (and its ANDROID_HOME) is used.
- name: Set up tools (mise)
uses: jdx/mise-action@9b200bcecbfd6303e69a4a261b2e09e3757440a7 # v5.2.0
with:
distribution: temurin
java-version: "21"
cache: gradle
install_args: java gradle

- name: Make Gradle executable
run: chmod +x ./gradlew
- name: Set up Gradle
uses: gradle/actions/setup-gradle@3f5f9adaf7d9fecd50b5935e54106014257a94e6 # v6.4.0
with:
# v6 defaults to Gradle's proprietary cache service; keep the old
# actions/cache-based behavior.
cache-provider: basic

- name: Build Android developer APK
run: |
./gradlew :composeApp:assembleDebug \
gradle :composeApp:assembleDebug \
-PmergenVersionCode="${{ github.run_number }}" \
-PmergenVersionName="${ANDROID_VERSION_NAME}"

Expand Down Expand Up @@ -103,7 +107,7 @@ jobs:
- name: Build Google Play release AAB
if: ${{ inputs.build_play_aab }}
run: |
./gradlew :composeApp:bundleRelease \
gradle :composeApp:bundleRelease \
-PmergenVersionCode="${{ github.run_number }}" \
-PmergenVersionName="${PLAY_VERSION_NAME}"

Expand Down Expand Up @@ -165,15 +169,15 @@ jobs:
echo "OK: AAB is signed with the Play-registered upload certificate."

- name: Upload Android APK artifact
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: mergen-android-apk
path: release-assets/Mergen-android-dev.apk
if-no-files-found: error

- name: Upload Google Play AAB artifact
if: ${{ inputs.build_play_aab }}
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: mergen-android-play-aab
path: release-assets/Mergen-android-play.aab
Expand All @@ -186,17 +190,14 @@ jobs:

steps:
- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1

- name: Set up Java
uses: actions/setup-java@v4
# Tools come from mise.toml (java feeds jarsigner/keytool and the Gradle
# part of the iOS build); android-sdk stays out on purpose.
- name: Set up tools (mise)
uses: jdx/mise-action@9b200bcecbfd6303e69a4a261b2e09e3757440a7 # v5.2.0
with:
distribution: temurin
java-version: "21"
cache: gradle

- name: Make Gradle executable
run: chmod +x ./gradlew
install_args: java gradle

- name: Build iOS Simulator app
run: |
Expand Down Expand Up @@ -232,7 +233,7 @@ jobs:
release-assets/Mergen-ios-simulator.zip

- name: Upload iOS Simulator artifact
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: mergen-ios-simulator
path: release-assets/Mergen-ios-simulator.zip
Expand All @@ -248,7 +249,7 @@ jobs:

steps:
- name: Download build artifacts
uses: actions/download-artifact@v4
uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
with:
pattern: mergen-*
path: release-assets
Expand Down
25 changes: 9 additions & 16 deletions .github/workflows/kotlin-quality-check.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,25 +12,18 @@ permissions:
jobs:
lint_only:
runs-on: ubuntu-latest

steps:
- name: Checkout Code
uses: actions/checkout@v4
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1

- name: Set up JDK 24
uses: actions/setup-java@v4
# Tools come from mise.toml (source of truth). Only java and ktlint are
# installed here; android-sdk stays out of CI because Gradle builds use
# the runner's preinstalled Android SDK.
- name: Set up tools (mise)
uses: jdx/mise-action@9b200bcecbfd6303e69a4a261b2e09e3757440a7 # v5.2.0
with:
java-version: '24'
distribution: 'temurin'

- name: Download Ktlint CLI
run: |
KTLINT_VERSION="1.1.1"
echo "Downloading Ktlint CLI version $KTLINT_VERSION..."
# Download the executable jar to the current directory
curl -sSLO https://github.com/pinterest/ktlint/releases/download/$KTLINT_VERSION/ktlint
# Make the file executable
chmod +x ktlint
install_args: java ktlint

- name: Execute Ktlint Check
run: ./ktlint "**/*.kt" "**/*.kts" "!composeApp/src/commonMain/kotlin/hu/petrik/filcapp/api/**"
run: ktlint "**/*.kt" "**/*.kts" "!**/build/**" "!composeApp/src/commonMain/kotlin/hu/petrik/filcapp/api/**"
Loading
Loading