cocoapods 0.16.4 → 0.17.0.rc1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +108 -0
  3. data/README.md +3 -3
  4. data/bin/pod +1 -1
  5. data/lib/cocoapods.rb +31 -31
  6. data/lib/cocoapods/command.rb +62 -107
  7. data/lib/cocoapods/command/inter_process_communication.rb +103 -0
  8. data/lib/cocoapods/command/list.rb +45 -44
  9. data/lib/cocoapods/command/outdated.rb +28 -25
  10. data/lib/cocoapods/command/project.rb +90 -0
  11. data/lib/cocoapods/command/push.rb +50 -32
  12. data/lib/cocoapods/command/repo.rb +125 -155
  13. data/lib/cocoapods/command/search.rb +23 -12
  14. data/lib/cocoapods/command/setup.rb +103 -64
  15. data/lib/cocoapods/command/spec.rb +329 -90
  16. data/lib/cocoapods/config.rb +197 -44
  17. data/lib/cocoapods/downloader.rb +47 -34
  18. data/lib/cocoapods/executable.rb +98 -41
  19. data/lib/cocoapods/external_sources.rb +325 -0
  20. data/lib/cocoapods/file_list.rb +8 -1
  21. data/lib/cocoapods/gem_version.rb +7 -0
  22. data/lib/cocoapods/generator/acknowledgements.rb +71 -7
  23. data/lib/cocoapods/generator/acknowledgements/markdown.rb +10 -9
  24. data/lib/cocoapods/generator/acknowledgements/plist.rb +9 -8
  25. data/lib/cocoapods/generator/copy_resources_script.rb +2 -2
  26. data/lib/cocoapods/generator/documentation.rb +153 -37
  27. data/lib/cocoapods/generator/prefix_header.rb +82 -0
  28. data/lib/cocoapods/generator/target_header.rb +58 -0
  29. data/lib/cocoapods/generator/xcconfig.rb +130 -0
  30. data/lib/cocoapods/hooks/installer_representation.rb +123 -0
  31. data/lib/cocoapods/hooks/library_representation.rb +79 -0
  32. data/lib/cocoapods/hooks/pod_representation.rb +74 -0
  33. data/lib/cocoapods/installer.rb +398 -147
  34. data/lib/cocoapods/installer/analyzer.rb +556 -0
  35. data/lib/cocoapods/installer/analyzer/sandbox_analyzer.rb +253 -0
  36. data/lib/cocoapods/installer/file_references_installer.rb +179 -0
  37. data/lib/cocoapods/installer/pod_source_installer.rb +289 -0
  38. data/lib/cocoapods/installer/target_installer.rb +307 -112
  39. data/lib/cocoapods/installer/user_project_integrator.rb +140 -176
  40. data/lib/cocoapods/installer/user_project_integrator/target_integrator.rb +193 -0
  41. data/lib/cocoapods/library.rb +195 -0
  42. data/lib/cocoapods/open_uri.rb +16 -14
  43. data/lib/cocoapods/project.rb +175 -52
  44. data/lib/cocoapods/resolver.rb +151 -164
  45. data/lib/cocoapods/sandbox.rb +276 -54
  46. data/lib/cocoapods/sandbox/file_accessor.rb +210 -0
  47. data/lib/cocoapods/sandbox/headers_store.rb +96 -0
  48. data/lib/cocoapods/sandbox/path_list.rb +178 -0
  49. data/lib/cocoapods/sources_manager.rb +218 -0
  50. data/lib/cocoapods/user_interface.rb +82 -18
  51. data/lib/cocoapods/{command → user_interface}/error_report.rb +5 -5
  52. data/lib/cocoapods/validator.rb +379 -0
  53. metadata +74 -55
  54. data/lib/cocoapods/command/install.rb +0 -55
  55. data/lib/cocoapods/command/linter.rb +0 -317
  56. data/lib/cocoapods/command/update.rb +0 -25
  57. data/lib/cocoapods/dependency.rb +0 -285
  58. data/lib/cocoapods/downloader/git.rb +0 -276
  59. data/lib/cocoapods/downloader/http.rb +0 -99
  60. data/lib/cocoapods/downloader/mercurial.rb +0 -26
  61. data/lib/cocoapods/downloader/subversion.rb +0 -42
  62. data/lib/cocoapods/local_pod.rb +0 -620
  63. data/lib/cocoapods/lockfile.rb +0 -274
  64. data/lib/cocoapods/platform.rb +0 -127
  65. data/lib/cocoapods/podfile.rb +0 -551
  66. data/lib/cocoapods/source.rb +0 -223
  67. data/lib/cocoapods/specification.rb +0 -579
  68. data/lib/cocoapods/specification/set.rb +0 -175
  69. data/lib/cocoapods/specification/statistics.rb +0 -112
  70. data/lib/cocoapods/user_interface/ui_pod.rb +0 -130
  71. data/lib/cocoapods/version.rb +0 -26
