cocoapods 0.9.2 → 0.10.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +40 -20
- data/lib/cocoapods.rb +1 -1
- data/lib/cocoapods/command/push.rb +4 -2
- data/lib/cocoapods/command/spec.rb +1 -10
- data/lib/cocoapods/dependency.rb +15 -9
- data/lib/cocoapods/downloader/git.rb +10 -1
- data/lib/cocoapods/downloader/http.rb +1 -1
- data/lib/cocoapods/installer.rb +13 -12
- data/lib/cocoapods/local_pod.rb +10 -3
- data/lib/cocoapods/podfile.rb +15 -1
- data/lib/cocoapods/sandbox.rb +15 -6
- metadata +2 -2
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,23 @@
|
|
1
|
+
## 0.10.0 (Unreleased)
|
2
|
+
|
3
|
+
[CocoaPods](http://git.io/4i75YA)
|
4
|
+
|
5
|
+
###### Enhancements
|
6
|
+
|
7
|
+
- Added a `--local-only` option to `pod push` so that developers can push locally and test before pushing to a remote. [#405](http://git.io/0ILJEw)
|
8
|
+
- Added line number information for errors generated in the Podfile. [#408](http://git.io/fWQvMg)
|
9
|
+
- Pods stored in git repositories now initialize submodules. [#406](http://git.io/L9ssSw)
|
10
|
+
|
11
|
+
|
12
|
+
###### Bug fixes
|
13
|
+
|
14
|
+
- Removed note about the post install hook form the linter.
|
15
|
+
- Improved xcodebuild error detection in the linter.
|
16
|
+
- Ensure the git cache exists, before updating it, when trying to install the ‘bleeding edge’ of a pod. [#426](http://git.io/d4eqRA)
|
17
|
+
- Clean downloaded external pods **after** resolving and activating (sub)specs. [#414](http://git.io/i77q_w)
|
18
|
+
- Support `tar.gz` as filename in a HTTP source. [#428](http://git.io/qhwKkA)
|
19
|
+
|
20
|
+
|
1
21
|
## 0.9.2
|
2
22
|
|
3
23
|
[CocoaPods](http://git.io/AVlRKg) • [Xcodeproj](http://git.io/xHbc0w)
|
@@ -135,9 +155,9 @@ configurations are based on the `Release` configuration, to base them on the
|
|
135
155
|
`Debug` configuration you will have to explicitely specify them as can be seen
|
136
156
|
above in the following line:
|
137
157
|
|
138
|
-
|
158
|
+
```ruby
|
139
159
|
xcodeproj 'TestProject', 'Test' => :debug
|
140
|
-
|
160
|
+
```
|
141
161
|
|
142
162
|
|
143
163
|
### Documentation
|
@@ -147,16 +167,16 @@ CocoaPods will now generate documentation for every library with the
|
|
147
167
|
|
148
168
|
You can customize the settings used like so:
|
149
169
|
|
150
|
-
|
170
|
+
```ruby
|
151
171
|
s.documentation = { :appledoc => ['--product-name', 'My awesome project!'] }
|
152
|
-
|
172
|
+
```
|
153
173
|
|
154
174
|
Alternatively, you can specify a URL where an HTML version of the documentation
|
155
175
|
can be found:
|
156
176
|
|
157
|
-
|
177
|
+
```ruby
|
158
178
|
s.documentation = { :html => 'http://example.com/docs/index.html' }
|
159
|
-
|
179
|
+
```
|
160
180
|
|
161
181
|
See [#149](https://github.com/CocoaPods/CocoaPods/issues/149) and
|
162
182
|
[#151](https://github.com/CocoaPods/CocoaPods/issues/151) for more info.
|
@@ -177,18 +197,18 @@ If you're not happy with the default boilerplate text generated for the title, h
|
|
177
197
|
and footnotes in the files, it's possible to customise these by overriding the methods
|
178
198
|
that generate the text in your `Podfile` like this:
|
179
199
|
|
180
|
-
|
200
|
+
```ruby
|
181
201
|
class ::Pod::Generator::Acknowledgements
|
182
202
|
def header_text
|
183
203
|
"My custom header text"
|
184
204
|
end
|
185
205
|
end
|
186
|
-
|
206
|
+
```
|
187
207
|
|
188
208
|
You can even go one step further and customise the text on a per target basis by
|
189
209
|
checking against the target name, like this:
|
190
210
|
|
191
|
-
|
211
|
+
```ruby
|
192
212
|
class ::Pod::Generator::Acknowledgements
|
193
213
|
def header_text
|
194
214
|
if @target_definition.label.end_with?("MyTargetName")
|
@@ -198,16 +218,16 @@ class ::Pod::Generator::Acknowledgements
|
|
198
218
|
end
|
199
219
|
end
|
200
220
|
end
|
201
|
-
|
221
|
+
```
|
202
222
|
|
203
223
|
Finally, here's a list of the methods that are available to override:
|
204
224
|
|
205
|
-
|
225
|
+
```ruby
|
206
226
|
header_title
|
207
227
|
header_text
|
208
228
|
footnote_title
|
209
229
|
footnote_text
|
210
|
-
|
230
|
+
```
|
211
231
|
|
212
232
|
|
213
233
|
### Introduced two new classes: LocalPod and Sandbox.
|
@@ -318,7 +338,7 @@ different sets of depedencies. This means that you can create a separate
|
|
318
338
|
library which contains all dependencies, including extra ones that you only use
|
319
339
|
in, for instance, a debug or test build. [[docs][1]]
|
320
340
|
|
321
|
-
|
341
|
+
```ruby
|
322
342
|
# This Podfile will build three static libraries:
|
323
343
|
# * libPods.a
|
324
344
|
# * libPods-debug.a
|
@@ -339,7 +359,7 @@ target :test, :exclusive => true do
|
|
339
359
|
# the `libPods-test.a` library.
|
340
360
|
dependency 'Kiwi'
|
341
361
|
end
|
342
|
-
|
362
|
+
```
|
343
363
|
|
344
364
|
### Install libraries from anywhere
|
345
365
|
|
@@ -347,7 +367,7 @@ A dependency can take a git url if the repo contains a podspec file in its
|
|
347
367
|
root, or a podspec can be loaded from a file or HTTP location. If no podspec is
|
348
368
|
available, a specification can be defined inline in the Podfile. [[docs][2]]
|
349
369
|
|
350
|
-
|
370
|
+
```ruby
|
351
371
|
# From a spec repo.
|
352
372
|
dependency 'SSToolkit'
|
353
373
|
|
@@ -378,14 +398,14 @@ dependency do |s|
|
|
378
398
|
end
|
379
399
|
end
|
380
400
|
end
|
381
|
-
|
401
|
+
```
|
382
402
|
|
383
403
|
### Add a `post_install` hook to the Podfile class
|
384
404
|
|
385
405
|
This allows the user to customize, for instance, the generated Xcode project
|
386
406
|
_before_ it’s written to disk. [[docs][3]]
|
387
407
|
|
388
|
-
|
408
|
+
```ruby
|
389
409
|
# Enable garbage collection support for MacRuby applications.
|
390
410
|
post_install do |installer|
|
391
411
|
installer.project.targets.each do |target|
|
@@ -394,14 +414,14 @@ post_install do |installer|
|
|
394
414
|
end
|
395
415
|
end
|
396
416
|
end
|
397
|
-
|
417
|
+
```
|
398
418
|
|
399
419
|
### Manifest
|
400
420
|
|
401
421
|
Generate a Podfile.lock file next to the Podfile, which contains a manifest of
|
402
422
|
your application’s dependencies and their dependencies.
|
403
423
|
|
404
|
-
|
424
|
+
```
|
405
425
|
PODS:
|
406
426
|
- JSONKit (1.4)
|
407
427
|
- LibComponentLogging-Core (1.1.4)
|
@@ -423,7 +443,7 @@ DOWNLOAD_ONLY:
|
|
423
443
|
DEPENDENCIES:
|
424
444
|
- RestKit-JSON-JSONKit
|
425
445
|
- RestKit-ObjectMapping
|
426
|
-
|
446
|
+
```
|
427
447
|
|
428
448
|
### Generate Xcode projects from scratch
|
429
449
|
|
data/lib/cocoapods.rb
CHANGED
@@ -14,7 +14,8 @@ module Pod
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def self.options
|
17
|
-
[["--allow-warnings", "Allows to push if warnings are not evitable"]
|
17
|
+
[ ["--allow-warnings", "Allows to push if warnings are not evitable"],
|
18
|
+
["--local-only", "Does not perform the step of pushing REPO to its remote"] ].concat(super)
|
18
19
|
end
|
19
20
|
|
20
21
|
extend Executable
|
@@ -22,6 +23,7 @@ module Pod
|
|
22
23
|
|
23
24
|
def initialize(argv)
|
24
25
|
@allow_warnings = argv.option('--allow-warnings')
|
26
|
+
@local_only = argv.option('--local-only')
|
25
27
|
@repo = argv.shift_argument
|
26
28
|
@podspec = argv.shift_argument
|
27
29
|
super unless argv.empty? && @repo
|
@@ -32,7 +34,7 @@ module Pod
|
|
32
34
|
check_repo_status
|
33
35
|
update_repo
|
34
36
|
add_specs_to_repo
|
35
|
-
push_repo
|
37
|
+
push_repo unless @local_only
|
36
38
|
puts
|
37
39
|
end
|
38
40
|
|
@@ -205,7 +205,6 @@ module Pod
|
|
205
205
|
@platform_notes[platform] << "#{platform.name} [!] Fatal errors found skipping the rest of the validation"
|
206
206
|
else
|
207
207
|
@platform_warnings[platform] += podspec_warnings + deprecation_warnings
|
208
|
-
@platform_notes[platform] += podspec_notes
|
209
208
|
peform_extensive_analysis unless quick
|
210
209
|
end
|
211
210
|
end
|
@@ -360,14 +359,6 @@ module Pod
|
|
360
359
|
@spec.source && @spec.source[:git] =~ /github.com/
|
361
360
|
end
|
362
361
|
|
363
|
-
# @return [Array<String>] List of the comments detected in the podspec
|
364
|
-
def podspec_notes
|
365
|
-
text = @file.read
|
366
|
-
deprecations = []
|
367
|
-
deprecations << "The `post_install' hook is reserved for edge cases" if text. =~ /post_install/
|
368
|
-
deprecations
|
369
|
-
end
|
370
|
-
|
371
362
|
# It reads a podspec file and checks for strings corresponding
|
372
363
|
# to features that are or will be deprecated
|
373
364
|
#
|
@@ -399,7 +390,7 @@ module Pod
|
|
399
390
|
def process_xcode_build_output(output)
|
400
391
|
output_by_line = output.split("\n")
|
401
392
|
selected_lines = output_by_line.select do |l|
|
402
|
-
l.include?('error: ') && (l !~ /errors? generated\./) \
|
393
|
+
l.include?('error: ') && (l !~ /errors? generated\./) && (l !~ /error: \(null\)/)\
|
403
394
|
|| l.include?('warning: ') && (l !~ /warnings? generated\./)\
|
404
395
|
|| l.include?('note: ') && (l !~ /expanded from macro/)
|
405
396
|
end
|
data/lib/cocoapods/dependency.rb
CHANGED
@@ -146,16 +146,20 @@ module Pod
|
|
146
146
|
end
|
147
147
|
|
148
148
|
def specification_from_sandbox(sandbox, platform)
|
149
|
+
specification_from_local(sandbox, platform) || specification_from_external(sandbox, platform)
|
150
|
+
end
|
151
|
+
|
152
|
+
def specification_from_local(sandbox, platform)
|
149
153
|
if local_pod = sandbox.installed_pod_named(name, platform)
|
150
154
|
local_pod.top_specification
|
151
|
-
else
|
152
|
-
copy_external_source_into_sandbox(sandbox)
|
153
|
-
local_pod = sandbox.installed_pod_named(name, platform)
|
154
|
-
local_pod.clean if config.clean? && local_pod.exists?
|
155
|
-
local_pod.top_specification
|
156
155
|
end
|
157
156
|
end
|
158
157
|
|
158
|
+
def specification_from_external(sandbox, platform)
|
159
|
+
copy_external_source_into_sandbox(sandbox, platform)
|
160
|
+
specification_from_local(sandbox, platform)
|
161
|
+
end
|
162
|
+
|
159
163
|
def ==(other_source)
|
160
164
|
return if other_source.nil?
|
161
165
|
name == other_source.name && params == other_source.params
|
@@ -163,10 +167,12 @@ module Pod
|
|
163
167
|
end
|
164
168
|
|
165
169
|
class GitSource < AbstractExternalSource
|
166
|
-
def copy_external_source_into_sandbox(sandbox)
|
170
|
+
def copy_external_source_into_sandbox(sandbox, platform)
|
167
171
|
puts " * Pre-downloading: '#{name}'" unless config.silent?
|
168
|
-
Downloader.for_target(sandbox.root + name, @params)
|
169
|
-
|
172
|
+
downloader = Downloader.for_target(sandbox.root + name, @params)
|
173
|
+
downloader.download
|
174
|
+
if local_pod = sandbox.installed_pod_named(name, platform)
|
175
|
+
local_pod.downloaded = true
|
170
176
|
end
|
171
177
|
end
|
172
178
|
|
@@ -181,7 +187,7 @@ module Pod
|
|
181
187
|
|
182
188
|
# can be http, file, etc
|
183
189
|
class PodspecSource < AbstractExternalSource
|
184
|
-
def copy_external_source_into_sandbox(sandbox)
|
190
|
+
def copy_external_source_into_sandbox(sandbox, _)
|
185
191
|
output_path = sandbox.root + "Local Podspecs/#{name}.podspec"
|
186
192
|
output_path.dirname.mkpath
|
187
193
|
puts " * Fetching podspec for `#{name}' from: #{@params[:podspec]}" unless config.silent?
|
@@ -76,6 +76,7 @@ module Pod
|
|
76
76
|
git "reset --hard HEAD"
|
77
77
|
git "clean -d -x -f"
|
78
78
|
git "pull"
|
79
|
+
git "submodule update"
|
79
80
|
end
|
80
81
|
end
|
81
82
|
|
@@ -99,7 +100,11 @@ module Pod
|
|
99
100
|
end
|
100
101
|
|
101
102
|
def download_head
|
102
|
-
|
103
|
+
if cache_exist?
|
104
|
+
update_cache
|
105
|
+
else
|
106
|
+
create_cache
|
107
|
+
end
|
103
108
|
clone(clone_url, target_path)
|
104
109
|
end
|
105
110
|
|
@@ -111,6 +116,7 @@ module Pod
|
|
111
116
|
git "fetch origin tags/#{options[:tag]}"
|
112
117
|
git "reset --hard FETCH_HEAD"
|
113
118
|
git "checkout -b activated-pod-commit"
|
119
|
+
git "submodule update --init"
|
114
120
|
end
|
115
121
|
end
|
116
122
|
|
@@ -135,6 +141,9 @@ module Pod
|
|
135
141
|
|
136
142
|
def clone(from, to)
|
137
143
|
git "clone \"#{from}\" \"#{to}\""
|
144
|
+
Dir.chdir(to) do
|
145
|
+
git "submodule update --init"
|
146
|
+
end
|
138
147
|
end
|
139
148
|
end
|
140
149
|
|
data/lib/cocoapods/installer.rb
CHANGED
@@ -57,12 +57,17 @@ module Pod
|
|
57
57
|
puts marker << ( pod.exists? ? "Using #{name}" : "Installing #{name}".green )
|
58
58
|
end
|
59
59
|
|
60
|
-
unless pod.exists?
|
61
|
-
|
62
|
-
|
63
|
-
|
60
|
+
download_pod(pod) unless pod.exists?
|
61
|
+
|
62
|
+
# This will not happen if the pod existed before we started the install
|
63
|
+
# process.
|
64
|
+
if pod.downloaded?
|
65
|
+
# The docs need to be generated before cleaning because the
|
66
|
+
# documentation is created for all the subspecs.
|
64
67
|
generate_docs(pod)
|
65
|
-
|
68
|
+
# Here we clean pod's that just have been downloaded or have been
|
69
|
+
# pre-downloaded in AbstractExternalSource#specification_from_sandbox.
|
70
|
+
pod.clean! if config.clean?
|
66
71
|
end
|
67
72
|
end
|
68
73
|
end
|
@@ -74,10 +79,12 @@ module Pod
|
|
74
79
|
if downloader.respond_to?(:download_head)
|
75
80
|
downloader.download_head
|
76
81
|
else
|
82
|
+
raise Informative, "The downloader of class `#{downloader.class.name}' does not support the `:head' option."
|
77
83
|
end
|
78
84
|
else
|
79
85
|
downloader.download
|
80
86
|
end
|
87
|
+
pod.downloaded = true
|
81
88
|
end
|
82
89
|
|
83
90
|
#TODO: move to generator ?
|
@@ -206,18 +213,12 @@ module Pod
|
|
206
213
|
specs_by_target.each do |target_definition, specs|
|
207
214
|
@pods_by_spec[target_definition.platform] = {}
|
208
215
|
result[target_definition] = specs.map do |spec|
|
209
|
-
|
210
|
-
pod.add_specification(spec)
|
211
|
-
pod
|
216
|
+
@sandbox.local_pod_for_spec(spec, target_definition.platform)
|
212
217
|
end.uniq.compact
|
213
218
|
end
|
214
219
|
result
|
215
220
|
end
|
216
221
|
|
217
|
-
def pod_for_spec(spec, platform)
|
218
|
-
@pods_by_spec[platform][spec.top_level_parent.name] ||= LocalPod.new(spec, @sandbox, platform)
|
219
|
-
end
|
220
|
-
|
221
222
|
private
|
222
223
|
|
223
224
|
def print_title(title, only_verbose = true)
|
data/lib/cocoapods/local_pod.rb
CHANGED
@@ -38,6 +38,13 @@ module Pod
|
|
38
38
|
#
|
39
39
|
attr_reader :platform
|
40
40
|
|
41
|
+
# @return [Boolean] Wether or not the pod has been downloaded in the
|
42
|
+
# current install process and still needs its docs
|
43
|
+
# generated and be cleaned.
|
44
|
+
#
|
45
|
+
attr_accessor :downloaded
|
46
|
+
alias_method :downloaded?, :downloaded
|
47
|
+
|
41
48
|
# @param [Specification] specification
|
42
49
|
# The first activated specification of the pod.
|
43
50
|
# @param [Sandbox] sandbox
|
@@ -139,7 +146,7 @@ module Pod
|
|
139
146
|
#
|
140
147
|
# @return [void]
|
141
148
|
#
|
142
|
-
def clean
|
149
|
+
def clean!
|
143
150
|
clean_paths.each { |path| FileUtils.rm_rf(path) }
|
144
151
|
@cleaned = true
|
145
152
|
end
|
@@ -299,8 +306,8 @@ module Pod
|
|
299
306
|
#
|
300
307
|
def all_specs_public_header_files
|
301
308
|
if @cleaned
|
302
|
-
raise Informative, "The pod is cleaned and cannot compute the
|
303
|
-
|
309
|
+
raise Informative, "The pod is cleaned and cannot compute the " \
|
310
|
+
"header files, as some might have been deleted."
|
304
311
|
end
|
305
312
|
|
306
313
|
all_specs = [ top_specification ] + top_specification.subspecs
|
data/lib/cocoapods/podfile.rb
CHANGED
@@ -1,5 +1,19 @@
|
|
1
1
|
module Pod
|
2
2
|
class Podfile
|
3
|
+
class Informative < ::Pod::Informative
|
4
|
+
def podfile_line
|
5
|
+
@podfile_line ||= self.backtrace.find {|t| t =~ /Podfile/}
|
6
|
+
end
|
7
|
+
|
8
|
+
def message
|
9
|
+
if podfile_line
|
10
|
+
super + " (#{podfile_line})\n".red
|
11
|
+
else
|
12
|
+
super
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
3
17
|
class UserProject
|
4
18
|
include Config::Mixin
|
5
19
|
|
@@ -200,7 +214,7 @@ module Pod
|
|
200
214
|
when :osx
|
201
215
|
target = '10.6'
|
202
216
|
else
|
203
|
-
raise Informative, "Unsupported platform: platform must be one of [:ios, :osx]"
|
217
|
+
raise ::Pod::Podfile::Informative, "Unsupported platform: platform must be one of [:ios, :osx]"
|
204
218
|
end
|
205
219
|
end
|
206
220
|
@target_definition.platform = Platform.new(name, target)
|
data/lib/cocoapods/sandbox.rb
CHANGED
@@ -9,6 +9,7 @@ module Pod
|
|
9
9
|
def initialize(path)
|
10
10
|
@root = Pathname.new(path)
|
11
11
|
@header_search_paths = [HEADERS_DIR]
|
12
|
+
@cached_local_pods = {}
|
12
13
|
|
13
14
|
FileUtils.mkdir_p(@root)
|
14
15
|
end
|
@@ -56,17 +57,25 @@ module Pod
|
|
56
57
|
headers_root.rmtree if headers_root.exist?
|
57
58
|
end
|
58
59
|
|
59
|
-
def
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
Pathname.new(spec_path)
|
60
|
+
def local_pod_for_spec(spec, platform)
|
61
|
+
key = [spec.top_level_parent.name, platform.to_sym]
|
62
|
+
(@cached_local_pods[key] ||= LocalPod.new(spec.top_level_parent, self, platform)).tap do |pod|
|
63
|
+
pod.add_specification(spec)
|
64
64
|
end
|
65
65
|
end
|
66
66
|
|
67
67
|
def installed_pod_named(name, platform)
|
68
68
|
if spec_path = podspec_for_name(name)
|
69
|
-
|
69
|
+
key = [name, platform.to_sym]
|
70
|
+
@cached_local_pods[key] ||= LocalPod.from_podspec(spec_path, self, platform)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def podspec_for_name(name)
|
75
|
+
if spec_path = Dir[root + "#{name}/*.podspec"].first
|
76
|
+
Pathname.new(spec_path)
|
77
|
+
elsif spec_path = Dir[root + "Local Podspecs/#{name}.podspec"].first
|
78
|
+
Pathname.new(spec_path)
|
70
79
|
end
|
71
80
|
end
|
72
81
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cocoapods
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.10.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-07-
|
12
|
+
date: 2012-07-29 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: faraday
|