Skip to content

Commit e5b8119

Browse files
committed
refactor: auto resolve discussion comment when changeset presented by default
1 parent ca05443 commit e5b8119

File tree

7 files changed

+32
-40
lines changed

7 files changed

+32
-40
lines changed

.changeset/swift-berries-exist.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
'changesets-gitlab': minor
2+
"changesets-gitlab": minor
33
---
44

5-
Add GITLAB_COMMENT_DISCUSSION_AUTORESOLVE optional environment variable to automaticly resolve added discussion with options to resolve discussion by default (value `all`) or resolve only when changeset is present (value `hasChangeset`)
5+
feat: add a new optional `GITLAB_COMMENT_DISCUSSION_AUTO_RESOLVE` environment variable to automatically resolve added discussion when changeset is present, if you want to always resolve the discussion, you should actually use `GITLAB_COMMENT_TYPE=note` instead, default `true`

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,9 @@ GITLAB_TOKEN_TYPE # optional, type of the provided token in
5353
GITLAB_CI_USER_NAME # optional, username with accessibility to push, used in pairs of the above token (if it was personal access token). If not set read it from the Gitlab API
5454
GITLAB_CI_USER_EMAIL # optional, default `gitlab[bot]@users.noreply.gitlab.com`
5555
GITLAB_COMMENT_TYPE # optional, type of the comment. defaults to `discussion`. can be set to `note` to not create a discussion instead of a thread
56+
GITLAB_COMMENT_DISCUSSION_AUTO_RESOLVE # optional, automatically resolve added discussion when changeset is present, if you want to always resolve the discussion, you should actually use `GITLAB_COMMENT_TYPE=note` instead, default `true`
5657
GITLAB_ADD_CHANGESET_MESSAGE # optional, default commit message for adding changesets on GitLab Web UI
57-
GITLAB_COMMENT_DISCUSSION_AUTO_RESOLVE # optional, automatically resolve added discussion with options to resolve discussion by default (value `always`) or resolve only when changeset is present (value `hasChangeset`)
58-
DEBUG_GITLAB_CREDENTIAL # optional, default `false`
58+
DEBUG_GITLAB_CREDENTIAL # optional, whether to log when setting remote url with sensitive `token` displayed
5959
```
6060

6161
### Example workflow

src/comment.ts

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import * as context from './context.js'
2020
import { env } from './env.js'
2121
import { getChangedPackages } from './get-changed-packages.js'
2222
import type { LooseString } from './types.js'
23-
import { getUsername } from './utils.js'
23+
import { getUsername, TRUTHY_VALUES } from './utils.js'
2424

2525
const generatedByBotNote = 'Generated By Changesets GitLab Bot'
2626

@@ -246,12 +246,8 @@ export const comment = async () => {
246246

247247
const {
248248
CI_MERGE_REQUEST_IID: mrIid,
249-
CI_MERGE_REQUEST_PROJECT_URL,
250-
CI_MERGE_REQUEST_SOURCE_BRANCH_SHA,
251-
CI_MERGE_REQUEST_TITLE,
252-
GITLAB_COMMENT_TYPE,
253-
GITLAB_COMMENT_DISCUSSION_AUTORESOLVE,
254-
GITLAB_ADD_CHANGESET_MESSAGE,
249+
GITLAB_COMMENT_TYPE: commentType,
250+
GITLAB_ADD_CHANGESET_MESSAGE: commitMessage,
255251
} = env
256252

257253
if (mrBranch.startsWith('changeset-release')) {
@@ -262,15 +258,15 @@ export const comment = async () => {
262258

263259
let errFromFetchingChangedFiles = ''
264260
try {
265-
const latestCommitSha = CI_MERGE_REQUEST_SOURCE_BRANCH_SHA
261+
const latestCommitSha = env.CI_MERGE_REQUEST_SOURCE_BRANCH_SHA
266262
const changedFilesPromise = api.MergeRequests.showChanges(
267263
context.projectId,
268264
mrIid,
269265
)
270266

271267
const [noteInfo, hasChangeset, { changedPackages, releasePlan }] =
272268
await Promise.all([
273-
getNoteInfo(api, mrIid, GITLAB_COMMENT_TYPE),
269+
getNoteInfo(api, mrIid, commentType),
274270
hasChangesetBeenAdded(changedFilesPromise),
275271
getChangedPackages({
276272
changedFiles: changedFilesPromise.then(x =>
@@ -290,17 +286,17 @@ export const comment = async () => {
290286
}),
291287
] as const)
292288

293-
const addChangesetUrl = `${CI_MERGE_REQUEST_PROJECT_URL}/-/new/${mrBranch}?file_name=.changeset/${humanId(
289+
const addChangesetUrl = `${env.CI_MERGE_REQUEST_PROJECT_URL}/-/new/${mrBranch}?file_name=.changeset/${humanId(
294290
{
295291
separator: '-',
296292
capitalize: false,
297293
},
298294
)}.md&file=${getNewChangesetTemplate(
299295
changedPackages,
300-
CI_MERGE_REQUEST_TITLE,
296+
env.CI_MERGE_REQUEST_TITLE,
301297
)}${
302-
GITLAB_ADD_CHANGESET_MESSAGE
303-
? '&commit_message=' + encodeURIComponent(GITLAB_ADD_CHANGESET_MESSAGE)
298+
commitMessage
299+
? '&commit_message=' + encodeURIComponent(commitMessage)
304300
: ''
305301
}`
306302

@@ -310,13 +306,12 @@ export const comment = async () => {
310306
: getAbsentMessage(latestCommitSha, addChangesetUrl, releasePlan)) +
311307
errFromFetchingChangedFiles
312308

313-
switch (GITLAB_COMMENT_TYPE) {
309+
switch (commentType) {
314310
case 'discussion': {
315311
if (noteInfo) {
316312
if (
317-
GITLAB_COMMENT_DISCUSSION_AUTORESOLVE === 'always' ||
318-
(GITLAB_COMMENT_DISCUSSION_AUTORESOLVE === 'hasChangeset' &&
319-
hasChangeset)
313+
hasChangeset &&
314+
TRUTHY_VALUES.has(env.GITLAB_COMMENT_DISCUSSION_AUTO_RESOLVE || '1')
320315
) {
321316
await api.MergeRequestDiscussions.resolve(
322317
context.projectId,
@@ -357,7 +352,7 @@ export const comment = async () => {
357352
}
358353
default: {
359354
throw new Error(
360-
`Invalid comment type "${GITLAB_COMMENT_TYPE}", should be "discussion" or "note"`,
355+
`Invalid comment type "${commentType}", should be "discussion" or "note"`,
361356
)
362357
}
363358
}

src/env.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ export const env = {
1818
GITLAB_CI_USER_EMAIL:
1919
process.env.GITLAB_CI_USER_EMAIL || 'gitlab[bot]@users.noreply.gitlab.com',
2020
GITLAB_COMMENT_TYPE: process.env.GITLAB_COMMENT_TYPE ?? 'discussion',
21-
DEBUG_GITLAB_CREDENTIAL: process.env.DEBUG_GITLAB_CREDENTIAL ?? 'false',
2221

2322
// only check for the token if we are explicitly using it
2423

src/main.ts

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,29 +10,27 @@ import { setupUser } from './git-utils.js'
1010
import readChangesetState from './read-changeset-state.js'
1111
import { runPublish, runVersion } from './run.js'
1212
import type { MainCommandOptions } from './types.js'
13-
import { execSync, getOptionalInput, getUsername } from './utils.js'
13+
import {
14+
execSync,
15+
getOptionalInput,
16+
getUsername,
17+
TRUTHY_VALUES,
18+
} from './utils.js'
1419

1520
export const main = async ({
1621
published,
1722
onlyChangesets,
1823
}: MainCommandOptions = {}) => {
19-
const {
20-
CI,
21-
GITLAB_HOST,
22-
GITLAB_TOKEN,
23-
HOME,
24-
NPM_TOKEN,
25-
DEBUG_GITLAB_CREDENTIAL = 'false',
26-
} = env
24+
const { GITLAB_TOKEN, NPM_TOKEN } = env
2725

2826
setOutput('published', false)
2927
setOutput('publishedPackages', [])
3028

31-
if (CI) {
29+
if (env.CI) {
3230
console.log('setting git user')
3331
await setupUser()
3432

35-
const url = new URL(GITLAB_HOST)
33+
const url = new URL(env.GITLAB_HOST)
3634

3735
console.log('setting GitLab credentials')
3836
const username = await getUsername(createApi())
@@ -47,7 +45,7 @@ export const main = async ({
4745
url.host
4846
}${url.pathname.replace(/\/$/, '')}/${env.CI_PROJECT_PATH}.git`,
4947
],
50-
{ silent: !['true', '1'].includes(DEBUG_GITLAB_CREDENTIAL) },
48+
{ silent: !TRUTHY_VALUES.has(env.DEBUG_GITLAB_CREDENTIAL!) },
5149
)
5250
}
5351

@@ -67,7 +65,7 @@ export const main = async ({
6765
'No changesets found, attempting to publish any unpublished packages to npm',
6866
)
6967

70-
const npmrcPath = `${HOME}/.npmrc`
68+
const npmrcPath = `${env.HOME}/.npmrc`
7169
if (fs.existsSync(npmrcPath)) {
7270
console.log('Found existing .npmrc file')
7371
} else if (NPM_TOKEN) {

src/types.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,9 @@ export type Env = GitLabCIPredefinedVariables &
2020
GITLAB_CI_USER_NAME?: string
2121
GITLAB_CI_USER_EMAIL: string
2222
GITLAB_COMMENT_TYPE: LooseString<'discussion' | 'note'>
23-
GITLAB_COMMENT_DISCUSSION_AUTORESOLVE: LooseString<
24-
'always' | 'hasChangeset'
25-
>
23+
GITLAB_COMMENT_DISCUSSION_AUTO_RESOLVE?: LooseString<'1' | 'true'>
2624
GITLAB_ADD_CHANGESET_MESSAGE?: string
27-
DEBUG_GITLAB_CREDENTIAL: LooseString<'1' | 'true'>
25+
DEBUG_GITLAB_CREDENTIAL?: LooseString<'1' | 'true'>
2826

2927
HOME: string
3028
NPM_TOKEN?: string

src/utils.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,3 +171,5 @@ export const getUsername = (api: Gitlab) => {
171171

172172
export const cjsRequire =
173173
typeof require === 'undefined' ? createRequire(import.meta.url) : require
174+
175+
export const TRUTHY_VALUES = new Set(['true', '1'])

0 commit comments

Comments
 (0)