xcocoapods 1.5.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (124) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +6303 -0
  3. data/LICENSE +28 -0
  4. data/README.md +80 -0
  5. data/bin/pod +56 -0
  6. data/bin/sandbox-pod +168 -0
  7. data/lib/cocoapods.rb +73 -0
  8. data/lib/cocoapods/command.rb +175 -0
  9. data/lib/cocoapods/command/cache.rb +28 -0
  10. data/lib/cocoapods/command/cache/clean.rb +90 -0
  11. data/lib/cocoapods/command/cache/list.rb +69 -0
  12. data/lib/cocoapods/command/env.rb +66 -0
  13. data/lib/cocoapods/command/init.rb +128 -0
  14. data/lib/cocoapods/command/install.rb +45 -0
  15. data/lib/cocoapods/command/ipc.rb +19 -0
  16. data/lib/cocoapods/command/ipc/list.rb +40 -0
  17. data/lib/cocoapods/command/ipc/podfile.rb +31 -0
  18. data/lib/cocoapods/command/ipc/podfile_json.rb +30 -0
  19. data/lib/cocoapods/command/ipc/repl.rb +51 -0
  20. data/lib/cocoapods/command/ipc/spec.rb +29 -0
  21. data/lib/cocoapods/command/ipc/update_search_index.rb +24 -0
  22. data/lib/cocoapods/command/lib.rb +11 -0
  23. data/lib/cocoapods/command/lib/create.rb +105 -0
  24. data/lib/cocoapods/command/lib/lint.rb +121 -0
  25. data/lib/cocoapods/command/list.rb +39 -0
  26. data/lib/cocoapods/command/options/project_directory.rb +36 -0
  27. data/lib/cocoapods/command/options/repo_update.rb +34 -0
  28. data/lib/cocoapods/command/outdated.rb +140 -0
  29. data/lib/cocoapods/command/repo.rb +29 -0
  30. data/lib/cocoapods/command/repo/add.rb +103 -0
  31. data/lib/cocoapods/command/repo/lint.rb +82 -0
  32. data/lib/cocoapods/command/repo/list.rb +93 -0
  33. data/lib/cocoapods/command/repo/push.rb +281 -0
  34. data/lib/cocoapods/command/repo/remove.rb +36 -0
  35. data/lib/cocoapods/command/repo/update.rb +28 -0
  36. data/lib/cocoapods/command/setup.rb +103 -0
  37. data/lib/cocoapods/command/spec.rb +112 -0
  38. data/lib/cocoapods/command/spec/cat.rb +51 -0
  39. data/lib/cocoapods/command/spec/create.rb +283 -0
  40. data/lib/cocoapods/command/spec/edit.rb +87 -0
  41. data/lib/cocoapods/command/spec/env_spec.rb +53 -0
  42. data/lib/cocoapods/command/spec/lint.rb +137 -0
  43. data/lib/cocoapods/command/spec/which.rb +43 -0
  44. data/lib/cocoapods/command/update.rb +101 -0
  45. data/lib/cocoapods/config.rb +347 -0
  46. data/lib/cocoapods/core_overrides.rb +1 -0
  47. data/lib/cocoapods/downloader.rb +190 -0
  48. data/lib/cocoapods/downloader/cache.rb +233 -0
  49. data/lib/cocoapods/downloader/request.rb +86 -0
  50. data/lib/cocoapods/downloader/response.rb +16 -0
  51. data/lib/cocoapods/executable.rb +222 -0
  52. data/lib/cocoapods/external_sources.rb +57 -0
  53. data/lib/cocoapods/external_sources/abstract_external_source.rb +205 -0
  54. data/lib/cocoapods/external_sources/downloader_source.rb +30 -0
  55. data/lib/cocoapods/external_sources/path_source.rb +55 -0
  56. data/lib/cocoapods/external_sources/podspec_source.rb +54 -0
  57. data/lib/cocoapods/gem_version.rb +5 -0
  58. data/lib/cocoapods/generator/acknowledgements.rb +107 -0
  59. data/lib/cocoapods/generator/acknowledgements/markdown.rb +44 -0
  60. data/lib/cocoapods/generator/acknowledgements/plist.rb +94 -0
  61. data/lib/cocoapods/generator/app_target_helper.rb +244 -0
  62. data/lib/cocoapods/generator/bridge_support.rb +22 -0
  63. data/lib/cocoapods/generator/constant.rb +19 -0
  64. data/lib/cocoapods/generator/copy_resources_script.rb +230 -0
  65. data/lib/cocoapods/generator/dummy_source.rb +31 -0
  66. data/lib/cocoapods/generator/embed_frameworks_script.rb +215 -0
  67. data/lib/cocoapods/generator/header.rb +103 -0
  68. data/lib/cocoapods/generator/info_plist_file.rb +116 -0
  69. data/lib/cocoapods/generator/module_map.rb +99 -0
  70. data/lib/cocoapods/generator/prefix_header.rb +60 -0
  71. data/lib/cocoapods/generator/umbrella_header.rb +46 -0
  72. data/lib/cocoapods/hooks_manager.rb +132 -0
  73. data/lib/cocoapods/installer.rb +703 -0
  74. data/lib/cocoapods/installer/analyzer.rb +972 -0
  75. data/lib/cocoapods/installer/analyzer/analysis_result.rb +87 -0
  76. data/lib/cocoapods/installer/analyzer/locking_dependency_analyzer.rb +98 -0
  77. data/lib/cocoapods/installer/analyzer/pod_variant.rb +67 -0
  78. data/lib/cocoapods/installer/analyzer/pod_variant_set.rb +157 -0
  79. data/lib/cocoapods/installer/analyzer/podfile_dependency_cache.rb +54 -0
  80. data/lib/cocoapods/installer/analyzer/sandbox_analyzer.rb +240 -0
  81. data/lib/cocoapods/installer/analyzer/specs_state.rb +84 -0
  82. data/lib/cocoapods/installer/analyzer/target_inspection_result.rb +53 -0
  83. data/lib/cocoapods/installer/analyzer/target_inspector.rb +260 -0
  84. data/lib/cocoapods/installer/installation_options.rb +158 -0
  85. data/lib/cocoapods/installer/pod_source_installer.rb +202 -0
  86. data/lib/cocoapods/installer/pod_source_preparer.rb +77 -0
  87. data/lib/cocoapods/installer/podfile_validator.rb +139 -0
  88. data/lib/cocoapods/installer/post_install_hooks_context.rb +132 -0
  89. data/lib/cocoapods/installer/pre_install_hooks_context.rb +51 -0
  90. data/lib/cocoapods/installer/source_provider_hooks_context.rb +34 -0
  91. data/lib/cocoapods/installer/user_project_integrator.rb +250 -0
  92. data/lib/cocoapods/installer/user_project_integrator/target_integrator.rb +463 -0
  93. data/lib/cocoapods/installer/user_project_integrator/target_integrator/xcconfig_integrator.rb +146 -0
  94. data/lib/cocoapods/installer/xcode.rb +8 -0
  95. data/lib/cocoapods/installer/xcode/pods_project_generator.rb +416 -0
  96. data/lib/cocoapods/installer/xcode/pods_project_generator/aggregate_target_installer.rb +181 -0
  97. data/lib/cocoapods/installer/xcode/pods_project_generator/app_host_installer.rb +84 -0
  98. data/lib/cocoapods/installer/xcode/pods_project_generator/file_references_installer.rb +334 -0
  99. data/lib/cocoapods/installer/xcode/pods_project_generator/pod_target_installer.rb +777 -0
  100. data/lib/cocoapods/installer/xcode/pods_project_generator/pod_target_integrator.rb +116 -0
  101. data/lib/cocoapods/installer/xcode/pods_project_generator/target_installation_result.rb +86 -0
  102. data/lib/cocoapods/installer/xcode/pods_project_generator/target_installer.rb +256 -0
  103. data/lib/cocoapods/installer/xcode/pods_project_generator/target_installer_helper.rb +68 -0
  104. data/lib/cocoapods/installer/xcode/target_validator.rb +147 -0
  105. data/lib/cocoapods/open-uri.rb +33 -0
  106. data/lib/cocoapods/project.rb +414 -0
  107. data/lib/cocoapods/resolver.rb +585 -0
  108. data/lib/cocoapods/resolver/lazy_specification.rb +79 -0
  109. data/lib/cocoapods/sandbox.rb +404 -0
  110. data/lib/cocoapods/sandbox/file_accessor.rb +444 -0
  111. data/lib/cocoapods/sandbox/headers_store.rb +146 -0
  112. data/lib/cocoapods/sandbox/path_list.rb +220 -0
  113. data/lib/cocoapods/sandbox/pod_dir_cleaner.rb +85 -0
  114. data/lib/cocoapods/sandbox/podspec_finder.rb +23 -0
  115. data/lib/cocoapods/sources_manager.rb +157 -0
  116. data/lib/cocoapods/target.rb +261 -0
  117. data/lib/cocoapods/target/aggregate_target.rb +338 -0
  118. data/lib/cocoapods/target/build_settings.rb +1075 -0
  119. data/lib/cocoapods/target/pod_target.rb +559 -0
  120. data/lib/cocoapods/user_interface.rb +459 -0
  121. data/lib/cocoapods/user_interface/error_report.rb +187 -0
  122. data/lib/cocoapods/user_interface/inspector_reporter.rb +109 -0
  123. data/lib/cocoapods/validator.rb +981 -0
  124. metadata +533 -0
@@ -0,0 +1,93 @@
1
+ module Pod
2
+ class Command
3
+ class Repo < Command
4
+ class List < Repo
5
+ self.summary = 'List repos'
6
+
7
+ self.description = <<-DESC
8
+ List the repos from the local spec-repos directory at `#{Config.instance.repos_dir}`.
9
+ DESC
10
+
11
+ def self.options
12
+ [['--count-only', 'Show the total number of repos']].concat(super)
13
+ end
14
+
15
+ def initialize(argv)
16
+ @count_only = argv.flag?('count-only')
17
+ super
18
+ end
19
+
20
+ # @output Examples:
21
+ #
22
+ # master
23
+ # - type: git (master)
24
+ # - URL: https://github.com/CocoaPods/Specs.git
25
+ # - path: /Users/lascorbe/.cocoapods/repos/master
26
+ #
27
+ # test
28
+ # - type: local copy
29
+ # - URL: file:///Users/lascorbe/.cocoapods/repos/test
30
+ # - path: /Users/lascorbe/.cocoapods/repos/test
31
+ #
32
+ def run
33
+ sources = config.sources_manager.all
34
+ print_sources(sources) unless @count_only
35
+ print_count_of_sources(sources)
36
+ end
37
+
38
+ private
39
+
40
+ # Pretty-prints the source at the given path.
41
+ #
42
+ # @param [Source] source
43
+ # The source repository to be printed.
44
+ #
45
+ # @return [void]
46
+ #
47
+ def print_source(source)
48
+ if source.git?
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})"
53
+ end
54
+ else
55
+ UI.puts '- Type: local'
56
+ end
57
+
58
+ UI.puts "- URL: #{source.url}"
59
+ UI.puts "- Path: #{source.repo}"
60
+ end
61
+
62
+ # Pretty-prints the given sources.
63
+ #
64
+ # @param [Array<Source>] sources
65
+ # The sources that should be printed.
66
+ #
67
+ # @return [void]
68
+ #
69
+ def print_sources(sources)
70
+ sources.each do |source|
71
+ UI.title source.name do
72
+ print_source(source)
73
+ end
74
+ end
75
+ UI.puts "\n"
76
+ end
77
+
78
+ # Pretty-prints the number of sources.
79
+ #
80
+ # @param [Array<Source>] sources
81
+ # The sources whose count should be printed.
82
+ #
83
+ # @return [void]
84
+ #
85
+ def print_count_of_sources(sources)
86
+ number_of_repos = sources.length
87
+ repo_string = number_of_repos != 1 ? 'repos' : 'repo'
88
+ UI.puts "#{number_of_repos} #{repo_string}".green
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,281 @@
1
+ require 'tempfile'
2
+ require 'fileutils'
3
+ require 'active_support/core_ext/string/inflections'
4
+
5
+ module Pod
6
+ class Command
7
+ class Repo < Command
8
+ class Push < Repo
9
+ self.summary = 'Push new specifications to a spec-repo'
10
+
11
+ self.description = <<-DESC
12
+ Validates `NAME.podspec` or `*.podspec` in the current working dir,
13
+ creates a directory and version folder for the pod in the local copy of
14
+ `REPO` (#{Config.instance.repos_dir}/[REPO]), copies the podspec file into the
15
+ version directory, and finally it pushes `REPO` to its remote.
16
+ DESC
17
+
18
+ self.arguments = [
19
+ CLAide::Argument.new('REPO', true),
20
+ CLAide::Argument.new('NAME.podspec', false),
21
+ ]
22
+
23
+ def self.options
24
+ [
25
+ ['--allow-warnings', 'Allows pushing even if there are warnings'],
26
+ ['--use-libraries', 'Linter uses static libraries to install the spec'],
27
+ ['--sources=https://github.com/artsy/Specs,master', 'The sources from which to pull dependent pods ' \
28
+ '(defaults to all available repos). ' \
29
+ 'Multiple sources must be comma-delimited.'],
30
+ ['--local-only', 'Does not perform the step of pushing REPO to its remote'],
31
+ ['--no-private', 'Lint includes checks that apply only to public repos'],
32
+ ['--skip-import-validation', 'Lint skips validating that the pod can be imported'],
33
+ ['--skip-tests', 'Lint skips building and running tests during validation'],
34
+ ['--commit-message="Fix bug in pod"', 'Add custom commit message. ' \
35
+ 'Opens default editor if no commit message is specified.'],
36
+ ['--use-json', 'Push JSON spec to repo'],
37
+ ['--swift-version=VERSION', 'The SWIFT_VERSION that should be used when linting the spec. ' \
38
+ 'This takes precedence over a .swift-version file.'],
39
+ ['--no-overwrite', 'Disallow pushing that would overwrite an existing spec.'],
40
+ ].concat(super)
41
+ end
42
+
43
+ def initialize(argv)
44
+ @allow_warnings = argv.flag?('allow-warnings')
45
+ @local_only = argv.flag?('local-only')
46
+ @repo = argv.shift_argument
47
+ @source = source_for_repo
48
+ @source_urls = argv.option('sources', config.sources_manager.all.map(&:url).join(',')).split(',')
49
+ @podspec = argv.shift_argument
50
+ @use_frameworks = !argv.flag?('use-libraries')
51
+ @private = argv.flag?('private', true)
52
+ @message = argv.option('commit-message')
53
+ @commit_message = argv.flag?('commit-message', false)
54
+ @use_json = argv.flag?('use-json')
55
+ @swift_version = argv.option('swift-version', nil)
56
+ @skip_import_validation = argv.flag?('skip-import-validation', false)
57
+ @skip_tests = argv.flag?('skip-tests', false)
58
+ @allow_overwrite = argv.flag?('overwrite', true)
59
+ super
60
+ end
61
+
62
+ def validate!
63
+ super
64
+ help! 'A spec-repo name or url is required.' unless @repo
65
+ unless @source && @source.repo.directory?
66
+ raise Informative,
67
+ "Unable to find the `#{@repo}` repo. " \
68
+ 'If it has not yet been cloned, add it via `pod repo add`.'
69
+ end
70
+ end
71
+
72
+ def run
73
+ open_editor if @commit_message && @message.nil?
74
+ check_if_master_repo
75
+ validate_podspec_files
76
+ check_repo_status
77
+ update_repo
78
+ add_specs_to_repo
79
+ push_repo unless @local_only
80
+ end
81
+
82
+ #---------------------------------------------------------------------#
83
+
84
+ private
85
+
86
+ # @!group Push sub-steps
87
+
88
+ extend Executable
89
+ executable :git
90
+
91
+ # Open default editor to allow users to enter commit message
92
+ #
93
+ def open_editor
94
+ return if ENV['EDITOR'].nil?
95
+
96
+ file = Tempfile.new('cocoapods')
97
+ File.chmod(0777, file.path)
98
+ file.close
99
+
100
+ system("#{ENV['EDITOR']} #{file.path}")
101
+ @message = File.read file.path
102
+ end
103
+
104
+ # Temporary check to ensure that users do not push accidentally private
105
+ # specs to the master repo.
106
+ #
107
+ def check_if_master_repo
108
+ remotes = `git -C "#{repo_dir}" remote -v 2>&1`
109
+ master_repo_urls = [
110
+ 'git@github.com:CocoaPods/Specs.git',
111
+ 'https://github.com/CocoaPods/Specs.git',
112
+ ]
113
+ is_master_repo = master_repo_urls.any? do |url|
114
+ remotes.include?(url)
115
+ end
116
+
117
+ if is_master_repo
118
+ raise Informative, 'To push to the CocoaPods master repo use ' \
119
+ "the `pod trunk push` command.\n\nIf you are using a fork of " \
120
+ 'the master repo for private purposes we recommend to migrate ' \
121
+ 'to a clean private repo. To disable this check remove the ' \
122
+ 'remote pointing to the CocoaPods master repo.'
123
+ end
124
+ end
125
+
126
+ # Performs a full lint against the podspecs.
127
+ #
128
+ def validate_podspec_files
129
+ UI.puts "\nValidating #{'spec'.pluralize(count)}".yellow
130
+ podspec_files.each do |podspec|
131
+ validator = Validator.new(podspec, @source_urls)
132
+ validator.allow_warnings = @allow_warnings
133
+ validator.use_frameworks = @use_frameworks
134
+ validator.ignore_public_only_results = @private
135
+ validator.swift_version = @swift_version
136
+ validator.skip_import_validation = @skip_import_validation
137
+ validator.skip_tests = @skip_tests
138
+ begin
139
+ validator.validate
140
+ rescue => e
141
+ raise Informative, "The `#{podspec}` specification does not validate." \
142
+ "\n\n#{e.message}"
143
+ end
144
+ raise Informative, "The `#{podspec}` specification does not validate." unless validator.validated?
145
+ end
146
+ end
147
+
148
+ # Checks that the repo is clean.
149
+ #
150
+ # @raise If the repo is not clean.
151
+ #
152
+ # @todo Add specs for staged and unstaged files.
153
+ #
154
+ # @todo Gracefully handle the case where source is not under git
155
+ # source control.
156
+ #
157
+ # @return [void]
158
+ #
159
+ def check_repo_status
160
+ clean = `git -C "#{repo_dir}" status --porcelain 2>&1` == ''
161
+ raise Informative, "The repo `#{@repo}` at #{UI.path repo_dir} is not clean" unless clean
162
+ end
163
+
164
+ # Updates the git repo against the remote.
165
+ #
166
+ # @return [void]
167
+ #
168
+ def update_repo
169
+ UI.puts "Updating the `#{@repo}' repo\n".yellow
170
+ UI.puts `git -C "#{repo_dir}" pull 2>&1`
171
+ end
172
+
173
+ # Commits the podspecs to the source, which should be a git repo.
174
+ #
175
+ # @note The pre commit hook of the repo is skipped as the podspecs have
176
+ # already been linted.
177
+ #
178
+ # @return [void]
179
+ #
180
+ def add_specs_to_repo
181
+ UI.puts "\nAdding the #{'spec'.pluralize(count)} to the `#{@repo}' repo\n".yellow
182
+ podspec_files.each do |spec_file|
183
+ spec = Pod::Specification.from_file(spec_file)
184
+ output_path = @source.pod_path(spec.name) + spec.version.to_s
185
+ if @message && !@message.empty?
186
+ message = @message
187
+ elsif output_path.exist?
188
+ unless @allow_overwrite
189
+ raise Informative, "#{spec} already exists and overwriting has been disabled."
190
+ end
191
+ message = "[Fix] #{spec}"
192
+ elsif output_path.dirname.directory?
193
+ message = "[Update] #{spec}"
194
+ else
195
+ message = "[Add] #{spec}"
196
+ end
197
+ FileUtils.mkdir_p(output_path)
198
+
199
+ if @use_json
200
+ json_file_name = "#{spec.name}.podspec.json"
201
+ json_file = File.join(output_path, json_file_name)
202
+ File.open(json_file, 'w') { |file| file.write(spec.to_pretty_json) }
203
+ else
204
+ FileUtils.cp(spec_file, output_path)
205
+ end
206
+
207
+ # only commit if modified
208
+ if repo_git('status', '--porcelain').include?(spec.name)
209
+ UI.puts " - #{message}"
210
+ repo_git('add', spec.name)
211
+ repo_git('commit', '--no-verify', '-m', message)
212
+ else
213
+ UI.puts " - [No change] #{spec}"
214
+ end
215
+ end
216
+ end
217
+
218
+ # Pushes the git repo against the remote.
219
+ #
220
+ # @return [void]
221
+ #
222
+ def push_repo
223
+ UI.puts "\nPushing the `#{@repo}' repo\n".yellow
224
+ repo_git('-C', repo_dir, 'push', 'origin', 'HEAD:refs/for/master')
225
+ end
226
+
227
+ #---------------------------------------------------------------------#
228
+
229
+ private
230
+
231
+ # @!group Private helpers
232
+
233
+ # @return result of calling the git! with args in repo_dir
234
+ #
235
+ def repo_git(*args)
236
+ git!(['-C', repo_dir] + args)
237
+ end
238
+
239
+ # @return [Pathname] The directory of the repository.
240
+ #
241
+ def repo_dir
242
+ @source.specs_dir
243
+ end
244
+
245
+ # @return [Array<Pathname>] The path of the specifications to push.
246
+ #
247
+ def podspec_files
248
+ if @podspec
249
+ path = Pathname(@podspec)
250
+ raise Informative, "Couldn't find #{@podspec}" unless path.exist?
251
+ [path]
252
+ else
253
+ files = Pathname.glob('*.podspec{,.json}')
254
+ raise Informative, "Couldn't find any podspec files in current directory" if files.empty?
255
+ files
256
+ end
257
+ end
258
+
259
+ # @return [Integer] The number of the podspec files to push.
260
+ #
261
+ def count
262
+ podspec_files.count
263
+ end
264
+
265
+ # Returns source for @repo
266
+ #
267
+ # @note If URL is invalid or repo doesn't exist, validate! will throw the error
268
+ #
269
+ # @return [Source]
270
+ #
271
+ def source_for_repo
272
+ config.sources_manager.source_with_name_or_url(@repo) unless @repo.nil?
273
+ rescue
274
+ nil
275
+ end
276
+
277
+ #---------------------------------------------------------------------#
278
+ end
279
+ end
280
+ end
281
+ end
@@ -0,0 +1,36 @@
1
+ module Pod
2
+ class Command
3
+ class Repo < Command
4
+ class Remove < Repo
5
+ self.summary = 'Remove a spec repo'
6
+
7
+ self.description = <<-DESC
8
+ Deletes the remote named `NAME` from the local spec-repos directory at `#{Config.instance.repos_dir}`.
9
+ DESC
10
+
11
+ self.arguments = [
12
+ CLAide::Argument.new('NAME', true),
13
+ ]
14
+
15
+ def initialize(argv)
16
+ @name = argv.shift_argument
17
+ super
18
+ end
19
+
20
+ def validate!
21
+ super
22
+ help! 'Deleting a repo needs a `NAME`.' unless @name
23
+ help! "repo #{@name} does not exist" unless File.directory?(dir)
24
+ help! "You do not have permission to delete the #{@name} repository." \
25
+ 'Perhaps try prefixing this command with sudo.' unless File.writable?(dir)
26
+ end
27
+
28
+ def run
29
+ UI.section("Removing spec repo `#{@name}`") do
30
+ FileUtils.rm_rf(dir)
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,28 @@
1
+ module Pod
2
+ class Command
3
+ class Repo < Command
4
+ class Update < Repo
5
+ self.summary = 'Update a spec repo'
6
+
7
+ self.description = <<-DESC
8
+ Updates the local clone of the spec-repo `NAME`. If `NAME` is omitted
9
+ this will update all spec-repos in `#{Config.instance.repos_dir}`.
10
+ DESC
11
+
12
+ self.arguments = [
13
+ CLAide::Argument.new('NAME', false),
14
+ ]
15
+
16
+ def initialize(argv)
17
+ @name = argv.shift_argument
18
+ super
19
+ end
20
+
21
+ def run
22
+ show_output = !config.silent?
23
+ config.sources_manager.update(@name, show_output)
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,103 @@
1
+ require 'fileutils'
2
+
3
+ module Pod
4
+ class Command
5
+ class Setup < Command
6
+ self.summary = 'Setup the CocoaPods environment'
7
+
8
+ self.description = <<-DESC
9
+ Creates a directory at `#{Config.instance.repos_dir}` which will hold your spec-repos.
10
+ This is where it will create a clone of the public `master` spec-repo from:
11
+
12
+ https://github.com/CocoaPods/Specs
13
+
14
+ If the clone already exists, it will ensure that it is up-to-date.
15
+ DESC
16
+
17
+ extend Executable
18
+ executable :git
19
+
20
+ def run
21
+ UI.section 'Setting up CocoaPods master repo' do
22
+ if master_repo_dir.exist?
23
+ set_master_repo_url
24
+ set_master_repo_branch
25
+ update_master_repo
26
+ else
27
+ add_master_repo
28
+ end
29
+ end
30
+
31
+ UI.puts 'Setup completed'.green
32
+ end
33
+
34
+ #--------------------------------------#
35
+
36
+ # @!group Setup steps
37
+
38
+ # Sets the url of the master repo according to whether it is push.
39
+ #
40
+ # @return [void]
41
+ #
42
+ def set_master_repo_url
43
+ Dir.chdir(master_repo_dir) do
44
+ git('remote', 'set-url', 'origin', url)
45
+ end
46
+ end
47
+
48
+ # Adds the master repo from the remote.
49
+ #
50
+ # @return [void]
51
+ #
52
+ def add_master_repo
53
+ cmd = ['master', url, 'master', '--progress']
54
+ Repo::Add.parse(cmd).run
55
+ end
56
+
57
+ # Updates the master repo against the remote.
58
+ #
59
+ # @return [void]
60
+ #
61
+ def update_master_repo
62
+ show_output = !config.silent?
63
+ config.sources_manager.update('master', show_output)
64
+ end
65
+
66
+ # Sets the repo to the master branch.
67
+ #
68
+ # @note This is not needed anymore as it was used for CocoaPods 0.6
69
+ # release candidates.
70
+ #
71
+ # @return [void]
72
+ #
73
+ def set_master_repo_branch
74
+ Dir.chdir(master_repo_dir) do
75
+ git %w(checkout master)
76
+ end
77
+ end
78
+
79
+ #--------------------------------------#
80
+
81
+ # @!group Private helpers
82
+
83
+ # @return [String] the url to use according to whether push mode should
84
+ # be enabled.
85
+ #
86
+ def url
87
+ self.class.read_only_url
88
+ end
89
+
90
+ # @return [String] the read only url of the master repo.
91
+ #
92
+ def self.read_only_url
93
+ 'https://github.com/CocoaPods/Specs.git'
94
+ end
95
+
96
+ # @return [Pathname] the directory of the master repo.
97
+ #
98
+ def master_repo_dir
99
+ config.sources_manager.master_repo_dir
100
+ end
101
+ end
102
+ end
103
+ end