dependabot-nix 0.367.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 +7 -0
- data/lib/dependabot/nix/file_fetcher.rb +66 -0
- data/lib/dependabot/nix/file_parser.rb +215 -0
- data/lib/dependabot/nix/file_updater.rb +81 -0
- data/lib/dependabot/nix/metadata_finder.rb +27 -0
- data/lib/dependabot/nix/package/package_details_fetcher.rb +142 -0
- data/lib/dependabot/nix/package_manager.rb +39 -0
- data/lib/dependabot/nix/requirement.rb +32 -0
- data/lib/dependabot/nix/update_checker/latest_version_finder.rb +60 -0
- data/lib/dependabot/nix/update_checker.rb +78 -0
- data/lib/dependabot/nix/version.rb +15 -0
- data/lib/dependabot/nix.rb +20 -0
- metadata +278 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: d96dbad7c99a3d367400e75f35924e09780a520b1bad0d75f3a09b1fd3dbcc61
|
|
4
|
+
data.tar.gz: 3075e3e0e369bfc2a6430770f31386d80501dee1a1fb3e99581668190779ad3a
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 7b7ce4e11d73728346b66072626e0e7dd495b5fc5933dc605f2e864f8f601cc935448e3f1dc271ca3f06d6f4e3fcdc97218c9d1f95d7e7e1c054c9c4881ce792
|
|
7
|
+
data.tar.gz: 7ef644ba8f2b8fd863f1f05903fc58ed0552ae408118f416ebfcd7986bc4f913e9bd6714090307a88b46cd421d6aec3ea5710d6ca8667efde7b5804d37d9b113
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# typed: strong
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
require "sorbet-runtime"
|
|
5
|
+
require "dependabot/file_fetchers"
|
|
6
|
+
require "dependabot/file_fetchers/base"
|
|
7
|
+
|
|
8
|
+
module Dependabot
|
|
9
|
+
module Nix
|
|
10
|
+
class FileFetcher < Dependabot::FileFetchers::Base
|
|
11
|
+
extend T::Sig
|
|
12
|
+
|
|
13
|
+
sig { override.params(filenames: T::Array[String]).returns(T::Boolean) }
|
|
14
|
+
def self.required_files_in?(filenames)
|
|
15
|
+
filenames.include?("flake.nix") && filenames.include?("flake.lock")
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
sig { override.returns(String) }
|
|
19
|
+
def self.required_files_message
|
|
20
|
+
"Repo must contain a flake.nix and flake.lock file."
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
sig { override.returns(T::Array[DependencyFile]) }
|
|
24
|
+
def fetch_files
|
|
25
|
+
unless allow_beta_ecosystems?
|
|
26
|
+
raise Dependabot::DependencyFileNotFound.new(
|
|
27
|
+
nil,
|
|
28
|
+
"Nix support is currently in beta. Set ALLOW_BETA_ECOSYSTEMS=true to enable it."
|
|
29
|
+
)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
fetched_files = []
|
|
33
|
+
fetched_files << flake_nix
|
|
34
|
+
fetched_files << flake_lock
|
|
35
|
+
fetched_files
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
sig { override.returns(T.nilable(T::Hash[Symbol, T.untyped])) }
|
|
39
|
+
def ecosystem_versions
|
|
40
|
+
nil
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
private
|
|
44
|
+
|
|
45
|
+
sig { returns(Dependabot::DependencyFile) }
|
|
46
|
+
def flake_nix
|
|
47
|
+
@flake_nix ||=
|
|
48
|
+
T.let(
|
|
49
|
+
fetch_file_from_host("flake.nix"),
|
|
50
|
+
T.nilable(Dependabot::DependencyFile)
|
|
51
|
+
)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
sig { returns(Dependabot::DependencyFile) }
|
|
55
|
+
def flake_lock
|
|
56
|
+
@flake_lock ||=
|
|
57
|
+
T.let(
|
|
58
|
+
fetch_file_from_host("flake.lock"),
|
|
59
|
+
T.nilable(Dependabot::DependencyFile)
|
|
60
|
+
)
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
Dependabot::FileFetchers.register("nix", Dependabot::Nix::FileFetcher)
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
# typed: strict
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
require "json"
|
|
5
|
+
require "sorbet-runtime"
|
|
6
|
+
|
|
7
|
+
require "dependabot/dependency"
|
|
8
|
+
require "dependabot/file_parsers"
|
|
9
|
+
require "dependabot/file_parsers/base"
|
|
10
|
+
require "dependabot/shared_helpers"
|
|
11
|
+
require "dependabot/nix/package_manager"
|
|
12
|
+
|
|
13
|
+
module Dependabot
|
|
14
|
+
module Nix
|
|
15
|
+
class FileParser < Dependabot::FileParsers::Base
|
|
16
|
+
extend T::Sig
|
|
17
|
+
|
|
18
|
+
# Source types that are backed by git and can be updated via revision tracking
|
|
19
|
+
SUPPORTED_SOURCE_TYPES = T.let(%w(github gitlab sourcehut git).freeze, T::Array[String])
|
|
20
|
+
|
|
21
|
+
SUPPORTED_LOCK_VERSION = 7
|
|
22
|
+
|
|
23
|
+
DEFAULT_HOSTS = T.let(
|
|
24
|
+
{
|
|
25
|
+
"github" => "github.com",
|
|
26
|
+
"gitlab" => "gitlab.com",
|
|
27
|
+
"sourcehut" => "git.sr.ht"
|
|
28
|
+
}.freeze,
|
|
29
|
+
T::Hash[String, String]
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
sig { override.returns(T::Array[Dependabot::Dependency]) }
|
|
33
|
+
def parse
|
|
34
|
+
lock_content = JSON.parse(T.must(flake_lock.content))
|
|
35
|
+
|
|
36
|
+
lock_version = lock_content["version"]
|
|
37
|
+
if lock_version != SUPPORTED_LOCK_VERSION
|
|
38
|
+
Dependabot.logger.warn(
|
|
39
|
+
"flake.lock version #{lock_version.inspect} differs from expected #{SUPPORTED_LOCK_VERSION}"
|
|
40
|
+
)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
root_name = lock_content.fetch("root", "root")
|
|
44
|
+
nodes = lock_content.fetch("nodes", {})
|
|
45
|
+
root_node = nodes.fetch(root_name, {})
|
|
46
|
+
root_inputs = root_node.fetch("inputs", {})
|
|
47
|
+
|
|
48
|
+
root_inputs.filter_map do |input_name, node_label|
|
|
49
|
+
node = resolve_node(node_label, nodes)
|
|
50
|
+
next unless node
|
|
51
|
+
|
|
52
|
+
build_dependency(input_name, node)
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
sig { returns(Ecosystem) }
|
|
57
|
+
def ecosystem
|
|
58
|
+
@ecosystem ||= T.let(
|
|
59
|
+
Ecosystem.new(
|
|
60
|
+
name: ECOSYSTEM,
|
|
61
|
+
package_manager: package_manager
|
|
62
|
+
),
|
|
63
|
+
T.nilable(Dependabot::Ecosystem)
|
|
64
|
+
)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
private
|
|
68
|
+
|
|
69
|
+
# Resolves a node_label to its node in the lock file.
|
|
70
|
+
# node_label is either a string (direct reference) or an array ("follows" path
|
|
71
|
+
# that must be walked through nested inputs maps).
|
|
72
|
+
sig do
|
|
73
|
+
params(
|
|
74
|
+
node_label: T.any(String, T::Array[String]),
|
|
75
|
+
nodes: T::Hash[String, T.untyped]
|
|
76
|
+
).returns(T.nilable(T::Hash[String, T.untyped]))
|
|
77
|
+
end
|
|
78
|
+
def resolve_node(node_label, nodes)
|
|
79
|
+
return nodes[node_label] unless node_label.is_a?(Array)
|
|
80
|
+
return nil if node_label.empty?
|
|
81
|
+
|
|
82
|
+
# Walk the "follows" path: e.g. ["nixpkgs", "flake-utils"] means
|
|
83
|
+
# follow root -> nixpkgs node -> its inputs -> flake-utils
|
|
84
|
+
resolved_label = resolve_follows_path(node_label, nodes)
|
|
85
|
+
resolved_label ? nodes[resolved_label] : nil
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# Walks a "follows" path through nested inputs to find the final node label.
|
|
89
|
+
sig do
|
|
90
|
+
params(
|
|
91
|
+
path: T::Array[String],
|
|
92
|
+
nodes: T::Hash[String, T.untyped]
|
|
93
|
+
).returns(T.nilable(String))
|
|
94
|
+
end
|
|
95
|
+
def resolve_follows_path(path, nodes)
|
|
96
|
+
current_node_label = T.let(nil, T.nilable(String))
|
|
97
|
+
|
|
98
|
+
path.each_with_index do |segment, index|
|
|
99
|
+
# For the first segment, look up in the root's inputs via nodes directly
|
|
100
|
+
target = if index.zero?
|
|
101
|
+
# The first segment references a top-level node by name
|
|
102
|
+
segment
|
|
103
|
+
else
|
|
104
|
+
# Subsequent segments look up inputs within the current node
|
|
105
|
+
node = nodes[T.must(current_node_label)]
|
|
106
|
+
return nil unless node.is_a?(Hash)
|
|
107
|
+
|
|
108
|
+
inputs = node.fetch("inputs", nil)
|
|
109
|
+
return nil unless inputs.is_a?(Hash)
|
|
110
|
+
|
|
111
|
+
label = inputs[segment]
|
|
112
|
+
return nil unless label.is_a?(String)
|
|
113
|
+
|
|
114
|
+
label
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
current_node_label = target
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
current_node_label
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
sig do
|
|
124
|
+
params(
|
|
125
|
+
input_name: String,
|
|
126
|
+
node: T::Hash[String, T.untyped]
|
|
127
|
+
).returns(T.nilable(Dependabot::Dependency))
|
|
128
|
+
end
|
|
129
|
+
def build_dependency(input_name, node)
|
|
130
|
+
locked = node.fetch("locked", nil)
|
|
131
|
+
original = node.fetch("original", nil)
|
|
132
|
+
return unless locked && original
|
|
133
|
+
|
|
134
|
+
source_type = locked.fetch("type", nil)
|
|
135
|
+
return unless SUPPORTED_SOURCE_TYPES.include?(source_type)
|
|
136
|
+
|
|
137
|
+
rev = locked.fetch("rev", nil)
|
|
138
|
+
return unless rev
|
|
139
|
+
|
|
140
|
+
url = build_url(locked)
|
|
141
|
+
return unless url
|
|
142
|
+
|
|
143
|
+
ref = original.fetch("ref", nil)
|
|
144
|
+
|
|
145
|
+
Dependency.new(
|
|
146
|
+
name: input_name,
|
|
147
|
+
version: rev,
|
|
148
|
+
package_manager: "nix",
|
|
149
|
+
requirements: [{
|
|
150
|
+
requirement: nil,
|
|
151
|
+
file: "flake.lock",
|
|
152
|
+
source: { type: "git", url: url, branch: ref, ref: ref },
|
|
153
|
+
groups: []
|
|
154
|
+
}]
|
|
155
|
+
)
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
sig { params(locked: T::Hash[String, T.untyped]).returns(T.nilable(String)) }
|
|
159
|
+
def build_url(locked)
|
|
160
|
+
case locked["type"]
|
|
161
|
+
when "github"
|
|
162
|
+
host = locked["host"] || DEFAULT_HOSTS["github"]
|
|
163
|
+
"https://#{host}/#{locked['owner']}/#{locked['repo']}"
|
|
164
|
+
when "gitlab"
|
|
165
|
+
host = locked["host"] || DEFAULT_HOSTS["gitlab"]
|
|
166
|
+
"https://#{host}/#{locked['owner']}/#{locked['repo']}"
|
|
167
|
+
when "sourcehut"
|
|
168
|
+
host = locked["host"] || DEFAULT_HOSTS["sourcehut"]
|
|
169
|
+
"https://#{host}/~#{locked['owner']}/#{locked['repo']}"
|
|
170
|
+
when "git"
|
|
171
|
+
locked["url"]
|
|
172
|
+
end
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
sig { returns(Dependabot::DependencyFile) }
|
|
176
|
+
def flake_lock
|
|
177
|
+
@flake_lock ||=
|
|
178
|
+
T.let(
|
|
179
|
+
T.must(get_original_file("flake.lock")),
|
|
180
|
+
T.nilable(Dependabot::DependencyFile)
|
|
181
|
+
)
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
sig { override.void }
|
|
185
|
+
def check_required_files
|
|
186
|
+
%w(flake.nix flake.lock).each do |filename|
|
|
187
|
+
raise "No #{filename}!" unless get_original_file(filename)
|
|
188
|
+
end
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
sig { returns(Ecosystem::VersionManager) }
|
|
192
|
+
def package_manager
|
|
193
|
+
@package_manager ||= T.let(
|
|
194
|
+
PackageManager.new(T.must(nix_version)),
|
|
195
|
+
T.nilable(Dependabot::Nix::PackageManager)
|
|
196
|
+
)
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
sig { returns(T.nilable(String)) }
|
|
200
|
+
def nix_version
|
|
201
|
+
@nix_version ||= T.let(
|
|
202
|
+
begin
|
|
203
|
+
version_output = SharedHelpers.run_shell_command("nix --version")
|
|
204
|
+
version_output.match(/nix.*?(\d+\.\d+[\.\d]*)/)&.captures&.first || "0.0.0"
|
|
205
|
+
rescue StandardError
|
|
206
|
+
"0.0.0"
|
|
207
|
+
end,
|
|
208
|
+
T.nilable(String)
|
|
209
|
+
)
|
|
210
|
+
end
|
|
211
|
+
end
|
|
212
|
+
end
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
Dependabot::FileParsers.register("nix", Dependabot::Nix::FileParser)
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# typed: strong
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
require "sorbet-runtime"
|
|
5
|
+
|
|
6
|
+
require "dependabot/errors"
|
|
7
|
+
require "dependabot/file_updaters"
|
|
8
|
+
require "dependabot/file_updaters/base"
|
|
9
|
+
require "dependabot/shared_helpers"
|
|
10
|
+
|
|
11
|
+
module Dependabot
|
|
12
|
+
module Nix
|
|
13
|
+
class FileUpdater < Dependabot::FileUpdaters::Base
|
|
14
|
+
extend T::Sig
|
|
15
|
+
|
|
16
|
+
sig { override.returns(T::Array[Dependabot::DependencyFile]) }
|
|
17
|
+
def updated_dependency_files
|
|
18
|
+
updated_lockfile_content = update_flake_lock
|
|
19
|
+
|
|
20
|
+
if updated_lockfile_content == flake_lock.content
|
|
21
|
+
raise Dependabot::DependencyFileContentNotChanged,
|
|
22
|
+
"Expected flake.lock to change for #{dependency.name}, but it didn't"
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
[updated_file(file: flake_lock, content: updated_lockfile_content)]
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
private
|
|
29
|
+
|
|
30
|
+
sig { returns(Dependabot::Dependency) }
|
|
31
|
+
def dependency
|
|
32
|
+
T.must(dependencies.first)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
sig { returns(String) }
|
|
36
|
+
def update_flake_lock
|
|
37
|
+
SharedHelpers.in_a_temporary_repo_directory(
|
|
38
|
+
flake_lock.directory,
|
|
39
|
+
repo_contents_path
|
|
40
|
+
) do
|
|
41
|
+
File.write("flake.nix", T.must(flake_nix.content))
|
|
42
|
+
File.write("flake.lock", T.must(flake_lock.content))
|
|
43
|
+
|
|
44
|
+
SharedHelpers.run_shell_command(
|
|
45
|
+
"nix flake update #{dependency.name}",
|
|
46
|
+
fingerprint: "nix flake update <input_name>"
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
File.read("flake.lock")
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
sig { override.void }
|
|
54
|
+
def check_required_files
|
|
55
|
+
%w(flake.nix flake.lock).each do |filename|
|
|
56
|
+
raise "No #{filename}!" unless get_original_file(filename)
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
sig { returns(Dependabot::DependencyFile) }
|
|
61
|
+
def flake_lock
|
|
62
|
+
@flake_lock ||=
|
|
63
|
+
T.let(
|
|
64
|
+
T.must(get_original_file("flake.lock")),
|
|
65
|
+
T.nilable(Dependabot::DependencyFile)
|
|
66
|
+
)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
sig { returns(Dependabot::DependencyFile) }
|
|
70
|
+
def flake_nix
|
|
71
|
+
@flake_nix ||=
|
|
72
|
+
T.let(
|
|
73
|
+
T.must(get_original_file("flake.nix")),
|
|
74
|
+
T.nilable(Dependabot::DependencyFile)
|
|
75
|
+
)
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
Dependabot::FileUpdaters.register("nix", Dependabot::Nix::FileUpdater)
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# typed: strict
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
require "sorbet-runtime"
|
|
5
|
+
|
|
6
|
+
require "dependabot/metadata_finders"
|
|
7
|
+
require "dependabot/metadata_finders/base"
|
|
8
|
+
|
|
9
|
+
module Dependabot
|
|
10
|
+
module Nix
|
|
11
|
+
class MetadataFinder < Dependabot::MetadataFinders::Base
|
|
12
|
+
extend T::Sig
|
|
13
|
+
|
|
14
|
+
private
|
|
15
|
+
|
|
16
|
+
sig { override.returns(T.nilable(Dependabot::Source)) }
|
|
17
|
+
def look_up_source
|
|
18
|
+
url = dependency.requirements.first&.fetch(:source)&.fetch(:url) ||
|
|
19
|
+
dependency.requirements.first&.fetch(:source)&.fetch("url")
|
|
20
|
+
|
|
21
|
+
Source.from_url(url)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
Dependabot::MetadataFinders.register("nix", Dependabot::Nix::MetadataFinder)
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
# typed: strict
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
require "json"
|
|
5
|
+
require "time"
|
|
6
|
+
require "sorbet-runtime"
|
|
7
|
+
require "dependabot/nix"
|
|
8
|
+
require "dependabot/package/package_release"
|
|
9
|
+
require "dependabot/package/package_details"
|
|
10
|
+
require "dependabot/git_commit_checker"
|
|
11
|
+
require "dependabot/git_metadata_fetcher"
|
|
12
|
+
|
|
13
|
+
module Dependabot
|
|
14
|
+
module Nix
|
|
15
|
+
module Package
|
|
16
|
+
class PackageDetailsFetcher
|
|
17
|
+
extend T::Sig
|
|
18
|
+
|
|
19
|
+
sig do
|
|
20
|
+
params(
|
|
21
|
+
dependency: Dependabot::Dependency,
|
|
22
|
+
credentials: T::Array[Dependabot::Credential]
|
|
23
|
+
).void
|
|
24
|
+
end
|
|
25
|
+
def initialize(dependency:, credentials:)
|
|
26
|
+
@dependency = dependency
|
|
27
|
+
@credentials = credentials
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
sig { returns(Dependabot::Dependency) }
|
|
31
|
+
attr_reader :dependency
|
|
32
|
+
|
|
33
|
+
sig { returns(T::Array[T.untyped]) }
|
|
34
|
+
attr_reader :credentials
|
|
35
|
+
|
|
36
|
+
sig { returns(T.nilable(T::Array[Dependabot::Package::PackageRelease])) }
|
|
37
|
+
def available_versions
|
|
38
|
+
versions_metadata = fetch_tags_and_release_date
|
|
39
|
+
|
|
40
|
+
versions_metadata = fetch_latest_tag_info if versions_metadata.empty?
|
|
41
|
+
|
|
42
|
+
pseudo_version = versions_metadata.length + 1
|
|
43
|
+
|
|
44
|
+
versions_metadata.flat_map do |version_details|
|
|
45
|
+
pseudo_version -= 1
|
|
46
|
+
tag = version_details[:tag]
|
|
47
|
+
release_date = version_details[:release_date]
|
|
48
|
+
|
|
49
|
+
Dependabot::Package::PackageRelease.new(
|
|
50
|
+
version: Nix::Version.new("0.0.0-0.#{pseudo_version}"),
|
|
51
|
+
tag: tag,
|
|
52
|
+
released_at: release_date ? Time.parse(release_date) : nil
|
|
53
|
+
)
|
|
54
|
+
rescue ArgumentError
|
|
55
|
+
Dependabot::Package::PackageRelease.new(
|
|
56
|
+
version: Nix::Version.new("0.0.0-0.#{pseudo_version}"),
|
|
57
|
+
tag: tag
|
|
58
|
+
)
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
private
|
|
63
|
+
|
|
64
|
+
TARGET_COMMITS_TO_FETCH = 500
|
|
65
|
+
private_constant :TARGET_COMMITS_TO_FETCH
|
|
66
|
+
|
|
67
|
+
sig { returns(T::Array[T::Hash[Symbol, T.untyped]]) }
|
|
68
|
+
def fetch_latest_tag_info
|
|
69
|
+
client = build_client
|
|
70
|
+
head = client.head_commit_for_current_branch
|
|
71
|
+
return [] unless head
|
|
72
|
+
|
|
73
|
+
[{ tag: head }]
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
sig { returns(T::Array[T::Hash[Symbol, T.untyped]]) }
|
|
77
|
+
def fetch_tags_and_release_date
|
|
78
|
+
parsed_results = T.let([], T::Array[T::Hash[Symbol, T.untyped]])
|
|
79
|
+
|
|
80
|
+
begin
|
|
81
|
+
Dependabot.logger.info("Fetching release info for Nix flake input: #{dependency.name}")
|
|
82
|
+
client = build_client
|
|
83
|
+
|
|
84
|
+
sha = T.let(nil, T.nilable(String))
|
|
85
|
+
catch :found do
|
|
86
|
+
while parsed_results.length < TARGET_COMMITS_TO_FETCH
|
|
87
|
+
commits = get_commits(client, sha)
|
|
88
|
+
break if commits.empty?
|
|
89
|
+
|
|
90
|
+
commits.each do |commit|
|
|
91
|
+
sha = commit["sha"]
|
|
92
|
+
parsed_results << {
|
|
93
|
+
tag: sha,
|
|
94
|
+
release_date: commit.dig("commit", "committer", "date")
|
|
95
|
+
}
|
|
96
|
+
throw :found if sha == dependency.version
|
|
97
|
+
end
|
|
98
|
+
break if commits.length < Dependabot::GitMetadataFetcher::MAX_COMMITS_PER_PAGE
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
parsed_results
|
|
102
|
+
rescue StandardError => e
|
|
103
|
+
Dependabot.logger.error("Error while fetching package info for nix flake input: #{e.message}")
|
|
104
|
+
parsed_results
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
sig { returns(Dependabot::GitCommitChecker) }
|
|
109
|
+
def build_client
|
|
110
|
+
Dependabot::GitCommitChecker.new(
|
|
111
|
+
dependency: dependency,
|
|
112
|
+
credentials: credentials
|
|
113
|
+
)
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
sig do
|
|
117
|
+
params(
|
|
118
|
+
client: Dependabot::GitCommitChecker,
|
|
119
|
+
sha: T.nilable(String)
|
|
120
|
+
).returns(T::Array[T::Hash[String, T.untyped]])
|
|
121
|
+
end
|
|
122
|
+
def get_commits(client, sha)
|
|
123
|
+
response = sha.nil? ? client.ref_details_for_pinned_ref : client.ref_details(sha)
|
|
124
|
+
|
|
125
|
+
unless response.status == 200
|
|
126
|
+
Dependabot.logger.error(
|
|
127
|
+
"Error while fetching details for #{dependency.name}: #{response.body}"
|
|
128
|
+
)
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
return [] unless response.status == 200
|
|
132
|
+
|
|
133
|
+
commits = JSON.parse(response.body)
|
|
134
|
+
sha.nil? || commits.empty? ? commits : commits[1..]
|
|
135
|
+
rescue StandardError => e
|
|
136
|
+
Dependabot.logger.error("Error fetching commits: #{e.message}")
|
|
137
|
+
[]
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# typed: strong
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
require "sorbet-runtime"
|
|
5
|
+
require "dependabot/ecosystem"
|
|
6
|
+
require "dependabot/nix/version"
|
|
7
|
+
|
|
8
|
+
module Dependabot
|
|
9
|
+
module Nix
|
|
10
|
+
ECOSYSTEM = "nix"
|
|
11
|
+
PACKAGE_MANAGER = "nix"
|
|
12
|
+
SUPPORTED_NIX_VERSIONS = T.let([].freeze, T::Array[Dependabot::Version])
|
|
13
|
+
DEPRECATED_NIX_VERSIONS = T.let([].freeze, T::Array[Dependabot::Version])
|
|
14
|
+
|
|
15
|
+
class PackageManager < Dependabot::Ecosystem::VersionManager
|
|
16
|
+
extend T::Sig
|
|
17
|
+
|
|
18
|
+
sig { params(raw_version: String).void }
|
|
19
|
+
def initialize(raw_version)
|
|
20
|
+
super(
|
|
21
|
+
name: PACKAGE_MANAGER,
|
|
22
|
+
version: Version.new(raw_version),
|
|
23
|
+
deprecated_versions: DEPRECATED_NIX_VERSIONS,
|
|
24
|
+
supported_versions: SUPPORTED_NIX_VERSIONS
|
|
25
|
+
)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
sig { returns(T::Boolean) }
|
|
29
|
+
def deprecated?
|
|
30
|
+
false
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
sig { returns(T::Boolean) }
|
|
34
|
+
def unsupported?
|
|
35
|
+
false
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# typed: strong
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
require "sorbet-runtime"
|
|
5
|
+
|
|
6
|
+
require "dependabot/requirement"
|
|
7
|
+
require "dependabot/utils"
|
|
8
|
+
|
|
9
|
+
module Dependabot
|
|
10
|
+
module Nix
|
|
11
|
+
class Requirement < Dependabot::Requirement
|
|
12
|
+
extend T::Sig
|
|
13
|
+
|
|
14
|
+
sig { override.params(requirement_string: T.nilable(String)).returns(T::Array[Requirement]) }
|
|
15
|
+
def self.requirements_array(requirement_string)
|
|
16
|
+
[new(requirement_string)]
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
sig { params(requirements: T.nilable(String)).void }
|
|
20
|
+
def initialize(*requirements)
|
|
21
|
+
requirements = requirements.flatten.flat_map do |req_string|
|
|
22
|
+
req_string&.split(",")&.map(&:strip)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
super(requirements)
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
Dependabot::Utils
|
|
32
|
+
.register_requirement_class("nix", Dependabot::Nix::Requirement)
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# typed: strong
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
require "sorbet-runtime"
|
|
5
|
+
|
|
6
|
+
require "dependabot/package/package_latest_version_finder"
|
|
7
|
+
require "dependabot/package/package_details"
|
|
8
|
+
require "dependabot/nix/update_checker"
|
|
9
|
+
require "dependabot/nix/package/package_details_fetcher"
|
|
10
|
+
|
|
11
|
+
module Dependabot
|
|
12
|
+
module Nix
|
|
13
|
+
class UpdateChecker
|
|
14
|
+
class LatestVersionFinder < Dependabot::Package::PackageLatestVersionFinder
|
|
15
|
+
extend T::Sig
|
|
16
|
+
|
|
17
|
+
sig do
|
|
18
|
+
override.params(releases: T::Array[Dependabot::Package::PackageRelease])
|
|
19
|
+
.returns(T::Array[Dependabot::Package::PackageRelease])
|
|
20
|
+
end
|
|
21
|
+
def apply_post_fetch_latest_versions_filter(releases)
|
|
22
|
+
if releases.empty?
|
|
23
|
+
Dependabot.logger.info("No releases found for #{dependency.name} after applying filters.")
|
|
24
|
+
return releases
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Fallback so the current version is always in the candidate set
|
|
28
|
+
releases << Dependabot::Package::PackageRelease.new(
|
|
29
|
+
version: Nix::Version.new("0.0.0-0.0"),
|
|
30
|
+
tag: dependency.version
|
|
31
|
+
)
|
|
32
|
+
releases
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# All Nix versions are pseudo-versions with prerelease segments (0.0.0-0.N),
|
|
36
|
+
# so we must always include prereleases to avoid filtering everything out.
|
|
37
|
+
sig { override.returns(T::Boolean) }
|
|
38
|
+
def wants_prerelease?
|
|
39
|
+
true
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
private
|
|
43
|
+
|
|
44
|
+
sig { override.returns(T.nilable(Dependabot::Package::PackageDetails)) }
|
|
45
|
+
def package_details
|
|
46
|
+
@package_details ||= T.let(
|
|
47
|
+
Dependabot::Package::PackageDetails.new(
|
|
48
|
+
dependency: dependency,
|
|
49
|
+
releases: Package::PackageDetailsFetcher.new(
|
|
50
|
+
dependency: dependency,
|
|
51
|
+
credentials: credentials
|
|
52
|
+
).available_versions || []
|
|
53
|
+
),
|
|
54
|
+
T.nilable(Dependabot::Package::PackageDetails)
|
|
55
|
+
)
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# typed: strong
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
require "sorbet-runtime"
|
|
5
|
+
|
|
6
|
+
require "dependabot/update_checkers"
|
|
7
|
+
require "dependabot/update_checkers/base"
|
|
8
|
+
require "dependabot/nix/version"
|
|
9
|
+
require "dependabot/nix/requirement"
|
|
10
|
+
require "dependabot/git_commit_checker"
|
|
11
|
+
|
|
12
|
+
module Dependabot
|
|
13
|
+
module Nix
|
|
14
|
+
class UpdateChecker < Dependabot::UpdateCheckers::Base
|
|
15
|
+
extend T::Sig
|
|
16
|
+
|
|
17
|
+
require_relative "update_checker/latest_version_finder"
|
|
18
|
+
|
|
19
|
+
sig { override.returns(T.nilable(T.any(String, Dependabot::Version))) }
|
|
20
|
+
def latest_version
|
|
21
|
+
@latest_version ||=
|
|
22
|
+
T.let(
|
|
23
|
+
fetch_latest_version,
|
|
24
|
+
T.nilable(T.any(String, Dependabot::Version))
|
|
25
|
+
)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
sig { override.returns(T.nilable(T.any(String, Dependabot::Version))) }
|
|
29
|
+
def latest_resolvable_version
|
|
30
|
+
# Resolvability isn't an issue for flake inputs — they're independent.
|
|
31
|
+
latest_version
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
sig { override.returns(T.nilable(T.any(String, Dependabot::Version))) }
|
|
35
|
+
def latest_resolvable_version_with_no_unlock
|
|
36
|
+
# No concept of "unlocking" for flake inputs
|
|
37
|
+
latest_version
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
sig { override.returns(T::Array[T::Hash[Symbol, T.untyped]]) }
|
|
41
|
+
def updated_requirements
|
|
42
|
+
# Flake input requirements are the URL and branch — we never update those.
|
|
43
|
+
dependency.requirements
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
private
|
|
47
|
+
|
|
48
|
+
sig { override.returns(T::Boolean) }
|
|
49
|
+
def latest_version_resolvable_with_full_unlock?
|
|
50
|
+
# Full unlock checks aren't relevant for flake inputs
|
|
51
|
+
false
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
sig { override.returns(T::Array[Dependabot::Dependency]) }
|
|
55
|
+
def updated_dependencies_after_full_unlock
|
|
56
|
+
raise NotImplementedError
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
sig { returns(T.nilable(String)) }
|
|
60
|
+
def fetch_latest_version
|
|
61
|
+
T.let(
|
|
62
|
+
LatestVersionFinder.new(
|
|
63
|
+
dependency: dependency,
|
|
64
|
+
dependency_files: dependency_files,
|
|
65
|
+
credentials: credentials,
|
|
66
|
+
ignored_versions: ignored_versions,
|
|
67
|
+
security_advisories: security_advisories,
|
|
68
|
+
cooldown_options: update_cooldown,
|
|
69
|
+
raise_on_ignored: raise_on_ignored
|
|
70
|
+
).latest_tag,
|
|
71
|
+
T.nilable(String)
|
|
72
|
+
)
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
Dependabot::UpdateCheckers.register("nix", Dependabot::Nix::UpdateChecker)
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# typed: strong
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
require "dependabot/version"
|
|
5
|
+
require "dependabot/utils"
|
|
6
|
+
|
|
7
|
+
module Dependabot
|
|
8
|
+
module Nix
|
|
9
|
+
class Version < Dependabot::Version
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
Dependabot::Utils
|
|
15
|
+
.register_version_class("nix", Dependabot::Nix::Version)
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# typed: strong
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
# These all need to be required so the various classes can be registered in a
|
|
5
|
+
# lookup table of package manager names to concrete classes.
|
|
6
|
+
require "dependabot/nix/file_fetcher"
|
|
7
|
+
require "dependabot/nix/file_parser"
|
|
8
|
+
require "dependabot/nix/update_checker"
|
|
9
|
+
require "dependabot/nix/file_updater"
|
|
10
|
+
require "dependabot/nix/metadata_finder"
|
|
11
|
+
require "dependabot/nix/version"
|
|
12
|
+
require "dependabot/nix/requirement"
|
|
13
|
+
|
|
14
|
+
require "dependabot/pull_request_creator/labeler"
|
|
15
|
+
Dependabot::PullRequestCreator::Labeler
|
|
16
|
+
.register_label_details("nix", name: "nix", colour: "3E6399")
|
|
17
|
+
|
|
18
|
+
require "dependabot/dependency"
|
|
19
|
+
Dependabot::Dependency
|
|
20
|
+
.register_production_check("nix", ->(_) { true })
|
metadata
ADDED
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: dependabot-nix
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.367.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Dependabot
|
|
8
|
+
bindir: bin
|
|
9
|
+
cert_chain: []
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
11
|
+
dependencies:
|
|
12
|
+
- !ruby/object:Gem::Dependency
|
|
13
|
+
name: dependabot-common
|
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
|
15
|
+
requirements:
|
|
16
|
+
- - '='
|
|
17
|
+
- !ruby/object:Gem::Version
|
|
18
|
+
version: 0.367.0
|
|
19
|
+
type: :runtime
|
|
20
|
+
prerelease: false
|
|
21
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
22
|
+
requirements:
|
|
23
|
+
- - '='
|
|
24
|
+
- !ruby/object:Gem::Version
|
|
25
|
+
version: 0.367.0
|
|
26
|
+
- !ruby/object:Gem::Dependency
|
|
27
|
+
name: debug
|
|
28
|
+
requirement: !ruby/object:Gem::Requirement
|
|
29
|
+
requirements:
|
|
30
|
+
- - "~>"
|
|
31
|
+
- !ruby/object:Gem::Version
|
|
32
|
+
version: '1.9'
|
|
33
|
+
type: :development
|
|
34
|
+
prerelease: false
|
|
35
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
36
|
+
requirements:
|
|
37
|
+
- - "~>"
|
|
38
|
+
- !ruby/object:Gem::Version
|
|
39
|
+
version: '1.9'
|
|
40
|
+
- !ruby/object:Gem::Dependency
|
|
41
|
+
name: gpgme
|
|
42
|
+
requirement: !ruby/object:Gem::Requirement
|
|
43
|
+
requirements:
|
|
44
|
+
- - "~>"
|
|
45
|
+
- !ruby/object:Gem::Version
|
|
46
|
+
version: '2.0'
|
|
47
|
+
type: :development
|
|
48
|
+
prerelease: false
|
|
49
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
50
|
+
requirements:
|
|
51
|
+
- - "~>"
|
|
52
|
+
- !ruby/object:Gem::Version
|
|
53
|
+
version: '2.0'
|
|
54
|
+
- !ruby/object:Gem::Dependency
|
|
55
|
+
name: rake
|
|
56
|
+
requirement: !ruby/object:Gem::Requirement
|
|
57
|
+
requirements:
|
|
58
|
+
- - "~>"
|
|
59
|
+
- !ruby/object:Gem::Version
|
|
60
|
+
version: '13.2'
|
|
61
|
+
type: :development
|
|
62
|
+
prerelease: false
|
|
63
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
64
|
+
requirements:
|
|
65
|
+
- - "~>"
|
|
66
|
+
- !ruby/object:Gem::Version
|
|
67
|
+
version: '13.2'
|
|
68
|
+
- !ruby/object:Gem::Dependency
|
|
69
|
+
name: rspec
|
|
70
|
+
requirement: !ruby/object:Gem::Requirement
|
|
71
|
+
requirements:
|
|
72
|
+
- - "~>"
|
|
73
|
+
- !ruby/object:Gem::Version
|
|
74
|
+
version: '3.12'
|
|
75
|
+
type: :development
|
|
76
|
+
prerelease: false
|
|
77
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
78
|
+
requirements:
|
|
79
|
+
- - "~>"
|
|
80
|
+
- !ruby/object:Gem::Version
|
|
81
|
+
version: '3.12'
|
|
82
|
+
- !ruby/object:Gem::Dependency
|
|
83
|
+
name: rspec-its
|
|
84
|
+
requirement: !ruby/object:Gem::Requirement
|
|
85
|
+
requirements:
|
|
86
|
+
- - "~>"
|
|
87
|
+
- !ruby/object:Gem::Version
|
|
88
|
+
version: '2.0'
|
|
89
|
+
type: :development
|
|
90
|
+
prerelease: false
|
|
91
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
92
|
+
requirements:
|
|
93
|
+
- - "~>"
|
|
94
|
+
- !ruby/object:Gem::Version
|
|
95
|
+
version: '2.0'
|
|
96
|
+
- !ruby/object:Gem::Dependency
|
|
97
|
+
name: rspec-sorbet
|
|
98
|
+
requirement: !ruby/object:Gem::Requirement
|
|
99
|
+
requirements:
|
|
100
|
+
- - "~>"
|
|
101
|
+
- !ruby/object:Gem::Version
|
|
102
|
+
version: '1.9'
|
|
103
|
+
type: :development
|
|
104
|
+
prerelease: false
|
|
105
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
106
|
+
requirements:
|
|
107
|
+
- - "~>"
|
|
108
|
+
- !ruby/object:Gem::Version
|
|
109
|
+
version: '1.9'
|
|
110
|
+
- !ruby/object:Gem::Dependency
|
|
111
|
+
name: rubocop
|
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
|
113
|
+
requirements:
|
|
114
|
+
- - "~>"
|
|
115
|
+
- !ruby/object:Gem::Version
|
|
116
|
+
version: '1.80'
|
|
117
|
+
type: :development
|
|
118
|
+
prerelease: false
|
|
119
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
120
|
+
requirements:
|
|
121
|
+
- - "~>"
|
|
122
|
+
- !ruby/object:Gem::Version
|
|
123
|
+
version: '1.80'
|
|
124
|
+
- !ruby/object:Gem::Dependency
|
|
125
|
+
name: rubocop-performance
|
|
126
|
+
requirement: !ruby/object:Gem::Requirement
|
|
127
|
+
requirements:
|
|
128
|
+
- - "~>"
|
|
129
|
+
- !ruby/object:Gem::Version
|
|
130
|
+
version: '1.26'
|
|
131
|
+
type: :development
|
|
132
|
+
prerelease: false
|
|
133
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
134
|
+
requirements:
|
|
135
|
+
- - "~>"
|
|
136
|
+
- !ruby/object:Gem::Version
|
|
137
|
+
version: '1.26'
|
|
138
|
+
- !ruby/object:Gem::Dependency
|
|
139
|
+
name: rubocop-rspec
|
|
140
|
+
requirement: !ruby/object:Gem::Requirement
|
|
141
|
+
requirements:
|
|
142
|
+
- - "~>"
|
|
143
|
+
- !ruby/object:Gem::Version
|
|
144
|
+
version: '3.7'
|
|
145
|
+
type: :development
|
|
146
|
+
prerelease: false
|
|
147
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
148
|
+
requirements:
|
|
149
|
+
- - "~>"
|
|
150
|
+
- !ruby/object:Gem::Version
|
|
151
|
+
version: '3.7'
|
|
152
|
+
- !ruby/object:Gem::Dependency
|
|
153
|
+
name: rubocop-sorbet
|
|
154
|
+
requirement: !ruby/object:Gem::Requirement
|
|
155
|
+
requirements:
|
|
156
|
+
- - "~>"
|
|
157
|
+
- !ruby/object:Gem::Version
|
|
158
|
+
version: '0.10'
|
|
159
|
+
type: :development
|
|
160
|
+
prerelease: false
|
|
161
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
162
|
+
requirements:
|
|
163
|
+
- - "~>"
|
|
164
|
+
- !ruby/object:Gem::Version
|
|
165
|
+
version: '0.10'
|
|
166
|
+
- !ruby/object:Gem::Dependency
|
|
167
|
+
name: simplecov
|
|
168
|
+
requirement: !ruby/object:Gem::Requirement
|
|
169
|
+
requirements:
|
|
170
|
+
- - "~>"
|
|
171
|
+
- !ruby/object:Gem::Version
|
|
172
|
+
version: '0.22'
|
|
173
|
+
type: :development
|
|
174
|
+
prerelease: false
|
|
175
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
176
|
+
requirements:
|
|
177
|
+
- - "~>"
|
|
178
|
+
- !ruby/object:Gem::Version
|
|
179
|
+
version: '0.22'
|
|
180
|
+
- !ruby/object:Gem::Dependency
|
|
181
|
+
name: turbo_tests
|
|
182
|
+
requirement: !ruby/object:Gem::Requirement
|
|
183
|
+
requirements:
|
|
184
|
+
- - "~>"
|
|
185
|
+
- !ruby/object:Gem::Version
|
|
186
|
+
version: 2.2.5
|
|
187
|
+
type: :development
|
|
188
|
+
prerelease: false
|
|
189
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
190
|
+
requirements:
|
|
191
|
+
- - "~>"
|
|
192
|
+
- !ruby/object:Gem::Version
|
|
193
|
+
version: 2.2.5
|
|
194
|
+
- !ruby/object:Gem::Dependency
|
|
195
|
+
name: vcr
|
|
196
|
+
requirement: !ruby/object:Gem::Requirement
|
|
197
|
+
requirements:
|
|
198
|
+
- - "~>"
|
|
199
|
+
- !ruby/object:Gem::Version
|
|
200
|
+
version: '6.1'
|
|
201
|
+
type: :development
|
|
202
|
+
prerelease: false
|
|
203
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
204
|
+
requirements:
|
|
205
|
+
- - "~>"
|
|
206
|
+
- !ruby/object:Gem::Version
|
|
207
|
+
version: '6.1'
|
|
208
|
+
- !ruby/object:Gem::Dependency
|
|
209
|
+
name: webmock
|
|
210
|
+
requirement: !ruby/object:Gem::Requirement
|
|
211
|
+
requirements:
|
|
212
|
+
- - "~>"
|
|
213
|
+
- !ruby/object:Gem::Version
|
|
214
|
+
version: '3.25'
|
|
215
|
+
type: :development
|
|
216
|
+
prerelease: false
|
|
217
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
218
|
+
requirements:
|
|
219
|
+
- - "~>"
|
|
220
|
+
- !ruby/object:Gem::Version
|
|
221
|
+
version: '3.25'
|
|
222
|
+
- !ruby/object:Gem::Dependency
|
|
223
|
+
name: webrick
|
|
224
|
+
requirement: !ruby/object:Gem::Requirement
|
|
225
|
+
requirements:
|
|
226
|
+
- - "~>"
|
|
227
|
+
- !ruby/object:Gem::Version
|
|
228
|
+
version: '1.9'
|
|
229
|
+
type: :development
|
|
230
|
+
prerelease: false
|
|
231
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
232
|
+
requirements:
|
|
233
|
+
- - "~>"
|
|
234
|
+
- !ruby/object:Gem::Version
|
|
235
|
+
version: '1.9'
|
|
236
|
+
description: Dependabot-Nix provides support for bumping Nix dependencies via Dependabot.
|
|
237
|
+
If you want support for multiple package managers, you probably want the meta-gem
|
|
238
|
+
dependabot-omnibus.
|
|
239
|
+
email: opensource@github.com
|
|
240
|
+
executables: []
|
|
241
|
+
extensions: []
|
|
242
|
+
extra_rdoc_files: []
|
|
243
|
+
files:
|
|
244
|
+
- lib/dependabot/nix.rb
|
|
245
|
+
- lib/dependabot/nix/file_fetcher.rb
|
|
246
|
+
- lib/dependabot/nix/file_parser.rb
|
|
247
|
+
- lib/dependabot/nix/file_updater.rb
|
|
248
|
+
- lib/dependabot/nix/metadata_finder.rb
|
|
249
|
+
- lib/dependabot/nix/package/package_details_fetcher.rb
|
|
250
|
+
- lib/dependabot/nix/package_manager.rb
|
|
251
|
+
- lib/dependabot/nix/requirement.rb
|
|
252
|
+
- lib/dependabot/nix/update_checker.rb
|
|
253
|
+
- lib/dependabot/nix/update_checker/latest_version_finder.rb
|
|
254
|
+
- lib/dependabot/nix/version.rb
|
|
255
|
+
homepage: https://github.com/dependabot/dependabot-core
|
|
256
|
+
licenses:
|
|
257
|
+
- MIT
|
|
258
|
+
metadata:
|
|
259
|
+
bug_tracker_uri: https://github.com/dependabot/dependabot-core/issues
|
|
260
|
+
changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.367.0
|
|
261
|
+
rdoc_options: []
|
|
262
|
+
require_paths:
|
|
263
|
+
- lib
|
|
264
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
265
|
+
requirements:
|
|
266
|
+
- - ">="
|
|
267
|
+
- !ruby/object:Gem::Version
|
|
268
|
+
version: 3.3.0
|
|
269
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
270
|
+
requirements:
|
|
271
|
+
- - ">="
|
|
272
|
+
- !ruby/object:Gem::Version
|
|
273
|
+
version: 3.3.0
|
|
274
|
+
requirements: []
|
|
275
|
+
rubygems_version: 3.7.2
|
|
276
|
+
specification_version: 4
|
|
277
|
+
summary: Provides Dependabot support for Nix
|
|
278
|
+
test_files: []
|