From 1e45fd05c1a04a37df15fb796da26de3bca57d69 Mon Sep 17 00:00:00 2001 From: nextcloud-android-bot Date: Thu, 29 Oct 2026 08:00:20 +0000 Subject: [PATCH 1/3] =?UTF-8?q?=F0=9F=94=84=20synced=20local=20'.github/wo?= =?UTF-8?q?rkflows/'=20with=20remote=20'config/workflows/'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: nextcloud-android-bot --- .github/workflows/codeql.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index ca30e10044cf..8d6ca036b1ed 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -1,6 +1,7 @@ # synced from @nextcloud/android-config # SPDX-FileCopyrightText: 2022-2024 Nextcloud GmbH and Nextcloud contributors +# SPDX-FileCopyrightText: 2026 Alper Ozturk # SPDX-FileCopyrightText: 2023-2024 Andy Scherzinger # SPDX-FileCopyrightText: 2022 Tobias Kaminsky # SPDX-FileCopyrightText: 2022 Álvaro Brey @@ -20,10 +21,15 @@ on: permissions: contents: read +concurrency: + group: codeql-${{ github.event.pull_request.number || github.run_id }} + cancel-in-progress: true + jobs: analyze: name: Analyze runs-on: ubuntu-latest-max + timeout-minutes: 90 permissions: actions: read contents: read From c1ca00ec7b6044c38b96e46fac2d265f507bb271 Mon Sep 17 00:00:00 2001 From: nextcloud-android-bot Date: Thu, 29 Oct 2026 08:00:20 +0000 Subject: [PATCH 2/3] =?UTF-8?q?=F0=9F=94=84=20synced=20local=20'fastlane/'?= =?UTF-8?q?=20with=20remote=20'config/fastlane/'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: nextcloud-android-bot --- fastlane/common.Fastfile | 306 +++++++++++++++++++++++++++++++ fastlane/common.Fastfile.license | 3 + 2 files changed, 309 insertions(+) create mode 100644 fastlane/common.Fastfile create mode 100644 fastlane/common.Fastfile.license diff --git a/fastlane/common.Fastfile b/fastlane/common.Fastfile new file mode 100644 index 000000000000..4027e3b6eff7 --- /dev/null +++ b/fastlane/common.Fastfile @@ -0,0 +1,306 @@ +# install fastlane via bundle +# cd fastlane +# bundle config set path fastlane +# bundle install + +# run fastlane +# bundle exec fastlane + +# update fastlane +# bundle update fastlane + +# update plugins +# bundle exec fastlane update_plugins + +BUILD_NUMBER_RC_START = 51 +BUILD_NUMBER_FINAL_START = 90 + +MAJOR_MULTIPLIER = 10000000 +MINOR_MULTIPLIER = 10000 +PATCH_MULTIPLIER = 100 + +TYPE_ALPHA = "alpha" +TYPE_RC = "rc" +TYPE_FINAL = "final" + +BUNDLE_PATH = "app/build/outputs/bundle/gplayRelease/app-gplay-release.aab" + +default_platform(:android) + +ENV['SUPPLY_UPLOAD_MAX_RETRIES']='10' + +platform :android do + desc "Run tests and build app" + lane :releasePhase1 do + sh("rm -rf ../release/ && mkdir -p ../release") + gradle(task: 'clean') + + versionInfo = getVersionInfo() + test() # needs to be overwritten in apps + + buildBundle() + buildAPKs(code: versionInfo["versionCode"]) + end + + desc "Print version info" + lane :printVersionInfo do + versionInfo = getVersionInfo() + versionComponents = parseVersionCode(versionInfo) + print "Version code: #{versionInfo["versionCode"]}\n" + print "Version name: #{versionInfo["versionName"]}\n" + print "Major: #{versionComponents["major"]}\n" + print "Minor: #{versionComponents["minor"]}\n" + print "Patch: #{versionComponents["patch"]}\n" + print "Build: #{versionComponents["build"]}\n" + end + + # Usage: fastlane incrementVersion type:(major|minor|patch|rc|final) + # For major, minor, and patch: will increment that version number by 1 and set the smaller ones to 0 + # For rc, final: will set build number to first rc/first final or increment it by 1 + desc "Increment version code and version name" + lane :incrementVersion do |options| + versionInfo = getVersionInfo() + versionComponents = parseVersionCode(versionInfo) + newVersionComponents = incrementVersionComponents(versionComponents: versionComponents, type: options[:type]) + versionNameGenerated = generateVersionName(newVersionComponents) + versionCodeGenerated = generateVersionCode(newVersionComponents) + + promptYesNo(text: "Version code: #{versionInfo["versionCode"]} -> #{versionCodeGenerated}\n" + + "Version name: #{versionInfo["versionName"]} -> #{versionNameGenerated}" + ) + writeVersions(versionCode: versionCodeGenerated, versionName: versionNameGenerated) + end + + desc "Upload Alpha version to play store" + lane :uploadAlphaToPlayStore do |options| + upload_to_play_store( + skip_upload_images: true, + skip_upload_aab: true, + skip_upload_changelogs: true, + skip_upload_metadata: true, + skip_upload_screenshots: true, + track: 'alpha', + apk: "/home/androiddaily/apks-#{APP}/android-#{APP}-" + options[:version] + ".apk", + ) + end + + + desc "Parse major, minor, patch and build from versionCode" + private_lane :parseVersionCode do |versionInfo| + versionCode = versionInfo["versionCode"] + build = versionCode % 100 + patch = (versionCode / PATCH_MULTIPLIER) % 100 + minor = (versionCode / MINOR_MULTIPLIER) % 100 + major = (versionCode / MAJOR_MULTIPLIER) % 100 + + type = getVersionType(build: build) + + + { "major" => major, "minor" => minor, "patch" => patch, "build" => build, "type" => type } + end + + desc "Get version type from build number" + private_lane :getVersionType do |options| + build = options[:build] + if build < BUILD_NUMBER_RC_START + type = TYPE_ALPHA + elsif build < BUILD_NUMBER_FINAL_START + type = TYPE_RC + else + type = TYPE_FINAL + end + type + end + + + + desc "Generate versionCode from version components" + private_lane :generateVersionCode do |versionComponents| + puts "Generating version code from #{versionComponents}" + major = versionComponents["major"] + minor = versionComponents["minor"] + patch = versionComponents["patch"] + build = versionComponents["build"] + test = major * MAJOR_MULTIPLIER + minor * MINOR_MULTIPLIER + patch * PATCH_MULTIPLIER + build + test + end + + desc "Compute version name from version code" + private_lane :generateVersionName do |versionComponents| + suffix = "" + buildNumber = versionComponents["build"] + puts "Generating version name from #{versionComponents}\n" + case + when versionComponents["type"] == TYPE_RC + rcNumber = (buildNumber - BUILD_NUMBER_RC_START) + 1 + suffix = " RC#{rcNumber}" + when versionComponents["type"] == TYPE_ALPHA + suffix = " Alpha#{buildNumber + 1}" + end + "#{versionComponents["major"]}.#{versionComponents["minor"]}.#{versionComponents["patch"]}#{suffix}" + end + + desc "Read versions from gradle file" + private_lane :getVersionInfo do + File.open("../app/build.gradle.kts","r") do |file| + text = file.read + versionName = text.match(/versionName = "(.*)"$/)[1] + versionCode = text.match(/versionCode = ([0-9]*)$/)[1].to_i + + { "versionCode" => versionCode, "versionName" => versionName } + end + end + + desc "Write versions to gradle file" + private_lane :writeVersions do |options| + File.open("../app/build.gradle","r+") do |file| + text = file.read + text.gsub!(/versionName "(.*)"$/, "versionName \"#{options[:versionName]}\"") + text.gsub!(/versionCode ([0-9]*)$/, "versionCode #{options[:versionCode]}") + file.rewind + file.write(text) + file.truncate(file.pos) + end + end + + private_lane :incrementVersionComponents do |options| + versionComponents = options[:versionComponents] + case options[:type] + when "major" + versionComponents["major"] = versionComponents["major"] + 1 + versionComponents["minor"] = 0 + versionComponents["patch"] = 0 + versionComponents["build"] = 0 + when "minor" + versionComponents["minor"] = versionComponents["minor"] + 1 + versionComponents["patch"] = 0 + versionComponents["build"] = 0 + when "patch" + versionComponents["patch"] = versionComponents["patch"] + 1 + versionComponents["build"] = 0 + when "rc" + if versionComponents["type"] != TYPE_RC + versionComponents["build"] = BUILD_NUMBER_RC_START + else + versionComponents["build"] = versionComponents["build"] + 1 + end + when "final" + if versionComponents["type"] != TYPE_FINAL + versionComponents["build"] = BUILD_NUMBER_FINAL_START + else + versionComponents["build"] = versionComponents["build"] + 1 + end + else + UI.user_error!("Unknown or missing version increment type #{options[:type]}. Usage: incrementVersion type:(major|minor|patch|rc|final)") + end + versionComponents["type"] = getVersionType(build: versionComponents["build"]) + versionComponents + end + + desc "Get tag name from version components" + private_lane :getTagName do |versionComponents| + if versionComponents["type"] == TYPE_FINAL + tag = "#{versionComponents["major"]}.#{versionComponents["minor"]}.#{versionComponents["patch"]}" + elsif versionComponents["type"] == TYPE_RC + rcNumber = (versionComponents["build"] - BUILD_NUMBER_RC_START) + 1 + rcNumberPadded = "%02d" % rcNumber + tag = "rc-#{versionComponents["major"]}.#{versionComponents["minor"]}.#{versionComponents["patch"]}-#{rcNumberPadded}" + else + UI.user_error!("Build number cannot be tagged: #{versionComponents["build"]}") + end + end + + desc "Check if version is releasable" + private_lane :checkReleasable do |versionComponents| + if versionComponents["type"] != TYPE_FINAL && versionComponents["type"] != TYPE_RC + UI.user_error!("Version is not releasable: #{versionComponents["type"]}") + end + end + + desc "Get play store track from version type" + private_lane :getPlayStoreTrack do |versionComponents| + case versionComponents["type"] + when TYPE_RC + track = "beta" + when TYPE_FINAL + track = "production" + else + UI.user_error!("Version is not releasable: #{versionComponents["type"]}") + end + end + + desc "Run tests" + private_lane :test do + gradle(task: "clean testGplayDebugUnitTest testGenericDebugUnitTest testQaDebugUnitTest") + end + + desc "Build app bundle" + private_lane :buildBundle do + gradle( + task: 'bundle', + flavor: 'Gplay', + build_type: 'Release', + print_command: false, + properties: GRADLE_SIGNING_PROPERTIES + ) + end + + desc "Build signed APK" + private_lane :SignedRelease do |options| + gradle( + task: 'assemble', + flavor: options[:flavor], + build_type: 'Release', + print_command: false, + properties: GRADLE_SIGNING_PROPERTIES + ) + + sh("mv ../app/build/outputs/apk/#{options[:flavor]}/release/*.apk ../release/nextcloud-#{APP}-#{options[:flavor]}-#{options[:versionCode]}.apk") + end + + desc "Build all APKs" + private_lane :buildAPKs do |options| + SignedRelease(flavor: "generic", versionCode: options[:code]) + SignedRelease(flavor: "gplay", versionCode: options[:code]) + + if APP == "files" + SignedRelease(flavor: "huawei", versionCode: options[:code]) + end + end + + desc "Create release tag" + private_lane :tag do |options| + tagName = options[:name] + add_git_tag( + tag: tagName, + sign: true + ) + push_git_tags(tag: tagName) + end + + desc "Upload release artifacts to Google Play" + private_lane :uploadToPlayStore do |options| + upload_to_play_store( + skip_upload_images: true, + skip_upload_apk: true, + track: options[:track], + aab: BUNDLE_PATH + ) + end + + desc "Check if release artifacts exist" + private_lane :checkArtifactsExist do + if !File.exist?("../#{BUNDLE_PATH}") + UI.user_error!("Bundle not found at #{BUNDLE_PATH}") + end + end + +end + +private_lane :promptYesNo do |options| + puts "\n" + options[:text] + answer = prompt(text: "is this okay?", boolean: true) + if !answer + UI.user_error!("Aborting") + end +end diff --git a/fastlane/common.Fastfile.license b/fastlane/common.Fastfile.license new file mode 100644 index 000000000000..8362977b874e --- /dev/null +++ b/fastlane/common.Fastfile.license @@ -0,0 +1,3 @@ +SPDX-FileCopyrightText: 2023-2024 Nextcloud GmbH and Nextcloud contributors +SPDX-FileCopyrightText: 2023 Álvaro Brey +SPDX-License-Identifier: GPL-3.0-or-later From 23f18c3f6d19143f2b232fe2ab87b205ab22666b Mon Sep 17 00:00:00 2001 From: nextcloud-android-bot Date: Thu, 29 Oct 2026 08:00:20 +0000 Subject: [PATCH 3/3] =?UTF-8?q?=F0=9F=94=84=20synced=20local=20'.'=20with?= =?UTF-8?q?=20remote=20'config/root/'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: nextcloud-android-bot --- Gemfile.lock | 80 +++++++++++++++++++++++++++------------------------- 1 file changed, 41 insertions(+), 39 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 39d96eae2f24..0584204f5879 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -8,7 +8,7 @@ GEM artifactory (3.0.17) atomos (0.1.3) aws-eventstream (1.4.0) - aws-partitions (1.1296.0) + aws-partitions (1.1290.0) aws-sdk-core (3.257.0) aws-eventstream (~> 1, >= 1.3.0) aws-partitions (~> 1, >= 1.992.0) @@ -21,7 +21,7 @@ GEM aws-sdk-kms (1.132.0) aws-sdk-core (~> 3, >= 3.256.0) aws-sigv4 (~> 1.5) - aws-sdk-s3 (1.233.2) + aws-sdk-s3 (1.232.2) aws-sdk-core (~> 3, >= 3.256.0) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.5) @@ -30,7 +30,7 @@ GEM babosa (1.0.4) base64 (0.3.0) benchmark (0.5.0) - bigdecimal (3.3.1) + bigdecimal (4.1.3) cgi (0.5.2) claide (1.1.0) colored (1.2) @@ -41,14 +41,14 @@ GEM declarative (0.0.20) digest-crc (0.7.0) rake (>= 12.0.0, < 14.0.0) - domain_name (0.7.20261007) + domain_name (0.6.20260921) dotenv (2.8.1) emoji_regex (3.2.3) erb (6.0.7) - excon (1.7.3) + excon (1.7.1) logger - faraday (2.15.0) - faraday-net_http (>= 2.0, < 3.6) + faraday (2.14.4) + faraday-net_http (>= 2.0, < 3.5) json logger faraday-cookie_jar (0.0.8) @@ -58,11 +58,12 @@ GEM faraday (>= 1, < 3) faraday-multipart (1.2.0) multipart-post (~> 2.0) - faraday-net_http (2.1.0) + faraday-net_http (3.4.4) + net-http (~> 0.5) faraday-retry (2.4.0) faraday (~> 2.0) fastimage (2.4.1) - fastlane (2.241.1) + fastlane (2.240.1) CFPropertyList (>= 2.3, < 5.0.0) abbrev (~> 0.1) addressable (>= 2.9.0, < 3.0.0) @@ -78,8 +79,7 @@ GEM csv (~> 3.3) dotenv (>= 2.1.1, < 3.0.0) emoji_regex (>= 0.1, < 4.0) - erb (>= 4.0, < 7.0) - excon (>= 1.0.0, < 2.0.0) + excon (>= 0.71.0, < 2.0.0) faraday (~> 2.7) faraday-cookie_jar (~> 0.0.8) faraday-follow_redirects (~> 0.3) @@ -90,7 +90,7 @@ GEM gh_inspector (>= 1.1.2, < 2.0.0) google-apis-androidpublisher_v3 (~> 0.99) google-apis-playcustomapp_v1 (~> 0.1) - google-cloud-env (>= 1.6.0, < 2.5.0) + google-cloud-env (>= 1.6.0, < 2.4.0) google-cloud-storage (~> 1.31) highline (~> 2.0) irb (>= 1.8) @@ -109,7 +109,7 @@ GEM rubyzip (>= 3.4.0, < 4.0.0) security (~> 0.3) simctl (~> 1.6.3) - terminal-notifier (>= 3.1.0, < 4.0.0) + terminal-notifier (>= 2.0.0, < 3.0.0) terminal-table (~> 4) tty-screen (>= 0.6.3, < 1.0.0) tty-spinner (>= 0.8.0, < 1.0.0) @@ -117,34 +117,33 @@ GEM xcodeproj (>= 1.13.0, < 2.0.0) xcpretty (~> 0.4.1) xcpretty-travis-formatter (>= 0.0.3, < 2.0.0) - fastlane-plugin-huawei_appgallery_connect (1.0.31) - cgi fastlane-sirp (1.1.0) gh_inspector (1.1.3) google-apis-androidpublisher_v3 (0.109.0) google-apis-core (>= 0.15.0, < 2.a) - google-apis-core (0.18.0) - addressable (~> 2.5, >= 2.5.1) - googleauth (~> 1.9) - httpclient (>= 2.8.3, < 3.a) - mini_mime (~> 1.0) - mutex_m + google-apis-core (1.2.5) + addressable (~> 2.9) + faraday (~> 2.13) + faraday-follow_redirects (~> 0.3) + googleauth (~> 1.14) + mini_mime (~> 1.1) + multi_json (~> 1.11) representable (~> 3.0) - retriable (>= 2.0, < 4.a) + retriable (>= 3.1, < 5.0) google-apis-iamcredentials_v1 (0.28.0) google-apis-core (>= 0.15.0, < 2.a) google-apis-playcustomapp_v1 (0.18.0) google-apis-core (>= 0.15.0, < 2.a) - google-apis-storage_v1 (0.69.0) + google-apis-storage_v1 (0.68.0) google-apis-core (>= 0.15.0, < 2.a) google-cloud-core (1.9.0) google-cloud-env (>= 1.0, < 3.a) google-cloud-errors (~> 1.0) - google-cloud-env (2.4.1) + google-cloud-env (2.3.1) base64 (~> 0.2) faraday (>= 1.0, < 3.a) google-cloud-errors (1.7.0) - google-cloud-storage (1.62.1) + google-cloud-storage (1.62.0) addressable (~> 2.8) digest-crc (~> 0.4) google-apis-core (>= 0.18, < 2) @@ -153,8 +152,8 @@ GEM google-cloud-core (~> 1.6) googleauth (~> 1.9) mini_mime (~> 1.0) - google-logging-utils (0.2.1) - googleauth (1.17.5) + google-logging-utils (0.2.0) + googleauth (1.17.4) faraday (>= 1.0, < 3.a) google-cloud-env (~> 2.2) google-logging-utils (~> 0.1) @@ -165,8 +164,6 @@ GEM highline (2.0.3) http-cookie (1.1.6) domain_name (~> 0.5) - httpclient (2.9.0) - mutex_m io-console (0.9.4) irb (1.18.0) pp (>= 0.6.0) @@ -175,7 +172,7 @@ GEM reline (>= 0.4.2) jmespath (1.6.2) json (2.21.2) - jwt (2.10.3) + jwt (3.3.0) base64 logger (1.7.0) mini_magick (4.13.2) @@ -185,6 +182,8 @@ GEM mutex_m (0.3.0) nanaimo (0.4.0) naturally (2.3.0) + net-http (0.9.1) + uri (>= 0.11.1) nkf (0.3.0) optparse (0.8.1) os (1.1.4) @@ -192,39 +191,39 @@ GEM plist (3.7.2) pp (0.6.4) prettyprint - prettyprint (0.2.1) + prettyprint (0.2.0) prism (1.9.0) pstore (0.2.1) - public_suffix (6.0.2) + public_suffix (7.0.5) rake (13.4.2) rbs (4.2.0) logger prism (>= 1.6.0) tsort - rdoc (8.1.0) + rdoc (8.0.0) erb prism (>= 1.6.0) rbs (>= 4.0.0) tsort reline (0.7.0) io-console (~> 0.5) - representable (3.3.1) + representable (3.3.0) declarative (< 0.1.0) trailblazer-option (>= 0.1.1, < 0.2.0) uber (< 0.2.0) - retriable (3.8.0) + retriable (4.2.0) rexml (3.4.4) rouge (3.28.0) rubyzip (3.7.0) security (0.3.0) - signet (0.22.1) + signet (0.22.0) addressable (~> 2.8) faraday (>= 0.17.5, < 3.a) jwt (>= 1.5, < 4.0) simctl (1.6.10) CFPropertyList naturally - terminal-notifier (3.1.0) + terminal-notifier (2.0.0) terminal-table (4.0.0) unicode-display_width (>= 1.1.1, < 4) trailblazer-option (0.1.2) @@ -234,7 +233,10 @@ GEM tty-spinner (0.9.3) tty-cursor (~> 0.7) uber (0.1.0) - unicode-display_width (2.6.0) + unicode-display_width (3.3.0) + unicode-emoji (~> 4.3) + unicode-emoji (4.3.0) + uri (1.1.1) word_wrap (1.0.0) xcodeproj (1.28.1) CFPropertyList (>= 2.3.3, < 4.0) @@ -254,8 +256,8 @@ PLATFORMS x86_64-linux DEPENDENCIES + abbrev fastlane - fastlane-plugin-huawei_appgallery_connect BUNDLED WITH 2.5.4