spitball-server 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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
+