cocoapods 0.36.4 → 0.37.0.beta.1
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +54 -0
- data/LICENSE +8 -2
- data/README.md +37 -16
- data/lib/cocoapods/command/lib.rb +3 -0
- data/lib/cocoapods/command/repo.rb +0 -31
- data/lib/cocoapods/command/repo/list.rb +16 -18
- data/lib/cocoapods/command/spec/lint.rb +3 -0
- data/lib/cocoapods/config.rb +6 -0
- data/lib/cocoapods/downloader.rb +40 -0
- data/lib/cocoapods/downloader/cache.rb +210 -0
- data/lib/cocoapods/downloader/request.rb +90 -0
- data/lib/cocoapods/downloader/response.rb +16 -0
- data/lib/cocoapods/external_sources/abstract_external_source.rb +18 -19
- data/lib/cocoapods/external_sources/path_source.rb +0 -2
- data/lib/cocoapods/gem_version.rb +1 -1
- data/lib/cocoapods/generator/embed_frameworks_script.rb +2 -2
- data/lib/cocoapods/generator/module_map.rb +17 -2
- data/lib/cocoapods/installer/analyzer.rb +21 -1
- data/lib/cocoapods/installer/pod_source_installer.rb +14 -111
- data/lib/cocoapods/installer/target_installer.rb +4 -0
- data/lib/cocoapods/installer/target_installer/pod_target_installer.rb +23 -2
- data/lib/cocoapods/installer/user_project_integrator/target_integrator/xcconfig_integrator.rb +36 -6
- data/lib/cocoapods/resolver.rb +3 -6
- data/lib/cocoapods/sandbox.rb +5 -3
- data/lib/cocoapods/sandbox/file_accessor.rb +25 -5
- data/lib/cocoapods/sandbox/pod_dir_cleaner.rb +85 -0
- data/lib/cocoapods/sandbox/podspec_finder.rb +26 -0
- data/lib/cocoapods/validator.rb +32 -7
- metadata +73 -64
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ab74bb5d0f584952ffd9115c2e61a0b624b9fb03
|
4
|
+
data.tar.gz: a935b3bff32b56d454932f95bff73eb4b6b780b5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b4c2c341908e2cceb3ee3ad114c21296648f583a19e1f11f31c062540727b3647c64e4fcab70ac8d3d32c3903fd0c611bd638eee052ce527a1fccfe2494e6921
|
7
|
+
data.tar.gz: d0161a847678e8d4d35efdf85dbf95e03dfc477af4348849c2230c84864b40096f5aeb287b9d9fbbf36473ee939527bfce4440b341e4839cda943bd99cd8d41b
|
data/CHANGELOG.md
CHANGED
@@ -4,6 +4,60 @@ To install or update CocoaPods see this [guide](http://docs.cocoapods.org/guides
|
|
4
4
|
|
5
5
|
To install release candidates run `[sudo] gem install cocoapods --pre`
|
6
6
|
|
7
|
+
## 0.37.0.beta.1
|
8
|
+
|
9
|
+
##### Enhancements
|
10
|
+
|
11
|
+
* Allow the specification of custom module map files.
|
12
|
+
[Samuel Giddins](https://github.com/segiddins)
|
13
|
+
[Marius Rackwitz](https://github.com/mrackwitz)
|
14
|
+
[#3145](https://github.com/CocoaPods/CocoaPods/issues/3145)
|
15
|
+
|
16
|
+
* Show the source URI for local Pod specification repositories in
|
17
|
+
`pod repo list`.
|
18
|
+
[Kyle Fuller](https://github.com/kylef)
|
19
|
+
|
20
|
+
* Only show a warning when there is a minimum deployment target mismatch
|
21
|
+
between target and spec, instead of throwing a hard error.
|
22
|
+
[Samuel Giddins](https://github.com/segiddins)
|
23
|
+
[#1241](https://github.com/CocoaPods/CocoaPods/issues/1241)
|
24
|
+
|
25
|
+
* Add download caching for pods, which speeds up `pod install` and linting,
|
26
|
+
potentially by several orders of magnitude.
|
27
|
+
[Samuel Giddins](https://github.com/segiddins)
|
28
|
+
[#2863](https://github.com/CocoaPods/CocoaPods/issues/2863)
|
29
|
+
[#3172](https://github.com/CocoaPods/CocoaPods/issues/3172)
|
30
|
+
|
31
|
+
* Add a `--fail-fast` option to both `pod spec lint` and `pod lib lint` that
|
32
|
+
causes the linter to exit as soon as a single subspec or platform fails
|
33
|
+
linting.
|
34
|
+
[Marius Rackwitz](https://github.com/mrackwitz)
|
35
|
+
|
36
|
+
* Naïvely prevent base xcconfig warnings for targets that have custom
|
37
|
+
config files set.
|
38
|
+
[Chris Brauchli](https://github.com/cbrauchli)
|
39
|
+
[#2633](https://github.com/CocoaPods/CocoaPods/issues/2633)
|
40
|
+
|
41
|
+
* Ensure private headers are declared as such in a framework's generated module
|
42
|
+
map.
|
43
|
+
[Samuel Giddins](https://github.com/segiddins)
|
44
|
+
[#2974](https://github.com/CocoaPods/CocoaPods/issues/2974)
|
45
|
+
|
46
|
+
##### Bug Fixes
|
47
|
+
|
48
|
+
* Do not pass code-sign arguments to xcodebuild when linting OS X targets.
|
49
|
+
[Boris Bügling](https://github.com/neonichu)
|
50
|
+
[#3310](https://github.com/CocoaPods/CocoaPods/issues/3310)
|
51
|
+
|
52
|
+
* Fixes an issue showing the URL to remote resources in `pod repo list`.
|
53
|
+
[Kyle Fuller](https://github.com/kylef)
|
54
|
+
|
55
|
+
* Fixes a problem with code signing when integrating CocoaPods
|
56
|
+
into a Today Widget extension.
|
57
|
+
[Christian Sampaio](https://github.com/chrisfsampaio)
|
58
|
+
[#3390](https://github.com/CocoaPods/CocoaPods/pull/3390)
|
59
|
+
|
60
|
+
|
7
61
|
## 0.36.4
|
8
62
|
|
9
63
|
##### Bug Fixes
|
data/LICENSE
CHANGED
@@ -1,7 +1,13 @@
|
|
1
1
|
This project is licensed under the MIT license.
|
2
2
|
|
3
|
-
Copyright (c) 2011 -
|
4
|
-
|
3
|
+
Copyright (c) 2011 - 2015 Eloy Durán <eloy.de.enige@gmail.com>,
|
4
|
+
Fabio Pelosin <fabiopelosin@gmail.com>,
|
5
|
+
Samuel Giddins <segiddins@segiddins.me>,
|
6
|
+
Marius Rackwitz <git@mariusrackwitz.de>,
|
7
|
+
Kyle Fuller <kyle@fuller.li>,
|
8
|
+
Boris Bügling <boris@buegling.com>,
|
9
|
+
Orta Therox <orta.therox@gmail.com>, and
|
10
|
+
Olivier Halligon <olivier@halligon.net>.
|
5
11
|
|
6
12
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
7
13
|
of this software and associated documentation files (the "Software"), to deal
|
data/README.md
CHANGED
@@ -8,39 +8,60 @@
|
|
8
8
|
|
9
9
|
CocoaPods manages dependencies for your Xcode projects.
|
10
10
|
|
11
|
-
You specify the dependencies for your project in
|
12
|
-
resolves dependencies between libraries, fetches
|
13
|
-
dependencies, and creates and maintains an Xcode
|
14
|
-
project.
|
15
|
-
|
16
|
-
Ultimately, the goal is to improve discoverability of, and engagement in, third
|
17
|
-
party open-source libraries, by creating a more centralized ecosystem.
|
11
|
+
You specify the dependencies for your project in a simple text file: your `Podfile`.
|
12
|
+
CocoaPods recursively resolves dependencies between libraries, fetches
|
13
|
+
source code for all dependencies, and creates and maintains an Xcode
|
14
|
+
workspace to build your project.
|
18
15
|
|
19
16
|
Installing and updating CocoaPods is very easy. Don't miss the [Installation
|
20
17
|
guide](http://guides.cocoapods.org/using/getting-started.html#installation) and the
|
21
|
-
[Getting started guide](
|
18
|
+
[Getting started guide](https://guides.cocoapods.org/using/getting-started.html).
|
19
|
+
|
20
|
+
## Project Goals
|
21
|
+
|
22
|
+
CocoaPods aims to improve the engagement with, and discoverability
|
23
|
+
of, third party open-source Cocoa libraries. These
|
24
|
+
project goals influence and drive the design of CocoaPods:
|
25
|
+
|
26
|
+
- Create and share libraries, and use them in your own projects,
|
27
|
+
without creating extra work for library authors. Integrate
|
28
|
+
non-CocoaPods libraries and hack on your own fork of any
|
29
|
+
CocoaPods library with a simple transparent `Podspec` standard.
|
30
|
+
- Allow library authors to structure their libraries however they like.
|
31
|
+
- Save time for library authors by automating a lot of Xcode work not
|
32
|
+
related to their libraries' functionality.
|
33
|
+
- Support any source management system. (Currently supported are git,
|
34
|
+
svn, mercurial, bazaar, and various types of archives downloaded over HTTP.)
|
35
|
+
- Promote a culture of distributed collaboration on pods, but also provide
|
36
|
+
features only possible with a centralised solution to foster a community.
|
37
|
+
- Build tools on top of the core Cocoa development system, including those
|
38
|
+
typically deployed to other operating systems, such as web-services.
|
39
|
+
- Provide opinionated and automated integration, but make it completely
|
40
|
+
optional. You may manually integrate your CocoaPods dependencies
|
41
|
+
into your Xcode project as you see fit, with or without a workspace.
|
42
|
+
- Solve everyday problems for Cocoa and Xcode developers.
|
22
43
|
|
23
44
|
## Sponsors
|
24
45
|
|
25
|
-
Lovingly sponsored by a collection of companies, see the footer of [CocoaPods.org](
|
46
|
+
Lovingly sponsored by a collection of companies, see the footer of [CocoaPods.org](https://cocoapods.org) for an up-to-date list.
|
26
47
|
|
27
48
|
## Collaborate
|
28
49
|
|
29
50
|
All CocoaPods development happens on GitHub. Contributions make for good karma and
|
30
|
-
we [welcome new](
|
51
|
+
we [welcome new](https://blog.cocoapods.org/starting-open-source/) contributors with joy. We take contributors seriously, and thus have a
|
31
52
|
contributor [code of conduct](CODE_OF_CONDUCT.md).
|
32
53
|
|
33
54
|
## Links
|
34
55
|
|
35
56
|
| Link | Description |
|
36
57
|
| :----- | :------ |
|
37
|
-
[CocoaPods.org](
|
38
|
-
[@CocoaPods](
|
39
|
-
[Blog](
|
58
|
+
[CocoaPods.org](https://cocoapods.org/) | Homepage and search for Pods.
|
59
|
+
[@CocoaPods](https://twitter.com/CocoaPods) | Follow CocoaPods on Twitter to stay up to date.
|
60
|
+
[Blog](https://blog.cocoapods.org) | The CocoaPods blog.
|
40
61
|
[Mailing List](http://groups.google.com/group/cocoapods) | Feel free to ask any kind of question.
|
41
|
-
[Guides](
|
62
|
+
[Guides](https://guides.cocoapods.org) | Everything you want to know about CocoaPods.
|
42
63
|
[Changelog](https://github.com/CocoaPods/CocoaPods/blob/master/CHANGELOG.md) | See the changes introduced in each CocoaPods version.
|
43
|
-
[New Pods RSS](
|
64
|
+
[New Pods RSS](https://feeds.cocoapods.org/new-pods.rss) | Don't miss any new Pods.
|
44
65
|
[Code of Conduct](CODE_OF_CONDUCT.md) | Find out the standards we hold ourselves to.
|
45
66
|
|
46
67
|
## Projects
|
@@ -49,7 +70,7 @@ CocoaPods is composed of the following projects:
|
|
49
70
|
|
50
71
|
| Status | Project | Description | Info |
|
51
72
|
| :----- | :------ | :--- | :--- |
|
52
|
-
| [](http://travis-ci.org/CocoaPods/CocoaPods) | [CocoaPods](https://github.com/CocoaPods/CocoaPods) | The CocoaPods command line tool. | [guides](
|
73
|
+
| [](http://travis-ci.org/CocoaPods/CocoaPods) | [CocoaPods](https://github.com/CocoaPods/CocoaPods) | The CocoaPods command line tool. | [guides](https://guides.cocoapods.org)
|
53
74
|
| [](http://travis-ci.org/CocoaPods/Core) | [CocoaPods Core](https://github.com/CocoaPods/Core) | Support for working with specifications and podfiles. | [docs](http://docs.cocoapods.org/cocoapods_core)
|
54
75
|
| [](http://travis-ci.org/CocoaPods/cocoapods-downloader) |[CocoaPods Downloader](https://github.com/CocoaPods/cocoapods-downloader) | Downloaders for various source types. | [docs](http://docs.cocoapods.org/cocoapods_downloader/index.html)
|
55
76
|
| [](https://travis-ci.org/CocoaPods/Xcodeproj) | [Xcodeproj](https://github.com/CocoaPods/Xcodeproj) | Create and modify Xcode projects from Ruby. | [docs](http://docs.cocoapods.org/xcodeproj/index.html)
|
@@ -113,6 +113,7 @@ module Pod
|
|
113
113
|
['--subspec=NAME', 'Lint validates only the given subspec'],
|
114
114
|
['--no-subspecs', 'Lint skips validation of subspecs'],
|
115
115
|
['--no-clean', 'Lint leaves the build directory intact for inspection'],
|
116
|
+
['--fail-fast', 'Lint stops on the first failing platform or subspec'],
|
116
117
|
['--use-libraries', 'Lint uses static libraries to install the spec'],
|
117
118
|
['--sources=https://github.com/artsy/Specs,master', 'The sources from which to pull dependant pods ' \
|
118
119
|
'(defaults to https://github.com/CocoaPods/Specs.git). '\
|
@@ -123,6 +124,7 @@ module Pod
|
|
123
124
|
@quick = argv.flag?('quick')
|
124
125
|
@allow_warnings = argv.flag?('allow-warnings')
|
125
126
|
@clean = argv.flag?('clean', true)
|
127
|
+
@fail_fast = argv.flag?('fail-fast', false)
|
126
128
|
@subspecs = argv.flag?('subspecs', true)
|
127
129
|
@only_subspec = argv.option('subspec')
|
128
130
|
@use_frameworks = !argv.flag?('use-libraries')
|
@@ -142,6 +144,7 @@ module Pod
|
|
142
144
|
validator.local = true
|
143
145
|
validator.quick = @quick
|
144
146
|
validator.no_clean = !@clean
|
147
|
+
validator.fail_fast = @fail_fast
|
145
148
|
validator.allow_warnings = @allow_warnings
|
146
149
|
validator.no_subspecs = !@subspecs || @only_subspec
|
147
150
|
validator.only_subspec = @only_subspec
|
@@ -24,37 +24,6 @@ module Pod
|
|
24
24
|
def dir
|
25
25
|
config.repos_dir + @name
|
26
26
|
end
|
27
|
-
|
28
|
-
# Returns the branch name (i.e. master).
|
29
|
-
#
|
30
|
-
# @return [String] The name of the current branch.
|
31
|
-
#
|
32
|
-
def branch_name
|
33
|
-
`git name-rev --name-only HEAD`.strip
|
34
|
-
end
|
35
|
-
|
36
|
-
# Returns the branch remote name (i.e. origin).
|
37
|
-
#
|
38
|
-
# @param [#to_s] branch_name
|
39
|
-
# The branch name to look for the remote name.
|
40
|
-
#
|
41
|
-
# @return [String] The given branch's remote name.
|
42
|
-
#
|
43
|
-
def branch_remote_name(branch_name)
|
44
|
-
`git config branch.#{branch_name}.remote`.strip
|
45
|
-
end
|
46
|
-
|
47
|
-
# Returns the url of the given remote name
|
48
|
-
# (i.e. git@github.com:CocoaPods/Specs.git).
|
49
|
-
#
|
50
|
-
# @param [#to_s] remote_name
|
51
|
-
# The branch remote name to look for the url.
|
52
|
-
#
|
53
|
-
# @return [String] The URL of the given remote.
|
54
|
-
#
|
55
|
-
def url_of_git_repo(remote_name)
|
56
|
-
`git config remote.#{remote_name}.url`.strip
|
57
|
-
end
|
58
27
|
end
|
59
28
|
end
|
60
29
|
end
|
@@ -20,12 +20,13 @@ module Pod
|
|
20
20
|
# @output Examples:
|
21
21
|
#
|
22
22
|
# master
|
23
|
-
# - type: git (
|
23
|
+
# - type: git (master)
|
24
24
|
# - URL: https://github.com/CocoaPods/Specs.git
|
25
25
|
# - path: /Users/lascorbe/.cocoapods/repos/master
|
26
26
|
#
|
27
27
|
# test
|
28
28
|
# - type: local copy
|
29
|
+
# - URL: file:///Users/lascorbe/.cocoapods/repos/test
|
29
30
|
# - path: /Users/lascorbe/.cocoapods/repos/test
|
30
31
|
#
|
31
32
|
def run
|
@@ -38,27 +39,24 @@ module Pod
|
|
38
39
|
|
39
40
|
# Pretty-prints the source at the given path.
|
40
41
|
#
|
41
|
-
# @param [
|
42
|
-
# The
|
42
|
+
# @param [Source] source
|
43
|
+
# The source repository to be printed.
|
43
44
|
#
|
44
45
|
# @return [void]
|
45
46
|
#
|
46
|
-
def
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
if
|
51
|
-
|
52
|
-
url = url_of_git_repo(remote_name)
|
53
|
-
UI.puts "- URL: #{url}"
|
54
|
-
else
|
55
|
-
UI.puts '- Type: git (no remote information available)'
|
56
|
-
end
|
57
|
-
else
|
58
|
-
UI.puts '- Type: local copy'
|
47
|
+
def print_source(source)
|
48
|
+
if SourcesManager.git_repo?(source.repo)
|
49
|
+
Dir.chdir(source.repo) do
|
50
|
+
branch_name = `git name-rev --name-only HEAD 2>/dev/null`.strip
|
51
|
+
branch_name = 'unknown' if branch_name.empty?
|
52
|
+
UI.puts "- Type: git (#{branch_name})"
|
59
53
|
end
|
60
|
-
|
54
|
+
else
|
55
|
+
UI.puts '- Type: local'
|
61
56
|
end
|
57
|
+
|
58
|
+
UI.puts "- URL: #{source.url}"
|
59
|
+
UI.puts "- Path: #{source.repo}"
|
62
60
|
end
|
63
61
|
|
64
62
|
# Pretty-prints the given sources.
|
@@ -71,7 +69,7 @@ module Pod
|
|
71
69
|
def print_sources(sources)
|
72
70
|
sources.each do |source|
|
73
71
|
UI.title source.name do
|
74
|
-
|
72
|
+
print_source(source)
|
75
73
|
end
|
76
74
|
end
|
77
75
|
UI.puts "\n"
|
@@ -20,6 +20,7 @@ module Pod
|
|
20
20
|
['--subspec=NAME', 'Lint validates only the given subspec'],
|
21
21
|
['--no-subspecs', 'Lint skips validation of subspecs'],
|
22
22
|
['--no-clean', 'Lint leaves the build directory intact for inspection'],
|
23
|
+
['--fail-fast', 'Lint stops on the first failing platform or subspec'],
|
23
24
|
['--use-libraries', 'Lint uses static libraries to install the spec'],
|
24
25
|
['--sources=https://github.com/artsy/Specs,master', 'The sources from which to pull dependant pods ' \
|
25
26
|
'(defaults to https://github.com/CocoaPods/Specs.git). '\
|
@@ -30,6 +31,7 @@ module Pod
|
|
30
31
|
@quick = argv.flag?('quick')
|
31
32
|
@allow_warnings = argv.flag?('allow-warnings')
|
32
33
|
@clean = argv.flag?('clean', true)
|
34
|
+
@fail_fast = argv.flag?('fail-fast', false)
|
33
35
|
@subspecs = argv.flag?('subspecs', true)
|
34
36
|
@only_subspec = argv.option('subspec')
|
35
37
|
@use_frameworks = !argv.flag?('use-libraries')
|
@@ -45,6 +47,7 @@ module Pod
|
|
45
47
|
validator = Validator.new(podspec, @source_urls)
|
46
48
|
validator.quick = @quick
|
47
49
|
validator.no_clean = !@clean
|
50
|
+
validator.fail_fast = @fail_fast
|
48
51
|
validator.allow_warnings = @allow_warnings
|
49
52
|
validator.no_subspecs = !@subspecs || @only_subspec
|
50
53
|
validator.only_subspec = @only_subspec
|
data/lib/cocoapods/config.rb
CHANGED
@@ -15,6 +15,7 @@ module Pod
|
|
15
15
|
:verbose => false,
|
16
16
|
:silent => false,
|
17
17
|
:skip_repo_update => false,
|
18
|
+
:skip_download_cache => !ENV['COCOAPODS_SKIP_CACHE'].nil?,
|
18
19
|
|
19
20
|
:clean => true,
|
20
21
|
:integrate_targets => true,
|
@@ -66,6 +67,11 @@ module Pod
|
|
66
67
|
attr_accessor :skip_repo_update
|
67
68
|
alias_method :skip_repo_update?, :skip_repo_update
|
68
69
|
|
70
|
+
# @return [Bool] Whether the installer should skip the download cache.
|
71
|
+
#
|
72
|
+
attr_accessor :skip_download_cache
|
73
|
+
alias_method :skip_download_cache?, :skip_download_cache
|
74
|
+
|
69
75
|
public
|
70
76
|
|
71
77
|
#-------------------------------------------------------------------------#
|
data/lib/cocoapods/downloader.rb
CHANGED
@@ -1,8 +1,48 @@
|
|
1
1
|
require 'cocoapods-downloader'
|
2
2
|
require 'claide/informative_error'
|
3
|
+
require 'fileutils'
|
4
|
+
require 'tmpdir'
|
3
5
|
|
4
6
|
module Pod
|
5
7
|
module Downloader
|
8
|
+
require 'cocoapods/downloader/cache'
|
9
|
+
require 'cocoapods/downloader/request'
|
10
|
+
require 'cocoapods/downloader/response'
|
11
|
+
|
12
|
+
# Downloads a pod from the given `request` to the given `target` location.
|
13
|
+
#
|
14
|
+
# @return [Response] The download response for this download.
|
15
|
+
#
|
16
|
+
# @param [Request] request
|
17
|
+
# the request that describes this pod download.
|
18
|
+
#
|
19
|
+
# @param [Pathname,Nil] target
|
20
|
+
# the location to which this pod should be downloaded. If `nil`,
|
21
|
+
# then the pod will only be cached.
|
22
|
+
#
|
23
|
+
# @param [Pathname,Nil] cache_path
|
24
|
+
# the path used to cache pod downloads. If `nil`, then no caching
|
25
|
+
# will be done.
|
26
|
+
#
|
27
|
+
def self.download(
|
28
|
+
request,
|
29
|
+
target,
|
30
|
+
cache_path: !Config.instance.skip_download_cache && Config.instance.cache_root + 'Pods'
|
31
|
+
)
|
32
|
+
cache_path, tmp_cache = Pathname(Dir.mktmpdir), true unless cache_path
|
33
|
+
cache = Cache.new(cache_path)
|
34
|
+
result = cache.download_pod(request)
|
35
|
+
if target
|
36
|
+
UI.message "Copying #{request.name} from `#{result.location}` to #{UI.path target}", '> ' do
|
37
|
+
FileUtils.rm_rf target
|
38
|
+
FileUtils.cp_r(result.location, target)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
result
|
42
|
+
ensure
|
43
|
+
FileUtils.rm_r cache_path if tmp_cache
|
44
|
+
end
|
45
|
+
|
6
46
|
class DownloaderError; include CLAide::InformativeError; end
|
7
47
|
|
8
48
|
class Base
|
@@ -0,0 +1,210 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'tmpdir'
|
3
|
+
|
4
|
+
module Pod
|
5
|
+
module Downloader
|
6
|
+
# The class responsible for managing Pod downloads, transparently caching
|
7
|
+
# them in a cache directory.
|
8
|
+
#
|
9
|
+
class Cache
|
10
|
+
# @return [Pathname] The root directory where this cache store its
|
11
|
+
# downloads.
|
12
|
+
#
|
13
|
+
attr_reader :root
|
14
|
+
|
15
|
+
# @param [Pathname,String] root
|
16
|
+
# see {#root}
|
17
|
+
#
|
18
|
+
def initialize(root)
|
19
|
+
@root = Pathname(root)
|
20
|
+
@root.mkpath
|
21
|
+
end
|
22
|
+
|
23
|
+
# Downloads the Pod from the given `request`
|
24
|
+
#
|
25
|
+
# @param [Request] request
|
26
|
+
# the request to be downloaded.
|
27
|
+
#
|
28
|
+
# @return [Response] the response from downloading `request`
|
29
|
+
#
|
30
|
+
def download_pod(request)
|
31
|
+
cached_pod(request) || uncached_pod(request)
|
32
|
+
rescue Informative
|
33
|
+
raise
|
34
|
+
rescue
|
35
|
+
UI.notice("Error installing #{request.name}")
|
36
|
+
raise
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
# @param [Request] request
|
42
|
+
# the request to be downloaded.
|
43
|
+
#
|
44
|
+
# @param [Hash<Symbol,String>] slug_opts
|
45
|
+
# the download options that should be used in constructing the
|
46
|
+
# cache slug for this request.
|
47
|
+
#
|
48
|
+
# @return [Pathname] The path for the Pod downloaded from the given
|
49
|
+
# `request`.
|
50
|
+
#
|
51
|
+
def path_for_pod(request, slug_opts = {})
|
52
|
+
root + request.slug(slug_opts)
|
53
|
+
end
|
54
|
+
|
55
|
+
# @param [Request] request
|
56
|
+
# the request to be downloaded.
|
57
|
+
#
|
58
|
+
# @param [Hash<Symbol,String>] slug_opts
|
59
|
+
# the download options that should be used in constructing the
|
60
|
+
# cache slug for this request.
|
61
|
+
#
|
62
|
+
# @return [Pathname] The path for the podspec downloaded from the given
|
63
|
+
# `request`.
|
64
|
+
#
|
65
|
+
def path_for_spec(request, slug_opts = {})
|
66
|
+
path = root + 'Specs' + request.slug(slug_opts)
|
67
|
+
path.sub_ext('.podspec.json')
|
68
|
+
end
|
69
|
+
|
70
|
+
# @param [Request] request
|
71
|
+
# the request to be downloaded.
|
72
|
+
#
|
73
|
+
# @return [Response] The download response for the given `request` that
|
74
|
+
# was found in the download cache.
|
75
|
+
#
|
76
|
+
def cached_pod(request)
|
77
|
+
path = path_for_pod(request)
|
78
|
+
spec = request.spec || cached_spec(request)
|
79
|
+
return unless spec && path.directory?
|
80
|
+
Response.new(path, spec, request.params)
|
81
|
+
end
|
82
|
+
|
83
|
+
# @param [Request] request
|
84
|
+
# the request to be downloaded.
|
85
|
+
#
|
86
|
+
# @return [Specification] The cached specification for the given
|
87
|
+
# `request`.
|
88
|
+
#
|
89
|
+
def cached_spec(request)
|
90
|
+
path = path_for_spec(request)
|
91
|
+
path.file? && Specification.from_file(path)
|
92
|
+
end
|
93
|
+
|
94
|
+
# @param [Request] request
|
95
|
+
# the request to be downloaded.
|
96
|
+
#
|
97
|
+
# @return [Response] The download response for the given `request` that
|
98
|
+
# was not found in the download cache.
|
99
|
+
#
|
100
|
+
def uncached_pod(request)
|
101
|
+
in_tmpdir do |target|
|
102
|
+
result = Response.new
|
103
|
+
result.checkout_options = download(request.name, target, request.params, request.head?)
|
104
|
+
|
105
|
+
if request.released_pod?
|
106
|
+
result.spec = request.spec
|
107
|
+
result.location = destination = path_for_pod(request, :params => result.checkout_options)
|
108
|
+
copy_and_clean(target, destination, request.spec)
|
109
|
+
write_spec(request.spec, path_for_spec(request, :params => result.checkout_options))
|
110
|
+
else
|
111
|
+
podspecs = Sandbox::PodspecFinder.new(target).podspecs
|
112
|
+
podspecs[request.name] = request.spec if request.spec
|
113
|
+
podspecs.each do |name, spec|
|
114
|
+
destination = path_for_pod(request, :name => name, :params => result.checkout_options)
|
115
|
+
copy_and_clean(target, destination, spec)
|
116
|
+
write_spec(spec, path_for_spec(request, :name => name, :params => result.checkout_options))
|
117
|
+
if request.name == name
|
118
|
+
result.location = destination
|
119
|
+
result.spec = spec
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
result
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
# Downloads a pod with the given `name` and `params` to `target`.
|
129
|
+
#
|
130
|
+
# @param [String] name
|
131
|
+
#
|
132
|
+
# @param [Pathname] target
|
133
|
+
#
|
134
|
+
# @param [Hash<Symbol,String>] params
|
135
|
+
#
|
136
|
+
# @param [Boolean] head
|
137
|
+
#
|
138
|
+
# @return [Hash] The checkout options required to re-download this exact
|
139
|
+
# same source.
|
140
|
+
#
|
141
|
+
def download(name, target, params, head)
|
142
|
+
downloader = Downloader.for_target(target, params)
|
143
|
+
if head
|
144
|
+
unless downloader.head_supported?
|
145
|
+
raise Informative, "The pod '#{name}' does not " \
|
146
|
+
"support the :head option, as it uses a #{downloader.name} " \
|
147
|
+
'source. Remove that option to use this pod.'
|
148
|
+
end
|
149
|
+
downloader.download_head
|
150
|
+
else
|
151
|
+
downloader.download
|
152
|
+
end
|
153
|
+
|
154
|
+
if downloader.options_specific? && !head
|
155
|
+
params
|
156
|
+
else
|
157
|
+
downloader.checkout_options
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
# Performs the given block inside a temporary directory,
|
162
|
+
# which is removed at the end of the block's scope.
|
163
|
+
#
|
164
|
+
# @return [Object] The return value of the given block
|
165
|
+
#
|
166
|
+
def in_tmpdir(&blk)
|
167
|
+
tmpdir = Pathname(Dir.mktmpdir)
|
168
|
+
blk.call(tmpdir)
|
169
|
+
ensure
|
170
|
+
FileUtils.remove_entry(tmpdir) if tmpdir.exist?
|
171
|
+
end
|
172
|
+
|
173
|
+
# Copies the `source` directory to `destination`, cleaning the directory
|
174
|
+
# of any files unused by `spec`.
|
175
|
+
#
|
176
|
+
# @param [Pathname] source
|
177
|
+
#
|
178
|
+
# @param [Pathname] destination
|
179
|
+
#
|
180
|
+
# @param [Specification] spec
|
181
|
+
#
|
182
|
+
# @return [Void]
|
183
|
+
#
|
184
|
+
def copy_and_clean(source, destination, spec)
|
185
|
+
specs_by_platform = {}
|
186
|
+
spec.available_platforms.each do |platform|
|
187
|
+
specs_by_platform[platform] = [spec, *spec.recursive_subspecs].select { |ss| ss.supported_on_platform?(platform) }
|
188
|
+
end
|
189
|
+
destination.parent.mkpath
|
190
|
+
FileUtils.cp_r(source, destination)
|
191
|
+
Sandbox::PodDirCleaner.new(destination, specs_by_platform).clean!
|
192
|
+
end
|
193
|
+
|
194
|
+
# Writes the given `spec` to the given `path`.
|
195
|
+
#
|
196
|
+
# @param [Specification] spec
|
197
|
+
# the specification to be written.
|
198
|
+
#
|
199
|
+
# @param [Pathname] path
|
200
|
+
# the path the specification is to be written to.
|
201
|
+
#
|
202
|
+
# @return [Void]
|
203
|
+
#
|
204
|
+
def write_spec(spec, path)
|
205
|
+
path.dirname.mkpath
|
206
|
+
path.open('w') { |f| f.write spec.to_pretty_json }
|
207
|
+
end
|
208
|
+
end
|
209
|
+
end
|
210
|
+
end
|