-
Notifications
You must be signed in to change notification settings - Fork 19
/
Copy pathrelease.ts
127 lines (119 loc) · 3.54 KB
/
release.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
import { flags } from '@oclif/command';
import { compose, filter, isNil, join, not } from 'ramda';
import { Observable, of } from 'rxjs';
import { map, switchMap, tap, withLatestFrom } from 'rxjs/operators';
import { yes } from 'src/cli/flags';
import { FotingoCommand } from 'src/cli/FotingoCommand';
import { Emoji } from 'src/io/messenger';
import { getReleaseNotes } from 'src/templates/getReleaseNotes';
import {
CreateRelease,
JointRelease,
LocalChanges,
Release as JiraRelease,
ReleaseData,
} from 'src/types';
export class Release extends FotingoCommand<JointRelease, ReleaseData> {
static description = 'Create a release with your changes';
static args = [
{
description: 'Name of the release to be created',
name: 'release',
required: true,
},
];
static flags = {
issues: flags.string({
char: 'i',
description: 'Specify more issues to include in the release',
multiple: true,
required: false,
}),
simple: flags.boolean({
char: 's',
description: 'Do not use any issue tracker',
name: 'simple',
}),
noVcsRelease: flags.boolean({
char: 'n',
description: 'Do not create a release in the remote VCS',
name: 'no-vcs-release',
}),
yes,
};
/**
* Given the local changes and a release data, build the object needed
* to create a release in the issue tracker
*/
private static buildReleaseData([data, { tracker, ...releaseData }]: [
LocalChanges,
ReleaseData,
]): CreateRelease {
return {
...releaseData,
...data,
submitRelease: tracker.enabled,
};
}
protected getCommandData(): ReleaseData {
const { args, flags } = this.parse(Release);
return {
issues: (flags.issues || []) as string[],
name: args.release as string,
tracker: {
enabled: !flags.simple,
},
useDefaults: flags.yes as boolean,
vcs: {
enabled: !flags.noVcsRelease,
},
};
}
protected runCmd(commandData$: Observable<ReleaseData>): Observable<JointRelease> {
const releaseInformation$ = commandData$.pipe(
switchMap(() => this.git.getBranchInfo()),
withLatestFrom(commandData$),
switchMap(this.getLocalChangesInformation),
withLatestFrom(commandData$),
map(Release.buildReleaseData),
);
const maybeCreateGithubRelease = (
source: Observable<[JiraRelease, ReleaseData]>,
): Observable<JointRelease> => {
return source.pipe(
switchMap(([release, releaseData]) =>
releaseData.vcs.enabled
? getReleaseNotes(
this.fotingo.release,
this.messenger,
release,
releaseData.useDefaults,
).pipe(
map((notes) => ({
notes,
release,
})),
switchMap(({ notes, release }) => this.github.createRelease(release, notes)),
)
: of({ release }),
),
);
};
return releaseInformation$.pipe(
tap((data) => this.messenger.emit(`Creating release ${data.name}`, Emoji.SHIP)),
switchMap(this.tracker.createRelease),
switchMap(this.tracker.setIssuesFixVersion),
withLatestFrom(commandData$),
maybeCreateGithubRelease,
tap((data: JointRelease) =>
this.messenger.emit(
`Release created: ${compose(
join('|'),
filter(compose(not, isNil)),
)([data.release.url, data.remoteRelease?.url])}`,
Emoji.LINK,
),
),
);
}
}