spitball 0.4.3 → 0.4.4

Sign up to get free protection for your applications and to get access to all the features.
data/bin/spitball CHANGED
@@ -30,6 +30,10 @@ opts = OptionParser.new do |opts|
30
30
  args[:without] = without
31
31
  end
32
32
 
33
+ opts.on('-g', '--generate-only', "Only generate, don't download") do
34
+ args[:generate] = true
35
+ end
36
+
33
37
  opts.separator ""
34
38
  opts.separator "environment variables:"
35
39
  opts.separator "\tSPITBALL_CACHE\t\t Specifies the cache dir. Defaults to /tmp/spitball"
@@ -53,4 +57,5 @@ ball = args[:host] ?
53
57
  Spitball::Remote.new(gemfile, gemfile_lock, :host => args[:host], :port => (args[:port] || 8080).to_i, :without => args[:without]) :
54
58
  Spitball.new(gemfile, gemfile_lock, :without => args[:without])
55
59
 
56
- ball.copy_to args[:destination]
60
+ args[:generate] ? ball.cache! : ball.copy_to(args[:destination])
61
+
@@ -3,6 +3,7 @@ module Bundler
3
3
 
4
4
  def initialize(file)
5
5
  @groups = Hash.new{|h, k| h[k] = []}
6
+ @gem_names = []
6
7
  instance_eval(file)
7
8
  end
8
9
 
@@ -10,6 +11,10 @@ module Bundler
10
11
  @groups
11
12
  end
12
13
 
14
+ def __gem_names
15
+ @gem_names
16
+ end
17
+
13
18
  def group(name, &blk)
14
19
  @current_group = name.to_sym
15
20
  instance_eval(&blk)
@@ -18,6 +23,7 @@ module Bundler
18
23
  alias_method :groups, :group
19
24
 
20
25
  def gem(*args)
26
+ @gem_names << args.first
21
27
  @groups[@current_group] << args.first
22
28
  end
23
29
 
data/lib/spitball.rb CHANGED
@@ -25,10 +25,14 @@ class Spitball
25
25
  attr_reader :gemfile, :gemfile_lock, :without, :options
26
26
 
27
27
  def initialize(gemfile, gemfile_lock, options = {})
28
+ Spitball::Repo.make_cache_dirs
28
29
  @gemfile = gemfile
29
30
  @gemfile_lock = gemfile_lock
30
31
  @options = options
31
32
  @without = (options[:without] || []).map{|w| w.to_sym}
33
+ @parsed_lockfile, @dsl = Bundler::FakeLockfileParser.new(gemfile_lock), Bundler::FakeDsl.new(gemfile)
34
+ raise "You need to run bundle install before you can use spitball" unless (@parsed_lockfile.dependencies.map{|d| d.name}.uniq.sort == @dsl.__gem_names.uniq.sort)
35
+ @groups_to_install = @dsl.__groups.keys - @without
32
36
  end
33
37
 
34
38
  def cached?
@@ -36,18 +40,16 @@ class Spitball
36
40
  end
37
41
 
38
42
  def cache!(sync = true)
39
- Spitball::Repo.make_cache_dirs
40
- unless cached?
41
- lock = Spitball::FileLock.new(bundle_path('lock'))
42
- if lock.acquire_lock
43
- begin
44
- create_bundle
45
- ensure
46
- lock.release_lock
47
- end
48
- elsif sync
49
- sleep 0.1 until cached?
43
+ return if cached?
44
+ lock = Spitball::FileLock.new(bundle_path('lock'))
45
+ if lock.acquire_lock
46
+ begin
47
+ create_bundle
48
+ ensure
49
+ lock.release_lock
50
50
  end
51
+ elsif sync
52
+ sleep 0.1 until cached?
51
53
  end
52
54
  end
53
55
 
@@ -59,7 +61,6 @@ class Spitball
59
61
  end
60
62
 
61
63
  def create_bundle
62
- ENV['BUNDLE_GEMFILE'] = gemfile_path # make bundler happy! :) *cry*
63
64
  Spitball::Repo.make_cache_dirs
64
65
  FileUtils.mkdir_p bundle_path
65
66
 
@@ -67,11 +68,9 @@ class Spitball
67
68
  File.open(gemfile_path, 'w') {|f| f.write gemfile }
68
69
  File.open(gemfile_lock_path, 'w') {|f| f.write gemfile_lock }
69
70
 
70
- parsed_lockfile, dsl = Bundler::FakeLockfileParser.new(gemfile_lock), Bundler::FakeDsl.new(gemfile)
71
-
72
71
  Dir.chdir(Repo.gemcache_path) do
