1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
require 'fileutils'
require 'pathname'
require 'yaml'
require 'bundler/rubygems'
module Bundler
VERSION = "0.9.0.pre6"
autoload :Definition, 'bundler/definition'
autoload :Dependency, 'bundler/dependency'
autoload :Dsl, 'bundler/dsl'
autoload :Environment, 'bundler/environment'
autoload :Index, 'bundler/index'
autoload :Installer, 'bundler/installer'
autoload :RemoteSpecification, 'bundler/remote_specification'
autoload :Resolver, 'bundler/resolver'
autoload :Settings, 'bundler/settings'
autoload :Source, 'bundler/source'
autoload :Specification, 'bundler/specification'
autoload :UI, 'bundler/ui'
class BundlerError < StandardError
def self.status_code(code = nil)
return @code unless code
@code = code
end
def status_code
self.class.status_code
end
end
class GemfileNotFound < BundlerError; status_code(10) ; end
class GemNotFound < BundlerError; status_code(7) ; end
class VersionConflict < BundlerError; status_code(6) ; end
class GemfileError < BundlerError; status_code(4) ; end
class GitError < BundlerError; status_code(11) ; end
class << self
attr_writer :ui, :bundle_path
def configure
@configured ||= begin
configure_gem_home_and_path
true
end
end
def ui
@ui ||= UI.new
end
def bundle_path
@bundle_path ||= begin
path = settings[:path] || "#{Gem.user_home}/.bundle"
Pathname.new(path).expand_path(root)
end
end
def setup(*groups)
gemfile = default_gemfile
load(gemfile).setup(*groups)
end
def load(gemfile = default_gemfile)
root = Pathname.new(gemfile).dirname
Environment.new root, definition(gemfile)
end
def definition(gemfile = default_gemfile)
configure
root = Pathname.new(gemfile).dirname
lockfile = root.join("Gemfile.lock")
if lockfile.exist?
Definition.from_lock(lockfile)
else
Definition.from_gemfile(gemfile)
end
end
def home
Pathname.new(bundle_path).join("bundler")
end
def install_path
home.join("gems")
end
def cache
home.join("cache")
end
def root
default_gemfile.dirname
end
def settings
@settings ||= Settings.new(root)
end
private
def default_gemfile
current = Pathname.new(Dir.pwd)
until current.root?
filename = current.join("Gemfile")
return filename if filename.exist?
current = current.parent
end
raise GemfileNotFound, "The default Gemfile was not found"
end
def configure_gem_home_and_path
if path = settings[:path]
ENV['GEM_HOME'] = File.expand_path(path, root)
ENV['GEM_PATH'] = ''
else
gem_home, gem_path = Gem.dir, Gem.path
ENV["GEM_PATH"] = [gem_home, gem_path].flatten.compact.join(File::PATH_SEPARATOR)
ENV["GEM_HOME"] = bundle_path.to_s
end
Gem.clear_paths
end
end
end
|