gemstash 2.0.0 → 2.2.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/CHANGELOG.md +57 -0
- data/exe/gemstash +3 -0
- data/lib/gemstash/api_key_authorization.rb +3 -0
- data/lib/gemstash/authorization.rb +7 -3
- data/lib/gemstash/cache.rb +42 -2
- data/lib/gemstash/cli/authorize.rb +5 -5
- data/lib/gemstash/cli/base.rb +4 -1
- data/lib/gemstash/cli/setup.rb +19 -4
- data/lib/gemstash/cli/start.rb +4 -1
- data/lib/gemstash/cli/status.rb +2 -0
- data/lib/gemstash/cli/stop.rb +2 -0
- data/lib/gemstash/cli.rb +2 -0
- data/lib/gemstash/config.ru +3 -3
- data/lib/gemstash/configuration.rb +8 -2
- data/lib/gemstash/db/authorization.rb +2 -0
- data/lib/gemstash/db/cached_rubygem.rb +3 -0
- data/lib/gemstash/db/dependency.rb +2 -0
- data/lib/gemstash/db/rubygem.rb +3 -0
- data/lib/gemstash/db/upstream.rb +3 -0
- data/lib/gemstash/db/version.rb +3 -0
- data/lib/gemstash/db.rb +3 -0
- data/lib/gemstash/dependencies.rb +6 -2
- data/lib/gemstash/env.rb +24 -4
- data/lib/gemstash/gem_fetcher.rb +4 -2
- data/lib/gemstash/gem_pusher.rb +7 -5
- data/lib/gemstash/gem_source/dependency_caching.rb +4 -4
- data/lib/gemstash/gem_source/private_source.rb +6 -3
- data/lib/gemstash/gem_source/rack_middleware.rb +3 -0
- data/lib/gemstash/gem_source/upstream_source.rb +9 -3
- data/lib/gemstash/gem_source.rb +4 -2
- data/lib/gemstash/gem_yanker.rb +4 -0
- data/lib/gemstash/health.rb +2 -0
- data/lib/gemstash/http_client.rb +12 -4
- data/lib/gemstash/logging.rb +3 -1
- data/lib/gemstash/man/gemstash-authorize.1.txt +0 -65
- data/lib/gemstash/man/gemstash-configuration.5.txt +0 -65
- data/lib/gemstash/man/gemstash-customize.7.txt +0 -65
- data/lib/gemstash/man/gemstash-debugging.7.txt +0 -65
- data/lib/gemstash/man/gemstash-deploy.7.txt +0 -65
- data/lib/gemstash/man/gemstash-mirror.7.txt +0 -65
- data/lib/gemstash/man/gemstash-multiple-sources.7.txt +0 -65
- data/lib/gemstash/man/gemstash-private-gems.7.txt +0 -65
- data/lib/gemstash/man/gemstash-readme.7.txt +0 -65
- data/lib/gemstash/man/gemstash-setup.1.txt +0 -65
- data/lib/gemstash/man/gemstash-start.1.txt +0 -65
- data/lib/gemstash/man/gemstash-status.1.txt +0 -65
- data/lib/gemstash/man/gemstash-stop.1.txt +0 -65
- data/lib/gemstash/man/gemstash-version.1.txt +0 -65
- data/lib/gemstash/migrations/01_gem_dependencies.rb +2 -0
- data/lib/gemstash/migrations/02_authorizations.rb +2 -0
- data/lib/gemstash/migrations/03_cached_gems.rb +2 -0
- data/lib/gemstash/migrations/04_health_tests.rb +2 -0
- data/lib/gemstash/puma.rb +2 -0
- data/lib/gemstash/rack_env_rewriter.rb +11 -2
- data/lib/gemstash/specs_builder.rb +5 -1
- data/lib/gemstash/storage.rb +17 -7
- data/lib/gemstash/upstream.rb +8 -5
- data/lib/gemstash/version.rb +4 -2
- data/lib/gemstash/web.rb +8 -4
- data/lib/gemstash.rb +3 -1
- metadata +40 -133
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 41416a39e4dabbc11e7f8f1ad812dc34ffce3fbfa47c6f997feec01c083bf483
|
4
|
+
data.tar.gz: c274c1eac63e99d2001f946b117c020dd1fe5c25bdcaf1c31dd28e0668603b2d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 94941045dd2f8232b5c55a79e775df4e89243d62ce88f22bd737d9dda3bf718a9d30b184b790677beba415c98243b3190c362cab800333993e6d89677592d398
|
7
|
+
data.tar.gz: 3f771fae6b0a388dd730978ec0721c83514d3479fd30f9211def6d7bad2ce5f9a83239bbfde091b450f32c053d0f763799e61aa9a9f95b947802dc2c1533275a
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,60 @@
|
|
1
|
+
## 2.1.0 (2020-02-26)
|
2
|
+
|
3
|
+
### Bugfixes
|
4
|
+
|
5
|
+
- Shebang should be the first thing in the file ([#222](https://github.com/rubygems/gemstash/pull/222), [@bronzdoc](https://github.com/bronzdoc))
|
6
|
+
|
7
|
+
### Changes
|
8
|
+
|
9
|
+
- Update rack-test requirement from ~> 0.6 to ~> 1.1 ([#199](https://github.com/rubygems/gemstash/pull/199), [@dependabot](https://github.com/dependabot))
|
10
|
+
- Update rake requirement from ~> 10.0 to ~> 12.3 ([#200](https://github.com/rubygems/gemstash/pull/200), [@dependabot](https://github.com/dependabot))
|
11
|
+
- CI matrix: Drop 2.0, 2.1, 2.2 ([#201](https://github.com/rubygems/gemstash/pull/201), [@olleolleolle](https://github.com/olleolleolle))
|
12
|
+
- Update rubocop version and update files to be inline with new cops ([#202](https://github.com/rubygems/gemstash/pull/202), [@bronzdoc](https://github.com/bronzdoc))
|
13
|
+
- Update rubocop requirement from = 0.60.0 to = 0.61.0 ([#208](https://github.com/rubygems/gemstash/pull/208), [@dependabot](https://github.com/dependabot))
|
14
|
+
- Update rubocop requirement from = 0.61.0 to = 0.61.1 ([#209](https://github.com/rubygems/gemstash/pull/209), [@dependabot](https://github.com/dependabot))
|
15
|
+
- Avoid Rubocop warnings ([#210](https://github.com/rubygems/gemstash/pull/210), [@olleolleolle](https://github.com/olleolleolle))
|
16
|
+
- RSpec: config.disable_monkey_patching! ([#211](https://github.com/rubygems/gemstash/pull/211), [@olleolleolle](https://github.com/olleolleolle))
|
17
|
+
- Travis: update JRuby to 9.2.5.0 ([#212](https://github.com/rubygems/gemstash/pull/212), [@olleolleolle](https://github.com/olleolleolle))
|
18
|
+
- Update rubocop requirement from = 0.61.1 to = 0.62.0 ([#213](https://github.com/rubygems/gemstash/pull/213), [@dependabot](https://github.com/dependabot))
|
19
|
+
- Update rubocop requirement from = 0.62.0 to = 0.63.0 ([#215](https://github.com/rubygems/gemstash/pull/215), [@dependabot](https://github.com/dependabot))
|
20
|
+
- gemspec: Allow Bundler 2 ([#217](https://github.com/rubygems/gemstash/pull/217), [@olleolleolle](https://github.com/olleolleolle))
|
21
|
+
- Update rubocop requirement from = 0.63.0 to = 0.63.1 ([#218](https://github.com/rubygems/gemstash/pull/218), [@dependabot](https://github.com/dependabot))
|
22
|
+
- Update rubocop requirement from = 0.63.1 to = 0.64.0 ([#220](https://github.com/rubygems/gemstash/pull/220), [@dependabot](https://github.com/dependabot))
|
23
|
+
- CI: matrix updates - update JRuby, add 2.6.1 ([#221](https://github.com/rubygems/gemstash/pull/221), [@olleolleolle](https://github.com/olleolleolle))
|
24
|
+
- Add a failing Aruba-based RSpec test for the CLI client output ([#223](https://github.com/rubygems/gemstash/pull/223), [@olleolleolle](https://github.com/olleolleolle))
|
25
|
+
- Update rubocop requirement from = 0.64.0 to = 0.65.0 ([#224](https://github.com/rubygems/gemstash/pull/224), [@dependabot](https://github.com/dependabot))
|
26
|
+
- CI: use 2.5.5, 2.6.2 ([#225](https://github.com/rubygems/gemstash/pull/225), [@olleolleolle](https://github.com/olleolleolle))
|
27
|
+
- Update rubocop requirement from = 0.65.0 to = 0.66.0 ([#226](https://github.com/rubygems/gemstash/pull/226), [@dependabot](https://github.com/dependabot), [@olleolleolle](https://github.com/olleolleolle), [@bronzdoc](https://github.com/bronzdoc))
|
28
|
+
- CI: Use 2.4.6 ([#228](https://github.com/rubygems/gemstash/pull/228), [@olleolleolle](https://github.com/olleolleolle))
|
29
|
+
- Update rubocop requirement from = 0.66.0 to = 0.67.1 ([#229](https://github.com/rubygems/gemstash/pull/229), [@dependabot](https://github.com/dependabot), [@olleolleolle](https://github.com/olleolleolle))
|
30
|
+
- CI: Drop 2.3.8 ([#230](https://github.com/rubygems/gemstash/pull/230), [@olleolleolle](https://github.com/olleolleolle))
|
31
|
+
- Update rubocop requirement from = 0.67.1 to = 0.67.2 ([#231](https://github.com/rubygems/gemstash/pull/231), [@dependabot](https://github.com/dependabot))
|
32
|
+
- CI: Use JRuby 9.2.7.0 ([#232](https://github.com/rubygems/gemstash/pull/232), [@olleolleolle](https://github.com/olleolleolle))
|
33
|
+
- Update rubocop requirement from = 0.67.2 to = 0.68.0 ([#233](https://github.com/rubygems/gemstash/pull/233), [@dependabot](https://github.com/dependabot), [@olleolleolle](https://github.com/olleolleolle))
|
34
|
+
- Update rubocop requirement from = 0.68.1 to = 0.69.0 ([#234](https://github.com/rubygems/gemstash/pull/234), [@dependabot](https://github.com/dependabot))
|
35
|
+
- Update rubocop requirement from = 0.69.0 to = 0.70.0 ([#235](https://github.com/rubygems/gemstash/pull/235), [@dependabot](https://github.com/dependabot))
|
36
|
+
- Set Travis badge to /rubygems user ([#236](https://github.com/rubygems/gemstash/pull/236), [@olleolleolle](https://github.com/olleolleolle))
|
37
|
+
- Fix broken links ([#240](https://github.com/rubygems/gemstash/pull/240), [@Aliciawyse](https://github.com/Aliciawyse))
|
38
|
+
- Fix various rubocop/codeclimate issues ([#241](https://github.com/rubygems/gemstash/pull/241), [@tchia04](https://github.com/tchia04))
|
39
|
+
- Fix some broken links in readme ([#243](https://github.com/rubygems/gemstash/pull/243), [@Aliciawyse](https://github.com/Aliciawyse))
|
40
|
+
- Improve webspec tests ([#244](https://github.com/rubygems/gemstash/pull/244), [@Aliciawyse](https://github.com/Aliciawyse))
|
41
|
+
- CI: Use jruby-9.2.8.0 ([#245](https://github.com/rubygems/gemstash/pull/245), [@olleolleolle](https://github.com/olleolleolle))
|
42
|
+
- CI: Use ruby 2.4.7, 2.5.6, 2.6.4 ([#246](https://github.com/rubygems/gemstash/pull/246), [@olleolleolle](https://github.com/olleolleolle))
|
43
|
+
- Add puma server pidfile configuration option ([#248](https://github.com/rubygems/gemstash/pull/248), [@krists](https://github.com/krists))
|
44
|
+
- CI: Use jruby-9.2.9.0 ([#249](https://github.com/rubygems/gemstash/pull/249), [@olleolleolle](https://github.com/olleolleolle))
|
45
|
+
- Officially drop support for older rubies ([#250](https://github.com/rubygems/gemstash/pull/250), [@deivid-rodriguez](https://github.com/deivid-rodriguez))
|
46
|
+
- Add config to ignore Gemfile source ([#253](https://github.com/rubygems/gemstash/pull/253), [@zpdcodes](https://github.com/zpdcodes))
|
47
|
+
- Update Puma gem ([#255](https://github.com/rubygems/gemstash/pull/255), [@bronzdoc](https://github.com/bronzdoc))
|
48
|
+
- Spec failures might be due to a bundler version ([#256](https://github.com/rubygems/gemstash/pull/256), [@bronzdoc](https://github.com/bronzdoc))
|
49
|
+
- Update spec homepage ([#257](https://github.com/rubygems/gemstash/pull/257), [@bronzdoc](https://github.com/bronzdoc))
|
50
|
+
- Update README.md links ([#258](https://github.com/rubygems/gemstash/pull/258), [@bronzdoc](https://github.com/bronzdoc))
|
51
|
+
- Add PR template ([#259](https://github.com/rubygems/gemstash/pull/259), [@bronzdoc](https://github.com/bronzdoc))
|
52
|
+
- Update docs ([#260](https://github.com/rubygems/gemstash/pull/260), [@bronzdoc](https://github.com/bronzdoc))
|
53
|
+
|
54
|
+
### Features
|
55
|
+
|
56
|
+
- Add configuration options cache_expiration, cache_max_size ([#207](https://github.com/rubygems/gemstash/pull/207), [@optix2000](https://github.com/optix2000), [@olleolleolle](https://github.com/olleolleolle))
|
57
|
+
|
1
58
|
## 2.0.0 (2018-11-18)
|
2
59
|
|
3
60
|
### Changes
|
data/exe/gemstash
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "gemstash"
|
2
4
|
|
3
5
|
module Gemstash
|
@@ -19,6 +21,7 @@ module Gemstash
|
|
19
21
|
def self.parse_authorization(request_env)
|
20
22
|
http_auth = Rack::Auth::Basic::Request.new(request_env)
|
21
23
|
return http_auth.credentials.first if http_auth.provided? && http_auth.basic?
|
24
|
+
|
22
25
|
request_env["HTTP_AUTHORIZATION"]
|
23
26
|
end
|
24
27
|
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "set"
|
2
4
|
|
3
5
|
module Gemstash
|
@@ -17,9 +19,7 @@ module Gemstash
|
|
17
19
|
|
18
20
|
unless permissions == "all"
|
19
21
|
permissions.each do |permission|
|
20
|
-
unless VALID_PERMISSIONS.include?(permission)
|
21
|
-
raise "Invalid permission '#{permission}'"
|
22
|
-
end
|
22
|
+
raise "Invalid permission '#{permission}'" unless VALID_PERMISSIONS.include?(permission)
|
23
23
|
end
|
24
24
|
|
25
25
|
permissions = permissions.join(",")
|
@@ -33,6 +33,7 @@ module Gemstash
|
|
33
33
|
def self.remove(auth_key)
|
34
34
|
record = Gemstash::DB::Authorization[auth_key: auth_key]
|
35
35
|
return unless record
|
36
|
+
|
36
37
|
record.destroy
|
37
38
|
gemstash_env.cache.invalidate_authorization(auth_key)
|
38
39
|
log.info "Authorization '#{auth_key}' with access to '#{record.permissions}' removed"
|
@@ -40,6 +41,7 @@ module Gemstash
|
|
40
41
|
|
41
42
|
def self.check(auth_key, permission)
|
42
43
|
raise NotAuthorizedError, "Authorization key required" if auth_key.to_s.strip.empty?
|
44
|
+
|
43
45
|
auth = self[auth_key]
|
44
46
|
raise NotAuthorizedError, "Authorization key is invalid" unless auth
|
45
47
|
raise NotAuthorizedError, "Authorization key doesn't have #{permission} access" unless auth.can?(permission)
|
@@ -48,6 +50,7 @@ module Gemstash
|
|
48
50
|
def self.[](auth_key)
|
49
51
|
cached_auth = gemstash_env.cache.authorization(auth_key)
|
50
52
|
return cached_auth if cached_auth
|
53
|
+
|
51
54
|
record = Gemstash::DB::Authorization[auth_key: auth_key]
|
52
55
|
|
53
56
|
if record
|
@@ -65,6 +68,7 @@ module Gemstash
|
|
65
68
|
|
66
69
|
def can?(permission)
|
67
70
|
raise "Invalid permission '#{permission}'" unless VALID_PERMISSIONS.include?(permission)
|
71
|
+
|
68
72
|
all? || @permissions.include?(permission)
|
69
73
|
end
|
70
74
|
|
data/lib/gemstash/cache.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "lru_redux"
|
2
4
|
require "forwardable"
|
3
5
|
|
@@ -6,7 +8,7 @@ module Gemstash
|
|
6
8
|
# for them. Under the hood is either a Memcached client via the dalli gem, or
|
7
9
|
# an in memory client via the lru_redux gem.
|
8
10
|
class Cache
|
9
|
-
EXPIRY =
|
11
|
+
EXPIRY = Env.current.config[:cache_expiration]
|
10
12
|
extend Forwardable
|
11
13
|
def_delegators :@client, :flush
|
12
14
|
|
@@ -47,7 +49,7 @@ module Gemstash
|
|
47
49
|
|
48
50
|
# Wrapper around the lru_redux gem to behave like a dalli Memcached client.
|
49
51
|
class LruReduxClient
|
50
|
-
MAX_SIZE =
|
52
|
+
MAX_SIZE = Env.current.config[:cache_max_size]
|
51
53
|
EXPIRY = Gemstash::Cache::EXPIRY
|
52
54
|
extend Forwardable
|
53
55
|
def_delegators :@cache, :delete
|
@@ -68,6 +70,7 @@ module Gemstash
|
|
68
70
|
# Atomic fetch... don't rely on nil meaning missing
|
69
71
|
value = @cache.fetch(key) { found = false }
|
70
72
|
next unless found
|
73
|
+
|
71
74
|
yield(key, value)
|
72
75
|
end
|
73
76
|
end
|
@@ -76,4 +79,41 @@ module Gemstash
|
|
76
79
|
@cache[key] = value
|
77
80
|
end
|
78
81
|
end
|
82
|
+
|
83
|
+
# Wrapper around the redis-rb gem to behave like a dalli Memcached client.
|
84
|
+
class RedisClient
|
85
|
+
extend Forwardable
|
86
|
+
|
87
|
+
def_delegator :@cache, :del, :delete
|
88
|
+
|
89
|
+
def initialize(redis_servers)
|
90
|
+
require "redis"
|
91
|
+
@cache = ::Redis.new(:url => redis_servers)
|
92
|
+
end
|
93
|
+
|
94
|
+
def alive!
|
95
|
+
@cache.ping == "PONG"
|
96
|
+
end
|
97
|
+
|
98
|
+
def get(key)
|
99
|
+
val = @cache.get(key)
|
100
|
+
YAML.load(val) unless val.nil?
|
101
|
+
end
|
102
|
+
|
103
|
+
def get_multi(keys)
|
104
|
+
@cache.mget(*keys).each do |k, v|
|
105
|
+
next if v.nil?
|
106
|
+
|
107
|
+
yield(k, YAML.load(v))
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
def set(key, value, expiry)
|
112
|
+
@cache.set(key, YAML.dump(value), :ex => expiry)
|
113
|
+
end
|
114
|
+
|
115
|
+
def flush
|
116
|
+
@cache.flushdb
|
117
|
+
end
|
118
|
+
end
|
79
119
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "gemstash"
|
2
4
|
require "securerandom"
|
3
5
|
|
@@ -28,13 +30,11 @@ module Gemstash
|
|
28
30
|
raise Gemstash::CLI::Error.new(@cli, "To remove individual permissions, you do not need --remove
|
29
31
|
Instead just authorize with the new set of permissions")
|
30
32
|
end
|
31
|
-
Gemstash::Authorization.remove(auth_key(false))
|
33
|
+
Gemstash::Authorization.remove(auth_key(allow_generate: false))
|
32
34
|
end
|
33
35
|
|
34
36
|
def save_authorization
|
35
|
-
if @args.include?("all")
|
36
|
-
raise Gemstash::CLI::Error.new(@cli, "Don't specify permissions to authorize for all")
|
37
|
-
end
|
37
|
+
raise Gemstash::CLI::Error.new(@cli, "Don't specify permissions to authorize for all") if @args.include?("all")
|
38
38
|
|
39
39
|
@args.each do |arg|
|
40
40
|
unless Gemstash::Authorization::VALID_PERMISSIONS.include?(arg)
|
@@ -46,7 +46,7 @@ Instead just authorize with the new set of permissions")
|
|
46
46
|
Gemstash::Authorization.authorize(auth_key, permissions)
|
47
47
|
end
|
48
48
|
|
49
|
-
def auth_key(allow_generate
|
49
|
+
def auth_key(allow_generate: true)
|
50
50
|
if @cli.options[:key]
|
51
51
|
@cli.options[:key]
|
52
52
|
elsif allow_generate
|
data/lib/gemstash/cli/base.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "gemstash"
|
2
4
|
|
3
5
|
module Gemstash
|
@@ -38,13 +40,14 @@ module Gemstash
|
|
38
40
|
def check_gemstash_version
|
39
41
|
version = Gem::Version.new(Gemstash::Storage.metadata[:gemstash_version])
|
40
42
|
return if Gem::Requirement.new("<= #{Gemstash::VERSION}").satisfied_by?(Gem::Version.new(version))
|
43
|
+
|
41
44
|
raise Gemstash::CLI::Error.new(@cli, "Gemstash version #{Gemstash::VERSION} does not support version " \
|
42
45
|
"#{version}.\nIt appears you may have downgraded Gemstash, please " \
|
43
46
|
"install version #{version} or later.")
|
44
47
|
end
|
45
48
|
|
46
49
|
def pidfile_args
|
47
|
-
["--pidfile", gemstash_env.
|
50
|
+
["--pidfile", gemstash_env.pidfile]
|
48
51
|
end
|
49
52
|
end
|
50
53
|
end
|
data/lib/gemstash/cli/setup.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "gemstash"
|
2
4
|
require "fileutils"
|
3
5
|
require "yaml"
|
@@ -44,11 +46,13 @@ module Gemstash
|
|
44
46
|
|
45
47
|
def say_current_config(option, label)
|
46
48
|
return if gemstash_env.config.default?(option)
|
49
|
+
|
47
50
|
@cli.say "#{label}: #{gemstash_env.config[option]}"
|
48
51
|
end
|
49
52
|
|
50
53
|
def ask_with_default(prompt, options, default)
|
51
54
|
raise "The options must all be lower case" if options.any? {|x| x.downcase != x }
|
55
|
+
|
52
56
|
result = nil
|
53
57
|
displayed_options = options.map {|x| x == default ? x.upcase : x }
|
54
58
|
prompt = "#{prompt} [#{displayed_options.join(", ")}]"
|
@@ -72,8 +76,9 @@ module Gemstash
|
|
72
76
|
|
73
77
|
def ask_cache
|
74
78
|
say_current_config(:cache_type, "Current cache")
|
75
|
-
@config[:cache_type] = ask_with_default("Cache with what?", %w[memory memcached], "memory")
|
79
|
+
@config[:cache_type] = ask_with_default("Cache with what?", %w[memory memcached redis], "memory")
|
76
80
|
ask_memcached_details if @config[:cache_type] == "memcached"
|
81
|
+
ask_redis_details if @config[:cache_type] == "redis"
|
77
82
|
end
|
78
83
|
|
79
84
|
def ask_memcached_details
|
@@ -83,6 +88,13 @@ module Gemstash
|
|
83
88
|
@config[:memcached_servers] = servers
|
84
89
|
end
|
85
90
|
|
91
|
+
def ask_redis_details
|
92
|
+
say_current_config(:redis_servers, "Current Redis servers")
|
93
|
+
servers = @cli.ask "What is the comma-separated list of Redis servers? [localhost:6379]"
|
94
|
+
servers = "localhost:6379" if servers.empty?
|
95
|
+
@config[:redis_servers] = servers
|
96
|
+
end
|
97
|
+
|
86
98
|
def ask_database
|
87
99
|
say_current_config(:db_adapter, "Current database adapter")
|
88
100
|
@config[:db_adapter] = ask_with_default("What database adapter?", %w[sqlite3 postgres mysql mysql2], "sqlite3")
|
@@ -135,8 +147,10 @@ module Gemstash
|
|
135
147
|
# we don't want to store metadata just yet
|
136
148
|
metadata_file = gemstash_env.base_file("metadata.yml")
|
137
149
|
break unless File.exist?(metadata_file)
|
150
|
+
|
138
151
|
version = Gem::Version.new(YAML.load_file(metadata_file)[:gemstash_version])
|
139
152
|
break if Gem::Requirement.new("<= #{Gemstash::VERSION}").satisfied_by?(Gem::Version.new(version))
|
153
|
+
|
140
154
|
raise Gemstash::CLI::Error.new(@cli, "The base path already exists with a newer version of Gemstash")
|
141
155
|
else
|
142
156
|
@cli.say "Creating the file storage path '#{dir}'"
|
@@ -160,6 +174,7 @@ module Gemstash
|
|
160
174
|
|
161
175
|
def say_error(title, error)
|
162
176
|
return unless @cli.options[:debug]
|
177
|
+
|
163
178
|
@cli.say @cli.set_color("#{title}: #{error}", :red)
|
164
179
|
|
165
180
|
error.backtrace.each do |line|
|
@@ -174,10 +189,10 @@ module Gemstash
|
|
174
189
|
gemstash_env.reset
|
175
190
|
end
|
176
191
|
|
177
|
-
def try(thing)
|
192
|
+
def try(thing, &block)
|
178
193
|
@cli.say "Checking that the #{thing} is available"
|
179
|
-
with_new_config
|
180
|
-
rescue => e
|
194
|
+
with_new_config(&block)
|
195
|
+
rescue StandardError => e
|
181
196
|
say_error "Error checking #{thing}", e
|
182
197
|
raise Gemstash::CLI::Error.new(@cli, "The #{thing} is not available")
|
183
198
|
end
|
data/lib/gemstash/cli/start.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "gemstash"
|
2
4
|
require "puma/cli"
|
3
5
|
|
@@ -18,6 +20,7 @@ module Gemstash
|
|
18
20
|
|
19
21
|
def setup_logging
|
20
22
|
return unless daemonize?
|
23
|
+
|
21
24
|
Gemstash::Logging.setup_logger(gemstash_env.log_file)
|
22
25
|
end
|
23
26
|
|
@@ -30,7 +33,7 @@ module Gemstash
|
|
30
33
|
end
|
31
34
|
|
32
35
|
def puma_config
|
33
|
-
File.expand_path("
|
36
|
+
File.expand_path("../puma.rb", __dir__)
|
34
37
|
end
|
35
38
|
|
36
39
|
def args
|
data/lib/gemstash/cli/status.rb
CHANGED
data/lib/gemstash/cli/stop.rb
CHANGED
data/lib/gemstash/cli.rb
CHANGED
data/lib/gemstash/config.ru
CHANGED
@@ -1,12 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "gemstash"
|
2
4
|
require "puma/commonlogger"
|
3
5
|
|
4
6
|
use Rack::Deflater
|
5
7
|
use Gemstash::Logging::RackMiddleware
|
6
8
|
|
7
|
-
if Gemstash::Env.daemonized?
|
8
|
-
use Puma::CommonLogger, Gemstash::Logging::StreamLogger.for_stdout
|
9
|
-
end
|
9
|
+
use Puma::CommonLogger, Gemstash::Logging::StreamLogger.for_stdout if Gemstash::Env.daemonized?
|
10
10
|
|
11
11
|
use Gemstash::Env::RackMiddleware, Gemstash::Env.current
|
12
12
|
use Gemstash::GemSource::RackMiddleware
|
@@ -1,8 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "yaml"
|
2
4
|
require "erb"
|
3
5
|
|
4
6
|
module Gemstash
|
5
|
-
|
7
|
+
# :nodoc:
|
6
8
|
class Configuration
|
7
9
|
DEFAULTS = {
|
8
10
|
cache_type: "memory",
|
@@ -10,12 +12,15 @@ module Gemstash
|
|
10
12
|
db_adapter: "sqlite3",
|
11
13
|
bind: "tcp://0.0.0.0:9292",
|
12
14
|
rubygems_url: "https://rubygems.org",
|
15
|
+
ignore_gemfile_source: false,
|
13
16
|
protected_fetch: false,
|
14
17
|
fetch_timeout: 20,
|
15
18
|
# Actual default for db_connection_options is dynamic based on the adapter
|
16
19
|
db_connection_options: {},
|
17
20
|
puma_threads: 16,
|
18
|
-
puma_workers: 1
|
21
|
+
puma_workers: 1,
|
22
|
+
cache_expiration: 30 * 60,
|
23
|
+
cache_max_size: 500
|
19
24
|
}.freeze
|
20
25
|
|
21
26
|
DEFAULT_FILE = File.expand_path("~/.gemstash/config.yml").freeze
|
@@ -35,6 +40,7 @@ module Gemstash
|
|
35
40
|
end
|
36
41
|
|
37
42
|
raise MissingFileError, file if file && !File.exist?(file)
|
43
|
+
|
38
44
|
file ||= default_file
|
39
45
|
|
40
46
|
if File.exist?(file)
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "gemstash"
|
2
4
|
|
3
5
|
module Gemstash
|
@@ -9,6 +11,7 @@ module Gemstash
|
|
9
11
|
upstream_id = Gemstash::DB::Upstream.find_or_insert(upstream)
|
10
12
|
record = self[upstream_id: upstream_id, name: gem_name.name, resource_type: resource_type.to_s]
|
11
13
|
return record.id if record
|
14
|
+
|
12
15
|
new(upstream_id: upstream_id, name: gem_name.name, resource_type: resource_type.to_s).tap(&:save).id
|
13
16
|
end
|
14
17
|
end
|
data/lib/gemstash/db/rubygem.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "gemstash"
|
2
4
|
|
3
5
|
module Gemstash
|
@@ -7,6 +9,7 @@ module Gemstash
|
|
7
9
|
def self.find_or_insert(spec)
|
8
10
|
record = self[name: spec.name]
|
9
11
|
return record.id if record
|
12
|
+
|
10
13
|
new(name: spec.name).tap(&:save).id
|
11
14
|
end
|
12
15
|
end
|
data/lib/gemstash/db/upstream.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Gemstash
|
2
4
|
module DB
|
3
5
|
# Sequel model for upstreams table.
|
@@ -5,6 +7,7 @@ module Gemstash
|
|
5
7
|
def self.find_or_insert(upstream)
|
6
8
|
record = self[uri: upstream.to_s]
|
7
9
|
return record.id if record
|
10
|
+
|
8
11
|
new(uri: upstream.to_s, host_id: upstream.host_id).tap(&:save).id
|
9
12
|
end
|
10
13
|
end
|
data/lib/gemstash/db/version.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "gemstash"
|
2
4
|
|
3
5
|
module Gemstash
|
@@ -52,6 +54,7 @@ module Gemstash
|
|
52
54
|
def self.find_by_full_name(full_name)
|
53
55
|
result = self[full_name: full_name]
|
54
56
|
return result if result
|
57
|
+
|
55
58
|
# Try again with the default platform, in case it is implied
|
56
59
|
self[full_name: "#{full_name}-ruby"]
|
57
60
|
end
|
data/lib/gemstash/db.rb
CHANGED
@@ -1,9 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "gemstash"
|
2
4
|
|
3
5
|
module Gemstash
|
4
6
|
# Module containing the DB models.
|
5
7
|
module DB
|
6
8
|
raise "Gemstash::DB cannot be loaded until the Gemstash::Env is available" unless Gemstash::Env.available?
|
9
|
+
|
7
10
|
Sequel::Model.db = Gemstash::Env.current.db
|
8
11
|
Sequel::Model.raise_on_save_failure = true
|
9
12
|
Sequel::Model.plugin :timestamps, update_on_create: true
|
@@ -1,8 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "cgi"
|
2
4
|
require "set"
|
3
5
|
|
4
6
|
module Gemstash
|
5
|
-
|
7
|
+
# :nodoc:
|
6
8
|
class Dependencies
|
7
9
|
def self.for_private
|
8
10
|
new(scope: "private", db_model: Gemstash::DB::Dependency)
|
@@ -22,7 +24,7 @@ module Gemstash
|
|
22
24
|
Fetcher.new(gems, @scope, @http_client, @db_model).fetch
|
23
25
|
end
|
24
26
|
|
25
|
-
|
27
|
+
# :nodoc:
|
26
28
|
class Fetcher
|
27
29
|
include Gemstash::Env::Helper
|
28
30
|
include Gemstash::Logging
|
@@ -59,6 +61,7 @@ module Gemstash
|
|
59
61
|
def fetch_from_database
|
60
62
|
return if done?
|
61
63
|
return unless @db_model
|
64
|
+
|
62
65
|
log.info "Querying dependencies: #{@gems.to_a.join(", ")}"
|
63
66
|
|
64
67
|
@db_model.fetch(@gems) do |gem, value|
|
@@ -71,6 +74,7 @@ module Gemstash
|
|
71
74
|
def fetch_from_web
|
72
75
|
return if done?
|
73
76
|
return unless @http_client
|
77
|
+
|
74
78
|
log.info "Fetching dependencies: #{@gems.to_a.join(", ")}"
|
75
79
|
gems_param = @gems.map {|gem| CGI.escape(gem) }.join(",")
|
76
80
|
fetched = @http_client.get("api/v1/dependencies?gems=#{gems_param}")
|
data/lib/gemstash/env.rb
CHANGED
@@ -1,9 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "gemstash"
|
2
4
|
require "active_support/core_ext/file/atomic"
|
3
5
|
require "dalli"
|
4
6
|
require "fileutils"
|
5
7
|
require "sequel"
|
6
8
|
require "uri"
|
9
|
+
require "pathname"
|
7
10
|
|
8
11
|
module Gemstash
|
9
12
|
# Storage for application-wide variables and configuration.
|
@@ -15,7 +18,7 @@ module Gemstash
|
|
15
18
|
|
16
19
|
# Little module to provide easy access to the current Gemstash::Env.
|
17
20
|
module Helper
|
18
|
-
|
21
|
+
private # rubocop:disable Layout/AccessModifierIndentation
|
19
22
|
|
20
23
|
def gemstash_env
|
21
24
|
Gemstash::Env.current
|
@@ -48,6 +51,7 @@ module Gemstash
|
|
48
51
|
|
49
52
|
def self.current
|
50
53
|
raise EnvNotSetError unless Thread.current[:gemstash_env]
|
54
|
+
|
51
55
|
Thread.current[:gemstash_env]
|
52
56
|
end
|
53
57
|
|
@@ -57,6 +61,7 @@ module Gemstash
|
|
57
61
|
|
58
62
|
def self.daemonized?
|
59
63
|
raise "Daemonized hasn't been set yet!" if @daemonized.nil?
|
64
|
+
|
60
65
|
@daemonized
|
61
66
|
end
|
62
67
|
|
@@ -105,12 +110,25 @@ module Gemstash
|
|
105
110
|
end
|
106
111
|
end
|
107
112
|
|
113
|
+
def pidfile
|
114
|
+
if config[:pidfile]
|
115
|
+
pathname = Pathname.new(config[:pidfile])
|
116
|
+
if pathname.relative?
|
117
|
+
base_file(pathname.to_s)
|
118
|
+
else
|
119
|
+
pathname.to_s
|
120
|
+
end
|
121
|
+
else
|
122
|
+
base_file("puma.pid")
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
108
126
|
def atomic_write(file, &block)
|
109
127
|
File.atomic_write(file, File.dirname(file), &block)
|
110
128
|
end
|
111
129
|
|
112
130
|
def rackup
|
113
|
-
File.expand_path("
|
131
|
+
File.expand_path("config.ru", __dir__)
|
114
132
|
end
|
115
133
|
|
116
134
|
def db
|
@@ -122,7 +140,7 @@ module Gemstash
|
|
122
140
|
db = if RUBY_PLATFORM == "java"
|
123
141
|
Sequel.connect("jdbc:sqlite:#{db_path}", config.database_connection_config)
|
124
142
|
else
|
125
|
-
Sequel.connect("sqlite://#{
|
143
|
+
Sequel.connect("sqlite://#{CGI.escape(db_path)}", config.database_connection_config)
|
126
144
|
end
|
127
145
|
when "postgres", "mysql", "mysql2"
|
128
146
|
db = Sequel.connect(config[:db_url], config.database_connection_config)
|
@@ -137,7 +155,7 @@ module Gemstash
|
|
137
155
|
|
138
156
|
def self.migrate(db)
|
139
157
|
Sequel.extension :migration
|
140
|
-
migrations_dir = File.expand_path("
|
158
|
+
migrations_dir = File.expand_path("migrations", __dir__)
|
141
159
|
Sequel::Migrator.run(db, migrations_dir, :use_transactions => true)
|
142
160
|
end
|
143
161
|
|
@@ -152,6 +170,8 @@ module Gemstash
|
|
152
170
|
Gemstash::LruReduxClient.new
|
153
171
|
when "memcached"
|
154
172
|
Dalli::Client.new(config[:memcached_servers])
|
173
|
+
when "redis"
|
174
|
+
Gemstash::RedisClient.new(config[:redis_servers])
|
155
175
|
else
|
156
176
|
raise "Invalid cache client: '#{config[:cache_type]}'"
|
157
177
|
end
|