Class: LgPodPlugin::LCache

Inherits:
Object
  • Object
show all
Defined in:
lib/lg_pod_plugin/downloader/l_cache.rb

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeLCache

Returns a new instance of LCache.



11
12
# File 'lib/lg_pod_plugin/downloader/l_cache.rb', line 11

def initialize
end

Class Method Details

.cache_pod(name, target, options = {}, spec = nil, released_pod = false) ⇒ Object



145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
# File 'lib/lg_pod_plugin/downloader/l_cache.rb', line 145

def self.cache_pod(name, target, options = {}, spec = nil, released_pod = false)
  checkout_options = Hash.new.deep_merge(options).reject do |key, val|
    !key || !val
  end
  request = LCache.download_request(name, checkout_options, spec, released_pod)
  _, pods_pecs = get_local_spec(request, target)
  pods_pecs.each do |_, s_spec|
    destination = path_for_pod(request, :name => name, :params => checkout_options)
    if !File.exist?(destination) || destination.children.empty?
      LgPodPlugin.log_green "Copying #{name} from `#{target}` to `#{destination}` "
      copy_and_clean(target, destination, s_spec)
    end
    cache_pod_spec = path_for_spec(request, :name => name, :params => checkout_options)
    unless File.exist?(cache_pod_spec)
      write_spec(s_spec, cache_pod_spec)
    end
  end

end

.clean_pod_unused_files(destination, spec) ⇒ Object



120
121
122
123
124
125
126
127
# File 'lib/lg_pod_plugin/downloader/l_cache.rb', line 120

def self.clean_pod_unused_files(destination, spec)
  specs_by_platform = group_subspecs_by_platform(spec)
  destination.parent.mkpath
  self.write_lock(destination) do
    Pod::Installer::PodSourcePreparer.new(spec, destination).prepare!
    Pod::Sandbox::PodDirCleaner.new(destination, specs_by_platform).clean!
  end
end

.copy_and_clean(source, destination, spec) ⇒ Object



109
110
111
112
113
114
115
116
117
118
# File 'lib/lg_pod_plugin/downloader/l_cache.rb', line 109

def self.copy_and_clean(source, destination, spec)
  specs_by_platform = group_subspecs_by_platform(spec)
  destination.parent.mkpath
  self.write_lock(destination) do
    FileUtils.rm_rf(destination)
    FileUtils.cp_r(source, destination)
    Pod::Installer::PodSourcePreparer.new(spec, destination).prepare!
    Pod::Sandbox::PodDirCleaner.new(destination, specs_by_platform).clean!
  end
end

.download_request(name, params, spec = nil, released_pod = false) ⇒ Object



51
52
53
54
55
56
57
# File 'lib/lg_pod_plugin/downloader/l_cache.rb', line 51

def self.download_request(name, params, spec = nil, released_pod = false)
  if released_pod
    Pod::Downloader::Request.new(spec: spec, released: true , name: name, params: params)
  else
    Pod::Downloader::Request.new(spec: nil, released: false , name: name, params: params)
  end
end

.get_local_spec(request, target) ⇒ Object

def self.cached_spec(request)

path = path_for_spec(request)
path.file? && Specification.from_file(path)

rescue JSON::ParserError

nil

end



77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
# File 'lib/lg_pod_plugin/downloader/l_cache.rb', line 77

def self.get_local_spec(request, target)
  result = Pod::Downloader::Response.new
  result.location = target
  if request.released_pod?
    result.spec = request.spec
    local_specs = { request.name => request.spec }
    return [request, local_specs]
  else
    local_specs = {}
    pods_pecs = Pod::Sandbox::PodspecFinder.new(target).podspecs
    pods_pecs[request.name] = request.spec if request.spec
    pods_pecs.each do |name, spec|
      if request.name == name
        result.spec = spec
        local_specs[request.name] = spec
      end
    end
  end
  [result, local_specs]
end

.group_subspecs_by_platform(spec) ⇒ Object



98
99
100
101
102
103
104
105
106
107
# File 'lib/lg_pod_plugin/downloader/l_cache.rb', line 98

def self.group_subspecs_by_platform(spec)
  specs_by_platform = {}
  [spec, *spec.recursive_subspecs].each do |ss|
    ss.available_platforms.each do |platform|
      specs_by_platform[platform] ||= []
      specs_by_platform[platform] << ss
    end
  end
  specs_by_platform
end

.path_for_pod(request, slug_opts = {}) ⇒ Object

MARK - 缓存方法



59
60
61
62
# File 'lib/lg_pod_plugin/downloader/l_cache.rb', line 59

def self.path_for_pod(request, slug_opts = {})
  root = self.root_path
  root + request.slug(**slug_opts)
end

.path_for_spec(request, slug_opts = {}) ⇒ Object



64
65
66
67
68
# File 'lib/lg_pod_plugin/downloader/l_cache.rb', line 64

def self.path_for_spec(request, slug_opts = {})
  root = self.root_path
  path = root + 'Specs' + request.slug(**slug_opts)
  Pathname.new(path.to_path + '.podspec.json')
end

.root_pathObject



46
47
48
49
# File 'lib/lg_pod_plugin/downloader/l_cache.rb', line 46

def self.root_path
  path = File.join(Dir.home, "Library/Caches/CocoaPods/Pods")
  Pathname(path)
end

.write_lock(location, &block) ⇒ Object



129
130
131
# File 'lib/lg_pod_plugin/downloader/l_cache.rb', line 129

def self.write_lock(location, &block)
  Pod::Downloader::Cache.lock(location, File::LOCK_SH, &block)
end

.write_spec(spec, path) ⇒ Object



134
135
136
137
138
139
140
141
# File 'lib/lg_pod_plugin/downloader/l_cache.rb', line 134

def self.write_spec(spec, path)
  path.dirname.mkpath
  Pod::Downloader::Cache.write_lock(path) do
    path.open('w') { |f|
      f.write spec.to_pretty_json
    }
  end
end

Instance Method Details

#find_pod_cache(name, options, spec = nil, released_pod = false) ⇒ Object



35
36
37
38
39
40
41
42
43
44
# File 'lib/lg_pod_plugin/downloader/l_cache.rb', line 35

def find_pod_cache(name, options, spec = nil, released_pod = false)
  hash_map = Hash.new.merge!(options)
  if hash_map.has_key?(:version)
    hash_map.delete(:version)
  end
  request = LCache.download_request(name, hash_map, spec, released_pod)
  destination = LCache.path_for_pod(request)
  cache_pod_spec = LCache.path_for_spec(request)
  [destination, cache_pod_spec]
end

#pod_cache_exist(name, options, spec = nil, released_pod = false) ⇒ Object



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/lg_pod_plugin/downloader/l_cache.rb', line 15

def pod_cache_exist(name, options, spec = nil, released_pod = false)
  # 参数为空不执行下载任务, 交给 cocoapods 处理下载
  if options.nil?
    return   [true, nil, nil]
  end

  destination, cache_pod_spec = self.find_pod_cache name, options, spec, released_pod
  lock_temp_file = destination.to_path+ ".lock"
  if File.exist?(lock_temp_file)
    FileUtils.rm_rf lock_temp_file
  end
  if (File.exist?(destination) && !destination.children.empty?) && cache_pod_spec.exist?
    return [true, destination, cache_pod_spec]
  else
    return [false, destination, cache_pod_spec]
  end
end