73
- parsed_lockfile.specs.each do |spec|
74
- install_gem(spec, parsed_lockfile.sources) unless without.any?{|w| dsl.__groups[w].include?(spec.name)}
72
+ @dsl.__gem_names.each do |spec_name|
73
+ install_gem(@parsed_lockfile.specs.find {|spec| spec.name == spec_name})
75
74
  end
76
75
  end
77
76
 
@@ -89,12 +88,27 @@ class Spitball
89
88
  FileUtils.rm_rf bundle_path
90
89
  end
91
90
 
92
- def install_gem(spec, sources)
93
- cache_dir = File.join(Repo.gemcache_path, "#{spec.name}-#{::Digest::MD5.hexdigest([spec.name, spec.version, sources_opt(sources)].join('/'))}")
91
+ def install_gem(spec)
92
+ if @groups_to_install.any?{|group| @dsl.__groups[group].include?(spec.name)}
93
+ install_and_copy_spec(spec)
94
+ spec.dependencies.each do |dep|
95
+ install_gem(@parsed_lockfile.specs.find {|spec| spec.name == dep.name})
96
+ end
97
+ end
98
+
99
+ end
100
+
101
+ def install_and_copy_spec(spec)
102
+ cache_dir = File.join(Repo.gemcache_path, "#{spec.name}-#{::Digest::MD5.hexdigest([spec.name, spec.version, sources_opt(@parsed_lockfile.sources)].join('/'))}")
94
103
  unless File.exist?(cache_dir)
95
104
  FileUtils.mkdir_p(cache_dir)
96
- out = `gem install #{spec.name} -v'#{spec.version}' --no-rdoc --no-ri --ignore-dependencies -i#{cache_dir} #{sources_opt(sources)} 2>&1`
97
- $? == 0 ? (puts out) : (raise BundleCreationFailure, out)
105
+ out = `gem install #{spec.name} -v'#{spec.version}' --no-rdoc --no-ri --ignore-dependencies -i#{cache_dir} #{sources_opt(@parsed_lockfile.sources)} 2>&1`
106
+ if $? == 0
107
+ puts out
108
+ else
109
+ FileUtils.rm_rf(cache_dir)
110
+ raise BundleCreationFailure, out
111
+ end
98
112
  else
99
113
  puts "Using cached version of #{spec.name} (#{spec.version})"
100
114
  end
@@ -128,4 +142,4 @@ class Spitball
128
142
  def tarball_path
129
143
  Repo.bundle_path(digest, 'tgz')
130
144
  end
131
- end
145
+ end
@@ -9,9 +9,7 @@ class Spitball::FileLock
9
9
  end
10
10
 
11
11
  def acquire_lock
12
-
13
12
  File.open(pre_lock_path, 'w') {|f| f.write Process.pid }
14
-
15
13
  system "ln #{pre_lock_path} #{path} > /dev/null 2>&1"
16
14
  File.read(path).to_i == Process.pid
17
15
  ensure
@@ -7,12 +7,11 @@ class Spitball::Remote
7
7
  include Spitball::ClientCommon
8
8
 
9
9
  def initialize(gemfile, gemfile_lock, opts = {})
10
- @gemfile = gemfile
11
- @gemfile_lock = gemfile_lock
12
- @host = opts[:host]
13
- @port = opts[:port]
14
- @without = (opts[:without] || []).map{|w| w.to_sym}
15
- @cache_dir = '/tmp/spitball/client'
10
+ @gemfile, @gemfile_lock = gemfile, gemfile_lock
11
+ @host = opts[:host]
12
+ @port = opts[:port]
13
+ @without = (opts[:without] || []).map{|w| w.to_sym}
14
+ @cache_dir = File.join(ENV['SPITBALL_CACHE'] || '/tmp/spitball', 'client')
16
15
  FileUtils.mkdir_p(@cache_dir)
17
16
  use_cache_file
18
17
  end
@@ -1,3 +1,3 @@
1
1
  class Spitball
2
- VERSION = '0.4.3'
2
+ VERSION = '0.4.4'
3
3
  end
data/spec/spec_helper.rb CHANGED
@@ -12,7 +12,7 @@ require 'rubygems'
12
12
  require 'fileutils'
13
13
  require 'spec'
14
14
  require 'spitball'
15
-
15
+ require 'phocus'
16
16
 
17
17
  Spec::Runner.configure do |config|
18
18
  config.mock_with :rr
