lib/origen/commands/new.rb in origen-0.21.0 vs lib/origen/commands/new.rb in origen-0.22.0

- old
+ new

@@ -1,10 +1,11 @@ require 'optparse' require 'fileutils' require 'httparty' require 'digest' require 'gems' +require 'time' include Origen::Utility::InputCapture options = {} @@ -23,11 +24,11 @@ http://origen-sdk.org/origen_app_generators Usage: origen new [APP_NAME] [options] END opts.on('-d', '--debugger', 'Enable the debugger') { options[:debugger] = true } - opts.on('-v', '--version TAG', String, 'Use a specific version of Origen App Generators') { |f| options[:version] = f } + opts.on('-f', '--fetch', 'Fetch the latest versions of the app generators, otherwise happens every 24hrs') { options[:fetch] = true } opts.separator '' opts.on('-h', '--help', 'Show this message') { puts opts; exit } end opt_parser.orig_parse! ARGV @@ -43,71 +44,87 @@ unless Dir["#{dir}/*"].empty? puts 'The requested workspace is not empty, please delete it and try again, or select a different path.' exit 1 end -version = options[:version] || begin - (Gems.info 'origen_app_generators')['version'] +generators_dir = "#{Origen.home}/app_generators" +update_required = false + +# Update the generators every 24hrs unless specifically requested +if options[:fetch] || !File.exist?(generators_dir) + update_required = true +else + if Origen.session.app_generators[generators_dir] + if Time.now - Origen.session.app_generators[generators_dir] > 60 * 60 * 24 + update_required = true + end + else + update_required = true + end end -version ||= '0.0.0' +generators = [['http://rubygems.org', 'origen_app_generators']] + Array(Origen.site_config.app_generators) -version.sub!(/^v/, '') +if update_required + puts 'Fetching the latest app generators...' + FileUtils.rm_rf(generators_dir) if File.exist?(generators_dir) + FileUtils.mkdir(generators_dir) -if Origen.running_on_windows? - tmp = 'C:/tmp/origen_app_generators' -else - tmp = '/tmp/origen_app_generators' -end + Dir.chdir generators_dir do + generators.each_with_index do |gen, i| + # If a reference to a gem from a gem server + if gen.is_a?(Array) + response = HTTParty.get("#{gen[0]}/api/v1/dependencies.json?gems=#{gen[1]}") -tmp_dir = "#{tmp}/app_gen#{version}" -lib = "#{tmp_dir}/lib" -md5 = "#{tmp}/md5#{version}" + if response.success? + latest_version = JSON.parse(response.body).map { |v| v['number'] }.max -# If the app generators already exists in /tmp, check that all files are still there. -# This deals with the problem of some files being swept up by the tmp cleaner while -# leaving the top-level folder there. -if File.exist?(tmp_dir) && File.exist?(md5) - old_sig = File.read(md5) - hash = Digest::MD5.new - Dir["#{tmp_dir}/**/{*,.*}"].each do |f| - hash << File.read(f) unless File.directory?(f) - end - new_sig = hash.hexdigest - all_present = old_sig == new_sig -else - all_present = false -end + response = HTTParty.get("#{gen[0]}/gems/#{gen[1]}-#{latest_version}.gem") + if response.success? + File.open("#{gen[1]}-#{latest_version}.gem", 'wb') do |f| + f.write response.parsed_response + end + else + puts "Sorry, could not find generator #{gen[1]} version #{latest_version}" + end -unless all_present + `gem unpack #{gen[1]}-#{latest_version}.gem` + FileUtils.rm_rf("#{gen[1]}-#{latest_version}.gem") + FileUtils.mv("#{gen[1]}-#{latest_version}", i.to_s) - FileUtils.rm_rf(tmp_dir) if File.exist?(tmp_dir) - FileUtils.mkdir_p(tmp) unless File.exist?(tmp) + else + puts "Failed to get generator #{gen[1]}, the response from the server was:" + puts response.body + end - File.open("#{tmp}/app_gen#{version}.gem", 'wb') do |f| - response = HTTParty.get("http://rubygems.org/downloads/origen_app_generators-#{version}.gem") - if response.success? - f.write response.parsed_response - else - puts "Sorry, could not find app generators version #{version}" - exit 1 + # If a reference to a git repo + elsif gen.to_s =~ /\.git$/ + Origen::RevisionControl.new(remote: gen, local: i.to_s).checkout(version: 'master', force: true) + + # Assume a reference to a folder + else + if File.exist?(gen) + FileUtils.cp_r(gen, i.to_s) + else + puts "Failed to find generator at #{gen}" + end + + end end - end - Dir.chdir tmp do - `gem unpack app_gen#{version}.gem` - `rm -f app_gen#{version}.gem` + Origen.session.app_generators[generators_dir] = Time.now end +end - hash = Digest::MD5.new - Dir["#{tmp_dir}/**/{*,.*}"].each do |f| - hash << File.read(f) unless File.directory?(f) - end - File.open(md5, 'w') { |f| f.write(hash.hexdigest) } +generators.each_with_index do |gen, i| + lib = "#{generators_dir}/#{i}/lib" + $LOAD_PATH.unshift(lib) end -$LOAD_PATH.unshift(lib) - Origen.with_boot_environment do require 'origen_app_generators' + generators.each_with_index do |gen, i| + loader = "#{generators_dir}/#{i}/config/load_generators.rb" + require loader if File.exist?(loader) + end OrigenAppGenerators.invoke(dir) end