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 ADDED
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in spitball-server.gemspec
4
+ gemspec
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
@@ -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)
@@ -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,5 @@
1
+ module Spitball
2
+ module Server
3
+ VERSION = "0.0.1"
4
+ end
5
+ 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
+