cocoapods 0.14.0 → 0.15.0
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.
- data/CHANGELOG.md +42 -9
- data/bin/pod +4 -0
- data/lib/cocoapods.rb +2 -2
- data/lib/cocoapods/command.rb +2 -25
- data/lib/cocoapods/command/install.rb +1 -2
- data/lib/cocoapods/command/linter.rb +24 -4
- data/lib/cocoapods/command/list.rb +16 -11
- data/lib/cocoapods/command/outdated.rb +2 -4
- data/lib/cocoapods/command/push.rb +10 -10
- data/lib/cocoapods/command/repo.rb +22 -20
- data/lib/cocoapods/command/search.rb +6 -4
- data/lib/cocoapods/command/setup.rb +15 -14
- data/lib/cocoapods/command/spec.rb +17 -14
- data/lib/cocoapods/command/update.rb +9 -1
- data/lib/cocoapods/config.rb +12 -4
- data/lib/cocoapods/dependency.rb +18 -15
- data/lib/cocoapods/downloader/git.rb +41 -28
- data/lib/cocoapods/downloader/http.rb +10 -3
- data/lib/cocoapods/downloader/mercurial.rb +6 -4
- data/lib/cocoapods/downloader/subversion.rb +6 -2
- data/lib/cocoapods/executable.rb +6 -6
- data/lib/cocoapods/generator/acknowledgements/markdown.rb +1 -0
- data/lib/cocoapods/installer.rb +73 -57
- data/lib/cocoapods/installer/target_installer.rb +15 -11
- data/lib/cocoapods/installer/user_project_integrator.rb +25 -16
- data/lib/cocoapods/local_pod.rb +34 -12
- data/lib/cocoapods/podfile.rb +15 -0
- data/lib/cocoapods/resolver.rb +33 -39
- data/lib/cocoapods/source.rb +172 -48
- data/lib/cocoapods/specification.rb +48 -32
- data/lib/cocoapods/specification/set.rb +102 -34
- data/lib/cocoapods/specification/statistics.rb +1 -1
- data/lib/cocoapods/user_interface.rb +215 -0
- data/lib/cocoapods/user_interface/ui_pod.rb +130 -0
- metadata +7 -7
- data/lib/cocoapods/command/presenter.rb +0 -61
- data/lib/cocoapods/command/presenter/cocoa_pod.rb +0 -118
@@ -12,20 +12,22 @@ module Pod
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def self.options
|
15
|
-
[[
|
15
|
+
[[
|
16
|
+
"--full", "Search by name, summary, and description",
|
17
|
+
"--stats", "Show additional stats (like GitHub watchers and forks)"
|
18
|
+
]].concat(super)
|
16
19
|
end
|
17
20
|
|
18
21
|
def initialize(argv)
|
19
22
|
@full_text_search = argv.option('--full')
|
20
|
-
@
|
23
|
+
@stats = argv.option('--stats')
|
21
24
|
@query = argv.shift_argument
|
22
25
|
super unless argv.empty? && @query
|
23
26
|
end
|
24
27
|
|
25
28
|
def run
|
26
29
|
sets = Source.search_by_name(@query.strip, @full_text_search)
|
27
|
-
sets.each {|
|
28
|
-
puts
|
30
|
+
sets.each { |set| UI.pod(set, (@stats ? :stats : :normal)) }
|
29
31
|
end
|
30
32
|
end
|
31
33
|
end
|
@@ -89,21 +89,22 @@ module Pod
|
|
89
89
|
end
|
90
90
|
|
91
91
|
def run
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
92
|
+
UI.section "Setting up CocoaPods master repo" do
|
93
|
+
if dir.exist?
|
94
|
+
set_master_repo_url
|
95
|
+
set_master_repo_branch
|
96
|
+
update_master_repo
|
97
|
+
else
|
98
|
+
add_master_repo
|
99
|
+
end
|
100
|
+
# Mainly so the specs run with submodule repos
|
101
|
+
if (dir + '.git/hooks').exist?
|
102
|
+
hook = dir + '.git/hooks/pre-commit'
|
103
|
+
hook.open('w') { |f| f << "#!/bin/sh\nrake lint" }
|
104
|
+
`chmod +x '#{hook}'`
|
105
|
+
end
|
105
106
|
end
|
106
|
-
|
107
|
+
UI.puts "Setup completed (#{push? ? "push" : "read-only"} access)".green
|
107
108
|
end
|
108
109
|
end
|
109
110
|
end
|
@@ -20,6 +20,7 @@ module Pod
|
|
20
20
|
|
21
21
|
def self.options
|
22
22
|
[ ["--quick", "Lint skips checks that would require to download and build the spec"],
|
23
|
+
["--local", "Lint a podspec against the local files contained in its directory"],
|
23
24
|
["--only-errors", "Lint validates even if warnings are present"],
|
24
25
|
["--no-clean", "Lint leaves the build directory intact for inspection"] ].concat(super)
|
25
26
|
end
|
@@ -32,9 +33,10 @@ module Pod
|
|
32
33
|
super if @name_or_url.nil?
|
33
34
|
super unless argv.empty?
|
34
35
|
elsif @action == 'lint'
|
35
|
-
@quick
|
36
|
-
@
|
37
|
-
@
|
36
|
+
@quick = argv.option('--quick')
|
37
|
+
@local = argv.option('--local')
|
38
|
+
@only_errors = argv.option('--only-errors')
|
39
|
+
@no_clean = argv.option('--no-clean')
|
38
40
|
@podspecs_paths = argv
|
39
41
|
else
|
40
42
|
super
|
@@ -59,21 +61,22 @@ module Pod
|
|
59
61
|
repo_id = repo_id_match[1]
|
60
62
|
data = github_data_for_template(repo_id)
|
61
63
|
data[:name] = @name_or_url if @url
|
62
|
-
puts semantic_versioning_notice(repo_id, data[:name]) if data[:version] == '0.0.1'
|
64
|
+
UI.puts semantic_versioning_notice(repo_id, data[:name]) if data[:version] == '0.0.1'
|
63
65
|
else
|
64
66
|
data = default_data_for_template(@name_or_url)
|
65
67
|
end
|
66
68
|
spec = spec_template(data)
|
67
69
|
(Pathname.pwd + "#{data[:name]}.podspec").open('w') { |f| f << spec }
|
68
|
-
puts "\nSpecification created at #{data[:name]}.podspec".green
|
70
|
+
UI.puts "\nSpecification created at #{data[:name]}.podspec".green
|
69
71
|
end
|
70
72
|
|
71
73
|
def lint
|
72
|
-
puts
|
74
|
+
UI.puts
|
73
75
|
invalid_count = 0
|
74
76
|
podspecs_to_lint.each do |podspec|
|
75
|
-
linter
|
76
|
-
linter.quick
|
77
|
+
linter = Linter.new(podspec)
|
78
|
+
linter.quick = @quick
|
79
|
+
linter.local = @local
|
77
80
|
linter.no_clean = @no_clean
|
78
81
|
|
79
82
|
# Show immediatly which pod is being processed.
|
@@ -93,19 +96,19 @@ module Pod
|
|
93
96
|
end
|
94
97
|
|
95
98
|
# This overwrites the previously printed text
|
96
|
-
puts " -> ".send(color) << linter.spec_name unless config.silent?
|
99
|
+
UI.puts " -> ".send(color) << linter.spec_name unless config.silent?
|
97
100
|
print_messages('ERROR', linter.errors)
|
98
101
|
print_messages('WARN', linter.warnings)
|
99
102
|
print_messages('NOTE', linter.notes)
|
100
103
|
|
101
|
-
puts unless config.silent?
|
104
|
+
UI.puts unless config.silent?
|
102
105
|
end
|
103
106
|
|
104
|
-
puts "Analyzed #{podspecs_to_lint.count} podspecs files.\n\n" unless config.silent?
|
107
|
+
UI.puts "Analyzed #{podspecs_to_lint.count} podspecs files.\n\n" unless config.silent?
|
105
108
|
count = podspecs_to_lint.count
|
106
109
|
if invalid_count == 0
|
107
110
|
lint_passed_message = count == 1 ? "#{podspecs_to_lint.first.basename} passed validation." : "All the specs passed validation."
|
108
|
-
puts lint_passed_message.green << "\n\n" unless config.silent?
|
111
|
+
UI.puts lint_passed_message.green << "\n\n" unless config.silent?
|
109
112
|
else
|
110
113
|
raise Informative, count == 1 ? "The spec did not pass validation." : "#{invalid_count} out of #{count} specs failed validation."
|
111
114
|
end
|
@@ -116,7 +119,7 @@ module Pod
|
|
116
119
|
|
117
120
|
def print_messages(type, messages)
|
118
121
|
return if config.silent?
|
119
|
-
messages.each {|msg| puts " - #{type.ljust(5)} | #{msg}"}
|
122
|
+
messages.each {|msg| UI.puts " - #{type.ljust(5)} | #{msg}"}
|
120
123
|
end
|
121
124
|
|
122
125
|
def podspecs_to_lint
|
@@ -171,7 +174,7 @@ module Pod
|
|
171
174
|
data = {}
|
172
175
|
|
173
176
|
data[:name] = repo['name']
|
174
|
-
data[:summary] = repo['description'].gsub(/["]/, '\"')
|
177
|
+
data[:summary] = (repo['description'] || '').gsub(/["]/, '\"')
|
175
178
|
data[:homepage] = (repo['homepage'] && !repo['homepage'].empty? ) ? repo['homepage'] : repo['html_url']
|
176
179
|
data[:author_name] = user['name'] || user['login']
|
177
180
|
data[:author_email] = user['email'] || 'email@address.com'
|
@@ -9,10 +9,18 @@ module Pod
|
|
9
9
|
Updates all dependencies.}
|
10
10
|
end
|
11
11
|
|
12
|
+
def self.options
|
13
|
+
[["--no-update", "Skip running `pod repo update` before install"]].concat(super)
|
14
|
+
end
|
15
|
+
|
16
|
+
def initialize(argv)
|
17
|
+
config.skip_repo_update = argv.option('--no-update')
|
18
|
+
super unless argv.empty?
|
19
|
+
end
|
20
|
+
|
12
21
|
def run
|
13
22
|
verify_podfile_exists!
|
14
23
|
verify_lockfile_exists!
|
15
|
-
update_spec_repos_if_necessary!
|
16
24
|
run_install_with_update(true)
|
17
25
|
end
|
18
26
|
end
|
data/lib/cocoapods/config.rb
CHANGED
@@ -14,7 +14,7 @@ module Pod
|
|
14
14
|
attr_accessor :clean, :verbose, :silent
|
15
15
|
attr_accessor :generate_docs, :doc_install
|
16
16
|
attr_accessor :integrate_targets
|
17
|
-
attr_accessor :
|
17
|
+
attr_accessor :new_version_message, :skip_repo_update
|
18
18
|
|
19
19
|
alias_method :clean?, :clean
|
20
20
|
alias_method :verbose?, :verbose
|
@@ -22,11 +22,13 @@ module Pod
|
|
22
22
|
alias_method :generate_docs?, :generate_docs
|
23
23
|
alias_method :doc_install?, :doc_install
|
24
24
|
alias_method :integrate_targets?, :integrate_targets
|
25
|
+
alias_method :skip_repo_update?, :skip_repo_update
|
26
|
+
alias_method :new_version_message?, :new_version_message
|
25
27
|
|
26
28
|
def initialize
|
27
29
|
@repos_dir = Pathname.new(File.expand_path("~/.cocoapods"))
|
28
|
-
@verbose = @silent = false
|
29
|
-
@clean = @generate_docs = @doc_install = @integrate_targets = true
|
30
|
+
@verbose = @silent = @skip_repo_update = false
|
31
|
+
@clean = @generate_docs = @doc_install = @integrate_targets = @new_version_message = true
|
30
32
|
end
|
31
33
|
|
32
34
|
def project_root
|
@@ -38,7 +40,13 @@ module Pod
|
|
38
40
|
end
|
39
41
|
|
40
42
|
def project_podfile
|
41
|
-
@project_podfile
|
43
|
+
unless @project_podfile
|
44
|
+
@project_podfile = project_root + 'CocoaPods.podfile'
|
45
|
+
unless @project_podfile.exist?
|
46
|
+
@project_podfile = project_root + 'Podfile'
|
47
|
+
end
|
48
|
+
end
|
49
|
+
@project_podfile
|
42
50
|
end
|
43
51
|
|
44
52
|
def project_lockfile
|
data/lib/cocoapods/dependency.rb
CHANGED
@@ -177,10 +177,10 @@ module Pod
|
|
177
177
|
output_path = sandbox.root + "Local Podspecs/#{name}.podspec"
|
178
178
|
output_path.dirname.mkpath
|
179
179
|
if podspec.is_a?(String)
|
180
|
-
raise Informative, "No podspec found for `#{name}' in
|
180
|
+
raise Informative, "No podspec found for `#{name}' in #{description}" unless podspec.include?('Spec.new')
|
181
181
|
output_path.open('w') { |f| f.puts(podspec) }
|
182
182
|
else
|
183
|
-
raise Informative, "No podspec found for `#{name}' in
|
183
|
+
raise Informative, "No podspec found for `#{name}' in #{description}" unless podspec.exist?
|
184
184
|
FileUtils.copy(podspec, output_path)
|
185
185
|
end
|
186
186
|
end
|
@@ -193,14 +193,15 @@ module Pod
|
|
193
193
|
|
194
194
|
class GitSource < AbstractExternalSource
|
195
195
|
def copy_external_source_into_sandbox(sandbox, platform)
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
196
|
+
UI.info("->".green + " Pre-downloading: '#{name}'") do
|
197
|
+
target = sandbox.root + name
|
198
|
+
target.rmtree if target.exist?
|
199
|
+
downloader = Downloader.for_target(sandbox.root + name, @params)
|
200
|
+
downloader.download
|
201
|
+
store_podspec(sandbox, target + "#{name}.podspec")
|
202
|
+
if local_pod = sandbox.installed_pod_named(name, platform)
|
203
|
+
local_pod.downloaded = true
|
204
|
+
end
|
204
205
|
end
|
205
206
|
end
|
206
207
|
|
@@ -216,10 +217,11 @@ module Pod
|
|
216
217
|
# can be http, file, etc
|
217
218
|
class PodspecSource < AbstractExternalSource
|
218
219
|
def copy_external_source_into_sandbox(sandbox, _)
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
220
|
+
UI.info("->".green + " Fetching podspec for `#{name}' from: #{@params[:podspec]}") do
|
221
|
+
path = @params[:podspec]
|
222
|
+
path = Pathname.new(path).expand_path if path.start_with?("~")
|
223
|
+
open(path) { |io| store_podspec(sandbox, io.read) }
|
224
|
+
end
|
223
225
|
end
|
224
226
|
|
225
227
|
def description
|
@@ -229,7 +231,8 @@ module Pod
|
|
229
231
|
|
230
232
|
class LocalSource < AbstractExternalSource
|
231
233
|
def pod_spec_path
|
232
|
-
path = Pathname.new(@params[:local]).expand_path
|
234
|
+
path = Pathname.new(@params[:local]).expand_path
|
235
|
+
path += "#{name}.podspec"# unless path.to_s.include?("#{name}.podspec")
|
233
236
|
raise Informative, "No podspec found for `#{name}' in `#{@params[:local]}'" unless path.exist?
|
234
237
|
path
|
235
238
|
end
|
@@ -7,33 +7,34 @@ module Pod
|
|
7
7
|
class Downloader
|
8
8
|
class Git < Downloader
|
9
9
|
include Config::Mixin
|
10
|
+
|
10
11
|
executable :git
|
11
12
|
|
12
13
|
MAX_CACHE_SIZE = 500
|
13
14
|
|
14
15
|
def download
|
15
16
|
create_cache unless cache_exist?
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
17
|
+
UI.section(' > Cloning git repo', '', 1) do
|
18
|
+
if options[:tag]
|
19
|
+
download_tag
|
20
|
+
elsif options[:branch]
|
21
|
+
download_branch
|
22
|
+
elsif options[:commit]
|
23
|
+
download_commit
|
24
|
+
else
|
25
|
+
download_head
|
26
|
+
end
|
27
|
+
Dir.chdir(target_path) { git! "submodule update --init" } if options[:submodules]
|
26
28
|
end
|
27
|
-
|
28
|
-
Dir.chdir(target_path) { git! "submodule update --init" } if options[:submodules]
|
29
29
|
prune_cache
|
30
30
|
end
|
31
31
|
|
32
32
|
def create_cache
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
33
|
+
UI.section(" > Creating cache git repo (#{cache_path})",'',1) do
|
34
|
+
cache_path.rmtree if cache_path.exist?
|
35
|
+
cache_path.mkpath
|
36
|
+
git! %Q|clone --mirror "#{url}" "#{cache_path}"|
|
37
|
+
end
|
37
38
|
end
|
38
39
|
|
39
40
|
def prune_cache
|
@@ -42,7 +43,7 @@ module Pod
|
|
42
43
|
repos = Pathname.new(caches_dir).children.select { |c| c.directory? }.sort_by(&:ctime)
|
43
44
|
while caches_size >= MAX_CACHE_SIZE && !repos.empty?
|
44
45
|
dir = repos.shift
|
45
|
-
|
46
|
+
UI.message "#{'->'.yellow} Removing git cache for `#{origin_url(dir)}'"
|
46
47
|
dir.rmtree
|
47
48
|
end
|
48
49
|
end
|
@@ -74,12 +75,17 @@ module Pod
|
|
74
75
|
end
|
75
76
|
|
76
77
|
def update_cache
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
78
|
+
UI.section(" > Updating cache git repo (#{cache_path})",'',1) do
|
79
|
+
Dir.chdir(cache_path) do
|
80
|
+
if git("config core.bare").chomp == "true"
|
81
|
+
git! "remote update"
|
82
|
+
else
|
83
|
+
git! "reset --hard HEAD"
|
84
|
+
git! "clean -d -x -f"
|
85
|
+
git! "pull origin master"
|
86
|
+
git! "fetch --tags"
|
87
|
+
end
|
88
|
+
end
|
83
89
|
end
|
84
90
|
end
|
85
91
|
|
@@ -95,10 +101,15 @@ module Pod
|
|
95
101
|
raise Informative, "[!] Cache unable to find git reference `#{ref}' for `#{url}'.".red unless ref_exists?(ref)
|
96
102
|
end
|
97
103
|
|
104
|
+
def branch_exists?(branch)
|
105
|
+
Dir.chdir(cache_path) { git "branch --all | grep #{branch}$" } # check for remote branch and do suffix matching ($ anchor)
|
106
|
+
$? == 0
|
107
|
+
end
|
108
|
+
|
98
109
|
def ensure_remote_branch_exists(branch)
|
99
|
-
|
100
|
-
|
101
|
-
raise Informative, "[!] Cache unable to find git reference `#{branch}' for `#{url}' (#{$?}).".red
|
110
|
+
return if branch_exists?(branch)
|
111
|
+
update_cache
|
112
|
+
raise Informative, "[!] Cache unable to find git reference `#{branch}' for `#{url}' (#{$?}).".red unless branch_exists?(branch)
|
102
113
|
end
|
103
114
|
|
104
115
|
def download_head
|
@@ -138,12 +149,14 @@ module Pod
|
|
138
149
|
git! "remote add upstream '#{@url}'" # we need to add the original url, not the cache url
|
139
150
|
git! "fetch -q upstream" # refresh the branches
|
140
151
|
git! "checkout --track -b activated-pod-commit upstream/#{options[:branch]}" # create a new tracking branch
|
141
|
-
|
152
|
+
UI.message("Just downloaded and checked out branch: #{options[:branch]} from upstream #{clone_url}")
|
142
153
|
end
|
143
154
|
end
|
144
155
|
|
145
156
|
def clone(from, to)
|
146
|
-
|
157
|
+
UI.section(" > Cloning to Pods folder",'',1) do
|
158
|
+
git! %Q|clone "#{from}" "#{to}"|
|
159
|
+
end
|
147
160
|
end
|
148
161
|
end
|
149
162
|
|
@@ -16,9 +16,10 @@ module Pod
|
|
16
16
|
def download
|
17
17
|
@filename = filename_with_type type
|
18
18
|
@download_path = target_path + @filename
|
19
|
-
|
20
|
-
|
21
|
-
|
19
|
+
UI.section(' > Downloading from HTTP', '', 3) do
|
20
|
+
download_file @download_path
|
21
|
+
extract_with_type @download_path, type
|
22
|
+
end
|
22
23
|
end
|
23
24
|
|
24
25
|
def type
|
@@ -33,6 +34,8 @@ module Pod
|
|
33
34
|
:tgz
|
34
35
|
elsif url =~ /.tar$/
|
35
36
|
:tar
|
37
|
+
elsif url =~ /.(tbz|tar\.bz2)$/
|
38
|
+
:tbz
|
36
39
|
else
|
37
40
|
nil
|
38
41
|
end
|
@@ -46,6 +49,8 @@ module Pod
|
|
46
49
|
"file.tgz"
|
47
50
|
when :tar
|
48
51
|
"file.tar"
|
52
|
+
when :tbz
|
53
|
+
"file.tbz"
|
49
54
|
else
|
50
55
|
raise UnsupportedFileTypeError.new "Unsupported file type: #{type}"
|
51
56
|
end
|
@@ -63,6 +68,8 @@ module Pod
|
|
63
68
|
tar! "xfz '#{full_filename}' -C '#{target_path}'"
|
64
69
|
when :tar
|
65
70
|
tar! "xf '#{full_filename}' -C '#{target_path}'"
|
71
|
+
when :tbz
|
72
|
+
tar! "xfj '#{full_filename}' -C '#{target_path}'"
|
66
73
|
else
|
67
74
|
raise UnsupportedFileTypeError.new "Unsupported file type: #{type}"
|
68
75
|
end
|
@@ -4,10 +4,12 @@ module Pod
|
|
4
4
|
executable :hg
|
5
5
|
|
6
6
|
def download
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
7
|
+
UI.section(' > Cloning mercurial repo', '', 3) do
|
8
|
+
if options[:revision]
|
9
|
+
download_revision
|
10
|
+
else
|
11
|
+
download_head
|
12
|
+
end
|
11
13
|
end
|
12
14
|
end
|
13
15
|
|