lib/grache/packer/packer.rb in grache-0.0.11 vs lib/grache/packer/packer.rb in grache-0.0.12

- old
+ new

@@ -1,7 +1,8 @@ # encoding: utf-8 +require 'aws-sdk' require 'digest' require 'fileutils' require 'json' require 'net/http' require 'tmpdir' @@ -15,10 +16,12 @@ require_relative '../bundler/bundler' require_relative '../zip/zip' module Grache class Packer + GEMFILE_RE = Regexp.new(/^\s*gem\s+['"]([^'"]+)['"]\s*,\s*:git\s+=>\s+['"]([^'"]+)['"](\s*,\s*:branch\s+=>\s+['""]([^'"]+)['""])?$/) + DEFAULT_INSTALL_OPTIONS = { } DEFAULT_PACK_OPTIONS = { dir: '.' @@ -39,11 +42,13 @@ # gemfile path 'bundle-pack' => 'bundle pack --gemfile=%s --all', # gemspec path - 'gem-build' => 'gem build %s' # spec path + 'gem-build' => 'gem build %s', # spec path + + 'gem-generate-index' => 'gem generate_index' } class << self def exec_cmd(cmd) puts cmd @@ -144,10 +149,14 @@ return unless gemfile puts "Gemfile located at #{gemfile}" if gemfile gem_dir = File.dirname(gemfile) + gemfile = process_gemfile(gemfile) + + # exit(0) + # TODO: Read gemfile programatically uses_gemspec = File.open(gemfile).read.index(/^gemspec$/) != nil if(uses_gemspec) tmp = File.join(gem_dir, '.gemspec') gemspecfile = tmp if File.exist?(tmp) @@ -163,20 +172,85 @@ if uses_gemspec cmd = CMDS['gem-build'] % gemspecfile exec_cmd(cmd) end - cache_dir = File.join(gem_dir, 'vendor') + cache_dir = File.join(gem_dir, 'vendor', 'cache') + gems_dir = File.join(gem_dir, 'vendor', 'gems') + + # Delete cache directory if File.directory?(cache_dir) puts "Deleting cache #{cache_dir}" FileUtils.rm_rf cache_dir end + FileUtils.mkdir_p cache_dir + + # Move built gems to cache + Dir.glob("#{gems_dir}/**/*.gem").each do |gem| + dest = File.join(cache_dir, File.basename(gem)) + puts "Moving #{gem} -> #{dest}" + FileUtils.mv(gem, dest) + end + + # Pack gems cmd = CMDS['bundle-pack'] % gemfile exec_cmd(cmd) + + # Generate local gem index, see http://stackoverflow.com/questions/5633939/how-do-i-specify-local-gem-files-in-my-gemfile + # Dir.chdir(cache_dir) do + # # Pack gems + # cmd = CMDS['gem-generate-index'] % gemfile + # exec_cmd(cmd) + # end end + def process_gemfile(gemfile_path) + new_gemfile = '' + git_gems = {} + File.open(gemfile_path, 'r') do |f| + f.each_line do |l| + m = GEMFILE_RE.match(l) + if(m) + branch = m[4] || 'master' + new_gemfile += "gem '#{m[1]}', :path => './vendor/gems/#{m[1]}'\n" + git_gems[m[1]] = { + :branch => branch, + :git => m[2] + } + else + new_gemfile += l + end + end + end + puts new_gemfile + + gem_dir = File.join(File.dirname(gemfile_path), 'vendor', 'gems') + FileUtils.mkdir_p gem_dir + Dir.chdir(gem_dir) do + git_gems.each do |name, gem| + FileUtils.rm_rf(name) + cmd = "git clone #{gem[:git]} #{name}" + puts cmd + system cmd + + Dir.chdir(name) do + cmd = "git checkout #{gem[:branch]}" + puts cmd + system cmd + + cmd = "gem build *.gemspec" + system(cmd) + end + end + end + + new_gemfile_path = "#{gemfile_path}.Generated" + File.open(new_gemfile_path, 'w') { |file| file.write(new_gemfile) } + new_gemfile_path + end + def zip(opts = DEFAULT_ZIP_OPTIONS) opts = DEFAULT_ZIP_OPTIONS.merge(opts) puts "Zipping pack: #{JSON.pretty_generate(opts)}" @@ -188,11 +262,12 @@ gemfile = find_gemfile(dir) return unless gemfile gem_dir = File.dirname(gemfile) - vendor_dir = File.join(gem_dir, 'vendor/') + gems_dir = File.join(gem_dir, 'gems') + vendor_dir = File.join(gem_dir, 'vendor') unless File.directory?(vendor_dir) puts "Vendor directory does not exists. Run 'grache pack build' first!" return end @@ -201,15 +276,40 @@ sha = Digest::SHA2.file(gemfile_lock).hexdigest archive = "grache-#{sha}.zip" FileUtils.rm archive, :force => true + # ZipGenerator.new(gems_dir, archive).write ZipGenerator.new(vendor_dir, archive).write puts "Created #{archive}" end end + + def deploy(opts = {access_key_id: nil, secret_access_key: nil}) + bucket_name = 'gdc-ms-grache' + + access_key_id = opts[:access_key_id] + if access_key_id.nil? + print 'Access Key ID? ' + access_key_id = $stdin.gets.chomp + end + + secret_access_key = opts[:secret_access_key] + if secret_access_key.nil? + print 'Secret access key? ' + secret_access_key = $stdin.gets.chomp + end + + s3 = AWS::S3.new(:access_key_id => access_key_id, :secret_access_key => secret_access_key) + + Dir.glob("**/grache-*.zip").each do |grache_file| + key = File.basename(grache_file) + s3.buckets[bucket_name].objects[key].write(:file => grache_file) + puts "Uploading file #{grache_file} to bucket #{bucket_name}." + end + end def find_gemfile(path) Packer.find_gemfile(path) end