@@ -1,25 +0,0 @@
1
- module Pod
2
- class Command
3
- class Update < Install
4
- def self.banner
5
- %{Updating dependencies of a project:
6
-
7
- $ pod update
8
-
9
- Updates all dependencies.}
10
- end
11
-
12
- def initialize(argv)
13
- config.skip_repo_update = argv.option('--no-update')
14
- super unless argv.empty?
15
- end
16
-
17
- def run
18
- verify_podfile_exists!
19
- verify_lockfile_exists!
20
- run_install_with_update(true)
21
- end
22
- end
23
- end
24
- end
25
-
@@ -1,285 +0,0 @@
1
- require 'cocoapods/open_uri'
2
-
3
- module Pod
4
- class Dependency < Gem::Dependency
5
-
6
- attr_reader :head
7
- alias :head? :head
8
- attr_accessor :specification, :external_source
9
-
10
- def initialize(*name_and_version_requirements, &block)
11
- if name_and_version_requirements.empty? && block
12
- @inline_podspec = true
13
- @specification = Specification.new(&block)
14
- super(@specification.name, @specification.version)
15
-
16
- elsif !name_and_version_requirements.empty? && block.nil?
17
- version = name_and_version_requirements.last
18
- if name_and_version_requirements.last.is_a?(Hash)
19
- @external_source = ExternalSources.from_params(name_and_version_requirements[0].split('/').first, name_and_version_requirements.pop)
20
- elsif version.is_a?(Symbol) && version == :head || version.is_a?(Version) && version.head?
21
- name_and_version_requirements.pop
22
- @head = true
23
- end
24
-
25
- super(*name_and_version_requirements)
26
-
27
- if head? && !latest_version?
28
- raise Informative, "A `:head' dependency may not specify version requirements."
29
- end
30
-
31
- else
32
- raise Informative, "A dependency needs either a name and version requirements, " \
33
- "a source hash, or a block which defines a podspec."
34
- end
35
- end
36
-
37
- def latest_version?
38
- versions = @version_requirements.requirements.map(&:last)
39
- versions == [Gem::Version.new('0')]
40
- end
41
-
42
- def ==(other)
43
- super && (head? == other.head?) && (@specification ? @specification == other.specification : @external_source == other.external_source)
44
- end
45
-
46
- def subspec_dependency?
47
- @name.include?('/')
48
- end
49
-
50
- def inline?
51
- @inline_podspec
52
- end
53
-
54
- def external?
55
- !@external_source.nil?
56
- end
57
-
58
- # In case this is a dependency for a subspec, e.g. 'RestKit/Networking',
59
- # this returns 'RestKit', which is what the Pod::Source needs to know to
60
- # retrieve the correct Set from disk.
61
- def top_level_spec_name
62
- subspec_dependency? ? @name.split('/').first : @name
63
- end
64
-
65
- # Returns a copy of the dependency, but with the name of the top level
66
- # spec. This is used by Pod::Specification::Set to merge dependencies on
67
- # the complete set, irrespective of what spec in the set wil be used.
68
- def to_top_level_spec_dependency
69
- dep = dup
70
- dep.name = top_level_spec_name
71
- dep
72
- end
73
-
74
- def to_s
75
- version = ''
76
- if external?
77
- version << @external_source.description
78
- elsif inline?
79
- version << 'defined in Podfile'
80
- elsif head?
81
- version << 'HEAD'
82
- elsif @version_requirements != Gem::Requirement.default
83
- version << @version_requirements.to_s
84
- end
85
- result = @name.dup
86
- result << " (#{version})" unless version.empty?
87
- result
88
- end
89
-
90
- def specification_from_sandbox(sandbox, platform)
91
- @external_source.specification_from_sandbox(sandbox, platform)
92
- end
93
-
94
- def match_version?(version)
95
- match?(name, version) && (version.head? == head?)
96
- end
97
-
98
- # Taken from RubyGems 1.3.7
99
- unless public_method_defined?(:match?)
100
- def match?(spec_name, spec_version)
101
- pattern = name
102
-
103
- if Regexp === pattern
104
- return false unless pattern =~ spec_name
105
- else
106
- return false unless pattern == spec_name
107
- end
108
-
109
- return true if requirement.to_s == ">= 0"
110
-
111
- requirement.satisfied_by? Gem::Version.new(spec_version)
112
- end
113
- end
114
-
115
- # Taken from a newer version of RubyGems
116
- unless public_method_defined?(:merge)
117
- def merge other
118
- unless name == other.name then
119
- raise ArgumentError,
120
- "#{self} and #{other} have different names"
121
- end
122
-
123
- default = Gem::Requirement.default
124
- self_req = self.requirement
125
- other_req = other.requirement
126
-
127
- return self.class.new name, self_req if other_req == default
128
- return self.class.new name, other_req if self_req == default
129
-
130
- self.class.new name, self_req.as_list.concat(other_req.as_list)
131
- end
132
- end
133
-
134
- module ExternalSources
135
- def self.from_params(name, params)
136
- return unless name && params
137
- if params.key?(:git)
138
- GitSource.new(name, params)
139
- elsif params.key?(:hg)
140
- MercurialSource.new(name, params)
141
- elsif params.key?(:svn)
142
- SvnSource.new(name, params)
143
- elsif params.key?(:podspec)
144
- PodspecSource.new(name, params)
145
- elsif params.key?(:local)
146
- LocalSource.new(name, params)
147
- else
148
- raise Informative, "Unknown external source parameters for #{name}: #{params}"
149
- end
150
- end
151
-
152
- class AbstractExternalSource
153
- include Config::Mixin
154
-
155
- attr_reader :name, :params
156
-
157
- def initialize(name, params)
158
- @name, @params = name, params
159
- end
160
-
161
- def specification_from_sandbox(sandbox, platform)
162
- specification_from_local(sandbox, platform) || specification_from_external(sandbox, platform)
163
- end
164
-
165
- def specification_from_local(sandbox, platform)
166
- if local_pod = sandbox.installed_pod_named(name, platform)
167
- local_pod.top_specification
168
- end
169
- end
170
-
171
- def specification_from_external(sandbox, platform)
172
- podspec = copy_external_source_into_sandbox(sandbox, platform)
173
- spec = specification_from_local(sandbox, platform)
174
- raise Informative, "No podspec found for `#{name}' in #{description}" unless spec
175
- spec
176
- end
177
-
178
- # Can store from a pathname or a string
179
- #
180
- def store_podspec(sandbox, podspec)
181
- output_path = sandbox.root + "Local Podspecs/#{name}.podspec"
182
- output_path.dirname.mkpath
183
- if podspec.is_a?(String)
184
- raise Informative, "No podspec found for `#{name}' in #{description}" unless podspec.include?('Spec.new')
185
- output_path.open('w') { |f| f.puts(podspec) }
186
- else
187
- raise Informative, "No podspec found for `#{name}' in #{description}" unless podspec.exist?
188
- FileUtils.copy(podspec, output_path)
189
- end
190
- end
191
-
192
- def ==(other)
193
- return if other.nil?
194
- name == other.name && params == other.params
195
- end
196
- end
197
-
198
- class DownloaderSource < AbstractExternalSource
199
- def copy_external_source_into_sandbox(sandbox, platform)
200
- UI.info("->".green + " Pre-downloading: '#{name}'") do
201
- target = sandbox.root + name
202
- target.rmtree if target.exist?
203
- downloader = Downloader.for_target(sandbox.root + name, @params)
204
- downloader.download
205
- store_podspec(sandbox, target + "#{name}.podspec")
206
- if local_pod = sandbox.installed_pod_named(name, platform)
207
- local_pod.downloaded = true
208
- end
209
- end
210
- end
211
- end
212
-
213
- class GitSource < DownloaderSource
214
- def description
215
- "from `#{@params[:git]}'".tap do |description|
216
- description << ", commit `#{@params[:commit]}'" if @params[:commit]
217
- description << ", branch `#{@params[:branch]}'" if @params[:branch]
218
- description << ", tag `#{@params[:tag]}'" if @params[:tag]
219
- end
220
- end
221
- end
222
-
223
- class MercurialSource < DownloaderSource
224
- def description
225
- "from `#{@params[:hg]}'".tap do |description|
226
- description << ", revision `#{@params[:revision]}'" if @params[:revision]
227
- end
228
- end
229
- end
230
-
231
- class SvnSource < DownloaderSource
232
- def description
233
- "from `#{@params[:svn]}'".tap do |description|
234
- description << ", folder `#{@params[:folder]}'" if @params[:folder]
235
- description << ", tag `#{@params[:tag]}'" if @params[:tag]
236
- description << ", revision `#{@params[:revision]}'" if @params[:revision]
237
- end
238
- end
239
- end
240
-
241
- # can be http, file, etc
242
- class PodspecSource < AbstractExternalSource
243
- def copy_external_source_into_sandbox(sandbox, _)
244
- UI.info("->".green + " Fetching podspec for `#{name}' from: #{@params[:podspec]}") do
245
- path = @params[:podspec]
246
- path = Pathname.new(path).expand_path if path.start_with?("~")
247
- open(path) { |io| store_podspec(sandbox, io.read) }
248
- end
249
- end
250
-
251
- def description
252
- "from `#{@params[:podspec]}'"
253
- end
254
- end
255
-
256
- class LocalSource < AbstractExternalSource
257
- def pod_spec_path
258
- path = Pathname.new(@params[:local]).expand_path
259
- path += "#{name}.podspec"# unless path.to_s.include?("#{name}.podspec")
260
- raise Informative, "No podspec found for `#{name}' in `#{@params[:local]}'" unless path.exist?
261
- path
262
- end
263
-
264
- def copy_external_source_into_sandbox(sandbox, _)
265
- store_podspec(sandbox, pod_spec_path)
266
- end
267
-
268
- def specification_from_local(sandbox, platform)
269
- specification_from_external(sandbox, platform)
270
- end
271
-
272
- def specification_from_external(sandbox, platform)
273
- copy_external_source_into_sandbox(sandbox, platform)
274
- spec = Specification.from_file(pod_spec_path)
275
- spec.source = @params
276
- spec
277
- end
278
-
279
- def description
280
- "from `#{@params[:local]}'"
281
- end
282
- end
283
- end
284
- end
285
- end
@@ -1,276 +0,0 @@
1
- require 'open-uri'
2
- # require 'tempfile'
3
- require 'zlib'
4
- require 'digest/sha1'
5
-
6
- module Pod
7
- class Downloader
8
-
9
- # Concreted Downloader class that provides support for specifications with
10
- # git sources.
11
- #
12
- class Git < Downloader
13
- include Config::Mixin
14
-
15
- executable :git
16
-
17
- def download
18
- create_cache unless cache_exist?
19
- UI.section(' > Cloning git repo', '', 1) do
20
- if options[:tag]
21
- download_tag
22
- elsif options[:branch]
23
- download_branch
24
- elsif options[:commit]
25
- download_commit
26
- else
27
- download_head
28
- end
29
- Dir.chdir(target_path) { git! "submodule update --init" } if options[:submodules]
30
- end
31
- prune_cache
32
- end
33
-
34
-
35
- # @!group Download implementations
36
-
37
- # @return [Pathname] The clone URL, which resolves to the cache path.
38
- #
39
- def clone_url
40
- cache_path
41
- end
42
-
43
- # @return [void] Convenience method to perform clones operations.
44
- #
45
- def clone(from, to)
46
- UI.section(" > Cloning to Pods folder",'',1) do
47
- git! %Q|clone "#{from}" "#{to}"|
48
- end
49
- end
50
-
51
- # @return [void] Checkouts the HEAD of the git source in the destination
52
- # path.
53
- #
54
- def download_head
55
- if cache_exist?
56
- update_cache
57
- else
58
- create_cache
59
- end
60
-
61
- clone(clone_url, target_path)
62
- Dir.chdir(target_path) { git! "submodule update --init" } if options[:submodules]
63
- end
64
-
65
- # @return [void] Checkouts a specific tag of the git source in the
66
- # destination path.
67
- #
68
- def download_tag
69
- ensure_ref_exists(options[:tag])
70
- Dir.chdir(target_path) do
71
- git! "init"
72
- git! "remote add origin '#{clone_url}'"
73
- git! "fetch origin tags/#{options[:tag]}"
74
- git! "reset --hard FETCH_HEAD"
75
- git! "checkout -b activated-pod-commit"
76
- end
77
- end
78
-
79
- # @return [void] Checkouts a specific commit of the git source in the
80
- # destination path.
81
- #
82
- def download_commit
83
- ensure_ref_exists(options[:commit])
84
- clone(clone_url, target_path)
85
- Dir.chdir(target_path) do
86
- git! "checkout -b activated-pod-commit #{options[:commit]}"
87
- end
88
- end
89
-
90
- # @return [void] Checkouts the HEAD of a specific branch of the git
91
- # source in the destination path.
92
- #
93
- def download_branch
94
- ensure_remote_branch_exists(options[:branch])
95
- clone(clone_url, target_path)
96
- Dir.chdir(target_path) do
97
- git! "remote add upstream '#{@url}'" # we need to add the original url, not the cache url
98
- git! "fetch -q upstream" # refresh the branches
99
- git! "checkout --track -b activated-pod-commit upstream/#{options[:branch]}" # create a new tracking branch
100
- UI.message("Just downloaded and checked out branch: #{options[:branch]} from upstream #{clone_url}")
101
- end
102
- end
103
-
104
-
105
-
106
- # @!group Checking references
107
-
108
- # @return [Bool] Wether a reference (commit SHA or tag)
109
- #
110
- def ref_exists?(ref)
111
- Dir.chdir(cache_path) { git "rev-list --max-count=1 #{ref}" }
112
- $? == 0
113
- end
114
-
115
- # @return [void] Checks if a reference exists in the cache and updates
116
- # only if necessary.
117
- #
118
- # @raises if after the update the reference can't be found.
119
- #
120
- def ensure_ref_exists(ref)
121
- return if ref_exists?(ref)
122
- update_cache
123
- raise Informative, "[!] Cache unable to find git reference `#{ref}' for `#{url}'.".red unless ref_exists?(ref)
124
- end
125
-
126
- # @return [Bool] Wether a branch exists in the cache.
127
- #
128
- def branch_exists?(branch)
129
- Dir.chdir(cache_path) { git "branch --all | grep #{branch}$" } # check for remote branch and do suffix matching ($ anchor)
130
- $? == 0
131
- end
132
-
133
- # @return [void] Checks if a branch exists in the cache and updates
134
- # only if necessary.
135
- #
136
- # @raises if after the update the branch can't be found.
137
- #
138
- def ensure_remote_branch_exists(branch)
139
- return if branch_exists?(branch)
140
- update_cache
141
- raise Informative, "[!] Cache unable to find git reference `#{branch}' for `#{url}' (#{$?}).".red unless branch_exists?(branch)
142
- end
143
-
144
-
145
- # @!group Cache
146
-
147
- # The maximum allowed size for the cache expressed in Mb.
148
- #
149
- MAX_CACHE_SIZE = 500
150
-
151
- # @return [Pathname] The directory where the cache for the current git
152
- # repo is stored.
153
- #
154
- # @note The name of the directory is the SHA1 hash value of the URL of
155
- # the git repo.
156
- #
157
- def cache_path
158
- @cache_path ||= caches_root + "#{Digest::SHA1.hexdigest(url.to_s)}"
159
- end
160
-
161
- # @return [Pathname] The directory where the git caches are stored.
162
- #
163
- def caches_root
164
- Pathname.new(File.expand_path("~/Library/Caches/CocoaPods/Git"))
165
- end
166
-
167
- # @return [Integer] The global size of the git cache expressed in Mb.
168
- #
169
- def caches_size
170
- `du -cm`.split("\n").last.to_i
171
- end
172
-
173
- # @return [Bool] Wether the cache exits.
174
- #
175
- # @note The previous implementation of the cache didn't use a barebone
176
- # git repo. This method takes into account this fact and checks
177
- # that the cache is actually a barebone repo. If the cache was not
178
- # barebone it will be deleted and recreated.
179
- #
180
- def cache_exist?
181
- cache_path.exist? &&
182
- cache_origin_url(cache_path).to_s == url.to_s &&
183
- Dir.chdir(cache_path) { git("config core.bare").chomp == "true" }
184
- end
185
-
186
- # @return [String] The origin URL of the cache with the given directory.
187
- #
188
- # @param [String] dir The directory of the cache.
189
- #
190
- def cache_origin_url(dir)
191
- Dir.chdir(dir) { `git config remote.origin.url`.chomp }
192
- end
193
-
194
- # @return [void] Creates the barebone repo that will serve as the cache
195
- # for the current repo.
196
- #
197
- def create_cache
198
- UI.section(" > Creating cache git repo (#{cache_path})",'',1) do
199
- cache_path.rmtree if cache_path.exist?
200
- cache_path.mkpath
201
- git! %Q|clone --mirror "#{url}" "#{cache_path}"|
202
- end
203
- end
204
-
205
- # @return [void] Updates the barebone repo used as a cache against its
206
- # remote.
207
- #
208
- def update_cache
209
- UI.section(" > Updating cache git repo (#{cache_path})",'',1) do
210
- Dir.chdir(cache_path) { git! "remote update" }
211
- end
212
- end
213
-
214
- # @return [void] Deletes the oldest caches until they the global size is
215
- # below the maximum allowed.
216
- #
217
- def prune_cache
218
- return unless caches_root.exist?
219
- Dir.chdir(caches_root) do
220
- repos = Pathname.new(caches_root).children.select { |c| c.directory? }.sort_by(&:ctime)
221
- while caches_size >= MAX_CACHE_SIZE && !repos.empty?
222
- dir = repos.shift
223
- UI.message "#{'->'.yellow} Removing git cache for `#{cache_origin_url(dir)}'"
224
- dir.rmtree
225
- end
226
- end
227
- end
228
- end
229
-
230
- # This class allows to download tarballs from GitHub and is not currently
231
- # being used by CocoaPods as the git cache is preferable.
232
- #
233
- class GitHub < Git
234
- def download_head
235
- download_only? ? download_and_extract_tarball('master') : super
236
- end
237
-
238
- def download_tag
239
- download_only? ? download_and_extract_tarball(options[:tag]) : super
240
- end
241
-
242
- def download_commit
243
- download_only? ? download_and_extract_tarball(options[:commit]) : super
244
- end
245
-
246
- def download_branch
247
- download_only? ? download_and_extract_tarball(options[:branch]) : super
248
- end
249
-
250
- def tarball_url_for(id)
251
- original_url, username, reponame = *(url.match(/[:\/]([\w\-]+)\/([\w\-]+)\.git/))
252
- "https://github.com/#{username}/#{reponame}/tarball/#{id}"
253
- end
254
-
255
- def tmp_path
256
- target_path + "tarball.tar.gz"
257
- end
258
-
259
- private
260
-
261
- def download_only?
262
- @options[:download_only]
263
- end
264
-
265
- def download_and_extract_tarball(id)
266
- File.open(tmp_path, "w+") do |tmpfile|
267
- open tarball_url_for(id) do |archive|
268
- tmpfile.write Zlib::GzipReader.new(archive).read
269
- end
270
-
271
- system "tar xf #{tmpfile.path} -C #{target_path} --strip-components 1"
272
- end
273
- end
274
- end
275
- end
276
- end