cocoapods-square-stable 0.19.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CHANGELOG.md +1296 -0
- data/LICENSE +20 -0
- data/README.md +94 -0
- data/bin/pod +16 -0
- data/bin/sandbox-pod +120 -0
- data/lib/cocoapods.rb +77 -0
- data/lib/cocoapods/command.rb +116 -0
- data/lib/cocoapods/command/help.rb +23 -0
- data/lib/cocoapods/command/inter_process_communication.rb +178 -0
- data/lib/cocoapods/command/list.rb +77 -0
- data/lib/cocoapods/command/outdated.rb +56 -0
- data/lib/cocoapods/command/podfile_info.rb +91 -0
- data/lib/cocoapods/command/project.rb +88 -0
- data/lib/cocoapods/command/push.rb +172 -0
- data/lib/cocoapods/command/repo.rb +145 -0
- data/lib/cocoapods/command/search.rb +61 -0
- data/lib/cocoapods/command/setup.rb +134 -0
- data/lib/cocoapods/command/spec.rb +590 -0
- data/lib/cocoapods/config.rb +231 -0
- data/lib/cocoapods/downloader.rb +59 -0
- data/lib/cocoapods/executable.rb +118 -0
- data/lib/cocoapods/external_sources.rb +363 -0
- data/lib/cocoapods/file_list.rb +36 -0
- data/lib/cocoapods/gem_version.rb +7 -0
- data/lib/cocoapods/generator/acknowledgements.rb +107 -0
- data/lib/cocoapods/generator/acknowledgements/markdown.rb +40 -0
- data/lib/cocoapods/generator/acknowledgements/plist.rb +64 -0
- data/lib/cocoapods/generator/bridge_support.rb +22 -0
- data/lib/cocoapods/generator/copy_resources_script.rb +54 -0
- data/lib/cocoapods/generator/dummy_source.rb +22 -0
- data/lib/cocoapods/generator/prefix_header.rb +82 -0
- data/lib/cocoapods/generator/target_environment_header.rb +86 -0
- data/lib/cocoapods/generator/xcconfig.rb +185 -0
- data/lib/cocoapods/hooks/installer_representation.rb +134 -0
- data/lib/cocoapods/hooks/library_representation.rb +94 -0
- data/lib/cocoapods/hooks/pod_representation.rb +74 -0
- data/lib/cocoapods/installer.rb +571 -0
- data/lib/cocoapods/installer/analyzer.rb +559 -0
- data/lib/cocoapods/installer/analyzer/sandbox_analyzer.rb +253 -0
- data/lib/cocoapods/installer/file_references_installer.rb +179 -0
- data/lib/cocoapods/installer/pod_source_installer.rb +248 -0
- data/lib/cocoapods/installer/target_installer.rb +379 -0
- data/lib/cocoapods/installer/user_project_integrator.rb +180 -0
- data/lib/cocoapods/installer/user_project_integrator/target_integrator.rb +224 -0
- data/lib/cocoapods/library.rb +202 -0
- data/lib/cocoapods/open_uri.rb +24 -0
- data/lib/cocoapods/project.rb +209 -0
- data/lib/cocoapods/resolver.rb +212 -0
- data/lib/cocoapods/sandbox.rb +343 -0
- data/lib/cocoapods/sandbox/file_accessor.rb +217 -0
- data/lib/cocoapods/sandbox/headers_store.rb +96 -0
- data/lib/cocoapods/sandbox/path_list.rb +208 -0
- data/lib/cocoapods/sources_manager.rb +276 -0
- data/lib/cocoapods/user_interface.rb +304 -0
- data/lib/cocoapods/user_interface/error_report.rb +101 -0
- data/lib/cocoapods/validator.rb +350 -0
- metadata +238 -0
@@ -0,0 +1,276 @@
|
|
1
|
+
module Pod
|
2
|
+
|
3
|
+
# Manages all the sources known to the running CocoaPods Instance.
|
4
|
+
#
|
5
|
+
class SourcesManager
|
6
|
+
|
7
|
+
class << self
|
8
|
+
|
9
|
+
include Config::Mixin
|
10
|
+
|
11
|
+
# @return [Source::Aggregate] the aggregate of all the sources known to
|
12
|
+
# this installation of CocoaPods.
|
13
|
+
#
|
14
|
+
def aggregate
|
15
|
+
Source::Aggregate.new(config.repos_dir)
|
16
|
+
end
|
17
|
+
|
18
|
+
# @return [Array<Source>] the list of all the sources known to this
|
19
|
+
# installation of CocoaPods.
|
20
|
+
#
|
21
|
+
def all
|
22
|
+
aggregate.all
|
23
|
+
end
|
24
|
+
|
25
|
+
# @return [Array<Specification::Set>] the list of all the specification
|
26
|
+
# sets know to this installation of CocoaPods.
|
27
|
+
#
|
28
|
+
def all_sets
|
29
|
+
aggregate.all_sets
|
30
|
+
end
|
31
|
+
|
32
|
+
# Search all the sources to match the set for the given dependency.
|
33
|
+
#
|
34
|
+
# @return [Set, nil] a set for a given dependency including all the
|
35
|
+
# {Source} that contain the Pod. If no sources containing the
|
36
|
+
# Pod where found it returns nil.
|
37
|
+
#
|
38
|
+
# @raise If no source including the set can be found.
|
39
|
+
#
|
40
|
+
def search(dependency)
|
41
|
+
aggregate.search(dependency)
|
42
|
+
end
|
43
|
+
|
44
|
+
# Search all the sources with the given search term.
|
45
|
+
#
|
46
|
+
# @param [String] query
|
47
|
+
# The search term.
|
48
|
+
#
|
49
|
+
# @param [Bool] full_text_search
|
50
|
+
# Whether the search should be limited to the name of the Pod or
|
51
|
+
# should include also the author, the summary, and the
|
52
|
+
# description.
|
53
|
+
#
|
54
|
+
# @raise If no source including the set can be found.
|
55
|
+
#
|
56
|
+
# @note Full text search requires to load the specification for each
|
57
|
+
# pod, hence is considerably slower.
|
58
|
+
#
|
59
|
+
# @return [Array<Set>] The sets that contain the search term.
|
60
|
+
#
|
61
|
+
def search_by_name(query, full_text_search = false)
|
62
|
+
if full_text_search
|
63
|
+
set_names = []
|
64
|
+
updated_search_index.each do |name, set_data|
|
65
|
+
text = name.dup
|
66
|
+
if full_text_search
|
67
|
+
text << set_data['authors'].to_s if set_data['authors']
|
68
|
+
text << set_data['summary'] if set_data['summary']
|
69
|
+
text << set_data['description'] if set_data['description']
|
70
|
+
end
|
71
|
+
set_names << name if text.downcase.include?(query.downcase)
|
72
|
+
end
|
73
|
+
sets = set_names.sort.map { |name| aggregate.represenative_set(name) }
|
74
|
+
else
|
75
|
+
sets = aggregate.search_by_name(query, false)
|
76
|
+
end
|
77
|
+
if sets.empty?
|
78
|
+
extra = ", author, summary, or description" if full_text_search
|
79
|
+
raise Informative, "Unable to find a pod with name#{extra} matching `#{query}`"
|
80
|
+
end
|
81
|
+
sets
|
82
|
+
end
|
83
|
+
|
84
|
+
# Creates or updates the search data and returns it. The search data
|
85
|
+
# groups by name the following information for each set:
|
86
|
+
#
|
87
|
+
# - version
|
88
|
+
# - summary
|
89
|
+
# - description
|
90
|
+
# - authors
|
91
|
+
#
|
92
|
+
# @note This operation is fairly expensive, because of the YAML
|
93
|
+
# conversion.
|
94
|
+
#
|
95
|
+
# @return [Hash{String => String}] The up to date search data.
|
96
|
+
#
|
97
|
+
def updated_search_index
|
98
|
+
unless @updated_search_index
|
99
|
+
if search_index_path.exist?
|
100
|
+
stored_index = YAML.load(search_index_path.read)
|
101
|
+
if stored_index && stored_index.is_a?(Hash)
|
102
|
+
search_index = aggregate.update_search_index(stored_index)
|
103
|
+
else
|
104
|
+
search_index = aggregate.generate_search_index
|
105
|
+
end
|
106
|
+
else
|
107
|
+
search_index = aggregate.generate_search_index
|
108
|
+
end
|
109
|
+
|
110
|
+
File.open(search_index_path, 'w') {|f| f.write(search_index.to_yaml) }
|
111
|
+
@updated_search_index = search_index
|
112
|
+
end
|
113
|
+
@updated_search_index
|
114
|
+
end
|
115
|
+
|
116
|
+
# Allows to clear the search index.
|
117
|
+
#
|
118
|
+
attr_writer :updated_search_index
|
119
|
+
|
120
|
+
# @return [Pathname] The path where the search index should be stored.
|
121
|
+
#
|
122
|
+
def search_index_path
|
123
|
+
CACHE_ROOT + 'search_index.yaml'
|
124
|
+
end
|
125
|
+
|
126
|
+
public
|
127
|
+
|
128
|
+
# @!group Updating Sources
|
129
|
+
#-----------------------------------------------------------------------#
|
130
|
+
|
131
|
+
extend Executable
|
132
|
+
executable :git
|
133
|
+
|
134
|
+
# Updates the local clone of the spec-repo with the given name or of all
|
135
|
+
# the git repos if the name is omitted.
|
136
|
+
#
|
137
|
+
# @param [String] name
|
138
|
+
#
|
139
|
+
# @return [void]
|
140
|
+
#
|
141
|
+
def update(source_name = nil, show_output = false)
|
142
|
+
if source_name
|
143
|
+
specified_source = aggregate.all.find { |s| s.name == source_name }
|
144
|
+
raise Informative, "Unable to find the `#{source_name}` repo." unless specified_source
|
145
|
+
raise Informative, "The `#{source_name}` repo is not a git repo." unless git_repo?(specified_source.repo)
|
146
|
+
sources = [specified_source]
|
147
|
+
else
|
148
|
+
sources = aggregate.all.select { |source| git_repo?(source.repo) }
|
149
|
+
end
|
150
|
+
|
151
|
+
sources.each do |source|
|
152
|
+
UI.section "Updating spec repo `#{source.name}`" do
|
153
|
+
Dir.chdir(source.repo) do
|
154
|
+
output = git!("pull")
|
155
|
+
UI.puts output if show_output && !config.verbose?
|
156
|
+
end
|
157
|
+
check_version_information(source.repo)
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
# Returns whether a source is a GIT repo.
|
163
|
+
#
|
164
|
+
# @param [Pathname] dir
|
165
|
+
# The directory where the source is stored.
|
166
|
+
#
|
167
|
+
# @return [Bool] Wether the given source is a GIT repo.
|
168
|
+
#
|
169
|
+
def git_repo?(dir)
|
170
|
+
Dir.chdir(dir) { `git rev-parse >/dev/null 2>&1` }
|
171
|
+
$?.exitstatus.zero?
|
172
|
+
end
|
173
|
+
|
174
|
+
# Checks the version information of the source with the given directory.
|
175
|
+
# It raises if the source is not compatible and if there is CocoaPods
|
176
|
+
# update it informs the user.
|
177
|
+
#
|
178
|
+
# @param [Pathname] dir
|
179
|
+
# The directory where the source is stored.
|
180
|
+
#
|
181
|
+
# @raise If the source is not compatible.
|
182
|
+
#
|
183
|
+
# @return [void]
|
184
|
+
#
|
185
|
+
def check_version_information(dir)
|
186
|
+
versions = version_information(dir)
|
187
|
+
unless repo_compatible?(dir)
|
188
|
+
min, max = versions['min'], versions['max']
|
189
|
+
version_msg = ( min == max ) ? min : "#{min} - #{max}"
|
190
|
+
raise Informative, "The `#{dir.basename}` repo requires " \
|
191
|
+
"CocoaPods #{version_msg}\n".red +
|
192
|
+
"Update CocoaPods, or checkout the appropriate tag in the repo."
|
193
|
+
end
|
194
|
+
|
195
|
+
if config.new_version_message? && cocoapods_update?(versions)
|
196
|
+
UI.puts "\nCocoaPods #{versions['last']} is available.\n".green
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
# Returns whether a source is compatible with the current version of
|
201
|
+
# CocoaPods.
|
202
|
+
#
|
203
|
+
# @param [Pathname] dir
|
204
|
+
# The directory where the source is stored.
|
205
|
+
#
|
206
|
+
# @return [Bool] whether the source is compatible.
|
207
|
+
#
|
208
|
+
def repo_compatible?(dir)
|
209
|
+
versions = version_information(dir)
|
210
|
+
|
211
|
+
min, max = versions['min'], versions['max']
|
212
|
+
bin_version = Gem::Version.new(Pod::VERSION)
|
213
|
+
supports_min = !min || bin_version >= Gem::Version.new(min)
|
214
|
+
supports_max = !max || bin_version <= Gem::Version.new(max)
|
215
|
+
supports_min && supports_max
|
216
|
+
end
|
217
|
+
|
218
|
+
# Checks whether there is a CocoaPods given the version information of a
|
219
|
+
# repo.
|
220
|
+
#
|
221
|
+
# @param [Hash] version_information
|
222
|
+
# The version information of a repository.
|
223
|
+
#
|
224
|
+
# @return [Bool] whether there is an update.
|
225
|
+
#
|
226
|
+
def cocoapods_update?(version_information)
|
227
|
+
version = version_information['last']
|
228
|
+
version && Gem::Version.new(version) > Gem::Version.new(Pod::VERSION)
|
229
|
+
end
|
230
|
+
|
231
|
+
# Returns the contents of the `CocoaPods-version.yml` file, which stores
|
232
|
+
# information about CocoaPods versions.
|
233
|
+
#
|
234
|
+
# This file is a hash with the following keys:
|
235
|
+
#
|
236
|
+
# - last: the last version of CocoaPods known to the source.
|
237
|
+
# - min: the minimum version of CocoaPods supported by the source.
|
238
|
+
# - max: the maximum version of CocoaPods supported by the source.
|
239
|
+
#
|
240
|
+
# @param [Pathname] dir
|
241
|
+
# The directory where the source is stored.
|
242
|
+
#
|
243
|
+
# @return [Hash] the versions information from the repo.
|
244
|
+
#
|
245
|
+
def version_information(dir)
|
246
|
+
require 'yaml'
|
247
|
+
yaml_file = dir + 'CocoaPods-version.yml'
|
248
|
+
yaml_file.exist? ? YAML.load_file(yaml_file) : {}
|
249
|
+
end
|
250
|
+
|
251
|
+
public
|
252
|
+
|
253
|
+
# @!group Master repo
|
254
|
+
#-----------------------------------------------------------------------#
|
255
|
+
|
256
|
+
# @return [Pathname] The path of the master repo.
|
257
|
+
#
|
258
|
+
def master_repo_dir
|
259
|
+
config.repos_dir + 'master'
|
260
|
+
end
|
261
|
+
|
262
|
+
# @return [Bool] Checks if the master repo is usable.
|
263
|
+
#
|
264
|
+
# @note Note this is used to automatically setup the master repo if
|
265
|
+
# needed.
|
266
|
+
#
|
267
|
+
def master_repo_functional?
|
268
|
+
master_repo_dir.exist? && repo_compatible?(master_repo_dir)
|
269
|
+
end
|
270
|
+
|
271
|
+
#-----------------------------------------------------------------------#
|
272
|
+
|
273
|
+
end
|
274
|
+
end
|
275
|
+
end
|
276
|
+
|
@@ -0,0 +1,304 @@
|
|
1
|
+
require 'cocoapods/user_interface/error_report'
|
2
|
+
|
3
|
+
module Pod
|
4
|
+
|
5
|
+
# Provides support for UI output. It provides support for nested sections of
|
6
|
+
# information and for a verbose mode.
|
7
|
+
#
|
8
|
+
module UserInterface
|
9
|
+
|
10
|
+
require 'colored'
|
11
|
+
|
12
|
+
@title_colors = %w|yellow green|
|
13
|
+
@title_level = 0
|
14
|
+
@indentation_level = 2
|
15
|
+
@treat_titles_as_messages = false
|
16
|
+
@warnings = []
|
17
|
+
|
18
|
+
class << self
|
19
|
+
|
20
|
+
include Config::Mixin
|
21
|
+
|
22
|
+
attr_accessor :indentation_level
|
23
|
+
attr_accessor :title_level
|
24
|
+
attr_accessor :warnings
|
25
|
+
|
26
|
+
# @return [Bool] Whether the wrapping of the strings to the width of the
|
27
|
+
# terminal should be disabled.
|
28
|
+
#
|
29
|
+
attr_accessor :disable_wrap
|
30
|
+
alias_method :disable_wrap?, :disable_wrap
|
31
|
+
|
32
|
+
# Prints a title taking an optional verbose prefix and
|
33
|
+
# a relative indentation valid for the UI action in the passed
|
34
|
+
# block.
|
35
|
+
#
|
36
|
+
# In verbose mode titles are printed with a color according
|
37
|
+
# to their level. In normal mode titles are printed only if
|
38
|
+
# they have nesting level smaller than 2.
|
39
|
+
#
|
40
|
+
# @todo Refactor to title (for always visible titles like search)
|
41
|
+
# and sections (titles that represent collapsible sections).
|
42
|
+
#
|
43
|
+
def section(title, verbose_prefix = '', relative_indentation = 0)
|
44
|
+
if config.verbose?
|
45
|
+
title(title, verbose_prefix, relative_indentation)
|
46
|
+
elsif title_level < 1
|
47
|
+
puts title
|
48
|
+
end
|
49
|
+
|
50
|
+
self.indentation_level += relative_indentation
|
51
|
+
self.title_level += 1
|
52
|
+
yield if block_given?
|
53
|
+
self.indentation_level -= relative_indentation
|
54
|
+
self.title_level -= 1
|
55
|
+
end
|
56
|
+
|
57
|
+
# In verbose mode it shows the sections and the contents.
|
58
|
+
# In normal mode it just prints the title.
|
59
|
+
#
|
60
|
+
# @return [void]
|
61
|
+
#
|
62
|
+
def titled_section(title, options = {})
|
63
|
+
relative_indentation = options[:relative_indentation] || 0
|
64
|
+
verbose_prefix = options[:verbose_prefix] || ''
|
65
|
+
if config.verbose?
|
66
|
+
title(title, verbose_prefix, relative_indentation)
|
67
|
+
else
|
68
|
+
puts title
|
69
|
+
end
|
70
|
+
|
71
|
+
self.indentation_level += relative_indentation
|
72
|
+
self.title_level += 1
|
73
|
+
yield if block_given?
|
74
|
+
self.indentation_level -= relative_indentation
|
75
|
+
self.title_level -= 1
|
76
|
+
end
|
77
|
+
|
78
|
+
# A title opposed to a section is always visible
|
79
|
+
#
|
80
|
+
def title(title, verbose_prefix = '', relative_indentation = 2)
|
81
|
+
if(@treat_titles_as_messages)
|
82
|
+
message(title, verbose_prefix)
|
83
|
+
else
|
84
|
+
title = verbose_prefix + title if config.verbose?
|
85
|
+
title = "\n#{title}" if @title_level < 2
|
86
|
+
if (color = @title_colors[@title_level])
|
87
|
+
title = title.send(color)
|
88
|
+
end
|
89
|
+
puts "#{title}"
|
90
|
+
end
|
91
|
+
|
92
|
+
self.indentation_level += relative_indentation
|
93
|
+
self.title_level += 1
|
94
|
+
yield if block_given?
|
95
|
+
self.indentation_level -= relative_indentation
|
96
|
+
self.title_level -= 1
|
97
|
+
end
|
98
|
+
|
99
|
+
# def title(title, verbose_prefix = '', relative_indentation = 2)
|
100
|
+
# end
|
101
|
+
|
102
|
+
# Prints a verbose message taking an optional verbose prefix and
|
103
|
+
# a relative indentation valid for the UI action in the passed
|
104
|
+
# block.
|
105
|
+
#
|
106
|
+
# @todo Clean interface.
|
107
|
+
#
|
108
|
+
def message(message, verbose_prefix = '', relative_indentation = 2)
|
109
|
+
message = verbose_prefix + message if config.verbose?
|
110
|
+
puts_indented message if config.verbose?
|
111
|
+
|
112
|
+
self.indentation_level += relative_indentation
|
113
|
+
yield if block_given?
|
114
|
+
self.indentation_level -= relative_indentation
|
115
|
+
end
|
116
|
+
|
117
|
+
# Prints an info to the user. The info is always displayed.
|
118
|
+
# It respects the current indentation level only in verbose
|
119
|
+
# mode.
|
120
|
+
#
|
121
|
+
# Any title printed in the optional block is treated as a message.
|
122
|
+
#
|
123
|
+
def info(message)
|
124
|
+
indentation = config.verbose? ? self.indentation_level : 0
|
125
|
+
indented = wrap_string(message, " " * indentation)
|
126
|
+
puts(indented)
|
127
|
+
|
128
|
+
self.indentation_level += 2
|
129
|
+
@treat_titles_as_messages = true
|
130
|
+
yield if block_given?
|
131
|
+
@treat_titles_as_messages = false
|
132
|
+
self.indentation_level -= 2
|
133
|
+
end
|
134
|
+
|
135
|
+
# Prints an important message to the user.
|
136
|
+
#
|
137
|
+
# @param [String] message The message to print.
|
138
|
+
#
|
139
|
+
# return [void]
|
140
|
+
#
|
141
|
+
def notice(message)
|
142
|
+
puts("\n[!] #{message}".green)
|
143
|
+
end
|
144
|
+
|
145
|
+
# Returns a string containing relative location of a path from the Podfile.
|
146
|
+
# The returned path is quoted. If the argument is nit it returns the
|
147
|
+
# empty string.
|
148
|
+
#
|
149
|
+
def path(pathname)
|
150
|
+
if pathname
|
151
|
+
path = pathname.relative_path_from(config.podfile_path.dirname || Pathname.pwd)
|
152
|
+
"`#{path}`"
|
153
|
+
else
|
154
|
+
''
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
# Prints the textual representation of a given set.
|
159
|
+
#
|
160
|
+
def pod(set, mode = :normal, statistics_provider = nil)
|
161
|
+
if mode == :name
|
162
|
+
puts_indented set.name
|
163
|
+
else
|
164
|
+
pod = Specification::Set::Presenter.new(set, statistics_provider)
|
165
|
+
title("\n-> #{pod.name} (#{pod.version})".green, '', 1) do
|
166
|
+
puts_indented pod.summary
|
167
|
+
labeled('Homepage', pod.homepage)
|
168
|
+
labeled('Source', pod.source_url)
|
169
|
+
labeled('Versions', pod.verions_by_source)
|
170
|
+
if mode == :stats
|
171
|
+
labeled('Pushed', pod.github_last_activity)
|
172
|
+
labeled('Authors', pod.authors) if pod.authors =~ /,/
|
173
|
+
labeled('Author', pod.authors) if pod.authors !~ /,/
|
174
|
+
labeled('License', pod.license)
|
175
|
+
labeled('Platform', pod.platform)
|
176
|
+
labeled('Watchers', pod.github_watchers)
|
177
|
+
labeled('Forks', pod.github_forks)
|
178
|
+
end
|
179
|
+
labeled('Sub specs', pod.subspecs)
|
180
|
+
end
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
# Prints a message with a label.
|
185
|
+
#
|
186
|
+
def labeled(label, value)
|
187
|
+
if value
|
188
|
+
''.tap do |t|
|
189
|
+
t << " - #{label}:".ljust(16)
|
190
|
+
if value.is_a?(Array)
|
191
|
+
separator = "\n - "
|
192
|
+
puts_indented t << separator << value.join(separator)
|
193
|
+
else
|
194
|
+
puts_indented t << value.to_s << "\n"
|
195
|
+
end
|
196
|
+
end
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
# Prints a message respecting the current indentation level and
|
201
|
+
# wrapping it to the terminal width if necessary.
|
202
|
+
#
|
203
|
+
def puts_indented(message = '')
|
204
|
+
indented = wrap_string(message, " " * self.indentation_level)
|
205
|
+
puts(indented)
|
206
|
+
end
|
207
|
+
|
208
|
+
# Prints the stored warnings. This method is intended to be called at the
|
209
|
+
# end of the execution of the binary.
|
210
|
+
#
|
211
|
+
# @return [void]
|
212
|
+
#
|
213
|
+
def print_warnings
|
214
|
+
STDOUT.flush
|
215
|
+
warnings.each do |warning|
|
216
|
+
next if warning[:verbose_only] && !config.verbose?
|
217
|
+
STDERR.puts("\n[!] #{warning[:message]}".yellow)
|
218
|
+
warning[:actions].each do |action|
|
219
|
+
indented = wrap_string(action, " - ")
|
220
|
+
puts(indented)
|
221
|
+
end
|
222
|
+
end
|
223
|
+
end
|
224
|
+
|
225
|
+
public
|
226
|
+
|
227
|
+
# @!group Basic methods
|
228
|
+
#-----------------------------------------------------------------------#
|
229
|
+
|
230
|
+
# prints a message followed by a new line unless config is silent.
|
231
|
+
#
|
232
|
+
def puts(message = '')
|
233
|
+
STDOUT.puts(message) unless config.silent?
|
234
|
+
end
|
235
|
+
|
236
|
+
# prints a message followed by a new line unless config is silent.
|
237
|
+
#
|
238
|
+
def print(message)
|
239
|
+
STDOUT.print(message) unless config.silent?
|
240
|
+
end
|
241
|
+
|
242
|
+
# Stores important warning to the user optionally followed by actions
|
243
|
+
# that the user should take. To print them use {#print_warnings}.
|
244
|
+
#
|
245
|
+
# @param [String] message The message to print.
|
246
|
+
# @param [Array] actions The actions that the user should take.
|
247
|
+
#
|
248
|
+
# return [void]
|
249
|
+
#
|
250
|
+
def warn(message, actions = [], verbose_only = false)
|
251
|
+
warnings << { :message => message, :actions => actions, :verbose_only => verbose_only }
|
252
|
+
end
|
253
|
+
|
254
|
+
private
|
255
|
+
|
256
|
+
# @!group Helpers
|
257
|
+
#-----------------------------------------------------------------------#
|
258
|
+
|
259
|
+
# @return [String] Wraps a string taking into account the width of the
|
260
|
+
# terminal and an option indent. Adapted from
|
261
|
+
# http://blog.macromates.com/2006/wrapping-text-with-regular-expressions/
|
262
|
+
#
|
263
|
+
# @param [String] txt The string to wrap
|
264
|
+
#
|
265
|
+
# @param [String] indent The string to use to indent the result.
|
266
|
+
#
|
267
|
+
# @return [String] The formatted string.
|
268
|
+
#
|
269
|
+
# @note If CocoaPods is not being run in a terminal or the width of the
|
270
|
+
# terminal is too small a width of 80 is assumed.
|
271
|
+
#
|
272
|
+
def wrap_string(txt, indent = '')
|
273
|
+
if disable_wrap || !STDIN.tty?
|
274
|
+
txt
|
275
|
+
else
|
276
|
+
width = `stty size`.split(' ')[1].to_i - indent.length
|
277
|
+
width = 80 unless width >= 10
|
278
|
+
txt.strip.gsub(/(.{1,#{width}})( +|$)\n?|(.{#{width}})/, indent + "\\1\\3\n")
|
279
|
+
end
|
280
|
+
end
|
281
|
+
end
|
282
|
+
end
|
283
|
+
UI = UserInterface
|
284
|
+
|
285
|
+
# Redirects cocoapods-core UI.
|
286
|
+
#
|
287
|
+
module CoreUI
|
288
|
+
|
289
|
+
class << self
|
290
|
+
|
291
|
+
# @todo enable in CocoaPods 0.17.0 release
|
292
|
+
#
|
293
|
+
def puts(message)
|
294
|
+
# UI.puts message
|
295
|
+
end
|
296
|
+
|
297
|
+
# @todo enable in CocoaPods 0.17.0 release
|
298
|
+
#
|
299
|
+
def warn(message)
|
300
|
+
# UI.warn message
|
301
|
+
end
|
302
|
+
end
|
303
|
+
end
|
304
|
+
end
|