erlbox 1.6.0 → 1.7.0

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION.yml CHANGED
@@ -1,4 +1,4 @@
1
1
  ---
2
2
  :patch: 0
3
3
  :major: 1
4
- :minor: 6
4
+ :minor: 7
data/bin/erlbox CHANGED
@@ -70,13 +70,13 @@ def load_config()
70
70
  config
71
71
  end
72
72
 
73
- def download_app(appname, appurl)
73
+ def download_app(appname, appurl, appvers)
74
74
  # Work directory will be /tmp/erlbox.<pid>
75
75
  tmpdir = "/tmp/erlbox_#{appname}.#{Process.pid}"
76
76
 
77
77
  # Clone the desired url using GIT
78
78
  # TODO: Support alternative systems
79
- cmd = "git clone #{appurl} #{tmpdir}/"
79
+ cmd = "git clone -n #{appurl} #{tmpdir}/"
80
80
  puts cmd
81
81
  system cmd
82
82
  if $? != 0
@@ -88,6 +88,14 @@ def download_app(appname, appurl)
88
88
  system "(cd #{tmpdir} && git submodule update --init)"
89
89
  end
90
90
 
91
+ # Check out appropriate version of the repo
92
+ cmd = "(cd #{tmpdir} && git checkout #{appvers})"
93
+ puts cmd
94
+ system cmd
95
+ if $? != 0
96
+ exit 1
97
+ end
98
+
91
99
  # Return the tmp directory path
92
100
  puts tmpdir
93
101
  tmpdir
@@ -111,12 +119,24 @@ def install_deps(workdir, appname = nil, stack = [])
111
119
  end
112
120
 
113
121
  def install_app(appname, stack = [])
122
+ puts "Installing #{appname}"
114
123
  # Check for a dependency cycle
115
124
  if stack.include?(appname)
116
125
  puts "#{appname} already scheduled for installation"
117
126
  return
118
127
  end
119
128
 
129
+ # Split app name on whitespace -- we pass the desired tag/branch in this way
130
+ if not appname.nil?
131
+ app_parts = appname.split(nil, 2)
132
+ if app_parts.length == 2
133
+ appname = app_parts[0]
134
+ appvers = app_parts[1]
135
+ else
136
+ appvers = "HEAD"
137
+ end
138
+ end
139
+
120
140
  # Default workdir is current working directory -- examination of appname may
121
141
  # override this.
122
142
  workdir = ""
@@ -135,12 +155,12 @@ def install_app(appname, stack = [])
135
155
  if File.directory?(appname_path)
136
156
  workdir = appname_path
137
157
  else
138
- workdir = download_app(appname, File.join(CONFIG['default_repo'], appname))
158
+ workdir = download_app(appname, File.join(CONFIG['default_repo'], appname), appvers)
139
159
  is_temp = true
140
160
  end
141
161
  else
142
162
  # Appname is a proper URL -- we'll pass this to git
143
- workdir = download_app(appname, appname)
163
+ workdir = download_app(appname, appname, appvers)
144
164
  is_temp = true
145
165
  end
146
166
  end
@@ -192,7 +212,11 @@ CONFIG = load_config()
192
212
  action = ARGV[0]
193
213
  case action
194
214
  when 'install'
195
- install_app(ARGV[1])
215
+ if ARGV.length > 2
216
+ install_app(ARGV[1] + " " + ARGV[2])
217
+ else
218
+ install_app(ARGV[1])
219
+ end
196
220
  when 'cleanup'
197
221
  FileUtils.rm_rf Dir.glob("/tmp/erlbox_*")
198
222
  when 'ensure'
data/erlbox.gemspec CHANGED
@@ -1,12 +1,15 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run `rake gemspec`
1
4
  # -*- encoding: utf-8 -*-
2
5
 
3
6
  Gem::Specification.new do |s|
4
7
  s.name = %q{erlbox}
5
- s.version = "1.6.0"
8
+ s.version = "1.7.0"
6
9
 
7
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
11
  s.authors = ["Phillip Toland"]
9
- s.date = %q{2009-07-27}
12
+ s.date = %q{2009-09-26}
10
13
  s.default_executable = %q{erlbox}
11
14
  s.description = %q{Rake tasks and helper scripts for building Erlang applications.}
12
15
  s.email = %q{phil.toland@gmail.com}
data/lib/erlbox/build.rb CHANGED
@@ -53,7 +53,7 @@ directory 'ebin'
53
53
 
54
54
  rule(%r(^ebin/.*\.beam$) => ["%{ebin,src}X.erl"]) do |t|
55
55
  puts "compiling #{t.source}..."
56
- sh "erlc #{print_flags(ERLC_FLAGS)} #{expand_path(ERL_PATH)} -o ebin #{t.source}"
56
+ sh "erlc #{print_flags(ERLC_FLAGS)} #{expand_path(ERL_PATH)} -o ebin #{t.source}", :verbose => verbose?
57
57
  end
58
58
 
59
59
  ## -------------------------------------------------------------------
data/lib/erlbox/eunit.rb CHANGED
@@ -79,6 +79,7 @@ def run_eunit(dir, cover = false, rest = '')
79
79
  log_dir = abspath(EUNIT_LOG_DIR)
80
80
 
81
81
  cover_flags = cover ? "-cover -o #{log_dir}/coverage" : ''
82
+ verbose_flags = verbose? ? '-v' : ''
82
83
 
83
84
  suites = ENV['suites']
84
85
  all_suites = ''
@@ -87,10 +88,16 @@ def run_eunit(dir, cover = false, rest = '')
87
88
  script = __FILE__.sub('.rb', '')
88
89
 
89
90
  cmd = "cd #{EUNIT_WORK_DIR} &&\
90
- #{script} -b #{abspath('./ebin')} -l #{log_dir}/eunit.log\
91
+ #{script} #{verbose_flags} #{expand_erl_path()} \
92
+ -b #{abspath('./ebin')} -l #{log_dir}/eunit.log\
91
93
  #{cover_flags} #{all_suites} #{abspath(dir)}"
92
94
 
93
95
  puts cmd.squeeze(' ') if verbose?
94
96
 
95
97
  sh cmd
96
98
  end
99
+
100
+ def expand_erl_path()
101
+ # Add the ERL_PATH includes using multiple -b arguments
102
+ ERL_PATH.empty? ? '' : "-b #{ERL_PATH.join(' -b ')}"
103
+ end
@@ -23,6 +23,14 @@
23
23
  ##
24
24
  ## -------------------------------------------------------------------
25
25
 
26
+ task :install => [:'install:build', :'install:deps'] do
27
+ erl_install()
28
+ end
29
+
30
+ task :install_no_deps => [:'install:build'] do
31
+ erl_install()
32
+ end
33
+
26
34
  namespace :install do
27
35
 
28
36
  task :appid, [:root_dir] do |t, args|
@@ -35,4 +43,8 @@ namespace :install do
35
43
  desc "Build the application for installation"
36
44
  task :build => [:compile]
37
45
 
46
+ desc "Installs all the dependencies for the current app"
47
+ task :deps do
48
+ erl_install_dependencies(APP_NAME)
49
+ end
38
50
  end
data/lib/erlbox/utils.rb CHANGED
@@ -23,6 +23,10 @@
23
23
  ##
24
24
  ## -------------------------------------------------------------------
25
25
 
26
+ require 'yaml'
27
+ require 'uri'
28
+ include FileUtils
29
+
26
30
  def debug?
27
31
  !ENV['debug'].nil?
28
32
  end
@@ -81,7 +85,7 @@ end
81
85
 
82
86
  def erl_app_version(app, extra_args = {})
83
87
  script = <<-ERL
