2024-09-14 23:16:42 +02:00
|
|
|
|
|
|
|
import path = require('path');
|
|
|
|
import { parseArgs } from 'util';
|
|
|
|
import { Context, downloadFile, getTargetRelease, updateReleaseAsset, uploadReleaseAsset } from './githubReleasesUtils';
|
|
|
|
import { GitHubRelease } from '../utils/checkForUpdatesUtils';
|
|
|
|
import { GenerateInfo, generateLatestArm64Yml } from './generateLatestArm64Yml';
|
|
|
|
|
|
|
|
const basePath = path.join(__dirname, '..');
|
|
|
|
const downloadDir = path.join(basePath, 'downloads');
|
|
|
|
|
|
|
|
// Renames release assets in Joplin Desktop releases
|
|
|
|
const renameReleaseAssets = async (context: Context, release: GitHubRelease) => {
|
|
|
|
// Patterns used to rename releases
|
|
|
|
const renamePatterns: [RegExp, string][] = [
|
|
|
|
[/-arm64\.dmg$/, '-arm64.DMG'],
|
|
|
|
];
|
|
|
|
|
|
|
|
for (const asset of release.assets) {
|
|
|
|
for (const [pattern, replacement] of renamePatterns) {
|
|
|
|
if (asset.name.match(pattern)) {
|
|
|
|
const newName = asset.name.replace(pattern, replacement);
|
|
|
|
await updateReleaseAsset(context, asset.url, newName);
|
|
|
|
|
|
|
|
// Only rename a release once.
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
// Creates release assets in Joplin Desktop releases
|
|
|
|
const createReleaseAssets = async (context: Context, release: GitHubRelease) => {
|
|
|
|
// Create latest-mac-arm64.yml file and publish
|
|
|
|
let dmgPath;
|
|
|
|
let zipPath;
|
|
|
|
for (const asset of release.assets) {
|
|
|
|
if (asset.name.endsWith('arm64.zip')) {
|
2024-09-15 12:02:02 +02:00
|
|
|
zipPath = await downloadFile(context, asset, downloadDir);
|
2024-09-14 23:16:42 +02:00
|
|
|
} else if (asset.name.endsWith('arm64.DMG')) {
|
2024-09-15 12:02:02 +02:00
|
|
|
dmgPath = await downloadFile(context, asset, downloadDir);
|
2024-09-14 23:16:42 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
const info: GenerateInfo = {
|
|
|
|
version: release.tag_name.slice(1),
|
|
|
|
dmgPath: dmgPath,
|
|
|
|
zipPath: zipPath,
|
|
|
|
releaseDate: new Date().toISOString(),
|
|
|
|
};
|
|
|
|
|
|
|
|
const latestArm64FilePath = generateLatestArm64Yml(info, downloadDir);
|
|
|
|
void uploadReleaseAsset(context, release, latestArm64FilePath);
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const modifyReleaseAssets = async () => {
|
|
|
|
const args = parseArgs({
|
|
|
|
options: {
|
|
|
|
tag: { type: 'string' },
|
|
|
|
token: { type: 'string' },
|
|
|
|
repo: { type: 'string' },
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
|
|
|
if (!args.values.tag || !args.values.token || !args.values.repo) {
|
|
|
|
throw new Error([
|
|
|
|
'Required arguments: --tag, --token, --repo',
|
|
|
|
' --tag should be a git tag with an associated release (e.g. v12.12.12)',
|
|
|
|
' --token should be a GitHub API token',
|
|
|
|
' --repo should be a string in the form user/reponame (e.g. laurent22/joplin)',
|
|
|
|
].join('\n'));
|
|
|
|
}
|
|
|
|
|
|
|
|
const context: Context = {
|
|
|
|
repo: args.values.repo,
|
|
|
|
githubToken: args.values.token,
|
|
|
|
targetTag: args.values.tag,
|
|
|
|
};
|
|
|
|
|
|
|
|
const release = await getTargetRelease(context, context.targetTag);
|
|
|
|
|
|
|
|
if (!release.assets) {
|
|
|
|
console.log(release);
|
|
|
|
throw new Error(`Release ${release.tag_name} missing assets!`);
|
|
|
|
}
|
|
|
|
|
|
|
|
console.log('Renaming release assets for tag', context.targetTag, context.repo);
|
|
|
|
void renameReleaseAssets(context, release);
|
|
|
|
console.log('Creating latest-mac-arm64.yml asset for tag', context.targetTag, context.repo);
|
|
|
|
void createReleaseAssets(context, release);
|
|
|
|
};
|
|
|
|
|
|
|
|
void modifyReleaseAssets();
|