spitball-server 0.0.1
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.
- data/.gitignore +4 -0
- data/Gemfile +4 -0
- data/Rakefile +2 -0
- data/bin/spitball-cache-cleanup +22 -0
- data/bin/spitball-server +100 -0
- data/lib/spitball-server.rb +5 -0
- data/spitball-server.gemspec +23 -0
- metadata +91 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Rakefile
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
require 'spitball'
|
|
4
|
+
require 'optparse'
|
|
5
|
+
|
|
6
|
+
args = {}
|
|
7
|
+
|
|
8
|
+
opts = OptionParser.new do |opts|
|
|
9
|
+
opts.banner = "Usage: spitball-cache-cleanup [options]"
|
|
10
|
+
opts.separator ""
|
|
11
|
+
opts.separator "options:"
|
|
12
|
+
|
|
13
|
+
opts.on('-w', '--access-window SECONDS', 'Access window within which tarballs are kept. Default 30 days') do |access_window|
|
|
14
|
+
args[:access_window] = access_window
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
opts.permute!(ARGV)
|
|
19
|
+
|
|
20
|
+
args[:access_window] ||= 2592000
|
|
21
|
+
|
|
22
|
+
Spitball::Repo.clean_up_unused(args[:access_window].to_i)
|
data/bin/spitball-server
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
require 'spitball'
|
|
4
|
+
require 'optparse'
|
|
5
|
+
require 'sinatra'
|
|
6
|
+
require 'json'
|
|
7
|
+
|
|
8
|
+
# cargo culting sinatra's option parser, since it has trouble
|
|
9
|
+
# with rubygem stub files
|
|
10
|
+
|
|
11
|
+
OptionParser.new { |op|
|
|
12
|
+
op.on('-x') { set :lock, true }
|
|
13
|
+
op.on('-e env') { |val| set :environment, val.to_sym }
|
|
14
|
+
op.on('-s server') { |val| set :server, val }
|
|
15
|
+
op.on('-p port') { |val| set :port, val.to_i }
|
|
16
|
+
op.on('-o addr') { |val| set :bind, val }
|
|
17
|
+
}.parse!(ARGV.dup)
|
|
18
|
+
|
|
19
|
+
# always run
|
|
20
|
+
set :run, true
|
|
21
|
+
|
|
22
|
+
mime_type :gemfile, 'text/plain'
|
|
23
|
+
mime_type :lock, 'text/plain'
|
|
24
|
+
mime_type :tgz, 'application/x-compressed'
|
|
25
|
+
|
|
26
|
+
# return json array of cached SHAs
|
|
27
|
+
get '/list' do
|
|
28
|
+
content_type :json
|
|
29
|
+
JSON.dump Spitball::Repo.cached_digests
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
get '/env' do
|
|
33
|
+
content_type :text
|
|
34
|
+
`#{$:.inspect}\n#{Spitball.gem_cmd} env`
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# return tgz or gemfile of cached SHA or 404
|
|
38
|
+
get '/:digest.:format' do |digest, format|
|
|
39
|
+
error 400 unless ['tgz', 'gemfile'].include? format
|
|
40
|
+
|
|
41
|
+
# this returns 404 on Errno::ENOENT
|
|
42
|
+
send_file Spitball::Repo.bundle_path(digest, format), :type => format
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
class Streamer
|
|
46
|
+
def initialize(io); @io = io end
|
|
47
|
+
def each; while buf = @io.read(200); yield buf end end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# POST a gemfile. Returns 201 Created if the bundle already exists, or
|
|
51
|
+
# 202 Accepted if it does not. The body of the response is the URI for
|
|
52
|
+
# the tarball.
|
|
53
|
+
post '/create' do
|
|
54
|
+
request_version = request.env["HTTP_#{Spitball::PROTOCOL_HEADER.gsub(/-/, '_').upcase}"]
|
|
55
|
+
if request_version != Spitball::PROTOCOL_VERSION
|
|
56
|
+
status 403
|
|
57
|
+
"Received version #{request_version} but need version #{Spitball::PROTOCOL_VERSION}"
|
|
58
|
+
else
|
|
59
|
+
without = request_version = request.env["HTTP_#{Spitball::WITHOUT_HEADER.gsub(/-/, '_').upcase}"]
|
|
60
|
+
without &&= without.split(',')
|
|
61
|
+
ball = Spitball.new(params['gemfile'], params['gemfile_lock'], :without => without)
|
|
62
|
+
url = "#{request.url.split("/create").first}/#{ball.digest}.tgz"
|
|
63
|
+
response['Location'] = url
|
|
64
|
+
|
|
65
|
+
if ball.cached?
|
|
66
|
+
status 201
|
|
67
|
+
"Bundle tarball pre-cached.\n"
|
|
68
|
+
else
|
|
69
|
+
status 202
|
|
70
|
+
|
|
71
|
+
i,o = IO.pipe
|
|
72
|
+
o.sync = true
|
|
73
|
+
|
|
74
|
+
# fork twice. once so we can have a pid to detach from in order to clean up,
|
|
75
|
+
# twice in order to properly redirect stdout for underlying shell commands.
|
|
76
|
+
pid = fork do
|
|
77
|
+
baller = open("|-")
|
|
78
|
+
if baller == nil # child
|
|
79
|
+
$stdout.sync = true
|
|
80
|
+
begin
|
|
81
|
+
ball.cache!
|
|
82
|
+
rescue Object => e
|
|
83
|
+
puts "#{e.class}: #{e}", e.backtrace.map{|l| "\t#{l}" }
|
|
84
|
+
end
|
|
85
|
+
else
|
|
86
|
+
while buf = baller.read(200)
|
|
87
|
+
$stdout.print buf
|
|
88
|
+
o.print buf
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
exit!
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
o.close
|
|
95
|
+
Process.detach(pid)
|
|
96
|
+
|
|
97
|
+
Streamer.new(i)
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
|
3
|
+
require "spitball-server"
|
|
4
|
+
|
|
5
|
+
Gem::Specification.new do |s|
|
|
6
|
+
s.name = "spitball-server"
|
|
7
|
+
s.version = Spitball::Server::VERSION
|
|
8
|
+
s.platform = Gem::Platform::RUBY
|
|
9
|
+
s.authors = ["Matt Freels", "Brandon Mitchell", "Joshua Hull"]
|
|
10
|
+
s.email = "freels@twitter.com"
|
|
11
|
+
s.homepage = ""
|
|
12
|
+
s.summary = %q{Use bundler to generate gem tarball packages -- server!}
|
|
13
|
+
s.description = %q{Use bundler to generate gem tarball packages - server!}
|
|
14
|
+
|
|
15
|
+
s.rubyforge_project = "spitball-server"
|
|
16
|
+
|
|
17
|
+
s.files = `git ls-files`.split("\n")
|
|
18
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
|
19
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
|
20
|
+
s.require_paths = ["lib"]
|
|
21
|
+
|
|
22
|
+
s.add_dependency 'spitball', '~> 0.5.0'
|
|
23
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: spitball-server
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
hash: 29
|
|
5
|
+
prerelease:
|
|
6
|
+
segments:
|
|
7
|
+
- 0
|
|
8
|
+
- 0
|
|
9
|
+
- 1
|
|
10
|
+
version: 0.0.1
|
|
11
|
+
platform: ruby
|
|
12
|
+
authors:
|
|
13
|
+
- Matt Freels
|
|
14
|
+
- Brandon Mitchell
|
|
15
|
+
- Joshua Hull
|
|
16
|
+
autorequire:
|
|
17
|
+
bindir: bin
|
|
18
|
+
cert_chain: []
|
|
19
|
+
|
|
20
|
+
date: 2011-04-25 00:00:00 -07:00
|
|
21
|
+
default_executable:
|
|
22
|
+
dependencies:
|
|
23
|
+
- !ruby/object:Gem::Dependency
|
|
24
|
+
name: spitball
|
|
25
|
+
prerelease: false
|
|
26
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
|
27
|
+
none: false
|
|
28
|
+
requirements:
|
|
29
|
+
- - ~>
|
|
30
|
+
- !ruby/object:Gem::Version
|
|
31
|
+
hash: 11
|
|
32
|
+
segments:
|
|
33
|
+
- 0
|
|
34
|
+
- 5
|
|
35
|
+
- 0
|
|
36
|
+
version: 0.5.0
|
|
37
|
+
type: :runtime
|
|
38
|
+
version_requirements: *id001
|
|
39
|
+
description: Use bundler to generate gem tarball packages - server!
|
|
40
|
+
email: freels@twitter.com
|
|
41
|
+
executables:
|
|
42
|
+
- spitball-cache-cleanup
|
|
43
|
+
- spitball-server
|
|
44
|
+
extensions: []
|
|
45
|
+
|
|
46
|
+
extra_rdoc_files: []
|
|
47
|
+
|
|
48
|
+
files:
|
|
49
|
+
- .gitignore
|
|
50
|
+
- Gemfile
|
|
51
|
+
- Rakefile
|
|
52
|
+
- bin/spitball-cache-cleanup
|
|
53
|
+
- bin/spitball-server
|
|
54
|
+
- lib/spitball-server.rb
|
|
55
|
+
- spitball-server.gemspec
|
|
56
|
+
has_rdoc: true
|
|
57
|
+
homepage: ""
|
|
58
|
+
licenses: []
|
|
59
|
+
|
|
60
|
+
post_install_message:
|
|
61
|
+
rdoc_options: []
|
|
62
|
+
|
|
63
|
+
require_paths:
|
|
64
|
+
- lib
|
|
65
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
66
|
+
none: false
|
|
67
|
+
requirements:
|
|
68
|
+
- - ">="
|
|
69
|
+
- !ruby/object:Gem::Version
|
|
70
|
+
hash: 3
|
|
71
|
+
segments:
|
|
72
|
+
- 0
|
|
73
|
+
version: "0"
|
|
74
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
75
|
+
none: false
|
|
76
|
+
requirements:
|
|
77
|
+
- - ">="
|
|
78
|
+
- !ruby/object:Gem::Version
|
|
79
|
+
hash: 3
|
|
80
|
+
segments:
|
|
81
|
+
- 0
|
|
82
|
+
version: "0"
|
|
83
|
+
requirements: []
|
|
84
|
+
|
|
85
|
+
rubyforge_project: spitball-server
|
|
86
|
+
rubygems_version: 1.6.2
|
|
87
|
+
signing_key:
|
|
88
|
+
specification_version: 3
|
|
89
|
+
summary: Use bundler to generate gem tarball packages -- server!
|
|
90
|
+
test_files: []
|
|
91
|
+
|