dependabot-common 0.291.0 → 0.293.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: cebae8e92439e403f480e7ffdcdb009582b7d5e196322fbdab8005048e77b05b
4
- data.tar.gz: 724f55170bf99cb90ef277776daed5415e6bdb6ed3dd30bde35e849711e7b68f
3
+ metadata.gz: 0b4d27736af7c39344d1d7b96954789a59840fc8babfb779a4b88e267170f1db
4
+ data.tar.gz: d61444a31fafe63b7704284f8c0d67b3ac1a8cac53284221c21fa32bdd1dc799
5
5
  SHA512:
6
- metadata.gz: 127292cb53f8677d645cd9a51e89d16babcdacf8d5455c89e442c3022e728597142426ec88362e81082dbe8825ab5e4639f0f98600c644a7294ab9551d329931
7
- data.tar.gz: ff5478b081ce3e05babd84dbc2f6730260dd73e676c093655d7c5577f6e45c0b9db9d9da328c6fef5b485e4446f8e2da6d21db7d270692ac6f57e11051c8bd02
6
+ metadata.gz: 49f0a7dd758a5329ead57e18df49bf954fa2220582695cc9fed271d60eb9642fe72bc9154663454533c7703436733a6622635c43f54b0578736c17e4a20e5631
7
+ data.tar.gz: 6e43c31f3902f35f53e2edaec282519c8c97fba6a0db1e36a2e39513d16d5882d9fb33d4a66f7515280c957309593b69af6d12624a23c399e71ca90c1a67ffbd
@@ -32,6 +32,10 @@ module Dependabot
32
32
  normalizer = name_normaliser_for(dependency)
33
33
  dep_name = T.must(normalizer).call(dependency.name)
34
34
 
35
+ if dependency.version.nil? && dependency.requirements.any?
36
+ dependency = extract_base_version_from_requirement(dependency)
37
+ end
38
+
35
39
  @ignore_conditions
36
40
  .select { |ic| self.class.wildcard_match?(T.must(normalizer).call(ic.dependency_name), dep_name) }
37
41
  .map { |ic| ic.ignored_versions(dependency, security_updates_only) }
@@ -40,6 +44,19 @@ module Dependabot
40
44
  .uniq
41
45
  end
42
46
 
47
+ sig { params(dependency: Dependency).returns(Dependency) }
48
+ def extract_base_version_from_requirement(dependency)
49
+ requirements = dependency.requirements
50
+ requirement = T.must(requirements.first)[:requirement]
51
+ version = requirement&.match(/\d+\.\d+\.\d+/)&.to_s
52
+ Dependabot::Dependency.new(
53
+ name: dependency.name,
54
+ version: version,
55
+ requirements: dependency.requirements,
56
+ package_manager: dependency.package_manager
57
+ )
58
+ end
59
+
43
60
  sig { params(wildcard_string: T.nilable(String), candidate_string: T.nilable(String)).returns(T::Boolean) }
44
61
  def self.wildcard_match?(wildcard_string, candidate_string)
45
62
  return false unless wildcard_string && candidate_string
@@ -17,30 +17,38 @@ module Dependabot
17
17
  abstract!
18
18
  # Initialize version information for a package manager or language.
19
19
  # @param name [String] the name of the package manager or language (e.g., "bundler", "ruby").
20
- # @param version [Dependabot::Version] the parsed current version.
20
+ # @param detected_version [Dependabot::Version] the detected version of the package manager or language.
21
+ # @param version [Dependabot::Version] the version dependabots run on.
21
22
  # @param deprecated_versions [Array<Dependabot::Version>] an array of deprecated versions.
22
23
  # @param supported_versions [Array<Dependabot::Version>] an array of supported versions.
23
24
  # @param requirement [Dependabot::Requirement] an array of requirements.
24
25
  # @example
25
- # VersionManager.new("bundler", "2.1.4", nil)
26
+ # VersionManager.new(
27
+ # name: "bundler",
28
+ # version: Version.new("2.1.4"),
29
+ # requirement: nil
30
+ # )
26
31
  sig do
27
32
  params(
28
33
  name: String,
29
- version: Dependabot::Version,
34
+ detected_version: T.nilable(Dependabot::Version),
35
+ version: T.nilable(Dependabot::Version),
30
36
  deprecated_versions: T::Array[Dependabot::Version],
31
37
  supported_versions: T::Array[Dependabot::Version],
32
38
  requirement: T.nilable(Dependabot::Requirement)
33
39
  ).void
34
40
  end
35
41
  def initialize(
36
- name,
37
- version,
38
- deprecated_versions = [],
39
- supported_versions = [],
40
- requirement = nil
42
+ name:,
43
+ detected_version: nil,
44
+ version: nil,
45
+ deprecated_versions: [],
46
+ supported_versions: [],
47
+ requirement: nil
41
48
  )
42
49
  @name = T.let(name, String)
43
- @version = T.let(version, Dependabot::Version)
50
+ @detected_version = T.let(detected_version || version, T.nilable(Dependabot::Version))
51
+ @version = T.let(version, T.nilable(Dependabot::Version))
44
52
  @deprecated_versions = T.let(deprecated_versions, T::Array[Dependabot::Version])
45
53
  @supported_versions = T.let(supported_versions, T::Array[Dependabot::Version])
46
54
  @requirement = T.let(requirement, T.nilable(Dependabot::Requirement))
@@ -52,10 +60,16 @@ module Dependabot
52
60
  sig { returns(String) }
53
61
  attr_reader :name
54
62
 
63
+ # The current version of the package manager or language.
64
+ # @example
65
+ # detected_version #=> Dependabot::Version.new("2")
66
+ sig { returns(T.nilable(Dependabot::Version)) }
67
+ attr_reader :detected_version
68
+
55
69
  # The current version of the package manager or language.
56
70
  # @example
57
71
  # version #=> Dependabot::Version.new("2.1.4")
58
- sig { returns(Dependabot::Version) }
72
+ sig { returns(T.nilable(Dependabot::Version)) }
59
73
  attr_reader :version
60
74
 
61
75
  # Returns an array of deprecated versions of the package manager.
@@ -76,16 +90,34 @@ module Dependabot
76
90
  sig { returns(T.nilable(Dependabot::Requirement)) }
77
91
  attr_reader :requirement
78
92
 
93
+ # The version of the package manager or language as a string.
94
+ # @example
95
+ # version_to_s #=> "2.1"
96
+ sig { returns(String) }
97
+ def version_to_s
98
+ version.to_s
99
+ end
100
+
101
+ # The raw version of the package manager or language.
102
+ # @example
103
+ # raw_version #=> "2.1.4"
104
+ sig { returns(String) }
105
+ def version_to_raw_s
106
+ version&.to_semver.to_s
107
+ end
108
+
79
109
  # Checks if the current version is deprecated.
80
110
  # Returns true if the version is in the deprecated_versions array; false otherwise.
81
111
  # @example
82
112
  # deprecated? #=> true
83
113
  sig { returns(T::Boolean) }
84
114
  def deprecated?
115
+ return false unless detected_version
116
+
85
117
  # If the version is unsupported, the unsupported error is getting raised separately.
86
118
  return false if unsupported?
87
119
 
88
- deprecated_versions.include?(version)
120
+ deprecated_versions.include?(detected_version)
89
121
  end
90
122
 
91
123
  # Checks if the current version is unsupported.
@@ -93,16 +125,20 @@ module Dependabot
93
125
  # unsupported? #=> false
94
126
  sig { returns(T::Boolean) }
95
127
  def unsupported?
128
+ return false unless detected_version
129
+
96
130
  return false if supported_versions.empty?
97
131
 
98
132
  # Check if the version is not supported
99
- supported_versions.all? { |supported| supported > version }
133
+ supported_versions.all? { |supported| supported > detected_version }
100
134
  end
101
135
 
102
136
  # Raises an error if the current package manager or language version is unsupported.
103
137
  # If the version is unsupported, it raises a ToolVersionNotSupported error.
104
138
  sig { void }
105
139
  def raise_if_unsupported!
140
+ return unless detected_version
141
+
106
142
  return unless unsupported?
107
143
 
108
144
  # Example: v2.*, v3.*
@@ -110,7 +146,7 @@ module Dependabot
110
146
 
111
147
  raise ToolVersionNotSupported.new(
112
148
  name,
113
- version.to_s,
149
+ detected_version.to_s,
114
150
  supported_versions_message
115
151
  )
116
152
  end
@@ -83,6 +83,11 @@ module Dependabot
83
83
  # and responsibility for fixing it is on them, not us. As a result we
84
84
  # quietly log these as errors
85
85
  { "error-type": "server_error" }
86
+ when BadRequirementError
87
+ {
88
+ "error-type": "illformed_requirement",
89
+ "error-detail": { message: error.message }
90
+ }
86
91
  when *Octokit::RATE_LIMITED_ERRORS
87
92
  # If we get a rate-limited error we let dependabot-api handle the
88
93
  # retry by re-enqueing the update job after the reset
@@ -144,11 +149,6 @@ module Dependabot
144
149
  "error-type": "git_dependencies_not_reachable",
145
150
  "error-detail": { "dependency-urls": error.dependency_urls }
146
151
  }
147
- when Dependabot::UnresolvableVersionError
148
- {
149
- "error-type": "unresolvable_version",
150
- "error-detail": { dependencies: error.dependencies }
151
- }
152
152
  when Dependabot::NotImplemented
153
153
  {
154
154
  "error-type": "not_implemented",
@@ -166,6 +166,7 @@ module Dependabot
166
166
 
167
167
  # rubocop:disable Lint/RedundantCopDisableDirective
168
168
  # rubocop:disable Metrics/CyclomaticComplexity
169
+ # rubocop:disable Metrics/AbcSize
169
170
  sig { params(error: StandardError).returns(T.nilable(T::Hash[Symbol, T.untyped])) }
170
171
  def self.updater_error_details(error)
171
172
  case error
@@ -179,6 +180,14 @@ module Dependabot
179
180
  "error-type": "dependency_file_not_evaluatable",
180
181
  "error-detail": { message: error.message }
181
182
  }
183
+ when Dependabot::DependencyFileNotParseable
184
+ {
185
+ "error-type": "dependency_file_not_parseable",
186
+ "error-detail": {
187
+ message: error.message,
188
+ "file-path": error.file_path
189
+ }
190
+ }
182
191
  when Dependabot::GitDependenciesNotReachable
183
192
  {
184
193
  "error-type": "git_dependencies_not_reachable",
@@ -294,6 +303,7 @@ module Dependabot
294
303
  # rubocop:enable Metrics/MethodLength
295
304
  # rubocop:enable Metrics/CyclomaticComplexity
296
305
  # rubocop:enable Lint/RedundantCopDisableDirective
306
+ # rubocop:enable Metrics/AbcSize
297
307
 
298
308
  class DependabotError < StandardError
299
309
  extend T::Sig
@@ -666,23 +676,6 @@ module Dependabot
666
676
  end
667
677
  end
668
678
 
669
- class UnresolvableVersionError < DependabotError
670
- extend T::Sig
671
-
672
- sig { returns(T::Array[String]) }
673
- attr_reader :dependencies
674
-
675
- sig { params(dependencies: T::Array[String]).void }
676
- def initialize(dependencies)
677
- @dependencies = dependencies
678
-
679
- msg = "Unable to determine semantic version from tags or commits for dependencies. " \
680
- "Dependencies must have a tag or commit that references a semantic version. " \
681
- "Affected dependencies: #{@dependencies.join(', ')}"
682
- super(msg)
683
- end
684
- end
685
-
686
679
  class GitDependenciesNotReachable < DependabotError
687
680
  extend T::Sig
688
681
 
@@ -311,7 +311,7 @@ module Dependabot
311
311
 
312
312
  SharedHelpers.with_git_configured(credentials: credentials) do
313
313
  Dir.chdir(T.must(repo_contents_path)) do
314
- return SharedHelpers.run_shell_command("git rev-parse HEAD").strip
314
+ return SharedHelpers.run_shell_command("git rev-parse HEAD", stderr_to_stdout: false).strip
315
315
  end
316
316
  end
317
317
  end
@@ -71,15 +71,20 @@ module Dependabot
71
71
  # Generates a description for supported versions.
72
72
  # @param supported_versions [Array<Dependabot::Version>, nil] The supported versions of the package manager.
73
73
  # @param support_later_versions [Boolean] Whether later versions are supported.
74
+ # @param version_manager_type [Symbol] The type of entity being deprecated i.e. :language or :package_manager
74
75
  # @return [String, nil] The generated description or nil if no supported versions are provided.
75
76
  sig do
76
77
  params(
77
78
  supported_versions: T.nilable(T::Array[Dependabot::Version]),
78
- support_later_versions: T::Boolean
79
+ support_later_versions: T::Boolean,
80
+ version_manager_type: Symbol
79
81
  ).returns(String)
80
82
  end
81
- def self.generate_supported_versions_description(supported_versions, support_later_versions)
82
- return "Please upgrade your package manager version" unless supported_versions&.any?
83
+ def self.generate_supported_versions_description(
84
+ supported_versions, support_later_versions, version_manager_type = :package_manager
85
+ )
86
+ entity_text = version_manager_type == :language ? "language" : "package manager"
87
+ return "Please upgrade your #{entity_text} version" unless supported_versions&.any?
83
88
 
84
89
  versions_string = supported_versions.map { |version| "`v#{version}`" }
85
90
 
@@ -94,25 +99,28 @@ module Dependabot
94
99
  "Please upgrade to one of the following versions: #{versions_string}#{later_description}."
95
100
  end
96
101
 
97
- # Generates a deprecation notice for the given package manager.
98
- # @param package_manager [VersionManager] The package manager object.
99
- # @return [Notice, nil] The generated deprecation notice or nil if the package manager is not deprecated.
102
+ # Generates a deprecation notice for the given version manager.
103
+ # @param version_manager [VersionManager] The version manager object.
104
+ # @param version_manager_type [Symbol] The version manager type e.g. :language or :package_manager
105
+ # @return [Notice, nil] The generated deprecation notice or nil if the version manager is not deprecated.
100
106
  sig do
101
107
  params(
102
- package_manager: Ecosystem::VersionManager
108
+ version_manager: Ecosystem::VersionManager,
109
+ version_manager_type: Symbol
103
110
  ).returns(T.nilable(Notice))
104
111
  end
105
- def self.generate_pm_deprecation_notice(package_manager)
106
- return nil unless package_manager.deprecated?
112
+ def self.generate_deprecation_notice(version_manager, version_manager_type = :package_manager)
113
+ return nil unless version_manager.deprecated?
107
114
 
108
115
  mode = NoticeMode::WARN
109
116
  supported_versions_description = generate_supported_versions_description(
110
- package_manager.supported_versions,
111
- package_manager.support_later_versions?
117
+ version_manager.supported_versions,
118
+ version_manager.support_later_versions?,
119
+ version_manager_type
112
120
  )
113
- notice_type = "#{package_manager.name}_deprecated_warn"
114
- title = "Package manager deprecation notice"
115
- description = "Dependabot will stop supporting `#{package_manager.name} v#{package_manager.version}`!"
121
+ notice_type = "#{version_manager.name}_deprecated_warn"
122
+ title = version_manager_type == :language ? "Language deprecation notice" : "Package manager deprecation notice"
123
+ description = "Dependabot will stop supporting `#{version_manager.name} v#{version_manager.detected_version}`!"
116
124
 
117
125
  ## Add the supported versions to the description
118
126
  description += "\n\n#{supported_versions_description}\n" unless supported_versions_description.empty?
@@ -120,7 +128,7 @@ module Dependabot
120
128
  Notice.new(
121
129
  mode: mode,
122
130
  type: notice_type,
123
- package_manager_name: package_manager.name,
131
+ package_manager_name: version_manager.name,
124
132
  title: title,
125
133
  description: description,
126
134
  show_in_pr: true,
@@ -8,9 +8,6 @@ module Dependabot
8
8
  class ChangeAttempt
9
9
  extend T::Sig
10
10
 
11
- sig { returns(T.nilable(String)) }
12
- attr_reader :diff
13
-
14
11
  sig { returns(T.nilable(StandardError)) }
15
12
  attr_reader :error
16
13
 
@@ -28,15 +25,13 @@ module Dependabot
28
25
  workspace: Dependabot::Workspace::Base,
29
26
  id: String,
30
27
  memo: T.nilable(String),
31
- diff: T.nilable(String),
32
28
  error: T.nilable(StandardError)
33
29
  ).void
34
30
  end
35
- def initialize(workspace, id:, memo:, diff: nil, error: nil)
31
+ def initialize(workspace, id:, memo:, error: nil)
36
32
  @workspace = workspace
37
33
  @id = id
38
34
  @memo = memo
39
- @diff = diff
40
35
  @error = error
41
36
  end
42
37
 
@@ -56,9 +56,9 @@ module Dependabot
56
56
  return nil if changed_files(ignored_mode: "no").empty?
57
57
 
58
58
  debug("store_change - before: #{current_commit}")
59
- sha, diff = commit(memo)
59
+ sha = commit(memo)
60
60
 
61
- change_attempts << ChangeAttempt.new(self, id: sha, memo: memo, diff: diff)
61
+ change_attempts << ChangeAttempt.new(self, id: sha, memo: memo)
62
62
  ensure
63
63
  debug("store_change - after: #{current_commit}")
64
64
  end
@@ -73,8 +73,8 @@ module Dependabot
73
73
  def capture_failed_change_attempt(memo = nil, error = nil)
74
74
  return nil if changed_files(ignored_mode: "matching").empty? && error.nil?
75
75
 
76
- sha, diff = stash(memo)
77
- change_attempts << ChangeAttempt.new(self, id: sha, memo: memo, diff: diff, error: error)
76
+ sha = stash(memo)
77
+ change_attempts << ChangeAttempt.new(self, id: sha, memo: memo, error: error)
78
78
  end
79
79
 
80
80
  private
@@ -87,7 +87,7 @@ module Dependabot
87
87
 
88
88
  sig { returns(String) }
89
89
  def head_sha
90
- run_shell_command("git rev-parse HEAD").strip
90
+ run_shell_command("git rev-parse HEAD", stderr_to_stdout: false).strip
91
91
  end
92
92
 
93
93
  sig { returns(String) }
@@ -112,7 +112,7 @@ module Dependabot
112
112
  ).strip
113
113
  end
114
114
 
115
- sig { params(memo: T.nilable(String)).returns([String, String]) }
115
+ sig { params(memo: T.nilable(String)).returns(String) }
116
116
  def stash(memo = nil)
117
117
  msg = memo || "workspace change attempt"
118
118
  run_shell_command("git add --all --force .")
@@ -122,19 +122,12 @@ module Dependabot
122
122
  allow_unsafe_shell_command: true
123
123
  )
124
124
 
125
- sha = last_stash_sha
126
- diff = run_shell_command(
127
- "git stash show --patch #{sha}",
128
- fingerprint: "git stash show --patch <sha>"
129
- )
130
-
131
- [sha, diff]
125
+ last_stash_sha
132
126
  end
133
127
 
134
- sig { params(memo: T.nilable(String)).returns([String, String]) }
128
+ sig { params(memo: T.nilable(String)).returns(String) }
135
129
  def commit(memo = nil)
136
130
  run_shell_command("git add #{path}")
137
- diff = run_shell_command("git diff --cached .")
138
131
 
139
132
  msg = memo || "workspace change"
140
133
  run_shell_command(
@@ -143,7 +136,7 @@ module Dependabot
143
136
  allow_unsafe_shell_command: true
144
137
  )
145
138
 
146
- [head_sha, diff]
139
+ head_sha
147
140
  end
148
141
 
149
142
  sig { params(sha: String).returns(String) }
data/lib/dependabot.rb CHANGED
@@ -2,5 +2,5 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  module Dependabot
5
- VERSION = "0.291.0"
5
+ VERSION = "0.293.0"
6
6
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dependabot-common
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.291.0
4
+ version: 0.293.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dependabot
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-12-19 00:00:00.000000000 Z
11
+ date: 2025-01-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-sdk-codecommit
@@ -615,7 +615,7 @@ licenses:
615
615
  - MIT
616
616
  metadata:
617
617
  bug_tracker_uri: https://github.com/dependabot/dependabot-core/issues
618
- changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.291.0
618
+ changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.293.0
619
619
  post_install_message:
620
620
  rdoc_options: []
621
621
  require_paths:
@@ -631,7 +631,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
631
631
  - !ruby/object:Gem::Version
632
632
  version: 3.3.7
633
633
  requirements: []
634
- rubygems_version: 3.5.9
634
+ rubygems_version: 3.5.22
635
635
  signing_key:
636
636
  specification_version: 4
637
637
  summary: Shared code used across Dependabot Core