gemstash 1.0.4 → 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 +5 -5
- data/CHANGELOG.md +33 -0
- data/lib/gemstash.rb +2 -0
- data/lib/gemstash/api_key_authorization.rb +29 -0
- data/lib/gemstash/authorization.rb +5 -1
- data/lib/gemstash/cli/authorize.rb +1 -1
- data/lib/gemstash/cli/setup.rb +50 -37
- data/lib/gemstash/cli/start.rb +1 -1
- data/lib/gemstash/config.ru +1 -0
- data/lib/gemstash/configuration.rb +35 -3
- data/lib/gemstash/db/version.rb +11 -0
- data/lib/gemstash/env.rb +16 -10
- data/lib/gemstash/gem_fetcher.rb +1 -1
- data/lib/gemstash/gem_pusher.rb +15 -17
- data/lib/gemstash/gem_source/private_source.rb +29 -44
- data/lib/gemstash/gem_source/upstream_source.rb +4 -4
- data/lib/gemstash/gem_unyanker.rb +10 -4
- data/lib/gemstash/gem_yanker.rb +10 -4
- data/lib/gemstash/health.rb +53 -0
- data/lib/gemstash/http_client.rb +5 -3
- data/lib/gemstash/logging.rb +1 -1
- data/lib/gemstash/man/gemstash-authorize.1 +6 -5
- data/lib/gemstash/man/gemstash-authorize.1.txt +14 -13
- data/lib/gemstash/man/gemstash-configuration.5 +90 -8
- data/lib/gemstash/man/gemstash-configuration.5.txt +82 -6
- data/lib/gemstash/man/gemstash-customize.7 +68 -12
- data/lib/gemstash/man/gemstash-customize.7.txt +64 -26
- data/lib/gemstash/man/gemstash-debugging.7 +1 -1
- data/lib/gemstash/man/gemstash-deploy.7 +33 -1
- data/lib/gemstash/man/gemstash-deploy.7.txt +25 -0
- data/lib/gemstash/man/gemstash-mirror.7 +1 -1
- data/lib/gemstash/man/gemstash-multiple-sources.7 +1 -1
- data/lib/gemstash/man/gemstash-private-gems.7 +52 -3
- data/lib/gemstash/man/gemstash-private-gems.7.txt +39 -4
- data/lib/gemstash/man/gemstash-readme.7 +34 -4
- data/lib/gemstash/man/gemstash-readme.7.txt +34 -12
- data/lib/gemstash/man/gemstash-setup.1 +3 -1
- data/lib/gemstash/man/gemstash-setup.1.txt +3 -1
- data/lib/gemstash/man/gemstash-start.1 +4 -3
- data/lib/gemstash/man/gemstash-start.1.txt +5 -4
- data/lib/gemstash/man/gemstash-status.1 +4 -3
- data/lib/gemstash/man/gemstash-status.1.txt +3 -2
- data/lib/gemstash/man/gemstash-stop.1 +4 -3
- data/lib/gemstash/man/gemstash-stop.1.txt +3 -2
- data/lib/gemstash/man/gemstash-version.1 +1 -1
- data/lib/gemstash/puma.rb +2 -2
- data/lib/gemstash/specs_builder.rb +14 -16
- data/lib/gemstash/version.rb +1 -1
- metadata +29 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 653074694a6da8d9a0d09699993e21229de4676097e5cc930ffbd6110898a6cf
|
4
|
+
data.tar.gz: 62e548f1804f1da0d2709fb725186ad8a811f608c8e9d6a5f2567307295136f6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d378ab9b7674da573af0fd96fd0c22d8070cdc0f0e7e02c9efd4f22cff6723e28892b28067c64ed740ad18f2add456542ff16274a5f6c318840afb3d35eb2737
|
7
|
+
data.tar.gz: 61d2a82b279c024f9e89d3aa037c967af91a47ae99b4f28da26e93a759cf9e7459d09738385f9715b29191fd92046c56f05cbc01428a0a63977ff01bbc89084b
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,36 @@
|
|
1
|
+
## 1.1.0 (2017-07-31)
|
2
|
+
|
3
|
+
### Bugfixes
|
4
|
+
|
5
|
+
- Gracefully handle empty configuration files ([#97](https://github.com/bundler/gemstash/pull/97), [@rjocoleman](https://github.com/rjocoleman))
|
6
|
+
- Remove bundler-audit since we don't commit our Gemfile.lock ([#98](https://github.com/bundler/gemstash/pull/98), [@smellsblue](https://github.com/smellsblue))
|
7
|
+
- Clarify what is being cached for 30 minutes ([#108](https://github.com/bundler/gemstash/pull/108), [@Nowaker](https://github.com/Nowaker))
|
8
|
+
- Update documentation ([#112](https://github.com/bundler/gemstash/pull/112), [@smellsblue](https://github.com/smellsblue))
|
9
|
+
- Integration tests for searching for gems ([#113](https://github.com/bundler/gemstash/pull/113), [@smellsblue](https://github.com/smellsblue))
|
10
|
+
- Add `ruby-head` Gemfile for Travis ([#121](https://github.com/bundler/gemstash/pull/121), [@olleolleolle](https://github.com/olleolleolle))
|
11
|
+
- Make all Pandoc filters executable ([#122](https://github.com/bundler/gemstash/pull/122), [@olleolleolle](https://github.com/olleolleolle))
|
12
|
+
- Fix `rake doc` to work with newer versions of Pandoc ([#124](https://github.com/bundler/gemstash/pull/124), [@smellsblue](https://github.com/smellsblue))
|
13
|
+
- Use `curl` since `unyank` is removed in newer RubyGems versions ([#125](https://github.com/bundler/gemstash/pull/125), [@smellsblue](https://github.com/smellsblue))
|
14
|
+
- Touch up docs and update CHANGELOG ([#128](https://github.com/bundler/gemstash/pull/128), [@smellsblue](https://github.com/smellsblue))
|
15
|
+
- Update Travis to use ruby `2.3.3` ([#127](https://github.com/bundler/gemstash/pull/127), [@olleolleolle](https://github.com/olleolleolle))
|
16
|
+
- Add Ruby `2.4.0` to Travis ([#132](https://github.com/bundler/gemstash/pull/132), [@thedrow](https://github.com/thedrow))
|
17
|
+
|
18
|
+
### Features
|
19
|
+
|
20
|
+
- Add support for mysql2 adapter ([#71](https://github.com/bundler/gemstash/pull/71), [@chriseckhardt](https://github.com/chriseckhardt))
|
21
|
+
- Allow logging to a different file ([#74](https://github.com/bundler/gemstash/pull/74), [@mrchucho](https://github.com/mrchucho))
|
22
|
+
- Document temporary protected fetch solution ([#80](https://github.com/bundler/gemstash/pull/80), [@taoza](https://github.com/taoza))
|
23
|
+
- Make gem fetch timeout configurable ([#81](https://github.com/bundler/gemstash/pull/81), [@midwire](https://github.com/midwire))
|
24
|
+
- Document fallback timeout for when Gemstash is down ([#88](https://github.com/bundler/gemstash/pull/88), [@parndt](https://github.com/parndt))
|
25
|
+
- Allow ERB parsed config file via `.erb` extension ([#90](https://github.com/bundler/gemstash/pull/90), [@jiexinhuang](https://github.com/jiexinhuang), [@rjocoleman](https://github.com/rjocoleman))
|
26
|
+
- Improve code climate ([#92](https://github.com/bundler/gemstash/pull/92), [@smellsblue](https://github.com/smellsblue))
|
27
|
+
- Refactor authorization ([#93](https://github.com/bundler/gemstash/pull/93), [@smellsblue](https://github.com/smellsblue), [@rjocoleman](https://github.com/rjocoleman))
|
28
|
+
- Add protected fetch for private gems ([#94](https://github.com/bundler/gemstash/pull/94), [@rjocoleman](https://github.com/rjocoleman))
|
29
|
+
- Add Ruby Together call to action ([#116](https://github.com/bundler/gemstash/pull/116), [@mrb](https://github.com/mrb))
|
30
|
+
- Configurable options to `Sequel.connect` ([#123](https://github.com/bundler/gemstash/pull/123), [@olleolleolle](https://github.com/olleolleolle))
|
31
|
+
- Support the `latest_specs.4.8.gz` endpoint for private gems ([#131](https://github.com/bundler/gemstash/pull/131), [@randycoulman](https://github.com/randycoulman))
|
32
|
+
- Merge in the latest 1.0 stable ([#136](https://github.com/bundler/gemstash/pull/136), [@smellsblue](https://github.com/smellsblue), [@randycoulman](https://github.com/randycoulman))
|
33
|
+
|
1
34
|
## 1.0.4 (2017-01-27)
|
2
35
|
|
3
36
|
### Features
|
data/lib/gemstash.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
#:nodoc:
|
2
2
|
module Gemstash
|
3
|
+
autoload :ApiKeyAuthorization, "gemstash/api_key_authorization"
|
3
4
|
autoload :Authorization, "gemstash/authorization"
|
4
5
|
autoload :DB, "gemstash/db"
|
5
6
|
autoload :Cache, "gemstash/cache"
|
@@ -12,6 +13,7 @@ module Gemstash
|
|
12
13
|
autoload :GemSource, "gemstash/gem_source"
|
13
14
|
autoload :GemUnyanker, "gemstash/gem_unyanker"
|
14
15
|
autoload :GemYanker, "gemstash/gem_yanker"
|
16
|
+
autoload :Health, "gemstash/health"
|
15
17
|
autoload :HTTPClient, "gemstash/http_client"
|
16
18
|
autoload :Logging, "gemstash/logging"
|
17
19
|
autoload :LruReduxClient, "gemstash/cache"
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require "gemstash"
|
2
|
+
|
3
|
+
module Gemstash
|
4
|
+
# Authorize actions via an API key and Gemstash::Authorization.
|
5
|
+
class ApiKeyAuthorization
|
6
|
+
def initialize(key)
|
7
|
+
@key = key
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.protect(app, &block)
|
11
|
+
key = parse_authorization(app.request.env)
|
12
|
+
app.auth = new(key)
|
13
|
+
yield
|
14
|
+
rescue Gemstash::NotAuthorizedError => e
|
15
|
+
app.headers["WWW-Authenticate"] = "Basic realm=\"Gemstash Private Gems\""
|
16
|
+
app.halt 401, e.message
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.parse_authorization(request_env)
|
20
|
+
http_auth = Rack::Auth::Basic::Request.new(request_env)
|
21
|
+
return http_auth.credentials.first if http_auth.provided? && http_auth.basic?
|
22
|
+
request_env["HTTP_AUTHORIZATION"]
|
23
|
+
end
|
24
|
+
|
25
|
+
def check(permission)
|
26
|
+
Gemstash::Authorization.check(@key, permission)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -9,7 +9,7 @@ module Gemstash
|
|
9
9
|
class Authorization
|
10
10
|
extend Gemstash::Env::Helper
|
11
11
|
extend Gemstash::Logging
|
12
|
-
VALID_PERMISSIONS = %w(push yank unyank).freeze
|
12
|
+
VALID_PERMISSIONS = %w(push yank unyank fetch).freeze
|
13
13
|
|
14
14
|
def self.authorize(auth_key, permissions)
|
15
15
|
raise "Authorization key is required!" if auth_key.to_s.strip.empty?
|
@@ -83,5 +83,9 @@ module Gemstash
|
|
83
83
|
def unyank?
|
84
84
|
can?("unyank")
|
85
85
|
end
|
86
|
+
|
87
|
+
def fetch?
|
88
|
+
can?("fetch")
|
89
|
+
end
|
86
90
|
end
|
87
91
|
end
|
data/lib/gemstash/cli/setup.rb
CHANGED
@@ -22,6 +22,8 @@ module Gemstash
|
|
22
22
|
ask_storage
|
23
23
|
ask_cache
|
24
24
|
ask_database
|
25
|
+
ask_protected_fetch
|
26
|
+
ask_timeout
|
25
27
|
check_cache
|
26
28
|
check_storage
|
27
29
|
check_database
|
@@ -45,6 +47,22 @@ module Gemstash
|
|
45
47
|
@cli.say "#{label}: #{gemstash_env.config[option]}"
|
46
48
|
end
|
47
49
|
|
50
|
+
def ask_with_default(prompt, options, default)
|
51
|
+
raise "The options must all be lower case" if options.any? {|x| x.downcase != x }
|
52
|
+
result = nil
|
53
|
+
displayed_options = options.map {|x| x == default ? x.upcase : x }
|
54
|
+
prompt = "#{prompt} [#{displayed_options.join(", ")}]"
|
55
|
+
|
56
|
+
until result
|
57
|
+
result = @cli.ask prompt
|
58
|
+
result = result.downcase
|
59
|
+
result = default if result.empty?
|
60
|
+
result = nil unless options.include?(result)
|
61
|
+
end
|
62
|
+
|
63
|
+
result
|
64
|
+
end
|
65
|
+
|
48
66
|
def ask_storage
|
49
67
|
say_current_config(:base_path, "Current base path")
|
50
68
|
path = @cli.ask "Where should files go? [~/.gemstash]", path: true
|
@@ -54,18 +72,8 @@ module Gemstash
|
|
54
72
|
|
55
73
|
def ask_cache
|
56
74
|
say_current_config(:cache_type, "Current cache")
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
until cache
|
61
|
-
cache = @cli.ask "Cache with what? [MEMORY, memcached]"
|
62
|
-
cache = cache.downcase
|
63
|
-
cache = "memory" if cache.empty?
|
64
|
-
cache = nil unless options.include?(cache)
|
65
|
-
end
|
66
|
-
|
67
|
-
@config[:cache_type] = cache
|
68
|
-
ask_memcached_details if cache == "memcached"
|
75
|
+
@config[:cache_type] = ask_with_default("Cache with what?", %w(memory memcached), "memory")
|
76
|
+
ask_memcached_details if @config[:cache_type] == "memcached"
|
69
77
|
end
|
70
78
|
|
71
79
|
def ask_memcached_details
|
@@ -77,27 +85,17 @@ module Gemstash
|
|
77
85
|
|
78
86
|
def ask_database
|
79
87
|
say_current_config(:db_adapter, "Current database adapter")
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
until database
|
84
|
-
database = @cli.ask "What database adapter? [SQLITE3, postgres, mysql]"
|
85
|
-
database = database.downcase
|
86
|
-
database = "sqlite3" if database.empty?
|
87
|
-
database = nil unless options.include?(database)
|
88
|
-
end
|
89
|
-
|
90
|
-
@config[:db_adapter] = database
|
91
|
-
ask_database_details(database) unless database == "sqlite3"
|
88
|
+
@config[:db_adapter] = ask_with_default("What database adapter?", %w(sqlite3 postgres mysql mysql2), "sqlite3")
|
89
|
+
ask_database_details(@config[:db_adapter]) unless @config[:db_adapter] == "sqlite3"
|
92
90
|
end
|
93
91
|
|
94
92
|
def ask_database_details(database)
|
95
93
|
say_current_config(:db_url, "Current database url")
|
96
94
|
|
97
|
-
if RUBY_PLATFORM == "java"
|
98
|
-
|
95
|
+
default_value = if RUBY_PLATFORM == "java"
|
96
|
+
"jdbc:#{database}:///gemstash"
|
99
97
|
else
|
100
|
-
|
98
|
+
"#{database}:///gemstash"
|
101
99
|
end
|
102
100
|
|
103
101
|
url = @cli.ask "Where is the database? [#{default_value}]"
|
@@ -105,20 +103,27 @@ module Gemstash
|
|
105
103
|
@config[:db_url] = url
|
106
104
|
end
|
107
105
|
|
106
|
+
def ask_protected_fetch
|
107
|
+
say_current_config(:protected_fetch, "Protected Fetch enabled")
|
108
|
+
|
109
|
+
value = @cli.yes? "Use Protected Fetch for Private Gems? [y/N]"
|
110
|
+
value = Gemstash::Configuration::DEFAULTS[:protected_fetch] if value.is_a?(String) && value.empty?
|
111
|
+
@config[:protected_fetch] = value
|
112
|
+
end
|
113
|
+
|
114
|
+
def ask_timeout
|
115
|
+
say_current_config(:fetch_timeout, "Fetch timeout")
|
116
|
+
timeout = @cli.ask "How many seconds to wait when fetching a gem? [20]"
|
117
|
+
timeout = Gemstash::Configuration::DEFAULTS[:fetch_timeout] if timeout.to_i < 1
|
118
|
+
@config[:fetch_timeout] = timeout.to_i
|
119
|
+
end
|
120
|
+
|
108
121
|
def check_cache
|
109
|
-
|
110
|
-
with_new_config { gemstash_env.cache_client.alive! }
|
111
|
-
rescue => e
|
112
|
-
say_error "Cache error", e
|
113
|
-
raise Gemstash::CLI::Error.new(@cli, "The cache is not available")
|
122
|
+
try("cache") { gemstash_env.cache_client.alive! }
|
114
123
|
end
|
115
124
|
|
116
125
|
def check_database
|
117
|
-
|
118
|
-
with_new_config { gemstash_env.db.test_connection }
|
119
|
-
rescue => e
|
120
|
-
say_error "Database error", e
|
121
|
-
raise Gemstash::CLI::Error.new(@cli, "The database is not available")
|
126
|
+
try("database") { gemstash_env.db.test_connection }
|
122
127
|
end
|
123
128
|
|
124
129
|
def check_storage
|
@@ -168,6 +173,14 @@ module Gemstash
|
|
168
173
|
ensure
|
169
174
|
gemstash_env.reset
|
170
175
|
end
|
176
|
+
|
177
|
+
def try(thing)
|
178
|
+
@cli.say "Checking that the #{thing} is available"
|
179
|
+
with_new_config { yield }
|
180
|
+
rescue => e
|
181
|
+
say_error "Error checking #{thing}", e
|
182
|
+
raise Gemstash::CLI::Error.new(@cli, "The #{thing} is not available")
|
183
|
+
end
|
171
184
|
end
|
172
185
|
end
|
173
186
|
end
|
data/lib/gemstash/cli/start.rb
CHANGED
data/lib/gemstash/config.ru
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require "yaml"
|
2
|
+
require "erb"
|
2
3
|
|
3
4
|
module Gemstash
|
4
5
|
#:nodoc:
|
@@ -8,7 +9,12 @@ module Gemstash
|
|
8
9
|
base_path: File.expand_path("~/.gemstash"),
|
9
10
|
db_adapter: "sqlite3",
|
10
11
|
bind: "tcp://0.0.0.0:9292",
|
11
|
-
rubygems_url: "https://rubygems.org"
|
12
|
+
rubygems_url: "https://rubygems.org",
|
13
|
+
protected_fetch: false,
|
14
|
+
fetch_timeout: 20,
|
15
|
+
# Actual default for db_connection_options is dynamic based on the adapter
|
16
|
+
db_connection_options: {},
|
17
|
+
puma_threads: 16
|
12
18
|
}.freeze
|
13
19
|
|
14
20
|
DEFAULT_FILE = File.expand_path("~/.gemstash/config.yml").freeze
|
@@ -28,10 +34,10 @@ module Gemstash
|
|
28
34
|
end
|
29
35
|
|
30
36
|
raise MissingFileError, file if file && !File.exist?(file)
|
31
|
-
file ||=
|
37
|
+
file ||= default_file
|
32
38
|
|
33
39
|
if File.exist?(file)
|
34
|
-
@config =
|
40
|
+
@config = parse_config(file)
|
35
41
|
@config = DEFAULTS.merge(@config)
|
36
42
|
@config.freeze
|
37
43
|
else
|
@@ -46,5 +52,31 @@ module Gemstash
|
|
46
52
|
def [](key)
|
47
53
|
@config[key]
|
48
54
|
end
|
55
|
+
|
56
|
+
# @return [Hash] Sequel connection configuration hash
|
57
|
+
def database_connection_config
|
58
|
+
case self[:db_adapter]
|
59
|
+
when "sqlite3"
|
60
|
+
{ max_connections: 1 }.merge(self[:db_connection_options])
|
61
|
+
when "postgres", "mysql", "mysql2"
|
62
|
+
{ max_connections: self[:puma_threads] + 1 }.merge(self[:db_connection_options])
|
63
|
+
else
|
64
|
+
raise "Unsupported DB adapter: '#{self[:db_adapter]}'"
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
private
|
69
|
+
|
70
|
+
def default_file
|
71
|
+
File.exist?("#{DEFAULT_FILE}.erb") ? "#{DEFAULT_FILE}.erb" : DEFAULT_FILE
|
72
|
+
end
|
73
|
+
|
74
|
+
def parse_config(file)
|
75
|
+
if file.end_with?(".erb")
|
76
|
+
YAML.load(ERB.new(File.read(file)).result) || {}
|
77
|
+
else
|
78
|
+
YAML.load_file(file) || {}
|
79
|
+
end
|
80
|
+
end
|
49
81
|
end
|
50
82
|
end
|
data/lib/gemstash/db/version.rb
CHANGED
@@ -19,6 +19,17 @@ module Gemstash
|
|
19
19
|
[rubygem.name, Gem::Version.new(number), platform]
|
20
20
|
end
|
21
21
|
|
22
|
+
def self.slug(params)
|
23
|
+
version = params[:version]
|
24
|
+
platform = params[:platform]
|
25
|
+
|
26
|
+
if platform.to_s.empty?
|
27
|
+
version
|
28
|
+
else
|
29
|
+
"#{version}-#{platform}"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
22
33
|
def self.for_spec_collection(prerelease: false, latest: false)
|
23
34
|
versions = where(indexed: true, prerelease: prerelease).association_join(:rubygem)
|
24
35
|
latest ? select_latest(versions) : versions
|
data/lib/gemstash/env.rb
CHANGED
@@ -31,6 +31,7 @@ module Gemstash
|
|
31
31
|
|
32
32
|
def call(env)
|
33
33
|
env["gemstash.env"] = @gemstash_env
|
34
|
+
Gemstash::Env.current = @gemstash_env
|
34
35
|
@app.call(env)
|
35
36
|
end
|
36
37
|
end
|
@@ -55,11 +56,8 @@ module Gemstash
|
|
55
56
|
end
|
56
57
|
|
57
58
|
def self.daemonized?
|
58
|
-
if @daemonized.nil?
|
59
|
-
|
60
|
-
else
|
61
|
-
@daemonized
|
62
|
-
end
|
59
|
+
raise "Daemonized hasn't been set yet!" if @daemonized.nil?
|
60
|
+
@daemonized
|
63
61
|
end
|
64
62
|
|
65
63
|
def self.daemonized=(value)
|
@@ -99,6 +97,14 @@ module Gemstash
|
|
99
97
|
File.join(base_path, path)
|
100
98
|
end
|
101
99
|
|
100
|
+
def log_file
|
101
|
+
if config[:log_file] == :stdout
|
102
|
+
$stdout
|
103
|
+
else
|
104
|
+
base_file(config[:log_file] || "server.log")
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
102
108
|
def atomic_write(file, &block)
|
103
109
|
File.atomic_write(file, File.dirname(file), &block)
|
104
110
|
end
|
@@ -113,13 +119,13 @@ module Gemstash
|
|
113
119
|
when "sqlite3"
|
114
120
|
db_path = base_file("gemstash.db")
|
115
121
|
|
116
|
-
if RUBY_PLATFORM == "java"
|
117
|
-
|
122
|
+
db = if RUBY_PLATFORM == "java"
|
123
|
+
Sequel.connect("jdbc:sqlite:#{db_path}", config.database_connection_config)
|
118
124
|
else
|
119
|
-
|
125
|
+
Sequel.connect("sqlite://#{URI.escape(db_path)}", config.database_connection_config)
|
120
126
|
end
|
121
|
-
when "postgres", "mysql"
|
122
|
-
db = Sequel.connect(config[:db_url])
|
127
|
+
when "postgres", "mysql", "mysql2"
|
128
|
+
db = Sequel.connect(config[:db_url], config.database_connection_config)
|
123
129
|
else
|
124
130
|
raise "Unsupported DB adapter: '#{config[:db_adapter]}'"
|
125
131
|
end
|
data/lib/gemstash/gem_fetcher.rb
CHANGED
data/lib/gemstash/gem_pusher.rb
CHANGED
@@ -16,12 +16,17 @@ module Gemstash
|
|
16
16
|
class YankedVersionError < ExistingVersionError
|
17
17
|
end
|
18
18
|
|
19
|
-
def
|
20
|
-
|
19
|
+
def self.serve(app)
|
20
|
+
gem = app.request.body.read
|
21
|
+
new(app.auth, gem).serve
|
22
|
+
end
|
23
|
+
|
24
|
+
def initialize(auth, content)
|
25
|
+
@auth = auth
|
21
26
|
@content = content
|
22
27
|
end
|
23
28
|
|
24
|
-
def
|
29
|
+
def serve
|
25
30
|
check_auth
|
26
31
|
store_gem
|
27
32
|
store_gemspec
|
@@ -44,7 +49,7 @@ module Gemstash
|
|
44
49
|
end
|
45
50
|
|
46
51
|
def check_auth
|
47
|
-
|
52
|
+
@auth.check("push")
|
48
53
|
end
|
49
54
|
|
50
55
|
def store_gem
|
@@ -64,15 +69,8 @@ module Gemstash
|
|
64
69
|
gemstash_env.db.transaction do
|
65
70
|
gem_id = Gemstash::DB::Rubygem.find_or_insert(spec)
|
66
71
|
existing = Gemstash::DB::Version.find_by_spec(gem_id, spec)
|
67
|
-
|
68
|
-
if existing
|
69
|
-
if existing.indexed
|
70
|
-
raise ExistingVersionError, "Cannot push to an existing version!"
|
71
|
-
else
|
72
|
-
raise YankedVersionError, "Cannot push to a yanked version!"
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
72
|
+
raise ExistingVersionError, "Cannot push to an existing version!" if existing && existing.indexed
|
73
|
+
raise YankedVersionError, "Cannot push to a yanked version!" if existing && !existing.indexed
|
76
74
|
version_id = Gemstash::DB::Version.insert_by_spec(gem_id, spec)
|
77
75
|
Gemstash::DB::Dependency.insert_by_spec(version_id, spec)
|
78
76
|
end
|
@@ -90,14 +88,14 @@ module Gemstash
|
|
90
88
|
module LegacyRubyGemsSupport
|
91
89
|
def self.included(base)
|
92
90
|
base.class_eval do
|
93
|
-
alias_method :
|
94
|
-
remove_method :
|
91
|
+
alias_method :serve_without_cleanup, :serve
|
92
|
+
remove_method :serve
|
95
93
|
remove_method :gem
|
96
94
|
end
|
97
95
|
end
|
98
96
|
|
99
|
-
def
|
100
|
-
|
97
|
+
def serve
|
98
|
+
serve_without_cleanup
|
101
99
|
ensure
|
102
100
|
cleanup
|
103
101
|
end
|