diff --git a/lib/bundler/source/git.rb b/lib/bundler/source/git.rb index 1f720f5..0ee9e4d 100644 --- a/lib/bundler/source/git.rb +++ b/lib/bundler/source/git.rb @@ -182,10 +182,12 @@ module Bundler end def load_spec_files - super + git_proxy.checkout rescue nil + super rescue PathError => e Bundler.ui.trace e raise GitError, "#{to_s} is not yet checked out. Run `bundle install` first." + git_proxy.checkout end # This is the path which is going to contain a cache diff --git a/lib/bundler/source/git/git_proxy.rb b/lib/bundler/source/git/git_proxy.rb index 29100a1..ec72fcb 100644 --- a/lib/bundler/source/git/git_proxy.rb +++ b/lib/bundler/source/git/git_proxy.rb @@ -1,7 +1,6 @@ module Bundler class Source class Git < Path - class GitNotInstalledError < GitError def initialize msg = "You need to install git to be able to use gems from git repositories. " @@ -35,9 +34,9 @@ module Bundler attr_writer :revision def initialize(path, uri, ref, revision = nil, git = nil) - @path = path - @uri = uri - @ref = ref + @path = path + @uri = uri + @ref = ref @revision = revision @git = git raise GitNotInstalledError.new if allow? && !Bundler.git_present? @@ -61,17 +60,93 @@ module Bundler end def checkout + @org_pwd = Dir.pwd if path.exist? - return if has_revision_cached? - Bundler.ui.confirm "Updating #{uri}" - in_path do - git_retry %|fetch --force --quiet --tags #{uri_escaped} "refs/heads/*:refs/heads/*"| - end + #return if has_revision_cached? + @EXT_LOCK + if defined?(Gem::Ext::Builder::CHDIR_MONITOR) + @EXT_LOCK = Gem::Ext::Builder::CHDIR_MONITOR + else + require "monitor" + @EXT_LOCK = Monitor.new + end + @EXT_LOCK.synchronize do + @old_pwd = Dir.pwd + Bundler.ui.confirm "Updating #{uri}" + FileUtils.cd(path) + git_retry %|fetch --force --quiet --tags #{uri_escaped} "refs/heads/*:refs/heads/*"| + @commit_num = `git log -1 --pretty=format:"%H"`[0..11] + @new_path = path.dirname + @old_folder_name = path.basename.to_s + '/' + @fold_name ='' + @fold_name = path.basename.to_s + @fold_name = @fold_name.split('-')[0..-2].join('-') + @new_path += (@fold_name + '-' + @commit_num) + path = @new_path + FileUtils.cd('..') + FileUtils.mv( @old_folder_name , path.basename.to_s+'/') if (Dir.exist? (path.basename.to_s+'/')) == false + FileUtils.cd(@new_path.to_s) + @path_destination = Pathname.new(path.dirname) + @path_destination= @path_destination.parent.parent.parent + Pathname.new("bundler/gems/#{path.basename}") + if (Dir.exist?(@path_destination.to_s)) == false + begin + FileUtils.cd(@path_destination.dirname) + rescue + FileUtils.mkdir_p(@path_destination.dirname) + FileUtils.cd(@path_destination.dirname) + end + FileUtils.mkdir(@path_destination.basename) + `cp -r "#{path}"/. "#{@path_destination}"/.git/` + FileUtils.cd(@path_destination.basename) + `git init` + `git checkout "#{ref}"` + end + @gemspec_name = '' + FileUtils.cd(@path_destination.to_s) + `ls`.split.each{|name| (@gemspec_name = name.to_s and break) if (name.include? '.gemspec') == true} + Bundler::load_gemspec("#{@path_destination}/#{@gemspec_name}") rescue puts "you don't have .gemspec file at #{@path_destination}" + FileUtils.cd(@old_pwd) + end else Bundler.ui.info "Fetching #{uri}" - FileUtils.mkdir_p(path.dirname) - git_retry %|clone #{uri_escaped} "#{path}" --bare --no-hardlinks --quiet| + if path != nil + FileUtils.mkdir_p(path.dirname) + git_retry %|clone #{uri_escaped} "#{path}" --bare --no-hardlinks --quiet| + FileUtils.cd(path) + git_retry %|fetch --all| + @commit_num = `git log -1 --pretty=format:"%H"`[0..11] + @new_path = path.dirname + @old_folder_name = path.basename.to_s + '/' + @fold_name ='' + @fold_name = path.basename.to_s + @fold_name = @fold_name.split('-')[0..-2].join('-') + @new_path += (@fold_name + '-' + @commit_num) + path = @new_path + FileUtils.cd('..') + FileUtils.mv( @old_folder_name , path.basename.to_s+'/') if (Dir.exist? (path.basename.to_s+'/')) == false + FileUtils.cd(@new_path.to_s) + @path_destination = Pathname.new(path.dirname) + @path_destination= @path_destination.parent.parent.parent + Pathname.new("bundler/gems/#{path.basename}") + if (Dir.exist?(@path_destination.to_s)) == false + begin + FileUtils.cd(@path_destination.dirname) + rescue + FileUtils.mkdir_p(@path_destination.dirname) + FileUtils.cd(@path_destination.dirname) + end + FileUtils.mkdir(@path_destination.basename) + `cp -r "#{path}"/. "#{@path_destination}"/.git/` + FileUtils.cd(@path_destination.basename) + `git init` + `git checkout "#{ref}"` + end + @gemspec_name = '' + FileUtils.cd(@path_destination.to_s) + `ls`.split.each{|name| (@gemspec_name = name.to_s and break) if (name.include? '.gemspec') == true} + Bundler::load_gemspec("#{@path_destination}/#{@gemspec_name}") rescue puts "you don't have .gemspec file at #{@path_destination}" + end end + FileUtils.cd(@org_pwd) end def copy_to(destination, submodules=false) @@ -138,7 +213,8 @@ module Bundler end def allow? - @git ? @git.allow_git_ops? : true + #@git ? @git.allow_git_ops? : true + true end def in_path(&blk)