Compare commits
88 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
504da80c09 | ||
| 0c575eaa26 | |||
| 38b5d8b464 | |||
| ef2bc851de | |||
|
|
448d85834b | ||
| 7b5f9c1518 | |||
| 67581d04f0 | |||
| be83067fb7 | |||
| ea4590f0ed | |||
|
|
721f32e1ea | ||
| 36a74b39e1 | |||
| 08159faec2 | |||
| 346bfb9d92 | |||
|
|
0b9cda92ca | ||
| 9f45b2344e | |||
|
|
4ae96c37d1 | ||
| 852e9c47f3 | |||
|
|
769bf74400 | ||
| 132d9e33a6 | |||
|
|
7ff161f1c5 | ||
| 7ea2901867 | |||
|
|
7a849d5d36 | ||
| b1d7eccd82 | |||
|
|
0f999750f1 | ||
| 6d2173f08d | |||
|
|
768e78ace9 | ||
| d41d2b81be | |||
| 1f09e9d5aa | |||
|
|
1bb5b85b3e | ||
| 3e4051a846 | |||
|
|
24baeda80f | ||
| 9d4c8327b0 | |||
|
|
42125f89eb | ||
| 7d0c7932ea | |||
| 6f9f40a061 | |||
| 41bec3b656 | |||
| 8ba765e3be | |||
|
|
6cdb74a391 | ||
| eb797dd0e8 | |||
| 7243e43bbb | |||
| 82966695b4 | |||
| 322b3e29fa | |||
| 634ac0be6b | |||
|
|
2852e3ecf5 | ||
| 179c6d781c | |||
| daac6f56fd | |||
| a447fe1c8a | |||
| d73fa03a25 | |||
|
|
cb7133fcd7 | ||
| 64af382f10 | |||
| a535c6b49a | |||
| c15ad85d67 | |||
| d474663d44 | |||
|
|
b984aaf187 | ||
| fc8aa17c61 | |||
| 633a1979ce | |||
| 0cb6c06d9d | |||
| ff593aee6d | |||
| bd11f814d7 | |||
|
|
96059f219c | ||
| e7ff39a232 | |||
| 11972542da | |||
| 5dcd1f25b1 | |||
| 1e85d0c2a6 | |||
| 9555eaf636 | |||
| 69f3a4fef9 | |||
|
|
466f5a04b2 | ||
|
|
d44909c79f | ||
| 9d474a62fe | |||
| c72a655f6a | |||
| 32326beb8d | |||
| ce158ad4f8 | |||
| 7ec952620d | |||
| b0fcd93792 | |||
| d7e9b62730 | |||
|
|
f54f69cd3c | ||
| 4d99694109 | |||
| 7c572a6e64 | |||
| 9740997709 | |||
| da170001f0 | |||
|
|
4d0a75882d | ||
| 7c57b7bcbb | |||
| c5595c0d1a | |||
| ea8ff9aabd | |||
| e6284b9577 | |||
|
|
2545e421de | ||
| a5c8e5b479 | |||
| e69625e8af |
1
.flutter-version
Normal file
@@ -0,0 +1 @@
|
||||
3.41.7
|
||||
91
.github/workflows/release.yml
vendored
@@ -11,7 +11,20 @@ permissions:
|
||||
pull-requests: write
|
||||
|
||||
jobs:
|
||||
setup:
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
flutter-version: ${{ steps.read.outputs.version }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
sparse-checkout: .flutter-version
|
||||
sparse-checkout-cone-mode: false
|
||||
- id: read
|
||||
run: echo "version=$(cat .flutter-version | tr -d '[:space:]')" >> "$GITHUB_OUTPUT"
|
||||
|
||||
lint:
|
||||
needs: setup
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
@@ -21,7 +34,7 @@ jobs:
|
||||
- name: Setup Flutter
|
||||
uses: subosito/flutter-action@v2
|
||||
with:
|
||||
channel: 'stable'
|
||||
flutter-version: ${{ needs.setup.outputs.flutter-version }}
|
||||
cache: true
|
||||
|
||||
- name: Cache pub dependencies
|
||||
@@ -35,9 +48,6 @@ jobs:
|
||||
- name: Install dependencies
|
||||
run: flutter pub get
|
||||
|
||||
- name: Stub .env
|
||||
run: cp .env.example .env
|
||||
|
||||
- name: Verify formatting
|
||||
run: dart format --output=none --set-exit-if-changed .
|
||||
|
||||
@@ -45,6 +55,7 @@ jobs:
|
||||
run: flutter analyze --no-fatal-infos
|
||||
|
||||
test:
|
||||
needs: setup
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
@@ -54,7 +65,7 @@ jobs:
|
||||
- name: Setup Flutter
|
||||
uses: subosito/flutter-action@v2
|
||||
with:
|
||||
channel: 'stable'
|
||||
flutter-version: ${{ needs.setup.outputs.flutter-version }}
|
||||
cache: true
|
||||
|
||||
- name: Cache pub dependencies
|
||||
@@ -68,12 +79,8 @@ jobs:
|
||||
- name: Install dependencies
|
||||
run: flutter pub get
|
||||
|
||||
- name: Stub .env
|
||||
run: cp .env.example .env
|
||||
|
||||
- name: Run tests
|
||||
run: flutter test --coverage --dart-define-from-file=.env
|
||||
|
||||
run: flutter test --coverage
|
||||
- name: Upload coverage
|
||||
uses: codecov/codecov-action@v4
|
||||
with:
|
||||
@@ -83,21 +90,15 @@ jobs:
|
||||
release-please:
|
||||
needs: [lint, test]
|
||||
if: github.event_name == 'push' && github.ref == 'refs/heads/master'
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
release_created: ${{ steps.release.outputs.release_created }}
|
||||
tag_name: ${{ steps.release.outputs.tag_name }}
|
||||
version: ${{ steps.release.outputs.version }}
|
||||
|
||||
steps:
|
||||
- name: Release Please
|
||||
id: release
|
||||
uses: googleapis/release-please-action@v4
|
||||
with:
|
||||
release-type: dart
|
||||
uses: chenasraf/workflows/.github/workflows/release-please-fastlane-changelog.yml@master
|
||||
with:
|
||||
release-type: dart
|
||||
fastlane-changelog-dirs: |
|
||||
fastlane/metadata/android/en-US/changelogs
|
||||
fastlane/metadata/ios/en-US/changelogs
|
||||
|
||||
build-android:
|
||||
needs: release-please
|
||||
needs: [setup, release-please]
|
||||
if: ${{ needs.release-please.outputs.release_created }}
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
@@ -115,7 +116,7 @@ jobs:
|
||||
- name: Setup Flutter
|
||||
uses: subosito/flutter-action@v2
|
||||
with:
|
||||
channel: 'stable'
|
||||
flutter-version: ${{ needs.setup.outputs.flutter-version }}
|
||||
cache: true
|
||||
|
||||
- name: Cache pub dependencies
|
||||
@@ -129,8 +130,8 @@ jobs:
|
||||
- name: Install dependencies
|
||||
run: flutter pub get
|
||||
|
||||
- name: Create .env
|
||||
run: cp .env.example .env
|
||||
- name: Remove JNI build-id for reproducible builds
|
||||
run: sed -i -e 's/-Wl,/-Wl,--build-id=none,/' $PUB_CACHE/hosted/pub.dev/jni-*/src/CMakeLists.txt
|
||||
|
||||
- name: Decode keystore
|
||||
run: echo ${{ secrets.ANDROID_KEYSTORE_BASE64 }} | base64 -d > android/app/upload-keystore.jks
|
||||
@@ -144,23 +145,35 @@ jobs:
|
||||
storeFile=upload-keystore.jks
|
||||
EOF
|
||||
|
||||
- name: Build APK
|
||||
run: flutter build apk --release --obfuscate --split-debug-info=build/debug-info-apk --dart-define-from-file=.env
|
||||
- name: Print signing key SHA-256
|
||||
run: |
|
||||
keytool -list -v -keystore android/app/upload-keystore.jks \
|
||||
-alias ${{ secrets.ANDROID_KEY_ALIAS }} \
|
||||
-storepass ${{ secrets.ANDROID_STORE_PASSWORD }} \
|
||||
2>/dev/null | grep "SHA256:" | awk '{print $2}'
|
||||
|
||||
- name: Build split APKs
|
||||
run: flutter build apk --release --split-per-abi
|
||||
|
||||
- name: Build App Bundle
|
||||
run: flutter build appbundle --release --obfuscate --split-debug-info=build/debug-info-aab --dart-define-from-file=.env
|
||||
|
||||
run: flutter build appbundle --release --obfuscate --split-debug-info=build/debug-info-aab
|
||||
- name: Rename artifacts
|
||||
run: |
|
||||
mv build/app/outputs/flutter-apk/app-release.apk build/app/outputs/flutter-apk/pantry-${{ needs.release-please.outputs.version }}.apk
|
||||
mv build/app/outputs/bundle/release/app-release.aab build/app/outputs/bundle/release/pantry-${{ needs.release-please.outputs.version }}.aab
|
||||
VERSION=${{ needs.release-please.outputs.version }}
|
||||
APK_DIR=build/app/outputs/flutter-apk
|
||||
mv ${APK_DIR}/app-armeabi-v7a-release.apk ${APK_DIR}/pantry-${VERSION}-armeabi-v7a.apk
|
||||
mv ${APK_DIR}/app-arm64-v8a-release.apk ${APK_DIR}/pantry-${VERSION}-arm64-v8a.apk
|
||||
mv ${APK_DIR}/app-x86_64-release.apk ${APK_DIR}/pantry-${VERSION}-x86_64.apk
|
||||
mv build/app/outputs/bundle/release/app-release.aab build/app/outputs/bundle/release/pantry-${VERSION}.aab
|
||||
|
||||
- name: Upload APK to release
|
||||
- name: Upload APKs to release
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
tag_name: ${{ needs.release-please.outputs.tag_name }}
|
||||
files: |
|
||||
build/app/outputs/flutter-apk/pantry-${{ needs.release-please.outputs.version }}.apk
|
||||
build/app/outputs/flutter-apk/pantry-${{ needs.release-please.outputs.version }}-armeabi-v7a.apk
|
||||
build/app/outputs/flutter-apk/pantry-${{ needs.release-please.outputs.version }}-arm64-v8a.apk
|
||||
build/app/outputs/flutter-apk/pantry-${{ needs.release-please.outputs.version }}-x86_64.apk
|
||||
|
||||
- name: Upload App Bundle to release
|
||||
uses: softprops/action-gh-release@v2
|
||||
@@ -170,7 +183,7 @@ jobs:
|
||||
build/app/outputs/bundle/release/pantry-${{ needs.release-please.outputs.version }}.aab
|
||||
|
||||
build-ios:
|
||||
needs: release-please
|
||||
needs: [setup, release-please]
|
||||
if: false # TEMPORARILY DISABLED — was: ${{ needs.release-please.outputs.release_created }}
|
||||
runs-on: macos-latest
|
||||
|
||||
@@ -181,7 +194,7 @@ jobs:
|
||||
- name: Setup Flutter
|
||||
uses: subosito/flutter-action@v2
|
||||
with:
|
||||
channel: 'stable'
|
||||
flutter-version: ${{ needs.setup.outputs.flutter-version }}
|
||||
cache: true
|
||||
|
||||
- name: Cache pub dependencies
|
||||
@@ -204,12 +217,8 @@ jobs:
|
||||
- name: Install dependencies
|
||||
run: flutter pub get
|
||||
|
||||
- name: Create .env
|
||||
run: cp .env.example .env
|
||||
|
||||
- name: Build iOS (no codesign)
|
||||
run: flutter build ios --release --no-codesign --obfuscate --split-debug-info=build/debug-info-ios --dart-define-from-file=.env
|
||||
|
||||
run: flutter build ios --release --no-codesign --obfuscate --split-debug-info=build/debug-info-ios
|
||||
- name: Create unsigned IPA
|
||||
run: |
|
||||
mkdir -p build/ios/ipa
|
||||
|
||||
11
.gitignore
vendored
@@ -47,6 +47,8 @@ app.*.map.json
|
||||
|
||||
# Environment
|
||||
.env
|
||||
.envrc
|
||||
/.flutter-flags.yml
|
||||
|
||||
# Android signing
|
||||
android/key.properties
|
||||
@@ -54,7 +56,8 @@ android/app/*.jks
|
||||
android/app/*.keystore
|
||||
|
||||
# Fastlane
|
||||
android/fastlane/play-store-key.json
|
||||
ios/fastlane/report.xml
|
||||
android/fastlane/report.xml
|
||||
/.envrc
|
||||
fastlane/play-store-key.json
|
||||
fastlane/.image_hashes.json
|
||||
fastlane/report.xml
|
||||
fastlane/Preview.html
|
||||
fastlane/metadata/ios/en-US/release_notes.txt
|
||||
|
||||
190
CHANGELOG.md
@@ -1,5 +1,195 @@
|
||||
# Changelog
|
||||
|
||||
## [0.11.0](https://github.com/chenasraf/pantry-flutter/compare/v0.10.1...v0.11.0) (2026-05-12)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* add setting to require checkbox tap to complete checklist items ([ef2bc85](https://github.com/chenasraf/pantry-flutter/commit/ef2bc851deedc180dda51fbfb7378aef7145cf5f))
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* preserve subpath for Nextcloud instances hosted on sub-paths ([0c575ea](https://github.com/chenasraf/pantry-flutter/commit/0c575eaa2601dc8c83c6b874f2d81b54a0f6bf01))
|
||||
|
||||
## [0.10.1](https://github.com/chenasraf/pantry-flutter/compare/v0.10.0...v0.10.1) (2026-04-26)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* make markdown links clickable ([7b5f9c1](https://github.com/chenasraf/pantry-flutter/commit/7b5f9c151845dde90275a8289b3114483d2b214d))
|
||||
|
||||
## [0.10.0](https://github.com/chenasraf/pantry-flutter/compare/v0.9.10...v0.10.0) (2026-04-21)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* update notes view & edit ui ([36a74b3](https://github.com/chenasraf/pantry-flutter/commit/36a74b39e1beb37fc2f1446f8d45945a22289c6b))
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* bug where note grid would not clip correctly ([08159fa](https://github.com/chenasraf/pantry-flutter/commit/08159faec22422da983f23685c53b45088d74b2a))
|
||||
|
||||
## [0.9.10](https://github.com/chenasraf/pantry-flutter/compare/v0.9.9...v0.9.10) (2026-04-19)
|
||||
|
||||
|
||||
### Build System
|
||||
|
||||
* fix signing ([9f45b23](https://github.com/chenasraf/pantry-flutter/commit/9f45b2344ef87708d55889e8fb80f465808fb0c7))
|
||||
|
||||
## [0.9.9](https://github.com/chenasraf/pantry-flutter/compare/v0.9.8...v0.9.9) (2026-04-19)
|
||||
|
||||
|
||||
### Build System
|
||||
|
||||
* re-sign with stripping ([852e9c4](https://github.com/chenasraf/pantry-flutter/commit/852e9c47f3cf11145a72ed78b6415ecd0da2b111))
|
||||
|
||||
## [0.9.8](https://github.com/chenasraf/pantry-flutter/compare/v0.9.7...v0.9.8) (2026-04-19)
|
||||
|
||||
|
||||
### Build System
|
||||
|
||||
* strip deps metadata from build ([132d9e3](https://github.com/chenasraf/pantry-flutter/commit/132d9e33a6662554149a7941053594c6c7ab9043))
|
||||
|
||||
## [0.9.7](https://github.com/chenasraf/pantry-flutter/compare/v0.9.6...v0.9.7) (2026-04-19)
|
||||
|
||||
|
||||
### Build System
|
||||
|
||||
* disable deps metadata in apk ([7ea2901](https://github.com/chenasraf/pantry-flutter/commit/7ea2901867b25e2c4bcd46cd744af7b12656b6dd))
|
||||
|
||||
## [0.9.6](https://github.com/chenasraf/pantry-flutter/compare/v0.9.5...v0.9.6) (2026-04-19)
|
||||
|
||||
|
||||
### Build System
|
||||
|
||||
* remove zipalign ([b1d7ecc](https://github.com/chenasraf/pantry-flutter/commit/b1d7eccd822fcbac56683a4085a329784c71ca7f))
|
||||
|
||||
## [0.9.5](https://github.com/chenasraf/pantry-flutter/compare/v0.9.4...v0.9.5) (2026-04-19)
|
||||
|
||||
|
||||
### Build System
|
||||
|
||||
* zipalign ([6d2173f](https://github.com/chenasraf/pantry-flutter/commit/6d2173f08d72d8e188c9a4aabe044ff922d4b32f))
|
||||
|
||||
## [0.9.4](https://github.com/chenasraf/pantry-flutter/compare/v0.9.3...v0.9.4) (2026-04-19)
|
||||
|
||||
|
||||
### Build System
|
||||
|
||||
* remove apk obfuscation ([d41d2b8](https://github.com/chenasraf/pantry-flutter/commit/d41d2b81beb512384cb3c2978bebd201c3bf53a0))
|
||||
|
||||
## [0.9.3](https://github.com/chenasraf/pantry-flutter/compare/v0.9.2...v0.9.3) (2026-04-19)
|
||||
|
||||
|
||||
### Build System
|
||||
|
||||
* upgrade flutter version ([3e4051a](https://github.com/chenasraf/pantry-flutter/commit/3e4051a8462271543381496a9d60a22239b8d8da))
|
||||
|
||||
## [0.9.2](https://github.com/chenasraf/pantry-flutter/compare/v0.9.1...v0.9.2) (2026-04-19)
|
||||
|
||||
|
||||
### Build System
|
||||
|
||||
* reproducible build ([9d4c832](https://github.com/chenasraf/pantry-flutter/commit/9d4c8327b035eb0433d6d0a571af406ffca84f83))
|
||||
|
||||
## [0.9.1](https://github.com/chenasraf/pantry-flutter/compare/v0.9.0...v0.9.1) (2026-04-18)
|
||||
|
||||
|
||||
### Build System
|
||||
|
||||
* add abi split ([7d0c793](https://github.com/chenasraf/pantry-flutter/commit/7d0c7932ea9bf18d5ff391351f0058889abba5d8))
|
||||
|
||||
## [0.9.0](https://github.com/chenasraf/pantry-flutter/compare/v0.8.0...v0.9.0) (2026-04-18)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* add search in lists ([eb797dd](https://github.com/chenasraf/pantry-flutter/commit/eb797dd0e87f7eb14576a3bdf7e77f9fe1c0cb09))
|
||||
* allow uploading list item image ([7243e43](https://github.com/chenasraf/pantry-flutter/commit/7243e43bbbfe8072327fc921ed2a4ffba228bd3f))
|
||||
|
||||
## [0.8.0](https://github.com/chenasraf/pantry-flutter/compare/v0.7.1...v0.8.0) (2026-04-16)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* add more icons to categories ([179c6d7](https://github.com/chenasraf/pantry-flutter/commit/179c6d781c1342434608b9af88daa807795c9a46))
|
||||
* allow adding one-off list items ([a447fe1](https://github.com/chenasraf/pantry-flutter/commit/a447fe1c8a1d9de655c081015f287afeba75bee1))
|
||||
|
||||
## [0.7.1](https://github.com/chenasraf/pantry-flutter/compare/v0.7.0...v0.7.1) (2026-04-14)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* about urls not opening ([64af382](https://github.com/chenasraf/pantry-flutter/commit/64af382f10bd696f05a23d31ee8e04d746fc4b46))
|
||||
|
||||
## [0.7.0](https://github.com/chenasraf/pantry-flutter/compare/v0.6.0...v0.7.0) (2026-04-14)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* add about page ([0cb6c06](https://github.com/chenasraf/pantry-flutter/commit/0cb6c06d9d418b61d5fd1c4852ec244366aa6af8))
|
||||
|
||||
## [0.6.0](https://github.com/chenasraf/pantry-flutter/compare/v0.5.0...v0.6.0) (2026-04-13)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* show next due date for list items ([e7ff39a](https://github.com/chenasraf/pantry-flutter/commit/e7ff39a2328ecd9967a3b162dc389bac8a645f38))
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* appbar icon spacings ([1197254](https://github.com/chenasraf/pantry-flutter/commit/11972542da777a5922aec564684b7f37b3330aa0))
|
||||
* improve i18n recurrence string rules ([1e85d0c](https://github.com/chenasraf/pantry-flutter/commit/1e85d0c2a6d46d7561105f02683bbed97c907792))
|
||||
|
||||
## [0.5.0](https://github.com/chenasraf/pantry-flutter/compare/v0.4.0...v0.5.0) (2026-04-12)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* add de, es, fr locales ([7ec9526](https://github.com/chenasraf/pantry-flutter/commit/7ec952620db2d957278d58c3798e5b03ab8c59fc))
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* allow arbitrary text in quantity ([32326be](https://github.com/chenasraf/pantry-flutter/commit/32326beb8d39d4713c9f65d01dfb243c44a5dbda))
|
||||
* improve rtl layout spacings ([9d474a6](https://github.com/chenasraf/pantry-flutter/commit/9d474a62fe6ae19f3c08cdb634eac725ffb403c4))
|
||||
* rtl layout + switching ([b0fcd93](https://github.com/chenasraf/pantry-flutter/commit/b0fcd937922badb59467f1bf164e3668c658e531))
|
||||
|
||||
## [0.4.0](https://github.com/chenasraf/pantry-flutter/compare/v0.3.0...v0.4.0) (2026-04-12)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* add hebrew language translation ([7c572a6](https://github.com/chenasraf/pantry-flutter/commit/7c572a6e64eafcf3433a2e6599b698312ffa9cbe))
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* description field in items saving+displaying ([4d99694](https://github.com/chenasraf/pantry-flutter/commit/4d9969410935d0b8d64fcfbc3e11d317a17979a6))
|
||||
|
||||
## [0.3.0](https://github.com/chenasraf/pantry-flutter/compare/v0.2.1...v0.3.0) (2026-04-12)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* improve main page navigations ([ea8ff9a](https://github.com/chenasraf/pantry-flutter/commit/ea8ff9aabd0924f8273927c907b800576c7cd697))
|
||||
* move items between lists ([c5595c0](https://github.com/chenasraf/pantry-flutter/commit/c5595c0d1ae07c3c2dbf35fba5a70a957fc9af17))
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* support back button when in photos foldeer ([e6284b9](https://github.com/chenasraf/pantry-flutter/commit/e6284b95774a5bd967af95626acb6ec3562ae9a5))
|
||||
|
||||
## [0.2.1](https://github.com/chenasraf/pantry-flutter/compare/v0.2.0...v0.2.1) (2026-04-11)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* sorting prefs persistence & error wrapping ([a5c8e5b](https://github.com/chenasraf/pantry-flutter/commit/a5c8e5b479e92f87ea910b5af19ca24711ce7b16))
|
||||
|
||||
## [0.2.0](https://github.com/chenasraf/pantry-flutter/compare/v0.1.0...v0.2.0) (2026-04-11)
|
||||
|
||||
|
||||
|
||||
@@ -8,8 +8,8 @@ GEM
|
||||
artifactory (3.0.17)
|
||||
atomos (0.1.3)
|
||||
aws-eventstream (1.4.0)
|
||||
aws-partitions (1.1237.0)
|
||||
aws-sdk-core (3.244.0)
|
||||
aws-partitions (1.1240.0)
|
||||
aws-sdk-core (3.245.0)
|
||||
aws-eventstream (~> 1, >= 1.3.0)
|
||||
aws-partitions (~> 1, >= 1.992.0)
|
||||
aws-sigv4 (~> 1.9)
|
||||
@@ -29,7 +29,7 @@ GEM
|
||||
babosa (1.0.4)
|
||||
base64 (0.2.0)
|
||||
benchmark (0.5.0)
|
||||
bigdecimal (4.1.1)
|
||||
bigdecimal (4.1.2)
|
||||
claide (1.1.0)
|
||||
colored (1.2)
|
||||
colored2 (3.1.2)
|
||||
@@ -72,7 +72,7 @@ GEM
|
||||
faraday_middleware (1.2.1)
|
||||
faraday (~> 1.0)
|
||||
fastimage (2.4.1)
|
||||
fastlane (2.232.2)
|
||||
fastlane (2.233.0)
|
||||
CFPropertyList (>= 2.3, < 4.0.0)
|
||||
abbrev (~> 0.1.2)
|
||||
addressable (>= 2.8, < 3.0.0)
|
||||
@@ -92,7 +92,7 @@ GEM
|
||||
faraday-cookie_jar (~> 0.0.6)
|
||||
faraday_middleware (~> 1.0)
|
||||
fastimage (>= 2.1.0, < 3.0.0)
|
||||
fastlane-sirp (>= 1.0.0)
|
||||
fastlane-sirp (>= 1.1.0)
|
||||
gh_inspector (>= 1.1.2, < 2.0.0)
|
||||
google-apis-androidpublisher_v3 (~> 0.3)
|
||||
google-apis-playcustomapp_v1 (~> 0.1)
|
||||
@@ -122,10 +122,9 @@ GEM
|
||||
xcodeproj (>= 1.13.0, < 2.0.0)
|
||||
xcpretty (~> 0.4.1)
|
||||
xcpretty-travis-formatter (>= 0.0.3, < 2.0.0)
|
||||
fastlane-sirp (1.0.0)
|
||||
sysrandom (~> 1.0)
|
||||
fastlane-sirp (1.1.0)
|
||||
gh_inspector (1.1.3)
|
||||
google-apis-androidpublisher_v3 (0.98.0)
|
||||
google-apis-androidpublisher_v3 (0.99.0)
|
||||
google-apis-core (>= 0.15.0, < 2.a)
|
||||
google-apis-core (0.18.0)
|
||||
addressable (~> 2.5, >= 2.5.1)
|
||||
@@ -169,13 +168,13 @@ GEM
|
||||
httpclient (2.9.0)
|
||||
mutex_m
|
||||
jmespath (1.6.2)
|
||||
json (2.19.3)
|
||||
json (2.19.4)
|
||||
jwt (2.10.2)
|
||||
base64
|
||||
logger (1.7.0)
|
||||
mini_magick (4.13.2)
|
||||
mini_mime (1.1.5)
|
||||
multi_json (1.19.1)
|
||||
multi_json (1.20.1)
|
||||
multipart-post (2.4.1)
|
||||
mutex_m (0.3.0)
|
||||
nanaimo (0.4.0)
|
||||
@@ -186,7 +185,7 @@ GEM
|
||||
ostruct (0.6.3)
|
||||
plist (3.7.2)
|
||||
public_suffix (7.0.5)
|
||||
rake (13.3.1)
|
||||
rake (13.4.2)
|
||||
representable (3.2.0)
|
||||
declarative (< 0.1.0)
|
||||
trailblazer-option (>= 0.1.1, < 0.2.0)
|
||||
@@ -205,7 +204,6 @@ GEM
|
||||
simctl (1.6.10)
|
||||
CFPropertyList
|
||||
naturally
|
||||
sysrandom (1.0.5)
|
||||
terminal-notifier (2.0.0)
|
||||
terminal-table (3.0.2)
|
||||
unicode-display_width (>= 1.1.1, < 3)
|
||||
@@ -243,15 +241,15 @@ CHECKSUMS
|
||||
artifactory (3.0.17) sha256=3023d5c964c31674090d655a516f38ca75665c15084140c08b7f2841131af263
|
||||
atomos (0.1.3) sha256=7d43b22f2454a36bace5532d30785b06de3711399cb1c6bf932573eda536789f
|
||||
aws-eventstream (1.4.0) sha256=116bf85c436200d1060811e6f5d2d40c88f65448f2125bc77ffce5121e6e183b
|
||||
aws-partitions (1.1237.0) sha256=9b82f529b69ad83a8e4c5e123038924ed5e8f59bd6064a293ef20efc63364841
|
||||
aws-sdk-core (3.244.0) sha256=3e458c078b0c5bdee95bc370c3a483374b3224cf730c1f9f0faf849a5d9a18ea
|
||||
aws-partitions (1.1240.0) sha256=b885b21712fdad699c56a28434756ed27f1389b07231320796dda9e7551de4a7
|
||||
aws-sdk-core (3.245.0) sha256=94f43b40508c346f1625b3d31f811c5841b667c92de14d5fb3c473b1284cb4ad
|
||||
aws-sdk-kms (1.123.0) sha256=d405f37e82f8fa32045ca8980be266c0b45b37aaf2012afe0254321a1e811f20
|
||||
aws-sdk-s3 (1.219.0) sha256=6a755d7377978525758b3c29185ca6a10128ce2b07555ca37c4549de10c2f1c7
|
||||
aws-sigv4 (1.12.1) sha256=6973ff95cb0fd0dc58ba26e90e9510a2219525d07620c8babeb70ef831826c00
|
||||
babosa (1.0.4) sha256=18dea450f595462ed7cb80595abd76b2e535db8c91b350f6c4b3d73986c5bc99
|
||||
base64 (0.2.0) sha256=0f25e9b21a02a0cc0cea8ef92b2041035d39350946e8789c562b2d1a3da01507
|
||||
benchmark (0.5.0) sha256=465df122341aedcb81a2a24b4d3bd19b6c67c1530713fd533f3ff034e419236c
|
||||
bigdecimal (4.1.1) sha256=1c09efab961da45203c8316b0cdaec0ff391dfadb952dd459584b63ebf8054ca
|
||||
bigdecimal (4.1.2) sha256=53d217666027eab4280346fba98e7d5b66baaae1b9c3c1c0ffe89d48188a3fbd
|
||||
claide (1.1.0) sha256=6d3c5c089dde904d96aa30e73306d0d4bd444b1accb9b3125ce14a3c0183f82e
|
||||
colored (1.2) sha256=9d82b47ac589ce7f6cab64b1f194a2009e9fd00c326a5357321f44afab2c1d2c
|
||||
colored2 (3.1.2) sha256=b13c2bd7eeae2cf7356a62501d398e72fde78780bd26aec6a979578293c28b4a
|
||||
@@ -277,10 +275,10 @@ CHECKSUMS
|
||||
faraday-retry (1.0.4) sha256=dc659233777fabf96c69c2ffe56c0a5d2c102af90321a42cc6c90157bcd716aa
|
||||
faraday_middleware (1.2.1) sha256=d45b78c8ee864c4783fbc276f845243d4a7918a67301c052647bacabec0529e9
|
||||
fastimage (2.4.1) sha256=c64bebd46b6fd8943ab70c1e6e85ff728f970f2e48f92ecd249b6bc3a540ad20
|
||||
fastlane (2.232.2) sha256=978689f60f0fc3d54699de86ef12be4eda9f5b52217c1798965257c390d2b112
|
||||
fastlane-sirp (1.0.0) sha256=66478f25bcd039ec02ccf65625373fca29646fa73d655eb533c915f106c5e641
|
||||
fastlane (2.233.0) sha256=b07087aaf13e7a4bcb07f853d91780193262b9f048861a24aa5e0f24069b8092
|
||||
fastlane-sirp (1.1.0) sha256=10bc94f9682efd8e1badfb31452a76dd8981f1f3a33717c765fde6d75b54d847
|
||||
gh_inspector (1.1.3) sha256=04cca7171b87164e053aa43147971d3b7f500fcb58177698886b48a9fc4a1939
|
||||
google-apis-androidpublisher_v3 (0.98.0) sha256=094fb952419c1131c16c4dfa66e0c96e6a2fa33adbe266f614b84b22cbc8c5cb
|
||||
google-apis-androidpublisher_v3 (0.99.0) sha256=a0452fdd99cb7672cc95cac07429305f8aaee54c22e4875224cf675b1ab59729
|
||||
google-apis-core (0.18.0) sha256=96b057816feeeab448139ed5b5c78eab7fc2a9d8958f0fbc8217dedffad054ee
|
||||
google-apis-iamcredentials_v1 (0.26.0) sha256=3ff70a10a1d6cddf2554e95b7c5df2c26afdeaeb64100048a355194da19e48a3
|
||||
google-apis-playcustomapp_v1 (0.17.0) sha256=d5bc90b705f3f862bab4998086449b0abe704ee1685a84821daa90ca7fa95a78
|
||||
@@ -294,12 +292,12 @@ CHECKSUMS
|
||||
http-cookie (1.0.8) sha256=b14fe0445cf24bf9ae098633e9b8d42e4c07c3c1f700672b09fbfe32ffd41aa6
|
||||
httpclient (2.9.0) sha256=4b645958e494b2f86c2f8a2f304c959baa273a310e77a2931ddb986d83e498c8
|
||||
jmespath (1.6.2) sha256=238d774a58723d6c090494c8879b5e9918c19485f7e840f2c1c7532cf84ebcb1
|
||||
json (2.19.3) sha256=289b0bb53052a1fa8c34ab33cc750b659ba14a5c45f3fcf4b18762dc67c78646
|
||||
json (2.19.4) sha256=670a7d333fb3b18ca5b29cb255eb7bef099e40d88c02c80bd42a3f30fe5239ac
|
||||
jwt (2.10.2) sha256=31e1ee46f7359883d5e622446969fe9c118c3da87a0b1dca765ce269c3a0c4f4
|
||||
logger (1.7.0) sha256=196edec7cc44b66cfb40f9755ce11b392f21f7967696af15d274dde7edff0203
|
||||
mini_magick (4.13.2) sha256=71d6258e0e8a3d04a9a0a09784d5d857b403a198a51dd4f882510435eb95ddd9
|
||||
mini_mime (1.1.5) sha256=8681b7e2e4215f2a159f9400b5816d85e9d8c6c6b491e96a12797e798f8bccef
|
||||
multi_json (1.19.1) sha256=7aefeff8f2c854bf739931a238e4aea64592845e0c0395c8a7d2eea7fdd631b7
|
||||
multi_json (1.20.1) sha256=2f3934e805cc45ef91b551a1f89d0e9191abd06a5e04a2ef09a6a036c452ca6d
|
||||
multipart-post (2.4.1) sha256=9872d03a8e552020ca096adadbf5e3cb1cd1cdd6acd3c161136b8a5737cdb4a8
|
||||
mutex_m (0.3.0) sha256=cfcb04ac16b69c4813777022fdceda24e9f798e48092a2b817eb4c0a782b0751
|
||||
nanaimo (0.4.0) sha256=faf069551bab17f15169c1f74a1c73c220657e71b6e900919897a10d991d0723
|
||||
@@ -310,7 +308,7 @@ CHECKSUMS
|
||||
ostruct (0.6.3) sha256=95a2ed4a4bd1d190784e666b47b2d3f078e4a9efda2fccf18f84ddc6538ed912
|
||||
plist (3.7.2) sha256=d37a4527cc1116064393df4b40e1dbbc94c65fa9ca2eec52edf9a13616718a42
|
||||
public_suffix (7.0.5) sha256=1a8bb08f1bbea19228d3bed6e5ed908d1cb4f7c2726d18bd9cadf60bc676f623
|
||||
rake (13.3.1) sha256=8c9e89d09f66a26a01264e7e3480ec0607f0c497a861ef16063604b1b08eb19c
|
||||
rake (13.4.2) sha256=cb825b2bd5f1f8e91ca37bddb4b9aaf345551b4731da62949be002fa89283701
|
||||
representable (3.2.0) sha256=cc29bf7eebc31653586849371a43ffe36c60b54b0a6365b5f7d95ec34d1ebace
|
||||
retriable (3.4.1) sha256=fb3f114b7d492121c158c01f3d5152b5a615c5b70d5877d0bc08c7ec3725c3bc
|
||||
rexml (3.4.4) sha256=19e0a2c3425dfbf2d4fc1189747bdb2f849b6c5e74180401b15734bc97b5d142
|
||||
@@ -320,7 +318,6 @@ CHECKSUMS
|
||||
security (0.1.5) sha256=3a977a0eca7706e804c96db0dd9619e0a94969fe3aac9680fcfc2bf9b8a833b7
|
||||
signet (0.21.0) sha256=d617e9fbf24928280d39dcfefba9a0372d1c38187ffffd0a9283957a10a8cd5b
|
||||
simctl (1.6.10) sha256=b99077f4d13ad81eace9f86bf5ba4df1b0b893a4d1b368bd3ed59b5b27f9236b
|
||||
sysrandom (1.0.5) sha256=5ac1ac3c2ec64ef76ac91018059f541b7e8f437fbda1ccddb4f2c56a9ccf1e75
|
||||
terminal-notifier (2.0.0) sha256=7a0d2b2212ab9835c07f4b2e22a94cff64149dba1eed203c04835f7991078cea
|
||||
terminal-table (3.0.2) sha256=f951b6af5f3e00203fb290a669e0a85c5dd5b051b3b023392ccfd67ba5abae91
|
||||
trailblazer-option (0.1.2) sha256=20e4f12ea4e1f718c8007e7944ca21a329eee4eed9e0fa5dde6e8ad8ac4344a3
|
||||
142
Makefile
@@ -1,9 +1,6 @@
|
||||
# Version from pubspec.yaml (without build number)
|
||||
VERSION := $(shell grep '^version:' pubspec.yaml | sed 's/version: *//;s/+.*//')
|
||||
|
||||
# Get staged Dart files
|
||||
STAGED_DART_FILES := $(shell git diff --cached --name-only --diff-filter=ACM | grep '\.dart$$' 2>/dev/null)
|
||||
|
||||
# Default target
|
||||
.PHONY: help
|
||||
help:
|
||||
@@ -12,7 +9,7 @@ help:
|
||||
@echo " Setup:"
|
||||
@echo " get Install dependencies"
|
||||
@echo " clean Clean build artifacts"
|
||||
@echo " install-precommit Install git pre-commit hook"
|
||||
@echo " install-hooks Install git hooks via lefthook"
|
||||
@echo " pods Update CocoaPods repo and install pods"
|
||||
@echo ""
|
||||
@echo " i18n:"
|
||||
@@ -21,14 +18,9 @@ help:
|
||||
@echo ""
|
||||
@echo " Development:"
|
||||
@echo " run Run the app in debug mode"
|
||||
@echo " webapp-run Run the web app in default browser"
|
||||
@echo " format Format staged Dart files"
|
||||
@echo " analyze Analyze staged Dart files"
|
||||
@echo " check Check staged files (format + analyze, no changes)"
|
||||
@echo " precommit Run pre-commit checks on staged files"
|
||||
@echo " format-all Format all Dart files"
|
||||
@echo " analyze-all Analyze all Dart files"
|
||||
@echo " check-all Check all files (format + analyze, no changes)"
|
||||
@echo " format Format all Dart files"
|
||||
@echo " analyze Analyze all Dart files"
|
||||
@echo " check Check all files (format + analyze, no changes)"
|
||||
@echo ""
|
||||
@echo " Testing:"
|
||||
@echo " test Run all tests"
|
||||
@@ -44,23 +36,24 @@ help:
|
||||
@echo " Building:"
|
||||
@echo " android-install Build APK and install on connected device"
|
||||
@echo " android-build-apk Build Android APK"
|
||||
@echo " android-build-apk-split Build Android split-per-ABI APKs"
|
||||
@echo " android-build-aab Build Android App Bundle"
|
||||
@echo " android-push Build APK and push to device via adb"
|
||||
@echo " ios-build Build iOS (no codesign)"
|
||||
@echo " web-build Build web app"
|
||||
@echo " build-all Build all platforms"
|
||||
@echo ""
|
||||
@echo " Release:"
|
||||
@echo " android-release-apk Build APK and copy to build/release/"
|
||||
@echo " android-release-aab Build AAB and copy to build/release/"
|
||||
@echo " ios-release Build iOS and create unsigned IPA in build/release/"
|
||||
@echo " web-release Build web and create zip in build/release/"
|
||||
@echo " release-all Build and release all platforms"
|
||||
@echo ""
|
||||
@echo " Deploying:"
|
||||
@echo " android-deploy Build AAB and upload to Google Play (TRACK=internal|beta|production, STATUS=draft|completed)"
|
||||
@echo " android-promote Promote release between tracks (FROM=internal, TO=production, STATUS=draft|completed)"
|
||||
@echo " ios-deploy Build IPA and upload (DEST=testflight|appstore, default: testflight)"
|
||||
@echo " release-production Build and deploy to production (Google Play + App Store)"
|
||||
@echo " release-beta Build and deploy to beta (Google Play beta + TestFlight)"
|
||||
|
||||
# Setup
|
||||
.PHONY: get
|
||||
@@ -79,6 +72,7 @@ build-clean:
|
||||
# i18n
|
||||
.PHONY: i18n
|
||||
i18n:
|
||||
dart run tool/fix_i18n_escapes.dart
|
||||
dart run build_runner build --delete-conflicting-outputs
|
||||
|
||||
.PHONY: i18n-watch
|
||||
@@ -88,58 +82,17 @@ i18n-watch:
|
||||
# Development
|
||||
.PHONY: run
|
||||
run:
|
||||
flutter run --dart-define-from-file=.env
|
||||
|
||||
.PHONY: webapp-run
|
||||
webapp-run:
|
||||
open http://localhost:5111 & flutter run -d web-server --web-port=5111 --dart-define-from-file=.env
|
||||
|
||||
flutter run
|
||||
.PHONY: format
|
||||
format:
|
||||
@if [ -n "$(STAGED_DART_FILES)" ]; then \
|
||||
echo "Formatting staged files..."; \
|
||||
dart format $(STAGED_DART_FILES); \
|
||||
else \
|
||||
echo "No staged Dart files to format."; \
|
||||
fi
|
||||
dart format .
|
||||
|
||||
.PHONY: analyze
|
||||
analyze:
|
||||
@if [ -n "$(STAGED_DART_FILES)" ]; then \
|
||||
echo "Analyzing staged files..."; \
|
||||
dart analyze $(STAGED_DART_FILES); \
|
||||
else \
|
||||
echo "No staged Dart files to analyze."; \
|
||||
fi
|
||||
flutter analyze --no-fatal-infos
|
||||
|
||||
.PHONY: check
|
||||
check:
|
||||
@if [ -n "$(STAGED_DART_FILES)" ]; then \
|
||||
echo "Checking staged files..."; \
|
||||
dart format --output=none --set-exit-if-changed $(STAGED_DART_FILES); \
|
||||
dart analyze $(STAGED_DART_FILES); \
|
||||
else \
|
||||
echo "No staged Dart files to check."; \
|
||||
fi
|
||||
|
||||
.PHONY: precommit
|
||||
precommit: format analyze
|
||||
@if [ -n "$(STAGED_DART_FILES)" ]; then \
|
||||
echo "Re-staging formatted files..."; \
|
||||
git add $(STAGED_DART_FILES); \
|
||||
fi
|
||||
|
||||
# Full project commands
|
||||
.PHONY: format-all
|
||||
format-all:
|
||||
dart format .
|
||||
|
||||
.PHONY: analyze-all
|
||||
analyze-all:
|
||||
flutter analyze --no-fatal-infos
|
||||
|
||||
.PHONY: check-all
|
||||
check-all:
|
||||
dart format --output=none --set-exit-if-changed .
|
||||
flutter analyze --no-fatal-infos
|
||||
|
||||
@@ -147,21 +100,23 @@ check-all:
|
||||
.PHONY: test
|
||||
test:
|
||||
ifdef FILES
|
||||
flutter test $(FILES) --dart-define-from-file=.env
|
||||
flutter test $(FILES)
|
||||
else
|
||||
flutter test --dart-define-from-file=.env
|
||||
flutter test
|
||||
endif
|
||||
|
||||
.PHONY: test-coverage
|
||||
test-coverage:
|
||||
flutter test --coverage --dart-define-from-file=.env
|
||||
flutter test --coverage
|
||||
@echo "Coverage report generated at coverage/lcov.info"
|
||||
|
||||
# Building
|
||||
.PHONY: android-build-apk
|
||||
android-build-apk:
|
||||
flutter build apk --release --obfuscate --split-debug-info=build/debug-info-apk --dart-define-from-file=.env
|
||||
|
||||
flutter build apk --release --obfuscate --split-debug-info=build/debug-info-apk
|
||||
.PHONY: android-build-apk-split
|
||||
android-build-apk-split:
|
||||
flutter build apk --release --split-per-abi --obfuscate --split-debug-info=build/debug-info-apk
|
||||
.PHONY: android-install
|
||||
android-install: android-build-apk
|
||||
flutter install
|
||||
@@ -173,18 +128,16 @@ android-push: android-build-apk
|
||||
|
||||
.PHONY: android-build-aab
|
||||
android-build-aab:
|
||||
flutter build appbundle --release --obfuscate --split-debug-info=build/debug-info-aab --dart-define-from-file=.env
|
||||
|
||||
flutter build appbundle --release --obfuscate --split-debug-info=build/debug-info-aab
|
||||
.PHONY: ios-build
|
||||
ios-build:
|
||||
flutter build ios --release --no-codesign --obfuscate --split-debug-info=build/debug-info-ios
|
||||
.PHONY: ios-build-ipa
|
||||
ios-build-ipa:
|
||||
flutter build ipa --release --obfuscate --split-debug-info=build/debug-info-ios --dart-define-from-file=.env --export-options-plist=ios/ExportOptions.plist
|
||||
|
||||
.PHONY: web-build
|
||||
web-build:
|
||||
flutter build web --release --dart-define-from-file=.env
|
||||
|
||||
.PHONY: build-all
|
||||
build-all: android-build-apk android-build-aab web-build
|
||||
build-all: android-build-apk android-build-aab
|
||||
|
||||
# Release (build + copy renamed artifacts to build/release/)
|
||||
.PHONY: android-release-apk
|
||||
@@ -210,7 +163,7 @@ android-upload:
|
||||
@echo "$(or $(TRACK),beta)" | grep -qE '^(internal|alpha|beta|production)$$' || (echo "Error: Invalid TRACK '$(TRACK)'. Must be: internal, alpha, beta, production"; exit 1)
|
||||
@echo "$(or $(STATUS),draft)" | grep -qE '^(draft|completed|halted|inProgress)$$' || (echo "Error: Invalid STATUS '$(STATUS)'. Must be: draft, completed, halted, inProgress"; exit 1)
|
||||
@echo "Track: $(or $(TRACK),internal) | Status: $(or $(STATUS),draft)"
|
||||
cd android && bundle exec fastlane deploy track:$(or $(TRACK),internal) status:$(or $(STATUS),draft)
|
||||
bundle exec fastlane deploy track:$(or $(TRACK),internal) status:$(or $(STATUS),draft)
|
||||
|
||||
.PHONY: android-deploy
|
||||
android-deploy: android-build-aab android-upload
|
||||
@@ -221,29 +174,33 @@ android-promote:
|
||||
@echo "$(or $(TO),production)" | grep -qE '^(internal|alpha|beta|production)$$' || (echo "Error: Invalid TO '$(TO)'. Must be: internal, alpha, beta, production"; exit 1)
|
||||
@echo "$(or $(STATUS),draft)" | grep -qE '^(draft|completed|halted|inProgress)$$' || (echo "Error: Invalid STATUS '$(STATUS)'. Must be: draft, completed, halted, inProgress"; exit 1)
|
||||
@echo "Promote: $(or $(FROM),internal) -> $(or $(TO),production) | Status: $(or $(STATUS),draft)"
|
||||
cd android && bundle exec fastlane promote from:$(or $(FROM),internal) to:$(or $(TO),production) status:$(or $(STATUS),draft)
|
||||
bundle exec fastlane promote from:$(or $(FROM),internal) to:$(or $(TO),production) status:$(or $(STATUS),draft)
|
||||
|
||||
.PHONY: ios-upload
|
||||
ios-upload:
|
||||
@echo "$(or $(DEST),testflight)" | grep -qE '^(testflight|appstore)$$' || (echo "Error: Invalid DEST '$(DEST)'. Must be: testflight, appstore"; exit 1)
|
||||
@echo "Destination: $(or $(DEST),testflight)"
|
||||
@if [ "$(or $(DEST),testflight)" = "appstore" ]; then \
|
||||
cd ios && bundle exec fastlane release; \
|
||||
bundle exec fastlane ios release; \
|
||||
else \
|
||||
cd ios && bundle exec fastlane beta; \
|
||||
bundle exec fastlane ios beta; \
|
||||
fi
|
||||
|
||||
.PHONY: ios-deploy
|
||||
ios-deploy: ios-build ios-upload
|
||||
|
||||
.PHONY: web-release
|
||||
web-release: web-build
|
||||
mkdir -p build/release
|
||||
cd build/web && zip -r ../release/pantry-$(VERSION)-web.zip .
|
||||
@echo "-> build/release/pantry-$(VERSION)-web.zip"
|
||||
ios-deploy: ios-build-ipa ios-upload
|
||||
|
||||
.PHONY: release-all
|
||||
release-all: build-clean android-release-apk android-release-aab web-release
|
||||
release-all: android-release-apk android-release-aab
|
||||
|
||||
.PHONY: release-production
|
||||
release-production:
|
||||
$(MAKE) android-deploy TRACK=production STATUS=completed
|
||||
$(MAKE) ios-deploy DEST=appstore
|
||||
|
||||
.PHONY: release-beta
|
||||
release-beta:
|
||||
$(MAKE) android-deploy TRACK=beta STATUS=completed
|
||||
$(MAKE) ios-deploy DEST=testflight
|
||||
|
||||
# CocoaPods
|
||||
.PHONY: pods
|
||||
@@ -252,17 +209,9 @@ pods:
|
||||
cd macos && pod install --repo-update
|
||||
|
||||
# Git hooks
|
||||
.PHONY: install-precommit
|
||||
install-precommit:
|
||||
@if [ ! -f .git/hooks/pre-commit ]; then \
|
||||
echo "Installing pre-commit hook..."; \
|
||||
echo '#!/bin/sh' > .git/hooks/pre-commit; \
|
||||
echo 'make precommit' >> .git/hooks/pre-commit; \
|
||||
chmod +x .git/hooks/pre-commit; \
|
||||
echo "Pre-commit hook installed."; \
|
||||
else \
|
||||
echo "Pre-commit hook already exists, skipping."; \
|
||||
fi
|
||||
.PHONY: install-hooks
|
||||
install-hooks:
|
||||
lefthook install
|
||||
|
||||
# API
|
||||
.PHONY: fetch-openapi
|
||||
@@ -287,11 +236,14 @@ endif
|
||||
.PHONY: icons
|
||||
icons:
|
||||
mkdir -p assets/icon
|
||||
rsvg-convert -h 1024 assets/logo_icon.svg > assets/icon/icon.png
|
||||
rsvg-convert -w 1024 -h 1024 assets/logo_icon_squircle.svg > assets/icon/icon.png
|
||||
rsvg-convert -w 1024 -h 1024 assets/logo_icon_square.svg > assets/icon/icon_ios.png
|
||||
rsvg-convert -w 1024 -h 1024 assets/logo_icon_foreground.svg > assets/icon/icon_foreground.png
|
||||
dart run flutter_launcher_icons
|
||||
rsvg-convert -w 512 -h 512 assets/logo_icon_squircle.svg > fastlane/metadata/android/en-US/images/icon.png
|
||||
|
||||
.PHONY: splash
|
||||
splash:
|
||||
mkdir -p assets/icon
|
||||
rsvg-convert -h 512 --page-width 1024 --page-height 1024 --top 256 --left 256 assets/logo_icon.svg > assets/icon/splash.png
|
||||
rsvg-convert -h 1152 --page-width 1920 --page-height 1920 --top 384 --left 384 assets/logo_icon.svg > assets/icon/splash.png
|
||||
dart run flutter_native_splash:create
|
||||
|
||||
@@ -43,9 +43,9 @@ It may take a few minutes for your tester status to propagate.
|
||||
Download the latest APK from the
|
||||
[releases page](https://github.com/chenasraf/pantry-flutter/releases) and sideload onto your device.
|
||||
|
||||
### iOS
|
||||
### App Store (iOS)
|
||||
|
||||
[Coming soon — TestFlight]
|
||||
[Install from the App Store](https://apps.apple.com/us/app/pantry-for-nextcloud/id6762161619)
|
||||
|
||||
## Development
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@ plugins {
|
||||
id("dev.flutter.flutter-gradle-plugin")
|
||||
}
|
||||
|
||||
import com.android.build.gradle.internal.api.ApkVariantOutputImpl
|
||||
import java.io.FileInputStream
|
||||
import java.util.Properties
|
||||
|
||||
@@ -48,7 +49,16 @@ android {
|
||||
}
|
||||
}
|
||||
|
||||
dependenciesInfo {
|
||||
includeInApk = false
|
||||
includeInBundle = false
|
||||
}
|
||||
|
||||
buildTypes {
|
||||
debug {
|
||||
applicationIdSuffix = ".debug"
|
||||
versionNameSuffix = "-dev"
|
||||
}
|
||||
release {
|
||||
signingConfig = if (signingConfigs.names.contains("release"))
|
||||
signingConfigs.getByName("release")
|
||||
@@ -58,6 +68,17 @@ android {
|
||||
}
|
||||
}
|
||||
|
||||
val abiCodes = mapOf("armeabi-v7a" to 1, "arm64-v8a" to 2, "x86_64" to 3)
|
||||
android.applicationVariants.configureEach {
|
||||
val variant = this
|
||||
variant.outputs.forEach { output ->
|
||||
val abiVersionCode = abiCodes[output.filters.find { it.filterType == "ABI" }?.identifier]
|
||||
if (abiVersionCode != null) {
|
||||
(output as ApkVariantOutputImpl).versionCodeOverride = variant.versionCode * 10 + abiVersionCode
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
flutter {
|
||||
source = "../.."
|
||||
}
|
||||
|
||||
@@ -1,7 +1,10 @@
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools">
|
||||
<!-- The INTERNET permission is required for development. Specifically,
|
||||
the Flutter tool needs it to communicate with the running application
|
||||
to allow setting breakpoints, to provide hot reload, etc.
|
||||
-->
|
||||
<uses-permission android:name="android.permission.INTERNET"/>
|
||||
|
||||
<application android:label="Pantry Dev" tools:replace="android:label" />
|
||||
</manifest>
|
||||
|
||||
|
Before Width: | Height: | Size: 8.8 KiB After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 7.1 KiB After Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 8.8 KiB After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 5.4 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 5.4 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 8.8 KiB After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 5.4 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 43 KiB |
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 60 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 43 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 4.7 KiB |
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 43 KiB |
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 60 KiB |
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 6.9 KiB |
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 60 KiB |
|
Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 5.9 KiB After Width: | Height: | Size: 4.9 KiB |
|
Before Width: | Height: | Size: 7.3 KiB After Width: | Height: | Size: 5.8 KiB |
@@ -1,2 +0,0 @@
|
||||
json_key_file(ENV["GOOGLE_PLAY_KEY_FILE"])
|
||||
package_name("dev.casraf.pantry")
|
||||
@@ -1,82 +0,0 @@
|
||||
default_platform(:android)
|
||||
|
||||
platform :android do
|
||||
def version_info
|
||||
pubspec = File.read(File.expand_path("../../pubspec.yaml", __dir__))
|
||||
version = pubspec.match(/^version:\s*(.+)$/)[1].strip
|
||||
name, build = version.split("+")
|
||||
{ name: name, build: build }
|
||||
end
|
||||
|
||||
def version_name
|
||||
v = version_info
|
||||
"#{v[:build]} (#{v[:name]})"
|
||||
end
|
||||
|
||||
def changelog_notes
|
||||
version = version_info[:name]
|
||||
changelog_path = File.expand_path("../../CHANGELOG.md", __dir__)
|
||||
return "Release #{version}" unless File.exist?(changelog_path)
|
||||
|
||||
changelog = File.read(changelog_path)
|
||||
pattern = /^## \[#{Regexp.escape(version)}\].*?\n(.*?)(?=^## \[|\z)/m
|
||||
match = changelog.match(pattern)
|
||||
return "Release #{version}" unless match
|
||||
|
||||
match[1].strip
|
||||
.gsub(/\s*\(\[[\da-f]+\]\([^)]+\)\)/, "")
|
||||
.gsub(/^\*\s+\*\*[^*]+:\*\*\s*/m, "- ")
|
||||
.gsub(/^\*\s+/, "- ")
|
||||
.gsub(/^### /, "")
|
||||
.gsub(/\n{3,}/, "\n\n")
|
||||
.strip
|
||||
.then { |n| n.empty? ? "Release #{version}" : n }
|
||||
end
|
||||
|
||||
desc "Upload AAB to Google Play"
|
||||
lane :deploy do |options|
|
||||
# Write release notes to the metadata tree so `supply` picks it up
|
||||
# keyed by the current versionCode.
|
||||
version_code = version_info[:build]
|
||||
changelog_dir = File.expand_path("metadata/android/en-US/changelogs", __dir__)
|
||||
FileUtils.mkdir_p(changelog_dir)
|
||||
File.write(File.join(changelog_dir, "#{version_code}.txt"), changelog_notes)
|
||||
|
||||
upload_to_play_store(
|
||||
aab: File.expand_path("../../build/app/outputs/bundle/release/app-release.aab", __dir__),
|
||||
track: options[:track] || "internal",
|
||||
release_status: options[:status] || "draft",
|
||||
version_name: version_name,
|
||||
metadata_path: File.expand_path("metadata/android", __dir__),
|
||||
)
|
||||
end
|
||||
|
||||
desc "Sync metadata and screenshots only (no AAB upload)"
|
||||
lane :metadata do
|
||||
upload_to_play_store(
|
||||
skip_upload_aab: true,
|
||||
skip_upload_apk: true,
|
||||
metadata_path: File.expand_path("metadata/android", __dir__),
|
||||
)
|
||||
end
|
||||
|
||||
desc "Promote a release from one track to another"
|
||||
lane :promote do |options|
|
||||
from = options[:from] || "internal"
|
||||
to = options[:to] || "production"
|
||||
status = options[:status] || "draft"
|
||||
|
||||
upload_to_play_store(
|
||||
track: from,
|
||||
track_promote_to: to,
|
||||
release_status: status,
|
||||
version_name: version_name,
|
||||
skip_upload_aab: true,
|
||||
skip_upload_apk: true,
|
||||
skip_upload_metadata: true,
|
||||
skip_upload_changelogs: true,
|
||||
skip_upload_images: true,
|
||||
skip_upload_screenshots: true,
|
||||
)
|
||||
end
|
||||
end
|
||||
|
Before Width: | Height: | Size: 13 KiB |
@@ -1 +0,0 @@
|
||||
Manage your household with your Nextcloud — lists, photos & notes.
|
||||
@@ -1 +0,0 @@
|
||||
Nextcloud Pantry
|
||||
|
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 29 KiB |
BIN
assets/icon/icon_foreground.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
assets/icon/icon_ios.png
Normal file
|
After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 53 KiB |
5
assets/logo_icon_foreground.svg
Normal file
@@ -0,0 +1,5 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 108 108">
|
||||
<g transform="translate(22, 22) scale(2.667)">
|
||||
<path fill="#FFFFFF" d="M12,3L2,12H5V20H19V12H22L12,3M12,8.75A2.25,2.25 0 0,1 14.25,11A2.25,2.25 0 0,1 12,13.25A2.25,2.25 0 0,1 9.75,11A2.25,2.25 0 0,1 12,8.75M12,15C13.5,15 16.5,15.75 16.5,17.25V18H7.5V17.25C7.5,15.75 10.5,15 12,15Z"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 367 B |
6
assets/logo_icon_square.svg
Normal file
@@ -0,0 +1,6 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
|
||||
<rect width="512" height="512" fill="#0082C9"/>
|
||||
<g transform="translate(106, 106) scale(12.5)">
|
||||
<path fill="#FFFFFF" d="M12,3L2,12H5V20H19V12H22L12,3M12,8.75A2.25,2.25 0 0,1 14.25,11A2.25,2.25 0 0,1 12,13.25A2.25,2.25 0 0,1 9.75,11A2.25,2.25 0 0,1 12,8.75M12,15C13.5,15 16.5,15.75 16.5,17.25V18H7.5V17.25C7.5,15.75 10.5,15 12,15Z"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 418 B |
25
assets/logo_icon_squircle.svg
Normal file
@@ -0,0 +1,25 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
|
||||
<defs>
|
||||
<clipPath id="squircle">
|
||||
<path d="
|
||||
M256,0
|
||||
C353,0 406,0 443,18
|
||||
C468,30 482,44 494,69
|
||||
C512,106 512,159 512,256
|
||||
C512,353 512,406 494,443
|
||||
C482,468 468,482 443,494
|
||||
C406,512 353,512 256,512
|
||||
C159,512 106,512 69,494
|
||||
C44,482 30,468 18,443
|
||||
C0,406 0,353 0,256
|
||||
C0,159 0,106 18,69
|
||||
C30,44 44,30 69,18
|
||||
C106,0 159,0 256,0
|
||||
Z"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
<rect width="512" height="512" fill="#0082C9" clip-path="url(#squircle)"/>
|
||||
<g transform="translate(106, 106) scale(12.5)">
|
||||
<path fill="#FFFFFF" d="M12,3L2,12H5V20H19V12H22L12,3M12,8.75A2.25,2.25 0 0,1 14.25,11A2.25,2.25 0 0,1 12,13.25A2.25,2.25 0 0,1 9.75,11A2.25,2.25 0 0,1 12,8.75M12,15C13.5,15 16.5,15.75 16.5,17.25V18H7.5V17.25C7.5,15.75 10.5,15 12,15Z"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 913 B |
@@ -1,5 +1,9 @@
|
||||
# Android
|
||||
json_key_file(ENV["GOOGLE_PLAY_KEY_FILE"])
|
||||
package_name("dev.casraf.pantry")
|
||||
|
||||
# iOS
|
||||
app_identifier("dev.casraf.pantry")
|
||||
apple_id(ENV["APPLE_ID"])
|
||||
|
||||
itc_team_id(ENV["ITC_TEAM_ID"])
|
||||
team_id(ENV["APPLE_TEAM_ID"])
|
||||
2
fastlane/Deliverfile
Normal file
@@ -0,0 +1,2 @@
|
||||
metadata_path("./fastlane/metadata/ios")
|
||||
screenshots_path("./fastlane/metadata/ios/screenshots")
|
||||
222
fastlane/Fastfile
Normal file
@@ -0,0 +1,222 @@
|
||||
require "digest"
|
||||
require "json"
|
||||
|
||||
# -- Shared helpers --
|
||||
|
||||
def version_info
|
||||
pubspec = File.read(File.expand_path("../pubspec.yaml", __dir__))
|
||||
version = pubspec.match(/^version:\s*(.+)$/)[1].strip
|
||||
name, build = version.split("+")
|
||||
{ name: name, build: build }
|
||||
end
|
||||
|
||||
def version_name
|
||||
v = version_info
|
||||
"#{v[:build]} (#{v[:name]})"
|
||||
end
|
||||
|
||||
def changelog_notes
|
||||
version = version_info[:name]
|
||||
changelog_path = File.expand_path("../CHANGELOG.md", __dir__)
|
||||
return "Release #{version}" unless File.exist?(changelog_path)
|
||||
|
||||
changelog = File.read(changelog_path)
|
||||
escaped = Regexp.escape(version)
|
||||
pattern = /^## (?:\[#{escaped}\]|#{escaped}[\s(]).*?\n(.*?)(?=^## |\z)/m
|
||||
match = changelog.match(pattern)
|
||||
return "Release #{version}" unless match
|
||||
|
||||
match[1].strip
|
||||
.gsub(/\s*\(\[[\da-f]+\]\([^)]+\)\)/, "")
|
||||
.gsub(/^\*\s+\*\*[^*]+:\*\*\s*/m, "- ")
|
||||
.gsub(/^\*\s+/, "- ")
|
||||
.gsub(/^### /, "")
|
||||
.gsub(/\n{3,}/, "\n\n")
|
||||
.strip
|
||||
.then { |n| n.empty? ? "Release #{version}" : n }
|
||||
end
|
||||
|
||||
# -- Android --
|
||||
|
||||
default_platform(:android)
|
||||
|
||||
platform :android do
|
||||
# Google Play enforces a 500-char limit on release notes per language.
|
||||
PLAY_NOTES_MAX = 500
|
||||
PLAY_NOTES_TRAILER = "\n\n… see full notes on GitHub."
|
||||
|
||||
def play_changelog
|
||||
notes = changelog_notes
|
||||
return notes if notes.length <= PLAY_NOTES_MAX
|
||||
|
||||
budget = PLAY_NOTES_MAX - PLAY_NOTES_TRAILER.length
|
||||
truncated = notes[0, budget]
|
||||
last_newline = truncated.rindex("\n")
|
||||
truncated = truncated[0, last_newline] if last_newline && last_newline > budget / 2
|
||||
truncated.rstrip + PLAY_NOTES_TRAILER
|
||||
end
|
||||
|
||||
# -- Image change detection --
|
||||
|
||||
IMAGE_HASH_CACHE = File.expand_path(".image_hashes.json", __dir__)
|
||||
|
||||
def current_image_hashes
|
||||
root = File.expand_path("metadata/android", __dir__)
|
||||
return {} unless Dir.exist?(root)
|
||||
|
||||
files = Dir.glob(File.join(root, "**/images/**/*")).select { |f| File.file?(f) }
|
||||
files.sort.each_with_object({}) do |path, acc|
|
||||
rel = path.sub("#{root}/", "")
|
||||
acc[rel] = Digest::SHA256.file(path).hexdigest
|
||||
end
|
||||
end
|
||||
|
||||
def cached_image_hashes
|
||||
return {} unless File.exist?(IMAGE_HASH_CACHE)
|
||||
JSON.parse(File.read(IMAGE_HASH_CACHE))
|
||||
rescue StandardError
|
||||
{}
|
||||
end
|
||||
|
||||
def images_changed?
|
||||
current_image_hashes != cached_image_hashes
|
||||
end
|
||||
|
||||
def save_image_hashes
|
||||
File.write(IMAGE_HASH_CACHE, JSON.pretty_generate(current_image_hashes))
|
||||
end
|
||||
|
||||
desc "Upload AAB to Google Play"
|
||||
lane :deploy do |options|
|
||||
# Write changelog if not already present (CI generates it during the
|
||||
# release PR, but this covers manual deploys).
|
||||
version_code = version_info[:build]
|
||||
changelog_dir = File.expand_path("metadata/android/en-US/changelogs", __dir__)
|
||||
changelog_file = File.join(changelog_dir, "#{version_code}.txt")
|
||||
unless File.exist?(changelog_file)
|
||||
FileUtils.mkdir_p(changelog_dir)
|
||||
File.write(changelog_file, play_changelog)
|
||||
end
|
||||
|
||||
changed = images_changed?
|
||||
UI.message(changed ? "Images changed — uploading." : "Images unchanged — skipping.")
|
||||
|
||||
upload_to_play_store(
|
||||
aab: File.expand_path("../build/app/outputs/bundle/release/app-release.aab", __dir__),
|
||||
track: options[:track] || "internal",
|
||||
release_status: options[:status] || "draft",
|
||||
version_name: version_name,
|
||||
metadata_path: File.expand_path("metadata/android", __dir__),
|
||||
skip_upload_images: !changed,
|
||||
skip_upload_screenshots: !changed,
|
||||
)
|
||||
|
||||
save_image_hashes if changed
|
||||
end
|
||||
|
||||
desc "Sync metadata and screenshots only (no AAB upload)"
|
||||
lane :metadata do
|
||||
changed = images_changed?
|
||||
UI.message(changed ? "Images changed — uploading." : "Images unchanged — skipping.")
|
||||
|
||||
upload_to_play_store(
|
||||
skip_upload_aab: true,
|
||||
skip_upload_apk: true,
|
||||
skip_upload_changelogs: true,
|
||||
metadata_path: File.expand_path("metadata/android", __dir__),
|
||||
skip_upload_images: !changed,
|
||||
skip_upload_screenshots: !changed,
|
||||
)
|
||||
|
||||
save_image_hashes if changed
|
||||
end
|
||||
|
||||
desc "Promote a release from one track to another"
|
||||
lane :promote do |options|
|
||||
from = options[:from] || "internal"
|
||||
to = options[:to] || "production"
|
||||
status = options[:status] || "draft"
|
||||
|
||||
upload_to_play_store(
|
||||
track: from,
|
||||
track_promote_to: to,
|
||||
release_status: status,
|
||||
version_name: version_name,
|
||||
skip_upload_aab: true,
|
||||
skip_upload_apk: true,
|
||||
skip_upload_metadata: true,
|
||||
skip_upload_changelogs: true,
|
||||
skip_upload_images: true,
|
||||
skip_upload_screenshots: true,
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
# -- iOS --
|
||||
|
||||
platform :ios do
|
||||
def api_key
|
||||
key_id = ENV.fetch("APP_STORE_API_KEY")
|
||||
app_store_connect_api_key(
|
||||
key_id: key_id,
|
||||
issuer_id: ENV.fetch("APP_STORE_ISSUER_ID"),
|
||||
key_filepath: File.join(ENV.fetch("APP_STORE_KEY_PATH"), "AuthKey_#{key_id}.p8"),
|
||||
)
|
||||
end
|
||||
|
||||
def find_ipa
|
||||
ipa_path = Dir[File.expand_path("../build/ios/ipa/*.ipa", __dir__)].first
|
||||
UI.user_error!("No IPA found in build/ios/ipa/. Run 'make ios-build' first.") unless ipa_path
|
||||
ipa_path
|
||||
end
|
||||
|
||||
def sync_release_notes
|
||||
version_code = version_info[:build]
|
||||
changelog_file = File.expand_path("metadata/ios/en-US/changelogs/#{version_code}.txt", __dir__)
|
||||
notes = File.exist?(changelog_file) ? File.read(changelog_file).strip : changelog_notes
|
||||
release_notes_path = File.expand_path("metadata/ios/en-US/release_notes.txt", __dir__)
|
||||
File.write(release_notes_path, notes)
|
||||
UI.message("Synced release notes from build #{version_code} (#{notes.length} chars)")
|
||||
notes
|
||||
end
|
||||
|
||||
desc "Upload to TestFlight"
|
||||
lane :beta do
|
||||
notes = sync_release_notes
|
||||
upload_to_testflight(
|
||||
api_key: api_key,
|
||||
ipa: find_ipa,
|
||||
changelog: notes,
|
||||
skip_waiting_for_build_processing: true,
|
||||
)
|
||||
end
|
||||
|
||||
desc "Upload to App Store"
|
||||
lane :release do
|
||||
sync_release_notes
|
||||
deliver(
|
||||
api_key: api_key,
|
||||
ipa: find_ipa,
|
||||
metadata_path: File.expand_path("metadata/ios", __dir__),
|
||||
screenshots_path: File.expand_path("metadata/ios/en-US/screenshots", __dir__),
|
||||
skip_screenshots: true,
|
||||
submit_for_review: true,
|
||||
precheck_include_in_app_purchases: false,
|
||||
force: true,
|
||||
)
|
||||
end
|
||||
|
||||
desc "Sync iOS metadata only (no IPA upload)"
|
||||
lane :metadata do
|
||||
deliver(
|
||||
api_key: api_key,
|
||||
metadata_path: File.expand_path("metadata/ios", __dir__),
|
||||
screenshots_path: File.expand_path("metadata/ios/en-US/screenshots", __dir__),
|
||||
skip_binary_upload: true,
|
||||
skip_screenshots: true,
|
||||
submit_for_review: false,
|
||||
precheck_include_in_app_purchases: false,
|
||||
force: true,
|
||||
)
|
||||
end
|
||||
end
|
||||
@@ -41,6 +41,35 @@ Promote a release from one track to another
|
||||
|
||||
----
|
||||
|
||||
|
||||
## iOS
|
||||
|
||||
### ios beta
|
||||
|
||||
```sh
|
||||
[bundle exec] fastlane ios beta
|
||||
```
|
||||
|
||||
Upload to TestFlight
|
||||
|
||||
### ios release
|
||||
|
||||
```sh
|
||||
[bundle exec] fastlane ios release
|
||||
```
|
||||
|
||||
Upload to App Store
|
||||
|
||||
### ios metadata
|
||||
|
||||
```sh
|
||||
[bundle exec] fastlane ios metadata
|
||||
```
|
||||
|
||||
Sync iOS metadata only (no IPA upload)
|
||||
|
||||
----
|
||||
|
||||
This README.md is auto-generated and will be re-generated every time [_fastlane_](https://fastlane.tools) is run.
|
||||
|
||||
More information about _fastlane_ can be found on [fastlane.tools](https://fastlane.tools).
|
||||
2
fastlane/metadata/android/en-US/changelogs/10.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
Bug Fixes
|
||||
- about urls not opening
|
||||
3
fastlane/metadata/android/en-US/changelogs/11.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
Features
|
||||
- add more icons to categories
|
||||
- allow adding one-off list items
|
||||
3
fastlane/metadata/android/en-US/changelogs/12.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
Features
|
||||
- add search in lists
|
||||
- allow uploading list item image
|
||||
2
fastlane/metadata/android/en-US/changelogs/13.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
Build System
|
||||
- add abi split
|
||||
2
fastlane/metadata/android/en-US/changelogs/14.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
Build System
|
||||
- reproducible build
|
||||
2
fastlane/metadata/android/en-US/changelogs/15.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
Build System
|
||||
- upgrade flutter version
|
||||
2
fastlane/metadata/android/en-US/changelogs/16.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
Build System
|
||||
- remove apk obfuscation
|
||||
2
fastlane/metadata/android/en-US/changelogs/17.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
Build System
|
||||
- zipalign
|
||||
2
fastlane/metadata/android/en-US/changelogs/18.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
Build System
|
||||
- remove zipalign
|
||||
2
fastlane/metadata/android/en-US/changelogs/19.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
Build System
|
||||
- disable deps metadata in apk
|
||||
2
fastlane/metadata/android/en-US/changelogs/20.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
Build System
|
||||
- strip deps metadata from build
|
||||
2
fastlane/metadata/android/en-US/changelogs/21.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
Build System
|
||||
- re-sign with stripping
|
||||
2
fastlane/metadata/android/en-US/changelogs/22.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
Build System
|
||||
- fix signing
|
||||
4
fastlane/metadata/android/en-US/changelogs/23.txt
Normal file
@@ -0,0 +1,4 @@
|
||||
Features
|
||||
- update notes view & edit ui
|
||||
Bug Fixes
|
||||
- bug where note grid would not clip correctly
|
||||
2
fastlane/metadata/android/en-US/changelogs/24.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
Bug Fixes
|
||||
- make markdown links clickable
|
||||
4
fastlane/metadata/android/en-US/changelogs/25.txt
Normal file
@@ -0,0 +1,4 @@
|
||||
Features
|
||||
- add setting to require checkbox tap to complete checklist items
|
||||
Bug Fixes
|
||||
- preserve subpath for Nextcloud instances hosted on sub-paths
|
||||
8
fastlane/metadata/android/en-US/changelogs/3.txt
Normal file
@@ -0,0 +1,8 @@
|
||||
Features
|
||||
|
||||
- add sorting by category for checklist
|
||||
- notifications support
|
||||
|
||||
Bug Fixes
|
||||
|
||||
- add bottom padding to accomodate fab
|
||||
3
fastlane/metadata/android/en-US/changelogs/4.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
Bug Fixes
|
||||
|
||||
- sorting prefs persistence & error wrapping
|
||||
8
fastlane/metadata/android/en-US/changelogs/5.txt
Normal file
@@ -0,0 +1,8 @@
|
||||
Features
|
||||
|
||||
- improve main page navigations
|
||||
- move items between lists
|
||||
|
||||
Bug Fixes
|
||||
|
||||
- support back button when in photos foldeer
|
||||
7
fastlane/metadata/android/en-US/changelogs/6.txt
Normal file
@@ -0,0 +1,7 @@
|
||||
Features
|
||||
|
||||
- add hebrew language translation
|
||||
|
||||
Bug Fixes
|
||||
|
||||
- description field in items saving+displaying
|
||||
6
fastlane/metadata/android/en-US/changelogs/7.txt
Normal file
@@ -0,0 +1,6 @@
|
||||
Features
|
||||
- add de, es, fr locales
|
||||
Bug Fixes
|
||||
- allow arbitrary text in quantity
|
||||
- improve rtl layout spacings
|
||||
- rtl layout + switching
|
||||
5
fastlane/metadata/android/en-US/changelogs/8.txt
Normal file
@@ -0,0 +1,5 @@
|
||||
Features
|
||||
- show next due date for list items
|
||||
Bug Fixes
|
||||
- appbar icon spacings
|
||||
- improve i18n recurrence string rules
|
||||
2
fastlane/metadata/android/en-US/changelogs/9.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
Features
|
||||
- add about page
|
||||
@@ -10,7 +10,7 @@ Upload and organize photos into folders. Add captions, drag to reorder, and brow
|
||||
Keep shared notes with your household. Color-code them, write in markdown, and pin the important stuff where everyone can see it.
|
||||
|
||||
* Your data, your server
|
||||
Pantry connects directly to your self-hosted Nextcloud instance. No accounts to create, no cloud services in between. Your data never leaves your server.
|
||||
Pantry connects directly to your Nextcloud instance. No accounts to create, no cloud services in between. Your data never leaves your server.
|
||||
|
||||
* Features
|
||||
- Shared checklists with categories, quantities, and recurrence
|
||||
@@ -20,6 +20,6 @@ Pantry connects directly to your self-hosted Nextcloud instance. No accounts to
|
||||
- Multi-select for bulk actions
|
||||
- Offline caching for fast loading
|
||||
- Material Design 3 with dark mode support
|
||||
- Nextcloud Login Flow v2 authentication
|
||||
- Secure login flow authentication
|
||||
|
||||
* Pantry requires a Nextcloud server with the Pantry app installed. Visit the project page for setup instructions.
|
||||
* Requires a Nextcloud server with the Pantry app installed. Visit the project page for setup instructions.
|
||||
|
Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 60 KiB |
BIN
fastlane/metadata/android/en-US/images/icon.png
Normal file
|
After Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 80 KiB After Width: | Height: | Size: 80 KiB |
|
Before Width: | Height: | Size: 517 KiB After Width: | Height: | Size: 517 KiB |
|
Before Width: | Height: | Size: 124 KiB After Width: | Height: | Size: 124 KiB |
|
Before Width: | Height: | Size: 53 KiB After Width: | Height: | Size: 53 KiB |
|
Before Width: | Height: | Size: 400 KiB After Width: | Height: | Size: 400 KiB |
|
Before Width: | Height: | Size: 88 KiB After Width: | Height: | Size: 88 KiB |
|
Before Width: | Height: | Size: 63 KiB After Width: | Height: | Size: 63 KiB |
|
Before Width: | Height: | Size: 455 KiB After Width: | Height: | Size: 455 KiB |
|
Before Width: | Height: | Size: 99 KiB After Width: | Height: | Size: 99 KiB |
1
fastlane/metadata/android/en-US/short_description.txt
Normal file
@@ -0,0 +1 @@
|
||||
Manage your household — shared lists, photos & notes on your own server.
|
||||
1
fastlane/metadata/android/en-US/title.txt
Normal file
@@ -0,0 +1 @@
|
||||
Pantry for Nextcloud
|
||||
1
fastlane/metadata/ios/copyright.txt
Normal file
@@ -0,0 +1 @@
|
||||
2026 Chen Asraf
|
||||
1
fastlane/metadata/ios/en-US/apple_tv_privacy_policy.txt
Normal file
@@ -0,0 +1 @@
|
||||
|
||||
2
fastlane/metadata/ios/en-US/changelogs/10.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
Bug Fixes
|
||||
- about urls not opening
|
||||
3
fastlane/metadata/ios/en-US/changelogs/11.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
Features
|
||||
- add more icons to categories
|
||||
- allow adding one-off list items
|
||||
3
fastlane/metadata/ios/en-US/changelogs/12.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
Features
|
||||
- add search in lists
|
||||
- allow uploading list item image
|
||||
2
fastlane/metadata/ios/en-US/changelogs/13.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
Build System
|
||||
- add abi split
|
||||
2
fastlane/metadata/ios/en-US/changelogs/14.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
Build System
|
||||
- reproducible build
|
||||
2
fastlane/metadata/ios/en-US/changelogs/15.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
Build System
|
||||
- upgrade flutter version
|
||||
2
fastlane/metadata/ios/en-US/changelogs/16.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
Build System
|
||||
- remove apk obfuscation
|
||||
2
fastlane/metadata/ios/en-US/changelogs/17.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
Build System
|
||||
- zipalign
|
||||