@@ -28,7 +28,7 @@ describe Spitball do
28
28
  describe "cached?" do
29
29
  it "returns true if the tarball has already been cached" do
30
30
  @spitball.should_not be_cached
31
- mock(@spitball).install_gem(anything, anything).times(any_times)
31
+ mock(@spitball).install_gem(anything).times(any_times)
32
32
  @spitball.cache!
33
33
  @spitball.should be_cached
34
34
  end
@@ -82,7 +82,7 @@ describe Spitball do
82
82
 
83
83
  describe "create_bundle" do
84
84
  it "generates a bundle at the bundle_path" do
85
- mock(@spitball).install_gem(anything, anything).times(any_times)
85
+ mock(@spitball).install_gem(anything).times(any_times)
86
86
  capture_stdout { @spitball.send :create_bundle }
87
87
  File.exist?(@spitball.send(:tarball_path)).should == true
88
88
  end
@@ -127,10 +127,10 @@ describe Spitball do
127
127
 
128
128
  it "should use without" do
129
129
  @spitball = Spitball.new(@gemfile, @lockfile)
130
- mock(@spitball).install_gem(anything, anything).times(7)
130
+ mock(@spitball).install_and_copy_spec(anything).times(1)
131
131
  @spitball.send :create_bundle
132
132
  @spitball = Spitball.new(@gemfile, @lockfile, :without => 'development')
133
- mock(@spitball).install_gem(anything, anything).times(6)
133
+ mock(@spitball).install_and_copy_spec(anything).times(0)
134
134
  @spitball.send :create_bundle
135
135
  end
136
136
  end
@@ -255,3 +255,37 @@ describe Spitball::Digest do
255
255
  spitball.hash.should == spitball.digest.hash
256
256
  end
257
257
  end
258
+
259
+ describe Spitball do
260
+ context "mismatched" do
261
+ before do
262
+ use_success_bundler
263
+
264
+ @gemfile = <<-end_gemfile
265
+ source :rubygems
266
+ gem "json_pure"
267
+ gem "somethingelse"
268
+ end_gemfile
269
+
270
+ @lockfile = <<-end_lockfile.strip.gsub(/\n[ ]{6}/m, "\n")
271
+ GEM
272
+ remote: http://rubygems.org/
273
+ specs:
274
+ json_pure (1.4.6)
275
+
276
+ PLATFORMS
277
+ ruby
278
+
279
+ DEPENDENCIES
280
+ json_pure
281
+ end_lockfile
282
+
283
+ end
284
+
285
+ describe "create_bundle failure" do
286
+ it "should raise on create_bundle" do
287
+ proc { Spitball.new(@gemfile, @lockfile) }.should raise_error
288
+ end
289
+ end
290
+ end
291
+ end
data/spitball.gemspec CHANGED
@@ -18,6 +18,7 @@ Gem::Specification.new do |s|
18
18
  s.add_development_dependency 'rspec', "~> 1.3.0"
19
19
  s.add_development_dependency 'rr'
20
20
  s.add_development_dependency 'rake'
21
+ s.add_development_dependency 'phocus'
21
22
 
22
23
  s.files = `git ls-files`.split("\n")
23
24
  s.test_files = `git ls-files -- spec/*`.split("\n")
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spitball
3
3
  version: !ruby/object:Gem::Version
4
- hash: 9
4
+ hash: 7
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 4
9
- - 3
10
- version: 0.4.3
9
+ - 4
10
+ version: 0.4.4
11
11
  platform: ruby
12
12
  authors:
13
13
  - Matt Freels
@@ -17,7 +17,7 @@ autorequire:
17
17
  bindir: bin
18
18
  cert_chain: []
19
19
 
20
- date: 2010-11-16 00:00:00 -08:00
20
+ date: 2011-01-06 00:00:00 -08:00
21
21
  default_executable:
22
22
  dependencies:
23
23
  - !ruby/object:Gem::Dependency
@@ -79,6 +79,20 @@ dependencies:
79
79
  version: "0"
80
80
  type: :development
81
81
  version_requirements: *id004
82
+ - !ruby/object:Gem::Dependency
83
+ name: phocus
84
+ prerelease: false
85
+ requirement: &id005 !ruby/object:Gem::Requirement
86
+ none: false
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ hash: 3
91
+ segments:
92
+ - 0
93
+ version: "0"
94
+ type: :development
95
+ version_requirements: *id005
82
96
  description: Use bundler to generate gem tarball packages.
83
97
  email: freels@twitter.com
84
98
  executables: