diff --git a/js/git-events/README.js b/js/git-events/README.js new file mode 100644 index 0000000..94ed283 --- /dev/null +++ b/js/git-events/README.js @@ -0,0 +1,7 @@ +/* +NB: README.md in workflow packages will be supported soon. + +This workflow demonstrates VCS & PullRequests related events, +described in detail in this blog post: +https://www.jetbrains.com/youtrack/whatsnew/2020-3/ + */ \ No newline at end of file diff --git a/js/git-events/all-old-pr-actions.js b/js/git-events/all-old-pr-actions.js new file mode 100644 index 0000000..4c47300 --- /dev/null +++ b/js/git-events/all-old-pr-actions.js @@ -0,0 +1,35 @@ +// https://habr.com/ru/company/JetBrains/blog/512880/ +var entities = require('@jetbrains/youtrack-scripting-api/entities'); + +exports.rule = entities.Issue.onChange({ + title: 'Existing PR changes ticket state', + guard: function(ctx) { + return ctx.issue.pullRequests.isNotEmpty() && // ensure there is PRs + !ctx.issue.fields.isChanged(ctx.State) && // allow users to change State manually, otherwise this will be blocked + ctx.issue.pullRequests.last().previousState && + ctx.issue.pullRequests.last().state.name !== ctx.issue.pullRequests.last().previousState.name; + }, + action: function(ctx) { + if ( ctx.issue.pullRequests.last().state.name === "OPEN" ) { + ctx.issue.fields.State = ctx.State.Review; + } else if ( ctx.issue.pullRequests.last().state.name === "DECLINED" ) { + ctx.issue.fields.State = ctx.State.InProgress; + } else if ( ctx.issue.pullRequests.last().state.name === "MERGED" ) { + ctx.issue.fields.State = ctx.State.Resolved; + } + }, + requirements: { + State: { + type: entities.State.fieldType, + InProgress: { + name: "In Progress" + }, + Review: { + name: "MR for Review" + }, + Resolved: { + name: "Resolved" + } + }, + } +}); diff --git a/js/git-events/git-push-ticket-in-progress.js b/js/git-events/git-push-ticket-in-progress.js new file mode 100644 index 0000000..be3ce01 --- /dev/null +++ b/js/git-events/git-push-ticket-in-progress.js @@ -0,0 +1,21 @@ +var entities = require('@jetbrains/youtrack-scripting-api/entities'); + +exports.rule = entities.Issue.onChange({ + title: 'in-progress on Git push', + guard: function(ctx) { + return ctx.issue.vcsChanges.added.isNotEmpty() && ctx.issue.fields.is(ctx.State, ctx.State.Open) && !ctx.issue.pullRequests.isNotEmpty(); + }, + action: function(ctx) { + ctx.issue.fields.State = ctx.State.InProgress; + }, + + requirements: { + State: { + type: entities.State.fieldType, + Open: {}, + InProgress: { + name: 'In Progress' + } + } + } +}); diff --git a/js/git-events/new-pr-ticket-ready-for-review.js b/js/git-events/new-pr-ticket-ready-for-review.js new file mode 100644 index 0000000..2766ec7 --- /dev/null +++ b/js/git-events/new-pr-ticket-ready-for-review.js @@ -0,0 +1,22 @@ +var entities = require('@jetbrains/youtrack-scripting-api/entities'); + +exports.rule = entities.Issue.onChange({ + title: 'Set_to_Ready_for_Review_when_pull_request_is_opened', + guard: function(ctx) { + return ctx.issue.pullRequests.isNotEmpty() && + !ctx.issue.fields.isChanged(ctx.State) && + !ctx.issue.pullRequests.last().previousState && + ctx.issue.pullRequests.last().state.name === "OPEN"; + }, + action: function(ctx) { + ctx.issue.fields.State = ctx.State.Review; + }, + requirements: { + State: { + type: entities.State.fieldType, + Review: { + name: "MR for Review" + } + }, + } +}); diff --git a/js/git-events/package.json b/js/git-events/package.json new file mode 100644 index 0000000..db2b5b6 --- /dev/null +++ b/js/git-events/package.json @@ -0,0 +1,12 @@ +{ + "name": "git-events", + "title": "GIT Events", + "description": null, + "dependencies" : { + "@jetbrains/youtrack-scripting-api" : "^2020.3.6638" + }, + "youtrack": { + "autoAttached": false, + "readOnly": false + } +} \ No newline at end of file