gitlab-triage 1.24.0 → 1.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0d4dafafa454a68a9258f5753ef3df345e0a0f13c104158bc1243ecb561d408a
4
- data.tar.gz: c0d12641e77a6865e0f5569d405e2548b03884e61280dc262a922ff38b786c84
3
+ metadata.gz: dfb91844acb53e2543200eae19db3c5abaf9cd79106add7fa5ca7ca9585215dd
4
+ data.tar.gz: eba68ca3b8a0539f2428e63d71f86fe28ac1e292e89141fa3312192f9a21a2fd
5
5
  SHA512:
6
- metadata.gz: ea2b0d33abf1eb19403519f264ab25d249a9992e97e08f830505f497a50cc91ae0f9210db270b87d45649ef41c1d1248fcf2ef13b6820991455cfe4d09e8247f
7
- data.tar.gz: 063b0a7ec5503f55ee4971e84cc1ddeb81b1ce83997a41dbd48a9c730ada4b402693fc1e4f2be6a955cc9de57c283ed4ee1b37e059633bec355a95c2a55efe3b
6
+ metadata.gz: fa86c82d57b8e4e9986039098b1c7f8f5b031dae68080bb38a84808ae6df26af48ebf0790d47558e8c9ecf6fad8ba2d7d8208ccb54a6b33cb753e0fac02139c5
7
+ data.tar.gz: cacc6bc349fa41819c5b163cd67165983021bfee35bc9f607f5a64cb283d1372db51740e4c851238e68ff15776ec6289dc280ee2ca1d11f5714c0d36f7e68013
data/.gitlab-ci.yml CHANGED
@@ -126,7 +126,7 @@ dry-run:gitlab-triage:
126
126
  - gitlab-triage --version
127
127
  - gitlab-triage --help
128
128
  - gitlab-triage --init
129
- - gitlab-triage --dry-run --debug --token $GITLAB_API_TOKEN --source-id $CI_PROJECT_PATH
129
+ - gitlab-triage --dry-run --debug --source-id $CI_PROJECT_PATH
130
130
 
131
131
  # This job requires allows to override the `CI_PROJECT_PATH` variable when triggered.
132
132
  dry-run:custom:
data/README.md CHANGED
@@ -21,6 +21,7 @@ Triage policies are defined on a resource level basis, resources being:
21
21
  - Epics
22
22
  - Issues
23
23
  - Merge Requests
24
+ - Branches
24
25
 
25
26
  Each policy can declare a number of conditions that must all be satisfied before
26
27
  a number of actions are carried out.
@@ -42,6 +43,7 @@ Select which resource to add the policy to:
42
43
  - `epics`
43
44
  - `issues`
44
45
  - `merge_requests`
46
+ - `branches`
45
47
 
46
48
  And create an array of `rules` to define your policies:
47
49
 
@@ -120,6 +122,18 @@ resource_rules:
120
122
  comment_type: thread
121
123
  comment: |
122
124
  {{author}} This issue is unlabelled. Please add one or more labels.
125
+ branches:
126
+ rules:
127
+ - name: My branch policy
128
+ conditions:
129
+ date:
130
+ attribute: committed_date
131
+ condition: older_than
132
+ interval_type: 6
133
+ interval: months
134
+ name: ^feature
135
+ actions:
136
+ delete: true
123
137
  ```
124
138
 
125
139
  ### Real world example
@@ -155,7 +169,7 @@ Available condition types:
155
169
  - [`milestone` condition](#milestone-condition)
156
170
  - [`iteration` condition](#iteration-condition)
157
171
  - [`state` condition](#state-condition)
158
- - [`upvotes` condition](#upvotes-condition)
172
+ - [`votes` condition](#votes-condition)
159
173
  - [`labels` condition](#labels-condition)
160
174
  - [`forbidden_labels` condition](#forbidden-labels-condition)
161
175
  - [`no_additional_labels` condition](#no-additional-labels-condition)
@@ -166,21 +180,23 @@ Available condition types:
166
180
  - [`target_branch` condition](#target-branch-condition)
167
181
  - [`weight` condition](#weight-condition)
168
182
  - [`discussions` condition](#discussions-condition)
183
+ - [`protected` condition](#protected-condition)
169
184
  - [`ruby` condition](#ruby-condition)
170
185
 
171
186
  ##### Date condition
172
187
 
173
188
  Accepts a hash of fields.
174
189
 
175
- | Field | Type | Values | Required |
176
- | --------- | ---- | ---- | -------- |
177
- | `attribute` | string | `created_at`, `updated_at`, `merged_at` | yes |
178
- | `condition` | string | `older_than`, `newer_than` | yes |
179
- | `interval_type` | string | `days`, `weeks`, `months`, `years` | yes |
180
- | `interval` | integer | integer | yes |
190
+ | Field | Type | Values | Required |
191
+ | --------- | ---- |--------------------------------------------------------------------------| -------- |
192
+ | `attribute` | string | `created_at`, `updated_at`, `merged_at`, `authored_date`, `committed_date` | yes |
193
+ | `condition` | string | `older_than`, `newer_than` | yes |
194
+ | `interval_type` | string | `days`, `weeks`, `months`, `years` | yes |
195
+ | `interval` | integer | integer | yes |
181
196
  > **Note:**
182
197
  > - `merged_at` only works on merge requests.
183
198
  > - `closed_at` is not supported in the GitLab API, but can be used in a [`ruby` condition](#ruby-condition).
199
+ > - `committed_date` and `authored_date` only works for branches.
184
200
 
185
201
  Example:
186
202
 
@@ -248,7 +264,7 @@ conditions:
248
264
  state: opened
249
265
  ```
250
266
 
251
- ##### Upvotes condition
267
+ ##### Votes condition
252
268
 
253
269
  Accepts a hash of fields.
254
270
 
@@ -262,7 +278,7 @@ Example:
262
278
 
263
279
  ```yml
264
280
  conditions:
265
- upvotes:
281
+ votes:
266
282
  attribute: upvotes
267
283
  condition: less_than
268
284
  threshold: 10
@@ -575,6 +591,13 @@ conditions:
575
591
  threshold: 15
576
592
  ```
577
593
 
594
+ ##### Protected condition
595
+
596
+ ** This condition is only applicable for branches**
597
+
598
+ Accept a boolean.
599
+ If not specified, default to `false` to filter out protected branches.
600
+
578
601
  ##### Ruby condition
579
602
 
580
603
  This condition allows users to write a Ruby expression to be evaluated for
@@ -661,6 +684,8 @@ Available action types:
661
684
  - [`comment_type` action option](#comment-type-action-option)
662
685
  - [`summarize` action](#summarize-action)
663
686
  - [`comment_on_summary` action](#comment-on-summary-action)
687
+ - [`issue` action](#create-a-new-issue-from-each-resource)
688
+ - [`delete` action](#delete-action)
664
689
 
665
690
  ##### Labels action
666
691
 
@@ -1032,6 +1057,30 @@ resource_rules:
1032
1057
  /label ~"needs attention"
1033
1058
  ```
1034
1059
 
1060
+ ##### Delete action
1061
+
1062
+ **This action is only applicable for branches.**
1063
+
1064
+ Delete the resource.
1065
+
1066
+ Accept a boolean. Set to `true` to enable.
1067
+
1068
+ Example :
1069
+ ```yaml
1070
+ resource_rules:
1071
+ branches:
1072
+ rules:
1073
+ - name: My branch policy
1074
+ conditions:
1075
+ date:
1076
+ attribute: committed_date
1077
+ condition: older_than
1078
+ interval_type: months
1079
+ interval: 30
1080
+ actions:
1081
+ delete: true
1082
+ ```
1083
+
1035
1084
  ### Summary policies
1036
1085
 
1037
1086
  Summary policies are special policies that join multiple rule policies together
@@ -1146,6 +1195,7 @@ Here's a list of currently available Ruby expression API:
1146
1195
  | related_merge_requests | [MergeRequest] | The list of merge requests related to the issue |
1147
1196
  | closed_by | [MergeRequest] | The list of merge requests that close the issue |
1148
1197
  | linked_issues | [LinkedIssue] | The list of issues that are linked to the issue |
1198
+ | due_date | Date | The due date of the issue. Could be `nil` |
1149
1199
 
1150
1200
  ##### Methods for `LinkedIssue`
1151
1201
 
@@ -1357,4 +1407,13 @@ Please refer to the [Contributing Guide](CONTRIBUTING.md).
1357
1407
 
1358
1408
  ## Release Process
1359
1409
 
1360
- Please refer to the [Release Process](docs/release_process.md).
1410
+ We release `gitlab-triage` on an ad-hoc basis. There is no regularity to when
1411
+ we release, we just release when we make a change - no matter the size of the
1412
+ change.
1413
+
1414
+ To release a new version:
1415
+
1416
+ 1. Create a Merge Request.
1417
+ 1. Use Merge Request template [Release.md](https://gitlab.com/gitlab-org/ruby/gems/gitlab-triage/-/blob/master/.gitlab/merge_request_templates/Release.md).
1418
+ 1. Follow the instructions.
1419
+ 1. After the Merge Request has been merged, a new gem version is [published automatically](https://gitlab.com/gitlab-org/quality/pipeline-common/-/blob/master/ci/gem-release.yml)
@@ -28,6 +28,11 @@ module Gitlab
28
28
  end
29
29
 
30
30
  def act
31
+ if policy.type == 'branches'
32
+ puts Gitlab::Triage::UI.warn "Comment actions are not available for branches. They will NOT be performed\n\n"
33
+ return
34
+ end
35
+
31
36
  policy.resources.each do |resource|
32
37
  comment = build_comment(resource).strip
33
38
 
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base'
4
+
5
+ module Gitlab
6
+ module Triage
7
+ module Action
8
+ class Delete < Base
9
+ class Dry < Delete
10
+ def act
11
+ puts "The following resources will be deleted by the rule **#{policy.name}**:\n\n"
12
+ super
13
+ end
14
+
15
+ private
16
+
17
+ def perform(resource)
18
+ puts "DELETE resource with type: #{resource[:type]} and id: #{resource_id(resource)}"
19
+ end
20
+ end
21
+
22
+ def act
23
+ return unless policy.type&.to_sym == :branches
24
+
25
+ policy.resources.each do |resource|
26
+ perform(resource)
27
+ end
28
+ end
29
+
30
+ private
31
+
32
+ def perform(resource)
33
+ network.delete_api(build_delete_url(resource))
34
+ end
35
+
36
+ def build_delete_url(resource)
37
+ delete_url = UrlBuilders::UrlBuilder.new(
38
+ source: policy.source,
39
+ source_id: network.options.source_id,
40
+ resource_type: policy.type,
41
+ resource_id: resource_id(resource),
42
+ network_options: network.options
43
+ ).build
44
+
45
+ puts Gitlab::Triage::UI.debug "delete_url: #{delete_url}" if network.options.debug
46
+
47
+ delete_url
48
+ end
49
+
50
+ def resource_id(resource)
51
+ resource[:name]
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -2,6 +2,7 @@ require_relative 'action/summarize'
2
2
  require_relative 'action/comment'
3
3
  require_relative 'action/comment_on_summary'
4
4
  require_relative 'action/issue'
5
+ require_relative 'action/delete'
5
6
 
6
7
  module Gitlab
7
8
  module Triage
@@ -13,7 +14,8 @@ module Gitlab
13
14
  [Summarize, policy.summarize?],
14
15
  [Comment, policy.comment?],
15
16
  [CommentOnSummary, policy.comment_on_summary?],
16
- [Issue, policy.issue?]
17
+ [Issue, policy.issue?],
18
+ [Delete, policy.delete?]
17
19
  ].each do |action, active|
18
20
  act(action: action, policy: policy, **args) if active
19
21
  end
@@ -31,7 +31,8 @@ module Gitlab
31
31
  web_url: "{{web_url}}",
32
32
  full_reference: "{{references.full}}",
33
33
  type: "{{type}}",
34
- items: "{{items}}"
34
+ items: "{{items}}",
35
+ name: "{{name}}"
35
36
  }.freeze
36
37
  PLACEHOLDER_REGEX = /{{([\w\.]+)}}/.freeze
37
38
 
@@ -3,6 +3,8 @@ require 'active_support/inflector'
3
3
 
4
4
  require_relative 'expand_condition'
5
5
  require_relative 'filters/merge_request_date_conditions_filter'
6
+ require_relative 'filters/branch_date_filter'
7
+ require_relative 'filters/branch_protected_filter'
6
8
  require_relative 'filters/votes_conditions_filter'
7
9
  require_relative 'filters/no_additional_labels_conditions_filter'
8
10
  require_relative 'filters/author_member_conditions_filter'
@@ -55,7 +57,6 @@ module Gitlab
55
57
 
56
58
  assert_all!
57
59
  assert_project_id!
58
- assert_token!
59
60
  require_ruby_files
60
61
  end
61
62
 
@@ -99,12 +100,6 @@ module Gitlab
99
100
  raise ArgumentError, 'A project_id is needed (pass it with the `--source-id` option)!'
100
101
  end
101
102
 
102
- def assert_token!
103
- return if options.token
104
-
105
- raise ArgumentError, 'A token is needed (pass it with the `--token` option)!'
106
- end
107
-
108
103
  def assert_all!
109
104
  raise ArgumentError, '--all-projects option cannot be used in conjunction with --source and --source-id option!' if
110
105
  options.all && (options.source || options.source_id)
@@ -333,17 +328,27 @@ module Gitlab
333
328
  puts
334
329
  end
335
330
 
336
- def filter_resources(resources, conditions)
331
+ def filter_resources(resources, conditions) # rubocop:disable Metrics/CyclomaticComplexity
337
332
  resources.select do |resource|
338
333
  results = []
339
334
 
340
335
  # rubocop:disable Style/IfUnlessModifier
341
336
  if conditions[:date]
342
- results << Filters::MergeRequestDateConditionsFilter.new(resource, conditions[:date]).calculate
337
+ case resource[:type]
338
+ when 'branches'
339
+ results << Filters::BranchDateFilter.new(resource, conditions[:date]).calculate
340
+ when 'merge_requests'
341
+ results << Filters::MergeRequestDateConditionsFilter.new(resource, conditions[:date]).calculate
342
+ end
343
+ end
344
+
345
+ if resource[:type] == 'branches'
346
+ results << Filters::BranchProtectedFilter.new(resource, conditions[:protected]).calculate
343
347
  end
344
348
 
345
- if conditions[:upvotes]
346
- results << Filters::VotesConditionsFilter.new(resource, conditions[:upvotes]).calculate
349
+ votes_condition = conditions[:votes] || conditions[:upvotes]
350
+ if votes_condition
351
+ results << Filters::VotesConditionsFilter.new(resource, votes_condition).calculate
347
352
  end
348
353
 
349
354
  if conditions[:no_additional_labels]
@@ -402,7 +407,7 @@ module Gitlab
402
407
 
403
408
  condition_builders << milestone_condition_builder(resource_type, conditions[:milestone]) if conditions[:milestone]
404
409
 
405
- if conditions[:date] && APIQueryBuilders::DateQueryParamBuilder.applicable?(conditions[:date])
410
+ if conditions[:date] && APIQueryBuilders::DateQueryParamBuilder.applicable?(conditions[:date]) && resource_type&.to_sym != :branches
406
411
  condition_builders << APIQueryBuilders::DateQueryParamBuilder.new(conditions.delete(:date))
407
412
  end
408
413
 
@@ -411,6 +416,8 @@ module Gitlab
411
416
  condition_builders.concat(issues_resource_query(conditions))
412
417
  when :merge_requests
413
418
  condition_builders.concat(merge_requests_resource_query(conditions))
419
+ when :branches
420
+ condition_builders.concat(branches_resource_query(conditions))
414
421
  end
415
422
 
416
423
  condition_builders.compact.each do |condition_builder|
@@ -468,6 +475,12 @@ module Gitlab
468
475
  end
469
476
  end
470
477
 
478
+ def branches_resource_query(conditions)
479
+ [].tap do |condition_builders|
480
+ condition_builders << APIQueryBuilders::SingleQueryParamBuilder.new('search', conditions[:name]) if conditions[:name]
481
+ end
482
+ end
483
+
471
484
  def draft_condition_builder(draft_condittion)
472
485
  # Issues API only accepts 'yes' and 'no' as strings: https://docs.gitlab.com/ee/api/merge_requests.html
473
486
  wip =
@@ -0,0 +1,67 @@
1
+ require_relative 'base_conditions_filter'
2
+
3
+ module Gitlab
4
+ module Triage
5
+ module Filters
6
+ class BranchDateFilter < BaseConditionsFilter
7
+ ATTRIBUTES = %w[committed_date authored_date].freeze
8
+ CONDITIONS = %w[older_than newer_than].freeze
9
+ INTERVAL_TYPES = %w[days weeks months years].freeze
10
+
11
+ def self.allowed_attributes
12
+ self::ATTRIBUTES
13
+ end
14
+
15
+ def self.filter_parameters
16
+ [
17
+ {
18
+ name: :attribute,
19
+ type: String,
20
+ values: allowed_attributes
21
+ },
22
+ {
23
+ name: :condition,
24
+ type: String,
25
+ values: CONDITIONS
26
+ },
27
+ {
28
+ name: :interval_type,
29
+ type: String,
30
+ values: INTERVAL_TYPES
31
+ },
32
+ {
33
+ name: :interval,
34
+ type: Numeric
35
+ }
36
+ ]
37
+ end
38
+
39
+ def initialize_variables(condition)
40
+ @attribute = condition[:attribute].to_sym
41
+ @condition = condition[:condition].to_sym
42
+ @interval_type = condition[:interval_type].to_sym
43
+ @interval = condition[:interval]
44
+ end
45
+
46
+ def resource_value
47
+ @resource[:commit][@attribute]&.to_date
48
+ end
49
+
50
+ def condition_value
51
+ @interval.public_send(@interval_type).ago.to_date # rubocop:disable GitlabSecurity/PublicSend
52
+ end
53
+
54
+ def calculate
55
+ return false unless resource_value
56
+
57
+ case @condition
58
+ when :older_than
59
+ resource_value < condition_value
60
+ when :newer_than
61
+ resource_value > condition_value
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,26 @@
1
+ require_relative 'base_conditions_filter'
2
+
3
+ module Gitlab
4
+ module Triage
5
+ module Filters
6
+ class BranchProtectedFilter < BaseConditionsFilter
7
+ def initialize_variables(config_value)
8
+ @attribute = :protected
9
+ @condition = config_value.nil? ? true : config_value
10
+ end
11
+
12
+ def resource_value
13
+ @resource[:protected]
14
+ end
15
+
16
+ def condition_value
17
+ @condition
18
+ end
19
+
20
+ def calculate
21
+ resource_value == condition_value
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -54,6 +54,10 @@ module Gitlab
54
54
  }
55
55
  GRAPHQL
56
56
 
57
+ def vote_attribute
58
+ @vote_attribute ||= (conditions.dig(:votes, :attribute) || conditions.dig(:upvotes, :attribute)).to_s
59
+ end
60
+
57
61
  def resource_fields
58
62
  fields = []
59
63
 
@@ -64,8 +68,8 @@ module Gitlab
64
68
  fields << 'labels { nodes { title } }'
65
69
  fields << 'author { id name username }'
66
70
  fields << 'assignees { nodes { id name username } }' if conditions.key?(:assignee_member)
67
- fields << 'upvotes' if conditions.dig(:upvotes, :attribute).to_s == 'upvotes'
68
- fields << 'downvotes' if conditions.dig(:upvotes, :attribute).to_s == 'downvotes'
71
+ fields << 'upvotes' if vote_attribute == 'upvotes'
72
+ fields << 'downvotes' if vote_attribute == 'downvotes'
69
73
  fields.push('draft', 'mergedAt') if resource_type == 'merge_requests'
70
74
  end
71
75
 
@@ -30,6 +30,10 @@ module Gitlab
30
30
  def post_api(...)
31
31
  restapi.post_api(...)
32
32
  end
33
+
34
+ def delete_api(...)
35
+ restapi.delete_api(...)
36
+ end
33
37
  end
34
38
  end
35
39
  end
@@ -53,6 +53,26 @@ module Gitlab
53
53
  }
54
54
  end
55
55
 
56
+ def delete(token, url)
57
+ response = HTTParty.delete(
58
+ url,
59
+ headers: {
60
+ 'User-Agent' => USER_AGENT,
61
+ 'PRIVATE-TOKEN' => token
62
+ }
63
+ )
64
+
65
+ raise_on_unauthorized_error!(response)
66
+ raise_on_internal_server_error!(response)
67
+ raise_on_too_many_requests!(response)
68
+
69
+ {
70
+ results: response.parsed_response,
71
+ ratelimit_remaining: response.headers["ratelimit-remaining"].to_i,
72
+ ratelimit_reset_at: Time.at(response.headers["ratelimit-reset"].to_i)
73
+ }
74
+ end
75
+
56
76
  private
57
77
 
58
78
  def raise_on_unauthorized_error!(response)
@@ -8,6 +8,7 @@ module Gitlab
8
8
  module Triage
9
9
  class OptionParser
10
10
  class << self
11
+ # rubocop:disable Metrics/AbcSize
11
12
  def parse(argv)
12
13
  options = Options.new
13
14
  options.host_url = 'https://gitlab.com'
@@ -89,9 +90,11 @@ module Gitlab
89
90
  parser.parse!(argv)
90
91
 
91
92
  options.source = nil if options.all
93
+ options.token ||= ''
92
94
 
93
95
  options
94
96
  end
97
+ # rubocop:enable Metrics/AbcSize
95
98
  end
96
99
  end
97
100
  end
@@ -56,13 +56,17 @@ module Gitlab
56
56
 
57
57
  def comment?
58
58
  # The actual keys are strings
59
- (actions.keys.map(&:to_sym) - [:summarize, :comment_on_summary]).any?
59
+ (actions.keys.map(&:to_sym) - [:summarize, :comment_on_summary, :delete, :issue]).any?
60
60
  end
61
61
 
62
62
  def issue?
63
63
  actions.key?(:issue)
64
64
  end
65
65
 
66
+ def delete?
67
+ actions.key?(:delete) && actions[:delete]
68
+ end
69
+
66
70
  def build_issue
67
71
  raise NotImplementedError
68
72
  end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base'
4
+ require_relative 'shared/issuable'
5
+
6
+ module Gitlab
7
+ module Triage
8
+ module Resource
9
+ class Branch < Base
10
+ end
11
+ end
12
+ end
13
+ end
@@ -6,6 +6,7 @@ require_relative 'issue'
6
6
  require_relative 'linked_issue'
7
7
  require_relative 'merge_request'
8
8
  require_relative 'instance_version'
9
+ require_relative 'branch'
9
10
 
10
11
  module Gitlab
11
12
  module Triage
@@ -9,6 +9,18 @@ module Gitlab
9
9
  class Issue < Base
10
10
  include Shared::Issuable
11
11
 
12
+ DATE_FIELDS = %i[
13
+ due_date
14
+ ].freeze
15
+
16
+ DATE_FIELDS.each do |field|
17
+ define_field(field) do
18
+ value = resource[field]
19
+
20
+ Date.parse(value) if value
21
+ end
22
+ end
23
+
12
24
  def merge_requests_count
13
25
  @merge_requests_count ||= resource.dig(:merge_requests_count)
14
26
  end
@@ -30,6 +42,10 @@ module Gitlab
30
42
  resource_url(sub_resource_type: 'links'))
31
43
  .map { |issue| LinkedIssue.new(issue, parent: self) }
32
44
  end
45
+
46
+ def expired?(today = Date.today)
47
+ due_date && due_date < today
48
+ end
33
49
  end
34
50
  end
35
51
  end
@@ -10,7 +10,6 @@ module Gitlab
10
10
  class RestAPINetwork
11
11
  include Retryable
12
12
 
13
- TokenNotFound = Class.new(StandardError)
14
13
  MINIMUM_RATE_LIMIT = 25
15
14
 
16
15
  attr_reader :options, :adapter
@@ -85,10 +84,25 @@ module Gitlab
85
84
  {}
86
85
  end
87
86
 
87
+ def delete_api(url)
88
+ response = execute_with_retry(
89
+ exception_types: Net::ReadTimeout,
90
+ backoff_exceptions: Errors::Network::TooManyRequests) do
91
+ puts Gitlab::Triage::UI.debug "delete_api: #{url}" if options.debug
92
+
93
+ @adapter.delete(token, url)
94
+ end
95
+
96
+ rate_limit_debug(response) if options.debug
97
+ rate_limit_wait(response)
98
+ rescue Net::ReadTimeout
99
+ {}
100
+ end
101
+
88
102
  private
89
103
 
90
104
  def token
91
- options.token || raise(TokenNotFound)
105
+ options.token
92
106
  end
93
107
 
94
108
  def rate_limit_debug(response)
@@ -34,6 +34,7 @@ module Gitlab
34
34
  def base_url
35
35
  url = host_with_api_url
36
36
  url << "/#{@source}/#{percent_encode(@source_id.to_s)}" unless @all
37
+ url << "/repository" if @resource_type == 'branches'
37
38
  url << "/#{@resource_type}" if @resource_type
38
39
  url
39
40
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Gitlab
4
4
  module Triage
5
- VERSION = '1.24.0'
5
+ VERSION = '1.26.0'
6
6
  end
7
7
  end
@@ -1,4 +1,4 @@
1
- image: ruby:2.4
1
+ image: ruby:2.7
2
2
 
3
3
  stages:
4
4
  - triage
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.24.0
4
+ version: 1.26.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - GitLab
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-09-21 00:00:00.000000000 Z
11
+ date: 2022-11-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -171,6 +171,7 @@ files:
171
171
  - lib/gitlab/triage/action/base.rb
172
172
  - lib/gitlab/triage/action/comment.rb
173
173
  - lib/gitlab/triage/action/comment_on_summary.rb
174
+ - lib/gitlab/triage/action/delete.rb
174
175
  - lib/gitlab/triage/action/issue.rb
175
176
  - lib/gitlab/triage/action/summarize.rb
176
177
  - lib/gitlab/triage/api_query_builders/base_query_param_builder.rb
@@ -197,6 +198,8 @@ files:
197
198
  - lib/gitlab/triage/filters/assignee_member_conditions_filter.rb
198
199
  - lib/gitlab/triage/filters/author_member_conditions_filter.rb
199
200
  - lib/gitlab/triage/filters/base_conditions_filter.rb
201
+ - lib/gitlab/triage/filters/branch_date_filter.rb
202
+ - lib/gitlab/triage/filters/branch_protected_filter.rb
200
203
  - lib/gitlab/triage/filters/discussions_conditions_filter.rb
201
204
  - lib/gitlab/triage/filters/member_conditions_filter.rb
202
205
  - lib/gitlab/triage/filters/merge_request_date_conditions_filter.rb
@@ -225,6 +228,7 @@ files:
225
228
  - lib/gitlab/triage/policies_resources/rule_resources.rb
226
229
  - lib/gitlab/triage/policies_resources/summary_resources.rb
227
230
  - lib/gitlab/triage/resource/base.rb
231
+ - lib/gitlab/triage/resource/branch.rb
228
232
  - lib/gitlab/triage/resource/context.rb
229
233
  - lib/gitlab/triage/resource/epic.rb
230
234
  - lib/gitlab/triage/resource/instance_version.rb