Commit 0d4dd44b authored by Fabio Pelosin's avatar Fabio Pelosin

Merge pull request #248 from CocoaPods/git-cache

[Downloader::Git] Cache repos
parents 81d3550d cfbdef54
...@@ -14,6 +14,7 @@ module Pod ...@@ -14,6 +14,7 @@ module Pod
attr_accessor :clean, :verbose, :silent attr_accessor :clean, :verbose, :silent
attr_accessor :generate_docs, :doc_install, :force_doc attr_accessor :generate_docs, :doc_install, :force_doc
attr_accessor :integrate_targets attr_accessor :integrate_targets
attr_accessor :git_cache_size
alias_method :clean?, :clean alias_method :clean?, :clean
alias_method :verbose?, :verbose alias_method :verbose?, :verbose
...@@ -27,6 +28,7 @@ module Pod ...@@ -27,6 +28,7 @@ module Pod
@repos_dir = Pathname.new(File.expand_path("~/.cocoapods")) @repos_dir = Pathname.new(File.expand_path("~/.cocoapods"))
@verbose = @silent = @force_doc = false @verbose = @silent = @force_doc = false
@clean = @generate_docs = @doc_install = @integrate_targets = true @clean = @generate_docs = @doc_install = @integrate_targets = true
@git_cache_size = 500
end end
def project_root def project_root
......
require 'open-uri' require 'open-uri'
require 'tempfile' require 'tempfile'
require 'zlib' require 'zlib'
require 'digest/sha1'
module Pod module Pod
class Downloader class Downloader
class Git < Downloader class Git < Downloader
include Config::Mixin
executable :git executable :git
def download def download
prepare_cache
puts '->'.green << ' Cloning git repo' if config.verbose?
if options[:tag] if options[:tag]
download_tag download_tag
elsif options[:commit] elsif options[:commit]
...@@ -15,16 +19,72 @@ module Pod ...@@ -15,16 +19,72 @@ module Pod
else else
download_head download_head
end end
removed_cached_repos_if_needed
end
def prepare_cache
return if config.git_cache_size == 0
if is_cache_valid?
puts '->'.green << " Updating cache git repo (#{cache_path})" if config.verbose?
Dir.chdir(cache_path) do
git "reset --hard HEAD"
git "clean -d -x -f"
git "pull"
end
else
puts '->'.green << " Creating cache git repo (#{cache_path})" if config.verbose?
cache_path.rmtree if cache_path.exist?
cache_path.mkpath
git "clone '#{url}' #{cache_path}"
end
end
def removed_cached_repos_if_needed
return unless caches_dir.exist?
Dir.chdir(caches_dir) do
repos = Pathname.new(caches_dir).children.select { |c| c.directory? }.sort_by(&:ctime)
while caches_size >= config.git_cache_size && !repos.empty?
dir = repos.shift
puts '->'.yellow << " Removing git cache for `#{origin_url(dir)}'" if config.verbose?
dir.rmtree
end
end
end
def cache_path
@cache_path ||= caches_dir + "#{Digest::SHA1.hexdigest(url.to_s)}"
end
def is_cache_valid?
cache_path.exist? && origin_url(cache_path) == url
end
def origin_url(dir)
Dir.chdir(dir) { `git config remote.origin.url`.chomp }
end
def caches_dir
Pathname.new "/var/tmp/CocoaPods/Git"
end
def clone_url
# git_cache_size = 0 disables the cache
config.git_cache_size == 0 ? url : cache_path
end
def caches_size
# expressed in Mb
`du -cm`.split("\n").last.to_i
end end
def download_head def download_head
git "clone '#{url}' '#{target_path}'" git "clone '#{clone_url}' '#{target_path}'"
end end
def download_tag def download_tag
Dir.chdir(target_path) do Dir.chdir(target_path) do
git "init" git "init"
git "remote add origin '#{url}'" git "remote add origin '#{clone_url}'"
git "fetch origin tags/#{options[:tag]}" git "fetch origin tags/#{options[:tag]}"
git "reset --hard FETCH_HEAD" git "reset --hard FETCH_HEAD"
git "checkout -b activated-pod-commit" git "checkout -b activated-pod-commit"
...@@ -32,7 +92,7 @@ module Pod ...@@ -32,7 +92,7 @@ module Pod
end end
def download_commit def download_commit
git "clone '#{url}' '#{target_path}'" git "clone '#{clone_url}' '#{target_path}'"
Dir.chdir(target_path) do Dir.chdir(target_path) do
git "checkout -b activated-pod-commit #{options[:commit]}" git "checkout -b activated-pod-commit #{options[:commit]}"
......
...@@ -53,6 +53,7 @@ end ...@@ -53,6 +53,7 @@ end
config = Pod::Config.instance config = Pod::Config.instance
config.silent = true config.silent = true
config.repos_dir = SpecHelper.tmp_repos_path config.repos_dir = SpecHelper.tmp_repos_path
config.git_cache_size = 0
require 'tmpdir' require 'tmpdir'
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment