cocoapods 1.0.0.beta.5 → 1.0.0.beta.6
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 +63 -4
- data/lib/cocoapods/command.rb +17 -7
- data/lib/cocoapods/command/install.rb +41 -0
- data/lib/cocoapods/command/inter_process_communication.rb +4 -0
- data/lib/cocoapods/command/options/project_directory.rb +36 -0
- data/lib/cocoapods/command/options/repo_update.rb +34 -0
- data/lib/cocoapods/command/outdated.rb +5 -2
- data/lib/cocoapods/command/repo/add.rb +7 -10
- data/lib/cocoapods/command/setup.rb +0 -12
- data/lib/cocoapods/command/update.rb +64 -0
- data/lib/cocoapods/config.rb +0 -6
- data/lib/cocoapods/executable.rb +2 -2
- data/lib/cocoapods/gem_version.rb +1 -1
- data/lib/cocoapods/generator/embed_frameworks_script.rb +1 -1
- data/lib/cocoapods/installer.rb +6 -1
- data/lib/cocoapods/installer/analyzer.rb +1 -1
- data/lib/cocoapods/installer/analyzer/target_inspector.rb +5 -0
- data/lib/cocoapods/installer/podfile_validator.rb +11 -0
- data/lib/cocoapods/installer/target_installer/aggregate_target_installer.rb +1 -1
- data/lib/cocoapods/installer/target_installer/pod_target_installer.rb +1 -3
- data/lib/cocoapods/resolver.rb +1 -1
- data/lib/cocoapods/sources_manager.rb +40 -9
- data/lib/cocoapods/target/pod_target.rb +11 -31
- data/lib/cocoapods/validator.rb +7 -2
- metadata +15 -12
- data/lib/cocoapods/command/project.rb +0 -157
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 82ef0fd2f13afd200f730d294d1e85d7aac49aba
|
4
|
+
data.tar.gz: c2b830bfc6c0edb7dd4e8ed8ab40409126825420
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e426d23e4284592fbdb93d1591d5a30d96b30dfc6b98b51a1da55476a0678075599892f82b9bf4d3d4885e5840f6d10efc986bcc52ba1e7d25889ccee0256b5f
|
7
|
+
data.tar.gz: 55d32672b07f933172d9e6cd3d90112a0fa4d0a863db32a3ea7747399312ffddc3ab6ee2b4df772a638d6abe12eee4aa84d48b2fef99755c9ea30cbebcecb068
|
data/CHANGELOG.md
CHANGED
@@ -4,15 +4,74 @@ 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
|
+
## 1.0.0.beta.6 (2016-03-15)
|
8
|
+
|
9
|
+
##### Breaking
|
10
|
+
|
11
|
+
* Running `pod install` doesn't imply an automatic spec repo update.
|
12
|
+
The old behavior can be achieved by passing in the option `--repo-update`
|
13
|
+
or running `pod repo update`.
|
14
|
+
[Marius Rackwitz](https://github.com/mrackwitz)
|
15
|
+
[#5004](https://github.com/CocoaPods/CocoaPods/issues/5004)
|
16
|
+
|
17
|
+
* Remove the configuration variable `skip_repo_update` as the default behavior
|
18
|
+
varies now between `pod install` and `pod (update|outdated)`.
|
19
|
+
[Marius Rackwitz](https://github.com/mrackwitz)
|
20
|
+
[#5017](https://github.com/CocoaPods/CocoaPods/issues/5017)
|
21
|
+
|
22
|
+
##### Enhancements
|
23
|
+
|
24
|
+
* The master specs repo will no longer perform 'no-op' git fetches. This should
|
25
|
+
help to reduce the load on GitHub's servers.
|
26
|
+
[Daniel Tomlinson](https://github.com/DanielTomlinson)
|
27
|
+
[#5005](https://github.com/CocoaPods/CocoaPods/issues/5005)
|
28
|
+
[#4989](https://github.com/CocoaPods/CocoaPods/issues/4989)
|
29
|
+
|
30
|
+
* The specs repos will no longer support shallow clones to reduce CPU load
|
31
|
+
on git servers. Pre-existing shallow clones of the `master` repo will
|
32
|
+
automatically be upgraded to deep clones when the repo is updated.
|
33
|
+
[Samuel Giddins](https://github.com/segiddins)
|
34
|
+
[#5016](https://github.com/CocoaPods/CocoaPods/issues/5016)
|
35
|
+
|
36
|
+
* The validator will check that all `public_header_files` and
|
37
|
+
`private_header_files` are also present in `source_files`.
|
38
|
+
[Samuel Giddins](https://github.com/segiddins)
|
39
|
+
[#4936](https://github.com/CocoaPods/CocoaPods/issues/4936)
|
40
|
+
|
41
|
+
##### Bug Fixes
|
42
|
+
|
43
|
+
* The master specs repository can no longer be added via `pod repo add`, but
|
44
|
+
instead must be done via `pod setup`.
|
45
|
+
[Samuel Giddins](https://github.com/segiddins)
|
46
|
+
|
47
|
+
* Print a friendly error message when the platform for a target cannot be
|
48
|
+
inferred.
|
49
|
+
[Samuel Giddins](https://github.com/segiddins)
|
50
|
+
[#4790](https://github.com/CocoaPods/CocoaPods/issues/4790)
|
51
|
+
|
52
|
+
* Rely on `TARGET_BUILD_DIR` instead of `CONFIGURATION_BUILD_DIR` in the
|
53
|
+
generated embed frameworks build phase's script, so that UI test targets can
|
54
|
+
be run.
|
55
|
+
[Marius Rackwitz](https://github.com/mrackwitz)
|
56
|
+
[#5022](https://github.com/CocoaPods/CocoaPods/issues/5022)
|
57
|
+
|
58
|
+
* Fix build paths for resources bundles.
|
59
|
+
[Marius Rackwitz](https://github.com/mrackwitz)
|
60
|
+
[#5028](https://github.com/CocoaPods/CocoaPods/pull/5028)
|
61
|
+
|
62
|
+
* Validate that a Podfile does not declare the same target twice.
|
63
|
+
[Samuel Giddins](https://github.com/segiddins)
|
64
|
+
[#5029](https://github.com/CocoaPods/CocoaPods/issues/5029)
|
65
|
+
|
66
|
+
|
7
67
|
## 1.0.0.beta.5 (2016-03-08)
|
8
68
|
|
9
69
|
##### Breaking
|
10
70
|
|
11
|
-
* Development pods will no longer be implicitly unlocked. This makes CocoaPods
|
12
|
-
|
13
|
-
lockfile.
|
71
|
+
* Development pods will no longer be implicitly unlocked. This makes CocoaPods respect
|
72
|
+
constraints related to dependencies of development pods in the lockfile.
|
14
73
|
|
15
|
-
If you change constraints of a dependency of your development pod
|
74
|
+
If you change the constraints of a dependency of your development pod and want to
|
16
75
|
override the locked version, you will have to use
|
17
76
|
`pod update ${DEPENDENCY_NAME}` manually.
|
18
77
|
[Muhammed Yavuz Nuzumlalı](https://github.com/manuyavuz)
|
data/lib/cocoapods/command.rb
CHANGED
@@ -14,17 +14,22 @@ module Pod
|
|
14
14
|
end
|
15
15
|
|
16
16
|
class Command < CLAide::Command
|
17
|
+
require 'cocoapods/command/options/repo_update'
|
18
|
+
require 'cocoapods/command/options/project_directory'
|
19
|
+
include Options
|
20
|
+
|
21
|
+
require 'cocoapods/command/cache'
|
22
|
+
require 'cocoapods/command/env'
|
23
|
+
require 'cocoapods/command/init'
|
24
|
+
require 'cocoapods/command/install'
|
17
25
|
require 'cocoapods/command/inter_process_communication'
|
18
26
|
require 'cocoapods/command/lib'
|
19
27
|
require 'cocoapods/command/list'
|
20
28
|
require 'cocoapods/command/outdated'
|
21
|
-
require 'cocoapods/command/project'
|
22
29
|
require 'cocoapods/command/repo'
|
23
30
|
require 'cocoapods/command/setup'
|
24
31
|
require 'cocoapods/command/spec'
|
25
|
-
require 'cocoapods/command/
|
26
|
-
require 'cocoapods/command/cache'
|
27
|
-
require 'cocoapods/command/env'
|
32
|
+
require 'cocoapods/command/update'
|
28
33
|
|
29
34
|
self.abstract_command = true
|
30
35
|
self.command = 'pod'
|
@@ -32,9 +37,6 @@ module Pod
|
|
32
37
|
self.description = 'CocoaPods, the Cocoa library package manager.'
|
33
38
|
self.plugin_prefixes = %w(claide cocoapods)
|
34
39
|
|
35
|
-
[Install, Update, Outdated, IPC::Podfile, IPC::Repl].each { |c| c.send(:include, ProjectDirectory) }
|
36
|
-
[Outdated].each { |c| c.send(:include, Project) }
|
37
|
-
|
38
40
|
def self.options
|
39
41
|
[
|
40
42
|
['--silent', 'Show nothing'],
|
@@ -102,6 +104,14 @@ module Pod
|
|
102
104
|
|
103
105
|
private
|
104
106
|
|
107
|
+
# Returns a new {Installer} parametrized from the {Config}.
|
108
|
+
#
|
109
|
+
# @return [Installer]
|
110
|
+
#
|
111
|
+
def installer_for_config
|
112
|
+
Installer.new(config.sandbox, config.podfile, config.lockfile)
|
113
|
+
end
|
114
|
+
|
105
115
|
# Checks that the podfile exists.
|
106
116
|
#
|
107
117
|
# @raise If the podfile does not exists.
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module Pod
|
2
|
+
class Command
|
3
|
+
class Install < Command
|
4
|
+
include RepoUpdate
|
5
|
+
include ProjectDirectory
|
6
|
+
|
7
|
+
self.summary = 'Install project dependencies to Podfile.lock versions'
|
8
|
+
|
9
|
+
self.description = <<-DESC
|
10
|
+
Downloads all dependencies defined in `Podfile` and creates an Xcode
|
11
|
+
Pods library project in `./Pods`.
|
12
|
+
|
13
|
+
The Xcode project file should be specified in your `Podfile` like this:
|
14
|
+
|
15
|
+
project 'path/to/XcodeProject.xcodeproj'
|
16
|
+
|
17
|
+
If no project is specified, then a search for an Xcode project will
|
18
|
+
be made. If more than one Xcode project is found, the command will
|
19
|
+
raise an error.
|
20
|
+
|
21
|
+
This will configure the project to reference the Pods static library,
|
22
|
+
add a build configuration file, and add a post build script to copy
|
23
|
+
Pod resources.
|
24
|
+
DESC
|
25
|
+
|
26
|
+
def self.options
|
27
|
+
[
|
28
|
+
['--repo-update', 'Force running `pod repo update` before install'],
|
29
|
+
].concat(super).reject { |(name, _)| name == '--no-repo-update' }
|
30
|
+
end
|
31
|
+
|
32
|
+
def run
|
33
|
+
verify_podfile_exists!
|
34
|
+
installer = installer_for_config
|
35
|
+
installer.repo_update = repo_update?(:default => false)
|
36
|
+
installer.update = false
|
37
|
+
installer.install!
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -37,6 +37,8 @@ module Pod
|
|
37
37
|
#-----------------------------------------------------------------------#
|
38
38
|
|
39
39
|
class Podfile < IPC
|
40
|
+
include ProjectDirectory
|
41
|
+
|
40
42
|
self.summary = 'Converts a Podfile to YAML'
|
41
43
|
self.description = 'Converts a Podfile to YAML and prints it to STDOUT.'
|
42
44
|
self.arguments = [
|
@@ -123,6 +125,8 @@ module Pod
|
|
123
125
|
#-----------------------------------------------------------------------#
|
124
126
|
|
125
127
|
class Repl < IPC
|
128
|
+
include ProjectDirectory
|
129
|
+
|
126
130
|
END_OF_OUTPUT_SIGNAL = "\n\r"
|
127
131
|
|
128
132
|
self.summary = 'The repl listens to commands on standard input'
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Pod
|
2
|
+
class Command
|
3
|
+
module Options
|
4
|
+
# Provides support for commands to take a user-specified `project directory`
|
5
|
+
#
|
6
|
+
module ProjectDirectory
|
7
|
+
module Options
|
8
|
+
def options
|
9
|
+
[
|
10
|
+
['--project-directory=/project/dir/', 'The path to the root of the project directory'],
|
11
|
+
].concat(super)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.included(base)
|
16
|
+
base.extend(Options)
|
17
|
+
end
|
18
|
+
|
19
|
+
def initialize(argv)
|
20
|
+
if project_directory = argv.option('project-directory')
|
21
|
+
@project_directory = Pathname.new(project_directory).expand_path
|
22
|
+
end
|
23
|
+
config.installation_root = @project_directory
|
24
|
+
super
|
25
|
+
end
|
26
|
+
|
27
|
+
def validate!
|
28
|
+
super
|
29
|
+
if @project_directory && !@project_directory.directory?
|
30
|
+
raise Informative, "`#{@project_directory}` is not a valid directory."
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Pod
|
2
|
+
class Command
|
3
|
+
module Options
|
4
|
+
# Provides support for commands to skip updating the spec repositories.
|
5
|
+
#
|
6
|
+
module RepoUpdate
|
7
|
+
module Options
|
8
|
+
def options
|
9
|
+
[
|
10
|
+
['--no-repo-update', 'Skip running `pod repo update` before install'],
|
11
|
+
].concat(super)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.included(base)
|
16
|
+
base.extend(Options)
|
17
|
+
end
|
18
|
+
|
19
|
+
def repo_update?(default: false)
|
20
|
+
if @repo_update.nil?
|
21
|
+
default
|
22
|
+
else
|
23
|
+
@repo_update
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def initialize(argv)
|
28
|
+
@repo_update = argv.flag?('repo-update')
|
29
|
+
super
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -1,6 +1,9 @@
|
|
1
1
|
module Pod
|
2
2
|
class Command
|
3
3
|
class Outdated < Command
|
4
|
+
include RepoUpdate
|
5
|
+
include ProjectDirectory
|
6
|
+
|
4
7
|
self.summary = 'Show outdated project dependencies'
|
5
8
|
|
6
9
|
self.description = <<-DESC
|
@@ -90,8 +93,8 @@ module Pod
|
|
90
93
|
|
91
94
|
def spec_sets
|
92
95
|
@spec_sets ||= begin
|
93
|
-
analyzer.send(:update_repositories)
|
94
|
-
aggregate = Source::Aggregate.new(analyzer.sources
|
96
|
+
analyzer.send(:update_repositories) if repo_update?(:default => true)
|
97
|
+
aggregate = Source::Aggregate.new(analyzer.sources)
|
95
98
|
installed_pods.map do |pod_name|
|
96
99
|
aggregate.search(Dependency.new(pod_name))
|
97
100
|
end.compact.uniq
|
@@ -15,14 +15,7 @@ module Pod
|
|
15
15
|
CLAide::Argument.new('BRANCH', false),
|
16
16
|
]
|
17
17
|
|
18
|
-
def self.options
|
19
|
-
[
|
20
|
-
['--shallow', 'Create a shallow clone (fast clone, but no push capabilities)'],
|
21
|
-
].concat(super)
|
22
|
-
end
|
23
|
-
|
24
18
|
def initialize(argv)
|
25
|
-
@shallow = argv.flag?('shallow', false)
|
26
19
|
@name = argv.shift_argument
|
27
20
|
@url = argv.shift_argument
|
28
21
|
@branch = argv.shift_argument
|
@@ -34,11 +27,16 @@ module Pod
|
|
34
27
|
unless @name && @url
|
35
28
|
help! 'Adding a repo needs a `NAME` and a `URL`.'
|
36
29
|
end
|
30
|
+
if @name == 'master' || @url =~ %r{github.com[:/]+cocoapods/specs}i
|
31
|
+
raise Informative,
|
32
|
+
'To setup the master specs repo, please run `pod setup`.'
|
33
|
+
end
|
37
34
|
end
|
38
35
|
|
39
36
|
def run
|
40
|
-
|
41
|
-
|
37
|
+
section = "Cloning spec repo `#{@name}` from `#{@url}`"
|
38
|
+
section << " (branch `#{@branch}`)" if @branch
|
39
|
+
UI.section(section) do
|
42
40
|
create_repos_dir
|
43
41
|
clone_repo
|
44
42
|
checkout_branch
|
@@ -70,7 +68,6 @@ module Pod
|
|
70
68
|
def clone_repo
|
71
69
|
Dir.chdir(config.repos_dir) do
|
72
70
|
command = ['clone', @url, @name]
|
73
|
-
command << '--depth=1' if @shallow
|
74
71
|
git!(command)
|
75
72
|
end
|
76
73
|
end
|
@@ -14,20 +14,9 @@ module Pod
|
|
14
14
|
If the clone already exists, it will ensure that it is up-to-date.
|
15
15
|
DESC
|
16
16
|
|
17
|
-
def self.options
|
18
|
-
[
|
19
|
-
['--no-shallow', 'Clone full history so push will work'],
|
20
|
-
].concat(super)
|
21
|
-
end
|
22
|
-
|
23
17
|
extend Executable
|
24
18
|
executable :git
|
25
19
|
|
26
|
-
def initialize(argv)
|
27
|
-
@shallow = argv.flag?('shallow', true)
|
28
|
-
super
|
29
|
-
end
|
30
|
-
|
31
20
|
def run
|
32
21
|
UI.section 'Setting up CocoaPods master repo' do
|
33
22
|
if master_repo_dir.exist?
|
@@ -62,7 +51,6 @@ module Pod
|
|
62
51
|
#
|
63
52
|
def add_master_repo
|
64
53
|
cmd = ['master', url, 'master']
|
65
|
-
cmd << '--shallow' if @shallow
|
66
54
|
Repo::Add.parse(cmd).run
|
67
55
|
end
|
68
56
|
|
@@ -0,0 +1,64 @@
|
|
1
|
+
module Pod
|
2
|
+
class Command
|
3
|
+
class Update < Command
|
4
|
+
include RepoUpdate
|
5
|
+
include ProjectDirectory
|
6
|
+
|
7
|
+
self.summary = 'Update outdated project dependencies and create new ' \
|
8
|
+
'Podfile.lock'
|
9
|
+
|
10
|
+
self.description = <<-DESC
|
11
|
+
Updates the Pods identified by the specified `POD_NAMES`. If no
|
12
|
+
`POD_NAMES` are specified it updates all the Pods ignoring the contents
|
13
|
+
of the Podfile.lock.
|
14
|
+
This command is reserved to the update of dependencies and pod install
|
15
|
+
should be used to install changes to the Podfile.
|
16
|
+
DESC
|
17
|
+
|
18
|
+
self.arguments = [
|
19
|
+
CLAide::Argument.new('POD_NAMES', false, true),
|
20
|
+
]
|
21
|
+
|
22
|
+
def initialize(argv)
|
23
|
+
@pods = argv.arguments! unless argv.arguments.empty?
|
24
|
+
super
|
25
|
+
end
|
26
|
+
|
27
|
+
# Check if all given pods are installed
|
28
|
+
#
|
29
|
+
def verify_pods_are_installed!
|
30
|
+
lockfile_roots = config.lockfile.pod_names.map { |p| Specification.root_name(p) }
|
31
|
+
missing_pods = @pods.map { |p| Specification.root_name(p) }.select do |pod|
|
32
|
+
!lockfile_roots.include?(pod)
|
33
|
+
end
|
34
|
+
|
35
|
+
unless missing_pods.empty?
|
36
|
+
message = if missing_pods.length > 1
|
37
|
+
"Pods `#{missing_pods.join('`, `')}` are not " \
|
38
|
+
'installed and cannot be updated'
|
39
|
+
else
|
40
|
+
"The `#{missing_pods.first}` Pod is not installed " \
|
41
|
+
'and cannot be updated'
|
42
|
+
end
|
43
|
+
raise Informative, message
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def run
|
48
|
+
verify_podfile_exists!
|
49
|
+
|
50
|
+
installer = installer_for_config
|
51
|
+
installer.repo_update = repo_update?(:default => true)
|
52
|
+
if @pods
|
53
|
+
verify_lockfile_exists!
|
54
|
+
verify_pods_are_installed!
|
55
|
+
installer.update = { :pods => @pods }
|
56
|
+
else
|
57
|
+
UI.puts 'Update all pods'.yellow
|
58
|
+
installer.update = true
|
59
|
+
end
|
60
|
+
installer.install!
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
data/lib/cocoapods/config.rb
CHANGED
@@ -14,7 +14,6 @@ module Pod
|
|
14
14
|
DEFAULTS = {
|
15
15
|
:verbose => false,
|
16
16
|
:silent => false,
|
17
|
-
:skip_repo_update => false,
|
18
17
|
:skip_download_cache => !ENV['COCOAPODS_SKIP_CACHE'].nil?,
|
19
18
|
|
20
19
|
:new_version_message => ENV['COCOAPODS_SKIP_UPDATE_MESSAGE'].nil?,
|
@@ -69,11 +68,6 @@ module Pod
|
|
69
68
|
|
70
69
|
# @!group Installation
|
71
70
|
|
72
|
-
# @return [Bool] Whether the installer should skip the repos update.
|
73
|
-
#
|
74
|
-
attr_accessor :skip_repo_update
|
75
|
-
alias_method :skip_repo_update?, :skip_repo_update
|
76
|
-
|
77
71
|
# @return [Bool] Whether the installer should skip the download cache.
|
78
72
|
#
|
79
73
|
attr_accessor :skip_download_cache
|
data/lib/cocoapods/executable.rb
CHANGED
@@ -137,9 +137,9 @@ module Pod
|
|
137
137
|
case capture
|
138
138
|
when :merge then Open3.capture2e(bin, *command)
|
139
139
|
when :both then Open3.capture3(bin, *command)
|
140
|
-
when :out then Open3.
|
140
|
+
when :out then Open3.capture3(bin, *command).values_at(0, -1)
|
141
141
|
when :err then Open3.capture3(bin, *command).drop(1)
|
142
|
-
when :none then Open3.
|
142
|
+
when :none then Open3.capture3(bin, *command).last
|
143
143
|
end
|
144
144
|
end
|
145
145
|
|
data/lib/cocoapods/installer.rb
CHANGED
@@ -84,6 +84,11 @@ module Pod
|
|
84
84
|
#
|
85
85
|
attr_accessor :update
|
86
86
|
|
87
|
+
# @return [Bool] Whether the spec repos should be updated.
|
88
|
+
#
|
89
|
+
attr_accessor :repo_update
|
90
|
+
alias_method :repo_update?, :repo_update
|
91
|
+
|
87
92
|
# @return [Boolean] Whether default plugins should be used during
|
88
93
|
# installation. Defaults to true.
|
89
94
|
#
|
@@ -140,7 +145,7 @@ module Pod
|
|
140
145
|
|
141
146
|
UI.section 'Updating local specs repositories' do
|
142
147
|
analyzer.update_repositories
|
143
|
-
end
|
148
|
+
end if repo_update?
|
144
149
|
|
145
150
|
UI.section 'Analyzing dependencies' do
|
146
151
|
analyze(analyzer)
|
@@ -153,6 +153,11 @@ module Pod
|
|
153
153
|
end
|
154
154
|
end
|
155
155
|
|
156
|
+
unless name
|
157
|
+
raise Informative,
|
158
|
+
"Unable to determine the platform for the `#{target_definition.name}` target."
|
159
|
+
end
|
160
|
+
|
156
161
|
target_definition.set_platform(name, deployment_target)
|
157
162
|
Platform.new(name, deployment_target)
|
158
163
|
end
|
@@ -34,6 +34,7 @@ module Pod
|
|
34
34
|
validate_pod_directives
|
35
35
|
validate_no_abstract_only_pods!
|
36
36
|
validate_dependencies_are_present!
|
37
|
+
validate_no_duplicate_targets!
|
37
38
|
|
38
39
|
@validated = true
|
39
40
|
end
|
@@ -122,6 +123,16 @@ module Pod
|
|
122
123
|
add_error "The dependency `#{dep}` is not used in any concrete target."
|
123
124
|
end
|
124
125
|
end
|
126
|
+
|
127
|
+
def validate_no_duplicate_targets!
|
128
|
+
podfile.target_definition_list.group_by { |td| [td.name, td.user_project_path] }.
|
129
|
+
each do |(name, project), definitions|
|
130
|
+
next unless definitions.size > 1
|
131
|
+
error = "The target `#{name}` is declared twice"
|
132
|
+
error << " for the project `#{project}`" if project
|
133
|
+
add_error(error << '.')
|
134
|
+
end
|
135
|
+
end
|
125
136
|
end
|
126
137
|
end
|
127
138
|
end
|
@@ -154,7 +154,7 @@ module Pod
|
|
154
154
|
end
|
155
155
|
frameworks_by_config[config] = relevant_pod_targets.flat_map do |pod_target|
|
156
156
|
frameworks = pod_target.file_accessors.flat_map(&:vendored_dynamic_artifacts).map { |fw| "${PODS_ROOT}/#{fw.relative_path_from(sandbox.root)}" }
|
157
|
-
frameworks << pod_target.build_product_path if pod_target.should_build? && pod_target.requires_frameworks?
|
157
|
+
frameworks << pod_target.build_product_path('$BUILT_PRODUCTS_DIR') if pod_target.should_build? && pod_target.requires_frameworks?
|
158
158
|
frameworks
|
159
159
|
end
|
160
160
|
end
|
@@ -177,9 +177,7 @@ module Pod
|
|
177
177
|
c.build_settings['PRODUCT_NAME'] = bundle_name
|
178
178
|
relative_info_plist_path = info_plist_path.relative_path_from(sandbox.root)
|
179
179
|
c.build_settings['INFOPLIST_FILE'] = relative_info_plist_path.to_s
|
180
|
-
|
181
|
-
c.build_settings['CONFIGURATION_BUILD_DIR'] = target.configuration_build_dir
|
182
|
-
end
|
180
|
+
c.build_settings['CONFIGURATION_BUILD_DIR'] = target.configuration_build_dir
|
183
181
|
|
184
182
|
# Set the correct device family for this bundle, based on the platform
|
185
183
|
device_family_by_platform = {
|
data/lib/cocoapods/resolver.rb
CHANGED
@@ -352,7 +352,7 @@ module Pod
|
|
352
352
|
if dependency && dependency.podspec_repo
|
353
353
|
return SourcesManager.aggregate_for_dependency(dependency)
|
354
354
|
else
|
355
|
-
@aggregate ||= Source::Aggregate.new(sources
|
355
|
+
@aggregate ||= Source::Aggregate.new(sources)
|
356
356
|
end
|
357
357
|
end
|
358
358
|
|
@@ -41,7 +41,7 @@ module Pod
|
|
41
41
|
#
|
42
42
|
def sources(names)
|
43
43
|
dirs = names.map { |name| source_dir(name) }
|
44
|
-
dirs.map { |repo|
|
44
|
+
dirs.map { |repo| source_from_path(repo) }
|
45
45
|
end
|
46
46
|
|
47
47
|
# Returns the source whose {Source#url} is equal to `url`, adding the repo
|
@@ -61,9 +61,11 @@ module Pod
|
|
61
61
|
previous_title_level = UI.title_level
|
62
62
|
UI.title_level = 0
|
63
63
|
begin
|
64
|
-
|
65
|
-
|
66
|
-
|
64
|
+
if name =~ /^master(-\d+)?$/
|
65
|
+
Command::Setup.parse([]).run
|
66
|
+
else
|
67
|
+
Command::Repo::Add.parse([name, url]).run
|
68
|
+
end
|
67
69
|
rescue Informative
|
68
70
|
raise Informative, "Unable to add a source with url `#{url}` " \
|
69
71
|
"named `#{name}`.\nYou can try adding it manually in " \
|
@@ -97,7 +99,7 @@ module Pod
|
|
97
99
|
def all
|
98
100
|
return [] unless config.repos_dir.exist?
|
99
101
|
dirs = config.repos_dir.children.select(&:directory?)
|
100
|
-
dirs.map { |repo|
|
102
|
+
dirs.map { |repo| source_from_path(repo) }
|
101
103
|
end
|
102
104
|
|
103
105
|
# @return [Array<Source>] The CocoaPods Master Repo source.
|
@@ -323,7 +325,7 @@ module Pod
|
|
323
325
|
changed_spec_paths = {}
|
324
326
|
sources.each do |source|
|
325
327
|
UI.section "Updating spec repo `#{source.name}`" do
|
326
|
-
changed_source_paths = source.update(show_output
|
328
|
+
changed_source_paths = source.update(show_output)
|
327
329
|
changed_spec_paths[source] = changed_source_paths if changed_source_paths.count > 0
|
328
330
|
check_version_information(source.repo)
|
329
331
|
end
|
@@ -468,14 +470,25 @@ module Pod
|
|
468
470
|
|
469
471
|
private
|
470
472
|
|
473
|
+
# @return [Source] The Source at a given path.
|
474
|
+
#
|
475
|
+
# @param [Pathname] path
|
476
|
+
# The local file path to one podspec repo.
|
477
|
+
#
|
478
|
+
def source_from_path(path)
|
479
|
+
return Source.new(path) unless path.basename.to_s == 'master'
|
480
|
+
MasterSource.new(path)
|
481
|
+
end
|
482
|
+
|
471
483
|
# @return [Source::Aggregate] The aggregate of the sources from repos.
|
472
484
|
#
|
473
485
|
# @param [Array<Pathname>] repos
|
474
486
|
# The local file paths to one or more podspec repo caches.
|
475
487
|
#
|
476
488
|
def aggregate_with_repos(repos)
|
489
|
+
sources = repos.map { |path| source_from_path(path) }
|
477
490
|
@aggregates_by_repos ||= {}
|
478
|
-
@aggregates_by_repos[repos] ||= Source::Aggregate.new(
|
491
|
+
@aggregates_by_repos[repos] ||= Source::Aggregate.new(sources)
|
479
492
|
end
|
480
493
|
|
481
494
|
# @return [Bool] Whether the given path is writable by the current user.
|
@@ -609,9 +622,15 @@ module Pod
|
|
609
622
|
extend Executable
|
610
623
|
executable :git
|
611
624
|
|
625
|
+
def git(args, include_error: false)
|
626
|
+
Executable.capture_command('git', args, :capture => include_error ? :merge : :out).first.strip
|
627
|
+
end
|
628
|
+
|
612
629
|
def update_git_repo(show_output = false)
|
613
|
-
|
614
|
-
|
630
|
+
ensure_in_repo!
|
631
|
+
Config.instance.with_changes(:verbose => show_output) do
|
632
|
+
git!(%w(pull --ff-only))
|
633
|
+
end
|
615
634
|
rescue
|
616
635
|
UI.warn 'CocoaPods was not able to update the ' \
|
617
636
|
"`#{name}` repo. If this is an unexpected issue " \
|
@@ -619,4 +638,16 @@ module Pod
|
|
619
638
|
'`pod repo update --verbose`'
|
620
639
|
end
|
621
640
|
end
|
641
|
+
|
642
|
+
class MasterSource
|
643
|
+
def update_git_repo(show_output = false)
|
644
|
+
ensure_in_repo!
|
645
|
+
if repo.join('.git', 'shallow').file?
|
646
|
+
UI.info "Performing a deep fetch of the `#{name}` specs repo to improve future performance" do
|
647
|
+
git!(%w(fetch --unshallow))
|
648
|
+
end
|
649
|
+
end
|
650
|
+
super
|
651
|
+
end
|
652
|
+
end
|
622
653
|
end
|
@@ -16,26 +16,10 @@ module Pod
|
|
16
16
|
#
|
17
17
|
attr_reader :build_headers
|
18
18
|
|
19
|
-
# @return [
|
20
|
-
#
|
21
|
-
#
|
22
|
-
#
|
23
|
-
# The namespacing cannot directly happen in the product name itself,
|
24
|
-
# because this must be equal to the module name and this will be
|
25
|
-
# used in source code, which should stay agnostic over the
|
26
|
-
# dependency manager.
|
27
|
-
# We need namespacing because multiple targets can exist for the
|
28
|
-
# same podspec and their products should not collide. This
|
29
|
-
# duplication is needed when multiple user targets have the same
|
30
|
-
# dependency, but they require different sets of subspecs or they
|
31
|
-
# are on different platforms.
|
32
|
-
#
|
33
|
-
def scoped?
|
34
|
-
!scope_suffix.nil?
|
35
|
-
end
|
36
|
-
|
37
|
-
# @return [String] used for the label and the directory name, which is used to
|
38
|
-
# scope the build product in the default configuration build dir.
|
19
|
+
# @return [String] used as suffix in the label
|
20
|
+
#
|
21
|
+
# @note This affects the value returned by #configuration_build_dir
|
22
|
+
# and accessors relying on this as #build_product_path.
|
39
23
|
#
|
40
24
|
attr_reader :scope_suffix
|
41
25
|
|
@@ -44,10 +28,10 @@ module Pod
|
|
44
28
|
#
|
45
29
|
attr_accessor :dependent_targets
|
46
30
|
|
47
|
-
# @param [Array<Specification>] @
|
48
|
-
# @param [Array<TargetDefinition>] target_definitions @see target_definitions
|
49
|
-
# @param [Sandbox] sandbox @see sandbox
|
50
|
-
# @param [String] scope_suffix @see scope_suffix
|
31
|
+
# @param [Array<Specification>] specs @see #specs
|
32
|
+
# @param [Array<TargetDefinition>] target_definitions @see #target_definitions
|
33
|
+
# @param [Sandbox] sandbox @see #sandbox
|
34
|
+
# @param [String] scope_suffix @see #scope_suffix
|
51
35
|
#
|
52
36
|
def initialize(specs, target_definitions, sandbox, scope_suffix = nil)
|
53
37
|
raise "Can't initialize a PodTarget without specs!" if specs.nil? || specs.empty?
|
@@ -89,14 +73,10 @@ module Pod
|
|
89
73
|
# @return [String] the label for the target.
|
90
74
|
#
|
91
75
|
def label
|
92
|
-
if
|
93
|
-
|
94
|
-
"#{root_spec.name}#{scope_suffix}"
|
95
|
-
else
|
96
|
-
"#{root_spec.name}-#{scope_suffix}"
|
97
|
-
end
|
76
|
+
if scope_suffix.nil? || scope_suffix[0] == '.'
|
77
|
+
"#{root_spec.name}#{scope_suffix}"
|
98
78
|
else
|
99
|
-
root_spec.name
|
79
|
+
"#{root_spec.name}-#{scope_suffix}"
|
100
80
|
end
|
101
81
|
end
|
102
82
|
|
data/lib/cocoapods/validator.rb
CHANGED
@@ -349,7 +349,6 @@ module Pod
|
|
349
349
|
@original_config = Config.instance.clone
|
350
350
|
config.installation_root = validation_dir
|
351
351
|
config.silent = !config.verbose
|
352
|
-
config.skip_repo_update = true
|
353
352
|
end
|
354
353
|
|
355
354
|
def tear_down_validation_environment
|
@@ -560,12 +559,18 @@ module Pod
|
|
560
559
|
# Ensures that a list of header files only contains header files.
|
561
560
|
#
|
562
561
|
def _validate_header_files(attr_name)
|
563
|
-
|
562
|
+
header_files = file_accessor.send(attr_name)
|
563
|
+
non_header_files = header_files.
|
564
564
|
select { |f| !Sandbox::FileAccessor::HEADER_EXTENSIONS.include?(f.extname) }.
|
565
565
|
map { |f| f.relative_path_from(file_accessor.root) }
|
566
566
|
unless non_header_files.empty?
|
567
567
|
error(attr_name, "The pattern matches non-header files (#{non_header_files.join(', ')}).")
|
568
568
|
end
|
569
|
+
non_source_files = header_files - file_accessor.source_files
|
570
|
+
unless non_source_files.empty?
|
571
|
+
error(attr_name, 'The pattern includes header files that are not listed' \
|
572
|
+
"in source_files (#{non_source_files.join(', ')}).")
|
573
|
+
end
|
569
574
|
end
|
570
575
|
|
571
576
|
def _validate_header_mappings_dir
|
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: 1.0.0.beta.
|
4
|
+
version: 1.0.0.beta.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eloy Duran
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2016-03-
|
14
|
+
date: 2016-03-14 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: cocoapods-core
|
@@ -19,21 +19,21 @@ dependencies:
|
|
19
19
|
requirements:
|
20
20
|
- - '='
|
21
21
|
- !ruby/object:Gem::Version
|
22
|
-
version: 1.0.0.beta.
|
22
|
+
version: 1.0.0.beta.6
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
26
26
|
requirements:
|
27
27
|
- - '='
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version: 1.0.0.beta.
|
29
|
+
version: 1.0.0.beta.6
|
30
30
|
- !ruby/object:Gem::Dependency
|
31
31
|
name: claide
|
32
32
|
requirement: !ruby/object:Gem::Requirement
|
33
33
|
requirements:
|
34
34
|
- - '>='
|
35
35
|
- !ruby/object:Gem::Version
|
36
|
-
version: 1.0.0.beta.
|
36
|
+
version: 1.0.0.beta.3
|
37
37
|
- - <
|
38
38
|
- !ruby/object:Gem::Version
|
39
39
|
version: '2.0'
|
@@ -43,7 +43,7 @@ dependencies:
|
|
43
43
|
requirements:
|
44
44
|
- - '>='
|
45
45
|
- !ruby/object:Gem::Version
|
46
|
-
version: 1.0.0.beta.
|
46
|
+
version: 1.0.0.beta.3
|
47
47
|
- - <
|
48
48
|
- !ruby/object:Gem::Version
|
49
49
|
version: '2.0'
|
@@ -73,7 +73,7 @@ dependencies:
|
|
73
73
|
requirements:
|
74
74
|
- - '>='
|
75
75
|
- !ruby/object:Gem::Version
|
76
|
-
version: 1.0.0.beta.
|
76
|
+
version: 1.0.0.beta.2
|
77
77
|
- - <
|
78
78
|
- !ruby/object:Gem::Version
|
79
79
|
version: '2.0'
|
@@ -83,7 +83,7 @@ dependencies:
|
|
83
83
|
requirements:
|
84
84
|
- - '>='
|
85
85
|
- !ruby/object:Gem::Version
|
86
|
-
version: 1.0.0.beta.
|
86
|
+
version: 1.0.0.beta.2
|
87
87
|
- - <
|
88
88
|
- !ruby/object:Gem::Version
|
89
89
|
version: '2.0'
|
@@ -173,7 +173,7 @@ dependencies:
|
|
173
173
|
requirements:
|
174
174
|
- - '>='
|
175
175
|
- !ruby/object:Gem::Version
|
176
|
-
version: 1.0.0.beta.
|
176
|
+
version: 1.0.0.beta.3
|
177
177
|
- - <
|
178
178
|
- !ruby/object:Gem::Version
|
179
179
|
version: '2.0'
|
@@ -183,7 +183,7 @@ dependencies:
|
|
183
183
|
requirements:
|
184
184
|
- - '>='
|
185
185
|
- !ruby/object:Gem::Version
|
186
|
-
version: 1.0.0.beta.
|
186
|
+
version: 1.0.0.beta.3
|
187
187
|
- - <
|
188
188
|
- !ruby/object:Gem::Version
|
189
189
|
version: '2.0'
|
@@ -362,11 +362,13 @@ files:
|
|
362
362
|
- lib/cocoapods/command/cache/list.rb
|
363
363
|
- lib/cocoapods/command/env.rb
|
364
364
|
- lib/cocoapods/command/init.rb
|
365
|
+
- lib/cocoapods/command/install.rb
|
365
366
|
- lib/cocoapods/command/inter_process_communication.rb
|
366
367
|
- lib/cocoapods/command/lib.rb
|
367
368
|
- lib/cocoapods/command/list.rb
|
369
|
+
- lib/cocoapods/command/options/project_directory.rb
|
370
|
+
- lib/cocoapods/command/options/repo_update.rb
|
368
371
|
- lib/cocoapods/command/outdated.rb
|
369
|
-
- lib/cocoapods/command/project.rb
|
370
372
|
- lib/cocoapods/command/repo.rb
|
371
373
|
- lib/cocoapods/command/repo/add.rb
|
372
374
|
- lib/cocoapods/command/repo/lint.rb
|
@@ -382,6 +384,7 @@ files:
|
|
382
384
|
- lib/cocoapods/command/spec/env_spec.rb
|
383
385
|
- lib/cocoapods/command/spec/lint.rb
|
384
386
|
- lib/cocoapods/command/spec/which.rb
|
387
|
+
- lib/cocoapods/command/update.rb
|
385
388
|
- lib/cocoapods/config.rb
|
386
389
|
- lib/cocoapods/downloader.rb
|
387
390
|
- lib/cocoapods/downloader/cache.rb
|
@@ -473,7 +476,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
473
476
|
version: '0'
|
474
477
|
requirements: []
|
475
478
|
rubyforge_project:
|
476
|
-
rubygems_version: 2.6.
|
479
|
+
rubygems_version: 2.6.2
|
477
480
|
signing_key:
|
478
481
|
specification_version: 3
|
479
482
|
summary: The Cocoa library package manager.
|
@@ -1,157 +0,0 @@
|
|
1
|
-
module Pod
|
2
|
-
class Command
|
3
|
-
# Provides support for commands to take a user-specified `project directory`
|
4
|
-
#
|
5
|
-
module ProjectDirectory
|
6
|
-
module Options
|
7
|
-
def options
|
8
|
-
[
|
9
|
-
['--project-directory=/project/dir/', 'The path to the root of the project directory'],
|
10
|
-
].concat(super)
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
def self.included(base)
|
15
|
-
base.extend(Options)
|
16
|
-
end
|
17
|
-
|
18
|
-
def initialize(argv)
|
19
|
-
if project_directory = argv.option('project-directory')
|
20
|
-
@project_directory = Pathname.new(project_directory).expand_path
|
21
|
-
end
|
22
|
-
config.installation_root = @project_directory
|
23
|
-
super
|
24
|
-
end
|
25
|
-
|
26
|
-
def validate!
|
27
|
-
super
|
28
|
-
if @project_directory && !@project_directory.directory?
|
29
|
-
raise Informative,
|
30
|
-
"`#{@project_directory}` is not a valid directory."
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
# Provides support for the common behaviour of the `install` and `update`
|
36
|
-
# commands.
|
37
|
-
#
|
38
|
-
module Project
|
39
|
-
module Options
|
40
|
-
def options
|
41
|
-
[
|
42
|
-
['--no-repo-update', 'Skip running `pod repo update` before install'],
|
43
|
-
].concat(super)
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
def self.included(base)
|
48
|
-
base.extend Options
|
49
|
-
end
|
50
|
-
|
51
|
-
def initialize(argv)
|
52
|
-
config.skip_repo_update = !argv.flag?('repo-update', !config.skip_repo_update)
|
53
|
-
super
|
54
|
-
end
|
55
|
-
|
56
|
-
# Runs the installer.
|
57
|
-
#
|
58
|
-
# @param [Hash, Boolean, nil] update
|
59
|
-
# Pods that have been requested to be updated or true if all Pods
|
60
|
-
# should be updated
|
61
|
-
#
|
62
|
-
# @return [void]
|
63
|
-
#
|
64
|
-
def run_install_with_update(update)
|
65
|
-
installer = Installer.new(config.sandbox, config.podfile, config.lockfile)
|
66
|
-
installer.update = update
|
67
|
-
installer.install!
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
#-------------------------------------------------------------------------#
|
72
|
-
|
73
|
-
class Install < Command
|
74
|
-
include Project
|
75
|
-
|
76
|
-
self.summary = 'Install project dependencies to Podfile.lock versions'
|
77
|
-
|
78
|
-
self.description = <<-DESC
|
79
|
-
Downloads all dependencies defined in `Podfile` and creates an Xcode
|
80
|
-
Pods library project in `./Pods`.
|
81
|
-
|
82
|
-
The Xcode project file should be specified in your `Podfile` like this:
|
83
|
-
|
84
|
-
project 'path/to/XcodeProject'
|
85
|
-
|
86
|
-
If no project is specified, then a search for an Xcode project will
|
87
|
-
be made. If more than one Xcode project is found, the command will
|
88
|
-
raise an error.
|
89
|
-
|
90
|
-
This will configure the project to reference the Pods static library,
|
91
|
-
add a build configuration file, and add a post build script to copy
|
92
|
-
Pod resources.
|
93
|
-
DESC
|
94
|
-
|
95
|
-
def run
|
96
|
-
verify_podfile_exists!
|
97
|
-
run_install_with_update(false)
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
|
-
#-------------------------------------------------------------------------#
|
102
|
-
|
103
|
-
class Update < Command
|
104
|
-
include Project
|
105
|
-
|
106
|
-
self.summary = 'Update outdated project dependencies and create new ' \
|
107
|
-
'Podfile.lock'
|
108
|
-
|
109
|
-
self.description = <<-DESC
|
110
|
-
Updates the Pods identified by the specified `POD_NAMES`. If no
|
111
|
-
`POD_NAMES` are specified it updates all the Pods ignoring the contents
|
112
|
-
of the Podfile.lock.
|
113
|
-
This command is reserved to the update of dependencies and pod install
|
114
|
-
should be used to install changes to the Podfile.
|
115
|
-
DESC
|
116
|
-
|
117
|
-
self.arguments = [
|
118
|
-
CLAide::Argument.new('POD_NAMES', false, true),
|
119
|
-
]
|
120
|
-
|
121
|
-
def initialize(argv)
|
122
|
-
@pods = argv.arguments! unless argv.arguments.empty?
|
123
|
-
super
|
124
|
-
end
|
125
|
-
|
126
|
-
def run
|
127
|
-
verify_podfile_exists!
|
128
|
-
|
129
|
-
if @pods
|
130
|
-
verify_lockfile_exists!
|
131
|
-
|
132
|
-
# Check if all given pods are installed
|
133
|
-
lockfile_roots = config.lockfile.pod_names.map { |p| Specification.root_name(p) }
|
134
|
-
missing_pods = @pods.map { |p| Specification.root_name(p) }.select do |pod|
|
135
|
-
!lockfile_roots.include?(pod)
|
136
|
-
end
|
137
|
-
|
138
|
-
unless missing_pods.empty?
|
139
|
-
message = if missing_pods.length > 1
|
140
|
-
"Pods `#{missing_pods.join('`, `')}` are not " \
|
141
|
-
'installed and cannot be updated'
|
142
|
-
else
|
143
|
-
"The `#{missing_pods.first}` Pod is not installed " \
|
144
|
-
'and cannot be updated'
|
145
|
-
end
|
146
|
-
raise Informative, message
|
147
|
-
end
|
148
|
-
|
149
|
-
run_install_with_update(:pods => @pods)
|
150
|
-
else
|
151
|
-
UI.puts 'Update all pods'.yellow unless @pods
|
152
|
-
run_install_with_update(true)
|
153
|
-
end
|
154
|
-
end
|
155
|
-
end
|
156
|
-
end
|
157
|
-
end
|