Skip to content

Instantly share code, notes, and snippets.

@luwol03
Created January 14, 2022 14:16
Show Gist options
  • Save luwol03/4d3974122764ca29fc70282545cd0a6c to your computer and use it in GitHub Desktop.
Save luwol03/4d3974122764ca29fc70282545cd0a6c to your computer and use it in GitHub Desktop.
migrate-releases

Migrate Releases

This is a script to migrate a Github Release from one Repo to another.

Instalation

npm i @octokit/rest semver dotenv

Usage

  1. Create a .env file with the following options:
GH_AUTH_TOKEN=
SOURCE_REPO=
DESTINATION_REPO=
TAG_SHA=
  1. Run migration
node migrate-releases.js
const { Octokit } = require('@octokit/rest');
const semver = require('semver');
require('dotenv').config();
const fileSizeSI = (bytes) => {
const size = (Math.log(bytes) / Math.log(1024)) | 0;
return (
(bytes / Math.pow(1024, size)).toFixed(2) +
' ' +
(size ? 'KMGTPEZY'[size - 1] + 'iB' : 'Bytes')
);
};
const octokit = new Octokit({
auth: process.env.GH_AUTH_TOKEN,
});
const { SOURCE_REPO, DESTINATION_REPO, TAG_SHA } = process.env;
const parseRepo = (repo) => ({
owner: repo.split('/')[0],
repo: repo.split('/')[1],
});
const oldRepo = parseRepo(SOURCE_REPO);
const newRepo = parseRepo(DESTINATION_REPO);
(async () => {
console.log(`Fetching all Releases from "${SOURCE_REPO}"...`);
const oldReleases = await octokit.rest.repos.listReleases({
...oldRepo,
});
console.log(` Found ${oldReleases.data.length} releases`);
for (const oldRelease of oldReleases.data.sort((a, b) =>
semver.compare(a.tag_name, b.tag_name)
)) {
console.log(` Creating "${oldRelease.name}"`);
const newRelease = await octokit.rest.repos.createRelease({
...newRepo,
tag_name: oldRelease.tag_name,
target_commitish: TAG_SHA,
name: oldRelease.name,
body: oldRelease.body,
});
console.log(` Processing Assets`);
for (const [i, asset] of Object.entries(oldRelease.assets)) {
console.log(
` - Asset ${+i + 1} of ${oldRelease.assets.length} ("${
asset.name
}")`
);
console.log(` Downloading asset (${fileSizeSI(asset.size)})...`);
const oldAsset = await octokit.rest.repos.getReleaseAsset({
...oldRepo,
asset_id: asset.id,
headers: {
Accept: 'application/octet-stream',
},
});
console.log(` Uploading asset...`);
await octokit.rest.repos.uploadReleaseAsset({
...newRepo,
release_id: newRelease.data.id,
name: asset.name,
headers: {
'Content-Type': asset.content_type,
},
data: oldAsset.data,
});
console.log(` Done`);
}
console.log(` Successfully created Release "${oldRelease.name}"`);
}
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment