rubygems-generate_index 1.0.0 → 1.1.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 +4 -4
- data/Gemfile.lock +2 -2
- data/lib/rubygems/commands/generate_index_command.rb +8 -3
- data/lib/rubygems/indexer.rb +146 -0
- data/rubygems-generate_index.gemspec +2 -2
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1ad952327cbcaa7acf0cae3fa55046eb6453bec284c897fcf2b02f49ff1a6cc1
|
4
|
+
data.tar.gz: 0bad6263323bd12ff67c039cbc80246df6631dfa285876585336b91d5620ff7f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e0ff2c9f9aec05d64453bbe3a8a5092cd43649e87cf1fd2000ad36e7c29b4a35e5223d9ff7319f4cbcf1e0f7d8371a2f573958c68937cc6667afc9d17cca47d7
|
7
|
+
data.tar.gz: 4f7f011e4624a6d3600fdc95b4bc14e4c408b05c7ce377b17206a70a3248594004a79dba3f25a3a08fa1a7da4c52002f064e2497d7a35eae68f1412f88ad7044
|
data/Gemfile.lock
CHANGED
@@ -12,7 +12,7 @@ class Gem::Commands::GenerateIndexCommand < Gem::Command
|
|
12
12
|
def initialize
|
13
13
|
super "generate_index",
|
14
14
|
"Generates the index files for a gem server directory",
|
15
|
-
:directory => ".", :build_modern => true
|
15
|
+
:directory => ".", :build_modern => true, :build_compact => true
|
16
16
|
|
17
17
|
@deprecated_options = { "generate_index" => {} } unless defined?(@deprecated_options)
|
18
18
|
|
@@ -30,15 +30,20 @@ class Gem::Commands::GenerateIndexCommand < Gem::Command
|
|
30
30
|
deprecate_option("--modern", version: "4.0", extra_msg: "Modern indexes (specs, latest_specs, and prerelease_specs) are always generated, so this option is not needed.")
|
31
31
|
deprecate_option("--no-modern", version: "4.0", extra_msg: "The `--no-modern` option is currently ignored. Modern indexes (specs, latest_specs, and prerelease_specs) are always generated.")
|
32
32
|
|
33
|
+
add_option "--[no-]compact",
|
34
|
+
"Generate compact index files" do |value, options|
|
35
|
+
options[:build_compact] = value
|
36
|
+
end
|
37
|
+
|
33
38
|
add_option "--update",
|
34
|
-
"Update modern
|
39
|
+
"Update modern and compact indices with gems added",
|
35
40
|
"since the last update" do |value, options|
|
36
41
|
options[:update] = value
|
37
42
|
end
|
38
43
|
end
|
39
44
|
|
40
45
|
def defaults_str # :nodoc:
|
41
|
-
"--directory . --modern"
|
46
|
+
"--directory . --modern --compact"
|
42
47
|
end
|
43
48
|
|
44
49
|
def description # :nodoc:
|
data/lib/rubygems/indexer.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "compact_index"
|
3
4
|
require "rubygems"
|
4
5
|
require "rubygems/package"
|
5
6
|
require "tmpdir"
|
@@ -23,6 +24,11 @@ class Gem::Indexer
|
|
23
24
|
|
24
25
|
attr_accessor :build_modern
|
25
26
|
|
27
|
+
##
|
28
|
+
# Build compact index files when true
|
29
|
+
|
30
|
+
attr_accessor :build_compact
|
31
|
+
|
26
32
|
##
|
27
33
|
# Index install location
|
28
34
|
|
@@ -64,6 +70,7 @@ class Gem::Indexer
|
|
64
70
|
options = { :build_modern => true }.merge options
|
65
71
|
|
66
72
|
@build_modern = options[:build_modern]
|
73
|
+
@build_compact = options[:build_compact]
|
67
74
|
|
68
75
|
@dest_directory = directory
|
69
76
|
@directory = Dir.mktmpdir "gem_generate_index"
|
@@ -103,6 +110,7 @@ class Gem::Indexer
|
|
103
110
|
Gem::Specification._resort! specs
|
104
111
|
build_marshal_gemspecs specs
|
105
112
|
build_modern_indices specs if @build_modern
|
113
|
+
build_compact_index specs if @build_compact
|
106
114
|
|
107
115
|
compress_indices
|
108
116
|
end
|
@@ -196,6 +204,57 @@ class Gem::Indexer
|
|
196
204
|
"#{@prerelease_specs_index}.gz"]
|
197
205
|
end
|
198
206
|
|
207
|
+
##
|
208
|
+
# Builds compact index files
|
209
|
+
|
210
|
+
def build_compact_index(specs)
|
211
|
+
gems = compact_index_gems(specs)
|
212
|
+
|
213
|
+
progress = ui.progress_reporter gems.count + 2,
|
214
|
+
"Generating compact index files for #{gems.count} gems",
|
215
|
+
"Complete"
|
216
|
+
|
217
|
+
Gem.time "Generated compact index files" do
|
218
|
+
info_dir = File.join(@directory, "info")
|
219
|
+
FileUtils.mkdir_p info_dir, :mode => 0o700
|
220
|
+
|
221
|
+
gems.each do |gem|
|
222
|
+
info = CompactIndex.info(gem.versions)
|
223
|
+
|
224
|
+
info_checksum = Digest::MD5.hexdigest(info)
|
225
|
+
gem[:versions].last[:info_checksum] = info_checksum
|
226
|
+
|
227
|
+
info_path = File.join(@directory, "info", gem.name)
|
228
|
+
if File.exist?(info_path)
|
229
|
+
raise "info file already exists: #{info_path}"
|
230
|
+
end
|
231
|
+
|
232
|
+
File.open(info_path, "wb") do |io|
|
233
|
+
io.write info
|
234
|
+
end
|
235
|
+
|
236
|
+
progress.updated "/info/#{gem.name}"
|
237
|
+
end
|
238
|
+
|
239
|
+
File.open(File.join(@directory, "names"), "wb") do |io|
|
240
|
+
io.write CompactIndex.names(gems.map(&:name))
|
241
|
+
end
|
242
|
+
progress.updated "/names"
|
243
|
+
|
244
|
+
CompactIndex::VersionsFile.new(
|
245
|
+
File.join(@directory, "versions")
|
246
|
+
).create(
|
247
|
+
gems,
|
248
|
+
)
|
249
|
+
|
250
|
+
progress.updated "/versions"
|
251
|
+
|
252
|
+
@files << info_dir << File.join(@directory, "names") << File.join(@directory, "versions")
|
253
|
+
|
254
|
+
progress.done
|
255
|
+
end
|
256
|
+
end
|
257
|
+
|
199
258
|
def map_gems_to_specs(gems)
|
200
259
|
gems.map do |gemfile|
|
201
260
|
if File.size(gemfile) == 0
|
@@ -389,6 +448,12 @@ class Gem::Indexer
|
|
389
448
|
@prerelease_specs_index)
|
390
449
|
end
|
391
450
|
|
451
|
+
if @build_compact
|
452
|
+
Gem.time "Updated compact index files" do
|
453
|
+
files += update_compact_index released, @dest_directory, @directory
|
454
|
+
end
|
455
|
+
end
|
456
|
+
|
392
457
|
compress_indices
|
393
458
|
|
394
459
|
verbose = Gem.configuration.really_verbose
|
@@ -439,6 +504,87 @@ class Gem::Indexer
|
|
439
504
|
end
|
440
505
|
end
|
441
506
|
|
507
|
+
##
|
508
|
+
# Combines specs in +index+ and +source+ then writes out a new
|
509
|
+
# compact index to +dest+.
|
510
|
+
|
511
|
+
def update_compact_index(new_specs, source, dest)
|
512
|
+
files = []
|
513
|
+
source_versions_path = File.join(source, "versions")
|
514
|
+
versions_file = CompactIndex::VersionsFile.new source_versions_path
|
515
|
+
|
516
|
+
gems = compact_index_gems new_specs
|
517
|
+
|
518
|
+
FileUtils.mkdir_p File.join(dest, "info")
|
519
|
+
|
520
|
+
new_names = []
|
521
|
+
gems.each do |gem|
|
522
|
+
existing_info_path = File.join(source, "info", gem.name)
|
523
|
+
if File.exist? existing_info_path
|
524
|
+
info = Gem.read_binary(existing_info_path) +
|
525
|
+
CompactIndex.info(gem.versions).sub(/\A---\n/, "")
|
526
|
+
else
|
527
|
+
new_names << gem.name
|
528
|
+
info = CompactIndex.info gem.versions
|
529
|
+
end
|
530
|
+
|
531
|
+
info_checksum = Digest::MD5.hexdigest(info)
|
532
|
+
gem[:versions].last[:info_checksum] = info_checksum
|
533
|
+
|
534
|
+
info_path = File.join(dest, "info", gem.name)
|
535
|
+
if File.exist?(info_path)
|
536
|
+
raise "info file already exists: #{info_path}"
|
537
|
+
end
|
538
|
+
|
539
|
+
File.open(info_path, "wb") do |io|
|
540
|
+
io.write info
|
541
|
+
end
|
542
|
+
files << info_path
|
543
|
+
end
|
544
|
+
|
545
|
+
versions_path = File.join(dest, "versions")
|
546
|
+
File.open(versions_path, "wb") do |io|
|
547
|
+
io.write versions_file.contents(gems)
|
548
|
+
end
|
549
|
+
files << versions_path
|
550
|
+
|
551
|
+
unless new_names.empty?
|
552
|
+
old_names = Gem.read_binary(File.join(source, "names")).lines(chomp: true)[2..]
|
553
|
+
names_path = File.join(dest, "names")
|
554
|
+
|
555
|
+
names = old_names + new_names
|
556
|
+
names.sort!
|
557
|
+
|
558
|
+
File.open(names_path, "wb") do |io|
|
559
|
+
io.write CompactIndex.names(names)
|
560
|
+
end
|
561
|
+
|
562
|
+
files << names_path
|
563
|
+
end
|
564
|
+
|
565
|
+
files
|
566
|
+
end
|
567
|
+
|
568
|
+
def compact_index_gems(specs)
|
569
|
+
versions_by_name = Hash.new {|h, k| h[k] = [] }
|
570
|
+
specs.each do |spec|
|
571
|
+
checksum = spec.loaded_from && Digest::SHA256.file(spec.loaded_from).base64digest!
|
572
|
+
versions_by_name[spec.name] << CompactIndex::GemVersion.new(
|
573
|
+
spec.version.version,
|
574
|
+
spec.platform,
|
575
|
+
checksum,
|
576
|
+
nil, # info_checksum
|
577
|
+
spec.dependencies.map {|d| CompactIndex::Dependency.new(d.name, d.requirement.to_s) },
|
578
|
+
spec.required_ruby_version&.to_s,
|
579
|
+
spec.required_rubygems_version&.to_s
|
580
|
+
)
|
581
|
+
end
|
582
|
+
versions_by_name.map do |name, versions|
|
583
|
+
versions.sort!
|
584
|
+
CompactIndex::Gem.new(name, versions)
|
585
|
+
end.tap(&:sort!)
|
586
|
+
end
|
587
|
+
|
442
588
|
private
|
443
589
|
|
444
590
|
def marshal_load(string)
|
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = "rubygems-generate_index"
|
5
|
-
s.version = "1.
|
5
|
+
s.version = "1.1.0"
|
6
6
|
s.authors = ["Jim Weirich", "Chad Fowler", "Eric Hodel", "Luis Lavena", "Aaron Patterson", "Samuel Giddins", "André Arko", "Evan Phoenix", "Hiroshi SHIBATA"]
|
7
7
|
s.email = ["", "", "drbrain@segment7.net", "luislavena@gmail.com", "aaron@tenderlovemaking.com", "segiddins@segiddins.me", "andre@arko.net", "evan@phx.io", "hsbt@ruby-lang.org"]
|
8
8
|
|
@@ -26,7 +26,7 @@ Gem::Specification.new do |s|
|
|
26
26
|
"CODE_OF_CONDUCT.md"
|
27
27
|
]
|
28
28
|
|
29
|
-
s.required_ruby_version = Gem::Requirement.new(">=
|
29
|
+
s.required_ruby_version = Gem::Requirement.new(">= 3.0.0")
|
30
30
|
s.required_rubygems_version = Gem::Requirement.new(">= 0")
|
31
31
|
|
32
32
|
s.add_dependency "compact_index", "~> 0.14.0"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubygems-generate_index
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jim Weirich
|
@@ -16,7 +16,7 @@ authors:
|
|
16
16
|
autorequire:
|
17
17
|
bindir: exe
|
18
18
|
cert_chain: []
|
19
|
-
date: 2023-11-
|
19
|
+
date: 2023-11-27 00:00:00.000000000 Z
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
22
22
|
name: compact_index
|
@@ -82,7 +82,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
82
82
|
requirements:
|
83
83
|
- - ">="
|
84
84
|
- !ruby/object:Gem::Version
|
85
|
-
version:
|
85
|
+
version: 3.0.0
|
86
86
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
87
87
|
requirements:
|
88
88
|
- - ">="
|