Skip to content

Commit 2daa901

Browse files
committed
Add support for deleting a release using the tag name or the release id (#13)
1 parent 3183c90 commit 2daa901

1 file changed

Lines changed: 51 additions & 30 deletions

File tree

src/index.js

Lines changed: 51 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,13 @@ program
1414
.version(pkg.version)
1515
.usage('<command> [<args>]')
1616
.option('--baseurl <baseurl>', 'API endpoint', 'https://api.github.com')
17-
.option('-T, --token <token>', 'OAuth2 token')
18-
.option('-o, --owner <owner>', 'The repository owner.')
19-
.option('-r, --repo <repo>', 'The repository name.')
17+
.option('-T, --token <token>', 'OAuth2 token', null)
18+
.option('-o, --owner <owner>', 'The repository owner.', '')
19+
.option('-r, --repo <repo>', 'The repository name.', '')
2020
.option('-t, --tag <tag>', 'The name of the tag.')
21+
.option('--release-id <id>', 'The release id.')
2122
.option('-c, --commitish <value>', 'Specifies the commitish value for tag. Unused if the tag already exists.')
22-
.option('-n, --name <name>', 'The name of the release.')
23+
.option('-n, --name <name>', 'The name of the release.', '') // Note: name is a reserved word and it has to specify a default value.
2324
.option('-b, --body <body>', 'Text describing the contents of the tag.')
2425
.option('-d, --draft [value]', '`true` makes the release a draft, and `false` publishes the release.', function(val) {
2526
if (String(val).toLowerCase() === 'false') {
@@ -49,8 +50,8 @@ function next(response) {
4950
return false;
5051
}
5152

52-
let link = LinkHeader.parse(response.headers.link).rel('next');
53-
if (!link) {
53+
const link = LinkHeader.parse(response.headers.link).rel('next');
54+
if (!link || !link[0]) {
5455
return false;
5556
}
5657

@@ -65,25 +66,27 @@ function next(response) {
6566

6667
const fn = {
6768
'upload': async () => {
68-
const { owner, repo, tag, commitish, name, body, draft, prerelease } = program;
69+
const { owner, repo, tag, commitish, name, body, draft, prerelease, releaseId } = program;
6970
const files = args;
7071
let release;
7172

7273
try {
73-
console.log(`> getReleaseByTag: owner=${owner}, repo=${repo}, tag=${tag}`);
74-
const res = await octokit.repos.getReleaseByTag({
75-
owner: owner,
76-
repo: repo,
77-
tag: tag,
78-
});
79-
release = res.data;
74+
if (tag) {
75+
console.log(`> getReleaseByTag: owner=${owner}, repo=${repo}, tag=${tag}`);
76+
const res = await octokit.repos.getReleaseByTag({ owner, repo, tag });
77+
release = res.data;
78+
} else if (releaseId) {
79+
console.log(`> getRelease: owner=${owner}, repo=${repo}, release_id=${releaseId}`);
80+
const res = await octokit.repos.getRelease({ owner, repo, release_id: releaseId });
81+
release = res.data;
82+
}
8083
} catch (err) {
8184
// Ignore
8285
}
8386

8487
try {
8588
if (!release) {
86-
console.log(`> createRelease: tag_name=${tag}, target_commitish=${commitish}, name=${name || tag}, draft=${!!draft}, prerelease=${!!prerelease}`);
89+
console.log(`> createRelease: tag_name=${tag}, target_commitish=${commitish || ''}, name=${name || tag}, draft=${!!draft}, prerelease=${!!prerelease}`);
8790
const res = await octokit.repos.createRelease({
8891
owner,
8992
repo,
@@ -131,18 +134,27 @@ const fn = {
131134
}
132135
},
133136
'delete': async () => {
134-
const { owner, repo, tag, name, body, draft, prerelease } = program;
137+
const { owner, repo, tag, releaseId } = program;
135138
const patterns = args;
136139
let release;
137140

138141
try {
139-
console.log(`> getReleaseByTag: owner=${owner}, repo=${repo}, tag=${tag}`);
140-
const res = await octokit.repos.getReleaseByTag({
141-
owner: owner,
142-
repo: repo,
143-
tag: tag,
144-
});
145-
release = res.data;
142+
if (tag) {
143+
console.log(`> getReleaseByTag: owner=${owner}, repo=${repo}, tag=${tag}`);
144+
const res = await octokit.repos.getReleaseByTag({ owner, repo, tag });
145+
release = res.data;
146+
} else if (releaseId) {
147+
console.log(`> getRelease: owner=${owner}, repo=${repo}, release_id=${releaseId}`);
148+
const res = await octokit.repos.getRelease({ owner, repo, release_id: releaseId });
149+
release = res.data;
150+
}
151+
152+
if (patterns.length === 0) {
153+
const release_id = release.id;
154+
console.log(`> deleteRelease: release_id=${release_id}`);
155+
await octokit.repos.deleteRelease({ owner, repo, release_id: release.id });
156+
return;
157+
}
146158
} catch (err) {
147159
console.error(err);
148160
return;
@@ -187,13 +199,22 @@ const fn = {
187199
}
188200
},
189201
'list': async () => {
190-
const releases = await octokit.repos.listReleases({
191-
owner: program.owner,
192-
repo: program.repo,
193-
page: 1,
194-
});
195-
for (const release of releases.data) {
196-
console.log(`${release.name} (${release.tag_name})`);
202+
const { owner, repo } = program;
203+
let releases = [];
204+
205+
try {
206+
let page = 1;
207+
do {
208+
const res = await octokit.repos.listReleases({ owner, repo, page });
209+
releases = releases.concat(res.data);
210+
page = next(res);
211+
} while (page)
212+
} catch (err) {
213+
console.log(err);
214+
}
215+
216+
for (const release of releases) {
217+
console.log(`* tag_name=${JSON.stringify(release.tag_name)}, name=${JSON.stringify(release.name)}, id=${release.id}`);
197218
}
198219
},
199220
}[command];

0 commit comments

Comments
 (0)