Skip to content

Commit aa080df

Browse files
committed
feat(releases): migrate releases from gitlab to github
1 parent 0df6923 commit aa080df

3 files changed

Lines changed: 123 additions & 0 deletions

File tree

src/githubHelper.ts

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,62 @@ export default class GithubHelper {
160160

161161
// ----------------------------------------------------------------------------
162162

163+
164+
/**
165+
* Gets a release by tag name
166+
* @param tag {string} - the tag name to search a release for
167+
* @returns
168+
*/
169+
async getReleaseByTag(tag) {
170+
try {
171+
await utils.sleep(this.delayInMs);
172+
// get an existing release by tag name in github
173+
let result = await this.githubApi.repos.getReleaseByTag({
174+
owner: this.githubOwner,
175+
repo: this.githubRepo,
176+
tag: tag
177+
});
178+
179+
return result;
180+
} catch (err) {
181+
console.error('No existing release for this tag on github');
182+
return null;
183+
}
184+
}
185+
186+
// ----------------------------------------------------------------------------
187+
188+
/**
189+
* Creates a new release on github
190+
* @param tag_name {string} - the tag name
191+
* @param name {string} - title of the release
192+
* @param body {string} - description for the release
193+
*/
194+
async createRelease(
195+
tag_name: string,
196+
name: string,
197+
body: string) {
198+
try {
199+
await utils.sleep(this.delayInMs);
200+
// get an array of GitHub labels for the new repo
201+
let result = await this.githubApi.repos.createRelease({
202+
owner: this.githubOwner,
203+
repo: this.githubRepo,
204+
tag_name,
205+
name,
206+
body,
207+
});
208+
209+
return result;
210+
} catch (err) {
211+
console.error('Could not create release on github');
212+
console.error(err);
213+
return null;
214+
}
215+
}
216+
217+
// ----------------------------------------------------------------------------
218+
163219
/**
164220
* Get a list of all the current GitHub pull requests.
165221
* This uses a while loop to make sure that each page of issues is received.

src/index.ts

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,13 @@ async function migrate() {
137137
await transferLabels(true, settings.conversion.useLowerCaseLabels);
138138
}
139139

140+
141+
// transfer GitLab releases to GitHub
142+
if (settings.transfer.releases) {
143+
await transferReleases();
144+
}
145+
146+
140147
// Transfer issues with their comments; do this before transferring the merge requests
141148
if (settings.transfer.issues) {
142149
await transferIssues();
@@ -149,6 +156,8 @@ async function migrate() {
149156
await transferMergeRequests();
150157
}
151158
}
159+
160+
152161
} catch (err) {
153162
console.error('Error during transfer:');
154163
console.error(err);
@@ -447,6 +456,63 @@ async function transferMergeRequests() {
447456
}
448457
}
449458

459+
/**
460+
* Transfer any releases that exist in GitLab that do not exist in GitHub
461+
* Please note that due to github api restrictions, this only transfers the
462+
* name, description and tag name of the release. It sorts the releases chronologically
463+
* and creates them on github one by one
464+
* @returns {Promise<void>}
465+
*/
466+
async function transferReleases() {
467+
inform('Transferring Releases');
468+
469+
// Get a list of all releases associated with this project
470+
let releases = await gitlabApi.Releases.all(settings.gitlab.projectId) as any;
471+
472+
// Sort releases in ascending order of their release date
473+
releases = releases.sort((a, b) => {
474+
return (new Date(a.released_at) as any) - (new Date(b.released_at) as any);
475+
});
476+
477+
console.log(
478+
'Transferring ' + releases.length.toString() + ' releases'
479+
);
480+
481+
//
482+
// Create GitHub release for each GitLab release
483+
//
484+
485+
// if a GitLab release does not exist in GitHub repo, create it
486+
for (let release of releases) {
487+
// Try to find a GitHub pull request that already exists for this GitLab
488+
// merge request
489+
let githubRelease = await githubHelper.getReleaseByTag(release.tag_name);
490+
491+
if (!githubRelease) {
492+
console.log(
493+
'Creating release: !' + release.name + ' - ' + release.tag_name
494+
);
495+
try {
496+
// process asynchronous code in sequence
497+
await githubHelper.createRelease(release.tag_name, release.name, release.description);
498+
} catch (err) {
499+
console.error(
500+
'Could not create release: !' +
501+
release.name + ' - ' + release.tag_name
502+
);
503+
console.error(err);
504+
}
505+
} else {
506+
if (githubRelease) {
507+
console.log(
508+
'Gitlab release already exists (as github release): ' +
509+
githubRelease.data.name + ' - ' + githubRelease.data.tag_name
510+
);
511+
}
512+
}
513+
}
514+
}
515+
450516
//-----------------------------------------------------------------------------
451517

452518
/**

src/settings.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ export default interface Settings {
1616
labels: boolean;
1717
issues: boolean;
1818
mergeRequests: boolean;
19+
releases: boolean;
1920
};
2021
usePlaceholderIssuesForMissingIssues: boolean;
2122
useReplacementIssuesForCreationFails: boolean;

0 commit comments

Comments
 (0)