super-productivity/tools/bump-android-version.js
Johannes Millan b583454327 fix(android): support pre-release versions in APK builds
- Update bump-android-version.js to handle RC/alpha/beta versions
- Pre-releases use versionCode suffix 0001-8999, stable uses 9000
- This ensures users can upgrade from RC to stable without uninstalling
- Skip Play Store upload for pre-release tags (GitHub only)
- Skip fastlane changelog generation for pre-releases

Fixes #5964
2026-01-12 15:25:18 +01:00

112 lines
3.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

const fs = require('fs');
const path = require('path');
// Read the version from package.json
const packageJson = require('../package.json');
const version = packageJson.version;
// Parse version to extract pre-release info
const versionParts = version.split('-');
const baseVersion = versionParts[0]; // e.g., "17.0.0"
const preRelease = versionParts[1]; // e.g., "RC.1" or undefined
const isPreRelease = !!preRelease;
String.prototype.insertAt = function (index, string) {
return this.substr(0, index) + string + this.substr(index);
};
// Define the path to build.gradle
const gradleFilePath = path.join(__dirname, '..', 'android', 'app', 'build.gradle');
// Read the build.gradle file
let gradleFileContent = fs.readFileSync(gradleFilePath, 'utf8');
// Calculate versionCode
const baseVersionCode =
baseVersion
.split('.')
.map((num) => num.padStart(2, '0'))
.join('') * 10000;
let versionCodeDroid;
if (isPreRelease) {
// Pre-release: extract number (RC.1 → 1, alpha.5 → 5)
// Uses suffix 0001-8999 to be LOWER than stable (9000)
const preReleaseNum = parseInt(preRelease.split('.')[1] || '1', 10);
versionCodeDroid = baseVersionCode + preReleaseNum;
} else {
// Stable release: use suffix 9000 to be HIGHER than any RC
versionCodeDroid = baseVersionCode + 9000;
}
const versionCodeDroidWithUnderscores = versionCodeDroid
.toString()
.padStart(10, '0')
.insertAt(6, '_')
.insertAt(4, '_')
.insertAt(2, '_');
gradleFileContent = gradleFileContent.replace(
/versionCode (\d|_)+/g,
`versionCode ${versionCodeDroidWithUnderscores}`,
);
gradleFileContent = gradleFileContent.replace(
/versionName "[^"]+"/g,
`versionName "${version}"`,
);
// Write the updated content back to build.gradle
fs.writeFileSync(gradleFilePath, gradleFileContent, 'utf8');
console.log(`Updated build.gradle to version ${version}`);
// Skip fastlane changelog for pre-release versions
if (isPreRelease) {
console.log('Pre-release version skipping fastlane changelog generation');
process.exit(0);
}
// CREATE fastlane changelog file
// Define the paths
const changelogPath = path.join(__dirname, '..', 'CHANGELOG.md');
const outputDir = path.join(
__dirname,
'..',
'android',
'fastlane',
'metadata',
'android',
'en-US',
'changelogs',
);
const outputFilePath = path.join(outputDir, `${versionCodeDroid}.txt`);
// Read the changelog.md file
const changelogContent = fs.readFileSync(changelogPath, 'utf8');
// Extract the latest changes
const lines = changelogContent.split('\n').slice(2); // Remove the first two lines;
let latestChanges = '';
let headerCount = 0;
for (const line of lines) {
if (line.startsWith('# [') || line.startsWith('## [')) {
headerCount++;
if (headerCount === 1) break;
}
latestChanges += line + '\n';
}
// Remove all links from the extracted text
latestChanges = latestChanges
.replace(/\[([^\]]+)\]\([^\)]+\)/g, '$1')
.replace(/\s*\([a-f0-9]{7}\)\s*$/gm, '');
// Ensure the output directory exists
if (!fs.existsSync(outputDir)) {
fs.mkdirSync(outputDir, { recursive: true });
}
// Write the latest changes to the versioned changelog file
fs.writeFileSync(outputFilePath, latestChanges, 'utf8');
console.log(`Wrote latest changes to ${outputFilePath}`);