84
- ok = application:load(#{app}),
88
+ application:load(#{app}),
85
89
  {ok, Vsn} = application:get_key(#{app}, vsn),
86
90
  io:format("~s\\n", [Vsn]).
87
91
  ERL
@@ -91,7 +95,7 @@ end
91
95
 
92
96
  def erl_app_modules(app)
93
97
  script = <<-ERL
94
- ok = application:load(#{app}),
98
+ application:load(#{app}),
95
99
  {ok, M} = application:get_key(#{app}, modules),
96
100
  [io:format("~s\\n", [Mod]) || Mod <- M].
97
101
  ERL
@@ -99,11 +103,193 @@ def erl_app_modules(app)
99
103
  output = erl_run(script, "-pa ebin")
100
104
  if output[/badmatch/]
101
105
  puts "Error processing .app file: #{output}"
106
+ []
107
+ else
108
+ output.split("\n")
109
+ end
110
+ end
111
+
112
+ def erl_app_applications(app)
113
+ script = <<-ERL
114
+ ok = application:load(#{app}),
115
+ {ok, A} = application:get_key(#{app}, applications),
116
+ [io:format("~s\\n", [App]) || App <- A].
117
+ ERL
118
+
119
+ output = erl_run(script, "-pa ebin")
120
+ if output[/badmatch/]
121
+ puts "Error processing .app file: #{output}"
122
+ []
102
123
  else
103
124
  output.split("\n")
104
125
  end
105
126
  end
106
127
 
128
+ def erl_app_versioned_dependencies(app)
129
+ script = <<-ERL
130
+ {ok, [{application, _AppName, AppConfig}]} = file:consult("ebin/#{app}.app"),
131
+ VDeps = case lists:keyfind(versioned_dependencies, 1, AppConfig) of
132
+ {versioned_dependencies, Deps} -> Deps;
133
+ Other -> []
134
+ end,
135
+
136
+ [io:format("~p~n", [tuple_to_list(Dep)]) || Dep <- VDeps].
137
+ ERL
138
+
139
+ output = erl_run(script, "-pa ebin")
140
+
141
+ # maps from a string to a list of lists, where each list is:
142
+ # [app, version, nil | gt | gte | e]
143
+ # (less than, less than or equal, etc.)
144
+ deps = output.split("\n").map{|d| d.gsub(/[\[\"\']/, '').split(',')}
145
+
146
+ deps
147
+ end
148
+
149
+ def erl_app_needs_upgrade?(app, requested_ver)
150
+ # if it's nil, force us to have something installed
151
+ requested_ver ||= '0.0.0.001'
152
+
153
+ installed_ver = erl_app_version(app)
154
+
155
+ if installed_ver =~ /init terminating/
156
+ installed_ver = "0.0.0"
157
+ end
158
+
159
+ return erl_version_needs_upgrade?(installed_ver, requested_ver)
160
+ end
161
+
162
+ def erl_version_needs_upgrade?(installed_version, requested_version)
163
+ iv = installed_version.split('.')
164
+ rv = requested_version.split('.')
165
+
166
+ iv.each_with_index do |n, i|
167
+ if rv[i].nil?
168
+ # installed version is longer, and all previous parts equal
169
+ return false
170
+ elsif rv[i].to_i > iv[i].to_i
171
+ return true # requested version is greater
172
+ elsif iv[i].to_i > rv[i].to_i
173
+ return false # installed version is greater
174
+ end
175
+ end
176
+
177
+ if rv.length > iv.length
178
+ return true # they're equal, but requested version has extra
179
+ else
180
+ return false # they're equal
181
+ end
182
+ end
183
+
184
+ def erl_install_dependencies(app)
185
+ erl_app_versioned_dependencies(app).each do |dep|
186
+ erl_install_dep(*dep)
187
+ end
188
+
189
+ erl_app_applications(app).each do |dep|
190
+ erl_install_dep(dep)
191
+ end
192
+ end
193
+
194
+ ##
195
+ # It appears that faxien allows us to specify that a version must
196
+ # be exactly equal to the requested version. I'm ignoring this for now,
197
+ # but in this case, the extra argument here would be 'e'
198
+ ##
199
+ def erl_install_dep(app, ver = nil, extra = nil)
200
+ appstr = ver ? "#{app}-#{ver}" : "#{app}"
201
+
202
+ if erl_app_needs_upgrade?(app, ver)
203
+ # do we have a ~/.erlbox.yaml file?
204
+
205
+ puts "Trying to install #{appstr}..."
206
+ erl_install_app(app)
207
+
208
+ # Check again, to make sure it was installed correctly
209
+ if erl_app_needs_upgrade?(app, ver)
210
+ STDERR.puts "ERROR: Failed to install dependency #{appstr}"
211
+ exit(1)
212
+ end
213
+ end
214
+ end
215
+
216
+ def load_yaml(file)
217
+ filename = File.expand_path(file)
218
+ return nil if not File.exist?(filename)
219
+ YAML::load(File.read(filename))
220
+ end
221
+
222
+ def load_config()
223
+ # Check for existence of the config file -- we MUST have one
224
+ config = load_yaml("~/.erlbox.yaml")
225
+
226
+ # Load the file and make sure required parameters are present
227
+ if config.nil? || config.empty?
228
+ STDERR.puts "To install dependencies from source, you must have a ~/.erlbox.yaml file with the key 'default_repo' (where git sources are) and optional keys 'erlang' (erlang root) and 'site_dir' (where to install applications. This must be in your ERL_LIBS path)"
229
+ config = []
230
+ end
231
+
232
+ # Fix up default repo URL
233
+ if config.has_key?('default_repo')
234
+ url = URI(config['default_repo'])
235
+ if url.scheme == nil || url.scheme == "file"
236
+ config['default_repo'] = File.expand_path(url.path)
237
+ end
238
+ end
239
+
240
+ # If erlang repo is specified, expand the path and use that to determine the root
241
+ if config.has_key?('erlang')
242
+ config['erlang_root'] = erl_root(File.expand_path(config['erlang'])).strip()
243
+ else
244
+ config['erlang_root'] = erl_root().strip()
245
+ end
246
+
247
+ if !config.has_key?('site_dir')
248
+ config['site_dir'] = File.join(config['erlang_root'], "lib")
249
+ end
250
+
251
+ config
252
+ end
253
+
254
+ # install the latest version of the requested app
255
+ def erl_install_app(appname)
256
+ config = load_config()
257
+ if config.empty?
258
+ STDERR.puts "Sorry, we currently only support installing dependencies from source"
259
+ exit 1
260
+ end
261
+
262
+ # TODO: deal with other schemes than just files
263
+ workdir = File.join(config['default_repo'], appname)
264
+ if !File.exist?(workdir)
265
+ STDERR.puts "No such directory: #{workdir}"
266
+ exit 1
267
+ end
268
+
269
+ sh "cd #{workdir} && rake install"
270
+ end
271
+
272
+ ##
273
+ # install the current app without checking dependencies
274
+ ##
275
+ def erl_install
276
+ config = load_config()
277
+
278
+ appid = "#{APP_NAME}-#{erl_app_version(APP_NAME)}"
279
+ install_dir = File.join(config['site_dir'], appid)
280
+
281
+ if File.exist?(install_dir)
282
+ rm_rf install_dir
283
+ end
284
+
285
+ mkdir install_dir
286
+ ['ebin', 'src', 'include', 'priv', 'mibs', 'deps'].each do |dir|
287
+ cp_r dir, install_dir if File.exist?(dir)
288
+ end
289
+
290
+ puts "Successfully installed #{appid} into #{install_dir}"
291
+ end
292
+
107
293
  # Returns true if running on Linux
108
294
  def linux?
109
295
  platform? 'linux'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: erlbox
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.0
4
+ version: 1.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Phillip Toland
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-07-27 00:00:00 -05:00
12
+ date: 2009-09-26 00:00:00 -05:00
13
13
  default_executable: erlbox
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency