gitlab-triage 1.10.1 → 1.11.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1242b945b940e1378f6bb8f66eb5f08f3adb387245c0425954aa7a6cc3e98f25
4
- data.tar.gz: 925cbb79cd61b2c5f4eeb87eed0596c674902aa6fd44bfe679b9740d660aede6
3
+ metadata.gz: e02cd169e252e4656441f6e9268314c2b968935957dbcb906ae3048ee7045da4
4
+ data.tar.gz: 3b58c8b37e3f82878272641ad848239c74623499f0e309ba0ac9aaaf6803cf0f
5
5
  SHA512:
6
- metadata.gz: 1caedc0d489bc0e45e66399aa9529cf3eaf9812a78cb99fddba5cc5a078b10ab748e763d2407e6911da9ba2cadbc56453040366c8bad1757a0ae07fbcbf25b1d
7
- data.tar.gz: 12de27a31f013916beee14fe3da467e1ee316774e8fea019c0735c68c81f0e5694a79cdcb5d4bc94522b620a94c4c4989c4367f51fd28d400f19a1dca63d48dc
6
+ metadata.gz: 181a6a5055a61b5d8c78f36d047dfef269a92a7d0173598a490e5420ab04fb267c9c42be2ae9bef31a815eb7730a15b921dde2b1834e49dcc20d0969d4986f54
7
+ data.tar.gz: 621d6e208ad9dcdd034931ca0656778e5247c6aa3f3e6fa8edf53ed401795452f0d136eec259df8a377e36589de866fc7ee949a792cd1fa5b2c07257cab577ee
@@ -2,7 +2,7 @@ stages:
2
2
  - prepare
3
3
  - test
4
4
  - triage
5
- - release
5
+ - deploy
6
6
 
7
7
  default:
8
8
  image: ruby:2.7
@@ -38,6 +38,7 @@ workflow:
38
38
  services:
39
39
  - docker:${DOCKER_VERSION}-dind
40
40
  variables:
41
+ DOCKER_VERSION: "19.03.0"
41
42
  DOCKER_DRIVER: overlay2
42
43
  DOCKER_HOST: tcp://docker:2375
43
44
  DOCKER_TLS_CERTDIR: ""
@@ -118,7 +119,7 @@ dry-run:gitlab-triage:
118
119
  - gitlab-triage --version
119
120
  - gitlab-triage --help
120
121
  - gitlab-triage --init
121
- - gitlab-triage --dry-run --debug --token $API_TOKEN --source-id $CI_PROJECT_PATH
122
+ - gitlab-triage --dry-run --debug --token $GITLAB_API_TOKEN --source-id $CI_PROJECT_PATH
122
123
 
123
124
  # This job requires allows to override the `CI_PROJECT_PATH` variable when triggered.
124
125
  dry-run:custom:
@@ -127,26 +128,6 @@ dry-run:custom:
127
128
  - when: manual
128
129
  allow_failure: true
129
130
 
130
- ###################
131
- ## Release stage ##
132
- ###################
133
- release:
134
- stage: release
135
- rules:
136
- - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE == "push"'
137
- changes: ["lib/gitlab/triage/version.rb"]
138
- - if: '$CI_MERGE_REQUEST_TITLE =~ /RELEASE/'
139
- when: manual
140
- before_script: []
141
- script:
142
- - version=$(ruby -r ./lib/gitlab/triage/version -e 'puts Gitlab::Triage::VERSION' | tr -d "\n")
143
- - tag="v${version}"
144
- - message="Version ${version}."
145
- # TODO: Add release notes from the Release MR?
146
- - 'curl --request POST --header "PRIVATE-TOKEN: ${API_TOKEN}" -d "tag_name=${tag}" -d "ref=${CI_COMMIT_SHA}" -d "message=${message}" "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/repository/tags"'
147
- - gem build gitlab-triage.gemspec
148
- - gem push "gitlab-triage-${version}.gem"
149
- artifacts:
150
- paths:
151
- - gitlab-triage*.gem
152
- expire_in: 30 days
131
+ include:
132
+ - project: 'gitlab-org/quality/pipeline-common'
133
+ file: '/ci/gem-release.yml'
data/Guardfile CHANGED
@@ -24,7 +24,7 @@
24
24
  # * zeus: 'zeus rspec' (requires the server to be started separately)
25
25
  # * 'just' rspec: 'rspec'
26
26
 
27
- guard :rspec, cmd: "bundle exec rspec" do
27
+ guard :rspec, cmd: "bundle exec rspec -f doc" do
28
28
  require "guard/rspec/dsl"
29
29
  dsl = Guard::RSpec::Dsl.new(self)
30
30
 
data/README.md CHANGED
@@ -552,6 +552,10 @@ Adds a number of labels to the resource.
552
552
 
553
553
  Accepts an array of strings. Each element is the name of a label to add.
554
554
 
555
+ If any of the labels doesn't exist, the automation will stop immediately so
556
+ that if a label is renamed or deleted, you'll have to explicitly update or remove
557
+ it in your policy file.
558
+
555
559
  Example:
556
560
 
557
561
  ```yml
@@ -567,6 +571,10 @@ Removes a number of labels from the resource.
567
571
 
568
572
  Accepts an array of strings. Each element is the name of a label to remove.
569
573
 
574
+ If any of the labels doesn't exist, the automation will stop immediately so
575
+ that if a label is renamed or deleted, you'll have to explicitly update or remove
576
+ it in your policy file.
577
+
570
578
  Example:
571
579
 
572
580
  ```yml
@@ -1016,22 +1024,22 @@ Usage: gitlab-triage [options]
1016
1024
  Triaging against a specific project:
1017
1025
 
1018
1026
  ```
1019
- gitlab-triage --dry-run --token $API_TOKEN --source-id gitlab-org/triage
1027
+ gitlab-triage --dry-run --token $GITLAB_API_TOKEN --source-id gitlab-org/triage
1020
1028
  ```
1021
1029
 
1022
1030
  Triaging against a whole group:
1023
1031
 
1024
1032
  ```
1025
- gitlab-triage --dry-run --token $API_TOKEN --source-id gitlab-org --source groups
1033
+ gitlab-triage --dry-run --token $GITLAB_API_TOKEN --source-id gitlab-org --source groups
1026
1034
  ```
1027
1035
 
1028
1036
  Triaging against an entire instance:
1029
1037
 
1030
1038
  ```
1031
- gitlab-triage --dry-run --token $API_TOKEN --all-projects
1039
+ gitlab-triage --dry-run --token $GITLAB_API_TOKEN --all-projects
1032
1040
  ```
1033
1041
 
1034
- > **Note:** The `--all-projects` option will process all resources for all projects visible to the specified `$API_TOKEN`
1042
+ > **Note:** The `--all-projects` option will process all resources for all projects visible to the specified `$GITLAB_API_TOKEN`
1035
1043
 
1036
1044
  #### Running on GitLab CI pipeline
1037
1045
 
@@ -1042,7 +1050,7 @@ run:triage:triage:
1042
1050
  stage: triage
1043
1051
  script:
1044
1052
  - gem install gitlab-triage
1045
- - gitlab-triage --token $API_TOKEN --source-id $CI_PROJECT_PATH
1053
+ - gitlab-triage --token $GITLAB_API_TOKEN --source-id $CI_PROJECT_PATH
1046
1054
  only:
1047
1055
  - schedules
1048
1056
  ```
@@ -1056,7 +1064,7 @@ Yes, you can override the host url using the following options:
1056
1064
  ##### CLI
1057
1065
 
1058
1066
  ```
1059
- gitlab-triage --dry-run --token $API_TOKEN --source-id gitlab-org/triage --host-url https://gitlab.host.com
1067
+ gitlab-triage --dry-run --token $GITLAB_API_TOKEN --source-id gitlab-org/triage --host-url https://gitlab.host.com
1060
1068
  ```
1061
1069
 
1062
1070
  ##### Policy file
@@ -1093,7 +1101,7 @@ Gitlab::Triage::Resource::Context.include MyPlugin
1093
1101
  And then run it with:
1094
1102
 
1095
1103
  ```shell
1096
- gitlab-triage -r ./my_plugin.rb --token $API_TOKEN --source-id gitlab-org/triage
1104
+ gitlab-triage -r ./my_plugin.rb --token $GITLAB_API_TOKEN --source-id gitlab-org/triage
1097
1105
  ```
1098
1106
 
1099
1107
  This allows you to use `has_severity_label?` in the Ruby condition:
@@ -41,8 +41,8 @@ module Gitlab
41
41
  CommandBuilders::CommentCommandBuilder.new(
42
42
  [
43
43
  CommandBuilders::TextContentBuilder.new(policy.actions[:comment], resource: resource, network: network).build_command,
44
- CommandBuilders::LabelCommandBuilder.new(policy.actions[:labels]).build_command,
45
- CommandBuilders::RemoveLabelCommandBuilder.new(policy.actions[:remove_labels]).build_command,
44
+ CommandBuilders::LabelCommandBuilder.new(policy.actions[:labels], resource: resource, network: network).build_command,
45
+ CommandBuilders::RemoveLabelCommandBuilder.new(policy.actions[:remove_labels], resource: resource, network: network).build_command,
46
46
  CommandBuilders::CcCommandBuilder.new(policy.actions[:mention]).build_command,
47
47
  CommandBuilders::MoveCommandBuilder.new(policy.actions[:move]).build_command,
48
48
  CommandBuilders::StatusCommandBuilder.new(policy.actions[:status]).build_command
@@ -2,13 +2,15 @@ module Gitlab
2
2
  module Triage
3
3
  module CommandBuilders
4
4
  class BaseCommandBuilder
5
- def initialize(items)
5
+ def initialize(items, resource: nil, network: nil)
6
6
  @items = Array.wrap(items)
7
7
  @items.delete('')
8
+ @resource = resource&.with_indifferent_access
9
+ @network = network
8
10
  end
9
11
 
10
12
  def build_command
11
- if @items.any?
13
+ if items.any?
12
14
  [slash_command_string, content_string].compact.join(separator)
13
15
  else
14
16
  ""
@@ -17,6 +19,8 @@ module Gitlab
17
19
 
18
20
  private
19
21
 
22
+ attr_reader :items, :resource, :network
23
+
20
24
  def separator
21
25
  ' '
22
26
  end
@@ -26,7 +30,7 @@ module Gitlab
26
30
  end
27
31
 
28
32
  def content_string
29
- @items.map do |item|
33
+ items.map do |item|
30
34
  format_item(item)
31
35
  end.join(separator)
32
36
  end
@@ -4,8 +4,25 @@ module Gitlab
4
4
  module Triage
5
5
  module CommandBuilders
6
6
  class LabelCommandBuilder < BaseCommandBuilder
7
+ def build_command
8
+ ensure_labels_exist!
9
+
10
+ super
11
+ end
12
+
7
13
  private
8
14
 
15
+ def ensure_labels_exist!
16
+ items.each do |label|
17
+ label_opts = { project_id: resource[:project_id], name: label }
18
+
19
+ unless Resource::Label.new(label_opts, network: network).exist?
20
+ raise Resource::Label::LabelDoesntExistError,
21
+ "Label `#{label}` doesn't exist!"
22
+ end
23
+ end
24
+ end
25
+
9
26
  def slash_command_string
10
27
  "/label"
11
28
  end
@@ -34,13 +34,9 @@ module Gitlab
34
34
  }.freeze
35
35
  PLACEHOLDER_REGEX = /{{([\w\.]+)}}/.freeze
36
36
 
37
- attr_reader :resource, :network
38
-
39
37
  def initialize(
40
38
  items, resource: nil, network: nil, redact_confidentials: true)
41
- super(items)
42
- @resource = resource&.with_indifferent_access
43
- @network = network
39
+ super(items, resource: resource, network: network)
44
40
  @redact_confidentials = redact_confidentials
45
41
  end
46
42
 
@@ -4,7 +4,6 @@ require 'active_support/inflector'
4
4
  require_relative 'expand_condition'
5
5
  require_relative 'filters/merge_request_date_conditions_filter'
6
6
  require_relative 'filters/votes_conditions_filter'
7
- require_relative 'filters/forbidden_labels_conditions_filter'
8
7
  require_relative 'filters/no_additional_labels_conditions_filter'
9
8
  require_relative 'filters/author_member_conditions_filter'
10
9
  require_relative 'filters/assignee_member_conditions_filter'
@@ -202,10 +201,6 @@ module Gitlab
202
201
  results << Filters::VotesConditionsFilter.new(resource, conditions[:upvotes]).calculate
203
202
  end
204
203
 
205
- if conditions[:forbidden_labels]
206
- results << Filters::ForbiddenLabelsConditionsFilter.new(resource, conditions[:forbidden_labels]).calculate
207
- end
208
-
209
204
  if conditions[:no_additional_labels]
210
205
  results << Filters::NoAdditionalLabelsConditionsFilter.new(resource, conditions.fetch(:labels) { [] }).calculate
211
206
  end
@@ -244,6 +239,11 @@ module Gitlab
244
239
 
245
240
  condition_builders = []
246
241
  condition_builders << APIQueryBuilders::MultiQueryParamBuilder.new('labels', conditions[:labels], ',') if conditions[:labels]
242
+
243
+ if conditions[:forbidden_labels]
244
+ condition_builders << APIQueryBuilders::MultiQueryParamBuilder.new('not[labels]', conditions[:forbidden_labels], ',')
245
+ end
246
+
247
247
  condition_builders << APIQueryBuilders::SingleQueryParamBuilder.new('state', conditions[:state]) if conditions[:state]
248
248
  condition_builders << APIQueryBuilders::SingleQueryParamBuilder.new('milestone', Array(conditions[:milestone])[0]) if conditions[:milestone]
249
249
  condition_builders << APIQueryBuilders::SingleQueryParamBuilder.new('source_branch', conditions[:source_branch]) if conditions[:source_branch]
@@ -58,11 +58,15 @@ module Gitlab
58
58
  build_url(params: params)
59
59
  end
60
60
 
61
+ def resource_id
62
+ resource[:iid]
63
+ end
64
+
61
65
  def resource_url(params: {}, sub_resource_type: nil)
62
66
  build_url(
63
67
  params: params,
64
68
  options: {
65
- resource_id: resource[:iid],
69
+ resource_id: resource_id,
66
70
  sub_resource_type: sub_resource_type
67
71
  }
68
72
  )
@@ -8,6 +8,8 @@ module Gitlab
8
8
  module Triage
9
9
  module Resource
10
10
  class Label < Base
11
+ LabelDoesntExistError = Class.new(StandardError)
12
+
11
13
  FIELDS = %i[
12
14
  id
13
15
  project_id
@@ -35,6 +37,19 @@ module Gitlab
35
37
  Time.parse(value) if value
36
38
  end
37
39
  end
40
+
41
+ def exist?
42
+ label = network.query_api_cached(resource_url).first
43
+ return false unless label
44
+
45
+ label[:name] == name
46
+ end
47
+
48
+ private
49
+
50
+ def resource_id
51
+ name
52
+ end
38
53
  end
39
54
  end
40
55
  end
@@ -17,7 +17,7 @@ module Gitlab
17
17
 
18
18
  def build
19
19
  url = base_url
20
- url << "/#{@resource_id}" if @resource_id
20
+ url << "/#{CGI.escape(@resource_id.to_s)}" if @resource_id
21
21
  url << "/#{@sub_resource_type}" if @sub_resource_type
22
22
  url << params_string if @params
23
23
  url
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Gitlab
4
4
  module Triage
5
- VERSION = '1.10.1'
5
+ VERSION = '1.11.0'
6
6
  end
7
7
  end
@@ -8,7 +8,7 @@ dry-run:triage:
8
8
  script:
9
9
  - gem install gitlab-triage
10
10
  - gitlab-triage --help
11
- - gitlab-triage --dry-run --token $API_TOKEN --source projects --source-id $CI_PROJECT_PATH
11
+ - gitlab-triage --dry-run --token $GITLAB_API_TOKEN --source projects --source-id $CI_PROJECT_PATH
12
12
  when: manual
13
13
  except:
14
14
  - schedules
@@ -17,6 +17,6 @@ run:triage:
17
17
  stage: triage
18
18
  script:
19
19
  - gem install gitlab-triage
20
- - gitlab-triage --token $API_TOKEN --source projects --source-id $CI_PROJECT_PATH
20
+ - gitlab-triage --token $GITLAB_API_TOKEN --source projects --source-id $CI_PROJECT_PATH
21
21
  only:
22
22
  - schedules
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gitlab-triage
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.10.1
4
+ version: 1.11.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - GitLab
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-07-08 00:00:00.000000000 Z
11
+ date: 2020-07-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -158,7 +158,6 @@ files:
158
158
  - lib/gitlab/triage/filters/assignee_member_conditions_filter.rb
159
159
  - lib/gitlab/triage/filters/author_member_conditions_filter.rb
160
160
  - lib/gitlab/triage/filters/base_conditions_filter.rb
161
- - lib/gitlab/triage/filters/forbidden_labels_conditions_filter.rb
162
161
  - lib/gitlab/triage/filters/member_conditions_filter.rb
163
162
  - lib/gitlab/triage/filters/merge_request_date_conditions_filter.rb
164
163
  - lib/gitlab/triage/filters/name_conditions_filter.rb
@@ -1,32 +0,0 @@
1
- require_relative 'base_conditions_filter'
2
-
3
- module Gitlab
4
- module Triage
5
- module Filters
6
- class ForbiddenLabelsConditionsFilter < BaseConditionsFilter
7
- def validate_condition(condition)
8
- raise ArgumentError, 'condition must be an array containing forbidden label values' unless condition.is_a?(Array)
9
- end
10
-
11
- def initialize_variables(forbidden_labels)
12
- @attribute = :labels
13
- @forbidden_labels = forbidden_labels
14
- end
15
-
16
- def resource_value
17
- @resource[@attribute]
18
- end
19
-
20
- def calculate
21
- label_intersection.empty?
22
- end
23
-
24
- private
25
-
26
- def label_intersection
27
- resource_value & @forbidden_labels
28
- end
29
- end
30
- end
31
- end
32
- end