cocoapods-bb-PodAssistant 0.1.5

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.
Files changed (33) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +22 -0
  3. data/README.md +48 -0
  4. data/lib/cocoapods-bb-PodAssistant/babybus/business/babybus_install_environment.rb +129 -0
  5. data/lib/cocoapods-bb-PodAssistant/babybus/helpers/babybus_info_plist_helper.rb +92 -0
  6. data/lib/cocoapods-bb-PodAssistant/babybus/installer/post_install_hooks.rb +111 -0
  7. data/lib/cocoapods-bb-PodAssistant/command/PodAssistant.rb +44 -0
  8. data/lib/cocoapods-bb-PodAssistant/command/linkline/linkline.rb +68 -0
  9. data/lib/cocoapods-bb-PodAssistant/command/linkline/target-linkline.rb +9 -0
  10. data/lib/cocoapods-bb-PodAssistant/command/linkline/targetValidator-linkline.rb +25 -0
  11. data/lib/cocoapods-bb-PodAssistant/command/linkline/targetdefinition-linkline.rb +37 -0
  12. data/lib/cocoapods-bb-PodAssistant/command/stable/podfile-linkline.rb +9 -0
  13. data/lib/cocoapods-bb-PodAssistant/command/stable/stable.rb +168 -0
  14. data/lib/cocoapods-bb-PodAssistant/command.rb +9 -0
  15. data/lib/cocoapods-bb-PodAssistant/config/cache_path.rb +16 -0
  16. data/lib/cocoapods-bb-PodAssistant/config/source_manager.rb +389 -0
  17. data/lib/cocoapods-bb-PodAssistant/config/stable_source.rb +7 -0
  18. data/lib/cocoapods-bb-PodAssistant/config/stable_specs.rb +27 -0
  19. data/lib/cocoapods-bb-PodAssistant/gem_version.rb +3 -0
  20. data/lib/cocoapods-bb-PodAssistant/helpers/git_cmd_helper.rb +73 -0
  21. data/lib/cocoapods-bb-PodAssistant/helpers/pod_module_helper.rb +246 -0
  22. data/lib/cocoapods-bb-PodAssistant/helpers/pod_utils.rb +128 -0
  23. data/lib/cocoapods-bb-PodAssistant/helpers/stable_env_helper.rb +36 -0
  24. data/lib/cocoapods-bb-PodAssistant/helpers/stable_manager_helper.rb +85 -0
  25. data/lib/cocoapods-bb-PodAssistant/helpers/yaml_files_helper.rb +72 -0
  26. data/lib/cocoapods-bb-PodAssistant/helpers.rb +6 -0
  27. data/lib/cocoapods-bb-PodAssistant/podfile.rb +392 -0
  28. data/lib/cocoapods-bb-PodAssistant/source_provider_hook.rb +335 -0
  29. data/lib/cocoapods-bb-PodAssistant.rb +1 -0
  30. data/lib/cocoapods_plugin.rb +9 -0
  31. data/spec/command/PodAssistant_spec.rb +12 -0
  32. data/spec/spec_helper.rb +50 -0
  33. metadata +132 -0
@@ -0,0 +1,168 @@
1
+ require 'cocoapods-bb-PodAssistant/config/source_manager'
2
+ require 'cocoapods-bb-PodAssistant/config/cache_path'
3
+ require 'cocoapods-bb-PodAssistant/helpers'
4
+
5
+ module Pod
6
+
7
+ # class StableOptions
8
+ # # define business specs,defalut is stable_specs
9
+ # option :business_specs, "stable_specs"
10
+
11
+ # # define custom lockSpecs tag
12
+ # option :tag, ""
13
+
14
+ # # define custom lockSpecs branch
15
+ # option :branch, ""
16
+ # end
17
+
18
+ class Command
19
+ class Stable < Command
20
+ require 'fileutils'
21
+ require 'cocoapods/executable.rb'
22
+ extend Executable
23
+ executable :git
24
+
25
+ self.summary = '拉取稳定lock配置'
26
+ self.description = <<-DESC
27
+ 拉取稳定lock配置插件。利用版本比对进行更新配置实现对组件版本控制管理。
28
+ DESC
29
+
30
+ self.arguments = [
31
+ CLAide::Argument.new('Podfile', false)
32
+ ]
33
+ def self.options
34
+ [
35
+ ['--init', '初始化项目yml配置,根据当前项目Podfile.lock生成'],
36
+ ['--sync', '同步远端yml配置,更新项目yml配置'],
37
+ ['--install', '命令同执行`pod install操作`'],
38
+ ['--update', '命令同执行`pod update操作`'],
39
+ ['--update-pod', '命令同执行`pod update <组件>操作`,更新yml配置组件版本信息,多个组件使用`,`或者`空格`隔开,注意⚠️ 使用`空格`需要使用双引号'],
40
+ ].concat(super)
41
+ end
42
+
43
+ def initialize(argv)
44
+ @names = argv.arguments! unless argv.arguments.empty?
45
+ @help = argv.flag?('help')
46
+ @init = argv.flag?('init')
47
+ @sync = argv.flag?('sync')
48
+ # install操作
49
+ @install = argv.flag?('install')
50
+ @update = argv.flag?('update')
51
+ # update组件数据支持多个使用`,`或者`空格`隔开
52
+ update_pods = argv.option('update-pod','')
53
+ if !update_pods.empty?
54
+ if update_pods.include?(' ')
55
+ @update_pods = update_pods.split(' ') unless update_pods.nil?
56
+ else update_pods.include?(',')
57
+ @update_pods = update_pods.split(',') unless update_pods.nil?
58
+ end
59
+ end
60
+ super
61
+ end
62
+ def validate!
63
+ super
64
+ banner! if @help
65
+ end
66
+
67
+ #help load podfile option
68
+ def stable!(source, options = {})
69
+ @ll_stable_source = source
70
+ if options.has_key?(:specs)
71
+ @businessSpec = options[:specs]
72
+ puts "当前业务使用源=>#{@businessSpec}"
73
+ end
74
+ @ll_stable_tag = options[:tag] if options.has_key?(:tag)
75
+ @ll_stable_branch = options[:branch] if options.has_key?(:branch)
76
+ @cache = BB::Cache.new()
77
+ configGitPath(@cache.cachePath)
78
+ end
79
+
80
+ ######################################## Main ########################################
81
+
82
+ def run
83
+ # begin
84
+ source_manager = BB::SourceManager.new(@businessSpec)
85
+ if @init
86
+ puts "[PodAssistant] 开始配置生成当前项目yml文件".yellow
87
+ # 生成本地yml配置
88
+ source_manager.generate_localStable
89
+ puts "[PodAssistant] `pod stable --init` complete!".green
90
+ elsif @install
91
+ puts "[PodAssistant] 执行 $ pod install".yellow
92
+ system "pod install"
93
+ puts "[PodAssistant] `pod stable --install` complete!".green
94
+ elsif @update
95
+ puts "[PodAssistant] 执行 $ pod update".yellow
96
+ system "pod update"
97
+ puts "[PodAssistant] `pod stable --update` complete!".green
98
+ elsif @update_pods
99
+ # 更新单个组件
100
+ puts "更新pod组件#{@update_pods} count:#{@update_pods.count}".yellow
101
+ source_manager.update_podmodules(@update_pods)
102
+ podnames = @update_pods.join(" ")
103
+ puts "[PodAssistant] 执行 $ pod update #{podnames}".yellow
104
+ system "pod update #{podnames}"
105
+ source_manager.update_local_stable_from_podmodules(@update_pods)
106
+ podnames = @update_pods.join(",")
107
+ puts "[PodAssistant] `pod stable --update-pod=#{podnames}` complete!".green
108
+ elsif @sync
109
+ puts "开始合并远端lock数据".yellow
110
+ ll_load_stable
111
+ #2、clone origin lock spec to cache dir
112
+ ll_cloneStable
113
+ #3、fetch newest code
114
+ ll_fetch_stale_git
115
+ # 数据合并
116
+ source_manager.merge_stable_data
117
+ puts "[PodAssistant] `pod stable` complete!".green
118
+ else
119
+ puts "[PodAssistant] `pod stable` 帮助文档请查看👇".yellow
120
+ banner!
121
+ end
122
+ # rescue => exception
123
+ # puts "[pod stable] error(已捕获): #{exception}".red
124
+ # end
125
+
126
+ end
127
+
128
+ private
129
+ ######################################## API ########################################
130
+ def ll_load_stable
131
+ unless File.exist?(File.join(Pathname.pwd, "Podfile"))
132
+ err_msg = "- Error: #{File.join(Pathname.pwd, "Podfile")} is not exit"
133
+ Pod::UI.puts "#{err_msg}".send(:red)
134
+ exit -9001
135
+ end
136
+
137
+ #获取podfile 内容
138
+ #1、删除所有注释行,避免干扰
139
+ #2、正则匹配,筛选出stable 方法
140
+ #3、执行stable 方法,获取配置
141
+ podfileContent = File.read(File.join(Pathname.pwd, "Podfile"))
142
+ podfileContent_vaild = podfileContent.lines.reject { |line| line.strip.start_with?("#") }.join
143
+ stableCommand = podfileContent_vaild.match(/^\s*stable!\s*'([^']+)'(?:,\s*(\w+):\s*'([^']+)')*/m)
144
+ unless stableCommand
145
+ err_msg = "- Error: not stable define in the podfile! you can define like【stable! 'https://git.babybus.co/babybus/ios/Specs/stable-specs.git', specs:'global_stable_specs'】in podfile"
146
+ Pod::UI.puts "#{err_msg}".send(:red)
147
+ exit -9002
148
+ end
149
+ eval(stableCommand.to_s)
150
+ end
151
+ def ll_cloneStable
152
+ cachePath = @cache.cachePath
153
+ unless Dir.exist?(File.join(cachePath))
154
+ clonePath = File.dirname(cachePath)
155
+ FileUtils.mkdir_p clonePath
156
+ git_clone(@stable_source,clonePath)
157
+ end
158
+ end
159
+
160
+ def ll_fetch_stale_git
161
+ git_reset
162
+ git_fetch
163
+ git_checkout_and_pull(@stable_source, @stable_branch, @stable_tag)
164
+ end
165
+
166
+ end
167
+ end
168
+ end
@@ -0,0 +1,9 @@
1
+ require 'cocoapods-bb-PodAssistant/command/PodAssistant'
2
+ #stable
3
+ require 'cocoapods-bb-PodAssistant/command/stable/stable'
4
+ require 'cocoapods-bb-PodAssistant/command/stable/podfile-linkline'
5
+ #linkline
6
+ require 'cocoapods-bb-PodAssistant/command/linkline/linkline'
7
+ require 'cocoapods-bb-PodAssistant/command/linkline/target-linkline'
8
+ require 'cocoapods-bb-PodAssistant/command/linkline/targetdefinition-linkline'
9
+ require 'cocoapods-bb-PodAssistant/command/linkline/targetValidator-linkline'
@@ -0,0 +1,16 @@
1
+ require 'cocoapods-bb-PodAssistant/config/stable_source'
2
+
3
+ module BB
4
+ class Cache
5
+ def initialize(stable_source = nil)
6
+ if stable_source.nil?
7
+ stable_source = StableSource.stable_default_source
8
+ end
9
+ @stable_source = stable_source
10
+ end
11
+
12
+ def cachePath()
13
+ File.join(File.expand_path('~/.cache'), 'cocoapods-bb-PodAssistant','stable',@stable_source.split('/').last.chomp('.git').to_s)
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,389 @@
1
+ require 'cocoapods-bb-PodAssistant/helpers'
2
+ require 'cocoapods-bb-PodAssistant/config/stable_specs'
3
+ require 'cocoapods-bb-PodAssistant/helpers/stable_manager_helper'
4
+ require 'cocoapods-core'
5
+
6
+ # 数据源管理
7
+ module BB
8
+ class SourceManager
9
+ def initialize(businessSpecName = nil)
10
+ @businessSpecName = businessSpecName
11
+ @stableMgr = BB::StableManager.new()
12
+ end
13
+
14
+ # 公共源路径(远端)
15
+ def public_stable_yaml
16
+ return @stableMgr.public_stable_yaml
17
+ end
18
+
19
+ # 业务源路径(远端)
20
+ def business_stable_yaml
21
+ return @stableMgr.business_stable_yaml(@businessSpecName)
22
+ end
23
+
24
+ # 本地源路径
25
+ def local_stable_yaml
26
+ return @stableMgr.local_stable_yaml
27
+ end
28
+
29
+ # 产品线本地lock数据
30
+ def fetch_local_stable_datas
31
+ localSpec = BB::StableSpecs.new()
32
+ return localSpec.readData(local_stable_yaml)
33
+ end
34
+
35
+ # 远端公共lock数据
36
+ def fetch_origin_stable_datas
37
+ # 策略:公共数据包含通用数据 + 业务线数据
38
+ pubSpec = BB::StableSpecs.new()
39
+ common_data = pubSpec.readData(public_stable_yaml)
40
+ # 业务线数据
41
+ business_config_file = business_stable_yaml
42
+ if business_config_file
43
+ if File.exist?(business_config_file)
44
+ busimessSpec = BB::StableSpecs.new()
45
+ busimess_data = busimessSpec.readData(business_config_file)
46
+ else
47
+ puts "业务线公共配置文件#{business_config_file}不存在,请确认!!!". send(:yellow)
48
+ exit
49
+ end
50
+ end
51
+ if busimess_data
52
+ # 数据合并操作(策略:业务线公共盖通用数据,理论不存在该情况)
53
+ newData = common_data
54
+ listdata = newData[YAML_CONFIG_LIST_KEY]
55
+ removedata = newData[YAML_CONFIG_REMOVE_KEY]
56
+ dependenciesdata = newData[YAML_CONFIG_DEPENDENCIES_KEY]
57
+ busimess_data.each do | key, val|
58
+ if key == YAML_CONFIG_LIST_KEY
59
+ if val.is_a?(Hash)
60
+ val.each do |list_name,list_ver|
61
+ listdata[list_name] = list_ver
62
+ end
63
+ end
64
+ elsif key == YAML_CONFIG_REMOVE_KEY
65
+ if val.is_a?(Array)
66
+ val.each do |remove_name|
67
+ removedata.push(remove_name)
68
+ end
69
+ end
70
+ elsif key == YAML_CONFIG_DEPENDENCIES_KEY
71
+ if val.is_a?(Hash)
72
+ val.each do |dependencies_name,dependencies_val|
73
+ dependenciesdata[dependencies_name] = dependencies_val
74
+ end
75
+ end
76
+ end
77
+ end
78
+ return newData
79
+ end
80
+ return common_data
81
+ end
82
+
83
+ # 更新本地lock数据
84
+ def update_localstable_datas(stable_lock)
85
+ localSpec = BB::StableSpecs.new()
86
+ localSpec.writeData(local_stable_yaml, stable_lock)
87
+ end
88
+
89
+ # 合并stable数据
90
+ def merge_stable_data()
91
+ #4、show origin_stable_lock diff with local_stable_lock
92
+ new_stable_spec = compare_specs(fetch_local_stable_datas, fetch_origin_stable_datas)
93
+
94
+ #5、rewirte local_stable_lock with origin_stable_lock
95
+ update_localstable_datas(new_stable_spec)
96
+ end
97
+
98
+ ######################################## Help ########################################
99
+ # compare tags (>=)
100
+ def versionGreatOrEqual(tag1, tag2)
101
+ if (tag1.is_a? String) && (tag2.is_a? String) && tag1.to_i >= tag2.to_i
102
+ return true
103
+ else
104
+ return false
105
+ end
106
+ return true
107
+ end
108
+
109
+ # compare tags (>)
110
+ def versionGreat(tag1, tag2)
111
+ result = versionGreatOrEqual(tag1,tag2)
112
+ if result == true && tag1 == tag2
113
+ return false
114
+ end
115
+ return result
116
+ end
117
+
118
+ # compare specs 参数1:本地,参数2:远端
119
+ def compare_specs(local_specs, common_specs)
120
+ added_projects = []
121
+ updated_projects = []
122
+ rollbacked_projects = []
123
+ deleted_projects = []
124
+ new_specs = local_specs
125
+
126
+ listdata = common_specs[YAML_CONFIG_LIST_KEY]
127
+ removedata = common_specs[YAML_CONFIG_REMOVE_KEY]
128
+ dependenciesdata = common_specs[YAML_CONFIG_DEPENDENCIES_KEY]
129
+
130
+ # puts "local_specs:#{local_specs}".send(:green)
131
+ # puts "common_specs:#{common_specs}".send(:green)
132
+ need_update_pod_lists={}
133
+ # step.1 匹配组件版本信息
134
+ listdata.each do |name, version|
135
+ name = name.to_s
136
+ local_version = local_specs[name]
137
+ if local_version.nil?
138
+ # 本地不存在这个数据
139
+ elsif local_version != version
140
+ # puts "merge name:#{name} local_version:#{local_version} route_version:#{version}".red
141
+ # 版本不一致
142
+ if (version.is_a? String) && (local_version.is_a? String)
143
+ end
144
+ if versionGreat(version, local_version)
145
+ updated_projects << "【#{name}】 (#{local_version}) -> (#{version.to_s.send(:yellow)})"
146
+ else
147
+ rollbacked_projects << "【#{name}】 (#{version.to_s.send(:red)}) <- (#{local_version})"
148
+ end
149
+ podCoreName = subspec_podname(name)
150
+ need_update_pod_lists[podCoreName] = version
151
+ end
152
+ end
153
+ # 解决subspec组件同步更新版本信息
154
+ need_update_pod_lists.each do |podCoreName, version|
155
+ new_specs.keys.each do |podName|
156
+ if (podName == podCoreName) || has_pod_subspec(podName, podCoreName)
157
+ new_specs[podName] = version
158
+ end
159
+ end
160
+ end
161
+ # step.2 匹配组件新增
162
+ dependenciesdata.each do |name, array|
163
+ name = name.to_s
164
+ version = listdata[name]
165
+ unless version
166
+ puts "公共库缺少[#{name}]版本依赖 cls:#{listdata.class} listdata:#{listdata}".send(:red)
167
+ exit
168
+ end
169
+ local_exist_ver = new_specs[name]
170
+ if local_exist_ver.nil?
171
+ new_specs[name] = version
172
+ added_projects << "【#{name}】 (#{version.to_s.send(:green)})"
173
+ end
174
+ if array.is_a?(Array)
175
+ array.each do |name|
176
+ name = name.to_s
177
+ local_exist_ver = new_specs[name]
178
+ if local_exist_ver.nil?
179
+ new_specs[name] = version
180
+ added_projects << "【#{name}】 (#{version.to_s.send(:green)})"
181
+ end
182
+ end
183
+ end
184
+ end
185
+ # step.3 匹配组件移除
186
+ removedata.each do |name|
187
+ name = name.to_s
188
+ # local_exist_ver = new_specs[name]
189
+ version = listdata[name]
190
+ if version
191
+ deleted_projects << "【#{name}】 (#{"delete".send(:red)}) <- (#{version})"
192
+ end
193
+ new_specs.delete(name)
194
+ end
195
+ showMergeLog(added_projects, updated_projects, rollbacked_projects, deleted_projects)
196
+ # puts "new_specs:#{new_specs}".send(:red)
197
+ return new_specs
198
+ end
199
+
200
+ def showMergeLog(added, updated, rollbacked, deleted)
201
+ #31m: 红色 32m:绿色 33m:黄色 34m:蓝色
202
+ #puts "\e[34m#{string}\e[0m"
203
+ if added.any?
204
+ puts "新增了以下项目:".send(:green)
205
+ puts added.join("\n")
206
+ end
207
+
208
+ if updated.any?
209
+ puts "更新了以下项目:". send(:yellow)
210
+ puts updated.join("\n")
211
+ end
212
+
213
+ if rollbacked.any?
214
+ puts "回滚了以下项目:".send(:red)
215
+ puts rollbacked.join("\n")
216
+ end
217
+
218
+ if deleted.any?
219
+ puts "移除了以下项目:".send(:red)
220
+ puts deleted.join("\n")
221
+ end
222
+
223
+ unless added.any? || updated.any? || added.any? || deleted.any?
224
+ puts "已经是最新版本数据".send(:green)
225
+ end
226
+ end
227
+ private def podfile_lock
228
+ lock = File.join(Pathname.pwd,"Podfile.lock")
229
+ raise "podfile.lock,不存在,请先pod install/update" unless File.exist?(lock)
230
+ lockfile ||= Pod::Lockfile.from_file(Pathname.new(lock))
231
+ return lockfile
232
+ end
233
+
234
+ def generate_localStable
235
+ lockfile = podfile_lock
236
+ local_specs = {}
237
+ # step.1 获取分支指向信息
238
+ dependencies = lockfile.dependencies
239
+ dependencies.each do | dependency |
240
+ if dependency.external_source.is_a? Hash
241
+ name = dependency.name
242
+ external_source = dependency.external_source
243
+ podCoreName = subspec_podname(name)
244
+ # checkout_options = lockfile.checkout_options_for_pod_named(podCoreName)
245
+ # if checkout_options.is_a? Hash
246
+ # commit = checkout_options[:commit]
247
+ # external_source[:commit] = commit
248
+ # puts "name:#{podCoreName} checkout_options:#{checkout_options} commit:#{commit}"
249
+ # end
250
+ if podCoreName != name
251
+ # local_specs.delete(podCoreName)
252
+ local_specs[podCoreName] = external_source
253
+ if (!has_include_core_subspec(name)) # 过滤core数据
254
+ local_specs[name] = external_source
255
+ Pod::UI.puts "[分支] #{name} => (#{external_source})"
256
+ end
257
+ else
258
+ local_specs[name] = external_source
259
+ Pod::UI.puts "[分支] #{name} => (#{external_source})"
260
+ end
261
+ end
262
+ end
263
+ # step.2 获取pods标签信息,如果存在分支优先使用分支信息
264
+ lockfile.pod_names.each do |pod_name|
265
+ version = lockfile.version(pod_name)
266
+ podCoreName = subspec_podname(pod_name)
267
+ if local_specs.has_key?(podCoreName)
268
+ if podCoreName != pod_name
269
+ if (!has_include_core_subspec(pod_name)) # 过滤core数据
270
+ # Pod::UI.puts "step.2 #{pod_name} => (#{local_specs[podCoreName]})"
271
+ local_specs[pod_name] = local_specs[podCoreName]
272
+ end
273
+ end
274
+ else
275
+ if (!has_include_core_subspec(pod_name)) # 过滤core数据
276
+ ver = version.to_s
277
+ local_specs[pod_name] = ver
278
+ Pod::UI.puts "[标签] #{pod_name} => (#{ver})"
279
+ end
280
+ end
281
+ end
282
+ # Pod::UI.puts "yml配置数据:#{local_specs}"
283
+ if local_specs.length > 0
284
+ update_localstable_datas(local_specs)
285
+ Pod::UI.puts "Generating yml配置文件=> #{local_stable_yaml} 更新成功".green
286
+ end
287
+ end
288
+ # pod库是否包含core subspec
289
+ def has_include_core_subspec(pod_name)
290
+ if has_include_subspec(pod_name)
291
+ subPodName = pod_name.include?('/') ? pod_name.split('/').last.strip : pod_name
292
+ if (subPodName == "Core") || (subPodName == "Main") # 过滤core数据
293
+ return true
294
+ end
295
+ end
296
+ return false
297
+ end
298
+ # pod库是否包含subspec
299
+ def has_include_subspec(pod_name)
300
+ podCoreName = subspec_podname(pod_name)
301
+ if podCoreName != pod_name
302
+ return true
303
+ end
304
+ return false
305
+ end
306
+ # subspec pod库名称
307
+ def subspec_podname(pod_name)
308
+ return pod_name.include?('/') ? pod_name.split('/').first.strip : pod_name
309
+ end
310
+ # 是否pod subspec库
311
+ def has_pod_subspec(podName, podCoreName)
312
+ return (has_include_subspec(podName) && podName.include?("#{podCoreName}/"))
313
+ end
314
+
315
+ # 更新单个pod组件
316
+ def update_podmodules(pod_lists)
317
+ local_stable_data = fetch_local_stable_datas # 本地stable配置
318
+ need_update_pod_lists = podCoreNames_from_podmodules(pod_lists)
319
+ is_resave_stable_data = false
320
+ need_update_pod_lists.each do |podCoreName|
321
+ local_stable_data.keys.each do |podName|
322
+ if (podName == podCoreName) || has_pod_subspec(podName, podCoreName)
323
+ pod = local_stable_data[podName]
324
+ if pod.is_a?(String)
325
+ version = pod.lstrip # 去除首字母空格
326
+ initial_str = version[0..0] # 第一个字母
327
+ # 项目配置固定版本,以本项目为主
328
+ is_fixed_version = initial_str.include?('=') ? true : false # 固定版本 pod 'A','= x.x.x'
329
+ is_lessthan_version = version.include?('<') ? true : false # 限制《最高》组件版本 pod 'A','< x.x.x' 或者 pod 'A','<= x.x.x'
330
+ is_greaterthan_version = version.include?('>') ? true : false # 限制《最低》组件版本 pod 'A','> x.x.x' 或者 pod 'A','>= x.x.x'
331
+ is_fuzzy_version = version.include?('~>') ? true : false # 固定版本 pod 'A','~> x.x.x'
332
+ is_fuzzy_versionV2 = (!is_fixed_version && !is_lessthan_version && !is_greaterthan_version && !is_fuzzy_version) ? true : false # 固定版本 pod 'A','x.x.x'
333
+ if (is_fuzzy_versionV2 == true)
334
+ local_stable_data[podName] = ">= #{version}"
335
+ is_resave_stable_data = true
336
+ end
337
+ end
338
+ end
339
+ end
340
+ end
341
+ if is_resave_stable_data == true
342
+ puts "[PodAssistant] 更新本地stable数据".yellow
343
+ update_localstable_datas(local_stable_data)
344
+ end
345
+ end
346
+ # 更新local stable组件
347
+ def update_local_stable_from_podmodules(pod_lists)
348
+ local_stable_data = fetch_local_stable_datas # 本地stable配置
349
+ need_update_pod_lists = podCoreNames_from_podmodules(pod_lists)
350
+ lockfile = podfile_lock
351
+ pod_names = lockfile.pod_names # lock标签数据
352
+ is_resave_stable_data = false
353
+ need_update_pod_lists.each do |podCoreName|
354
+ local_stable_data.keys.each do |podName|
355
+ if (podName == podCoreName) || has_pod_subspec(podName, podCoreName)
356
+ pod = local_stable_data[podName]
357
+ if pod.is_a?(String)
358
+ version = pod.lstrip # 去除首字母空格
359
+ initial_str = version[0..0] # 第一个字母
360
+ is_greaterthan_version = version.include?('>') ? true : false # 限制《最低》组件版本 pod 'A','> x.x.x' 或者 pod 'A','>= x.x.x'
361
+ if (is_greaterthan_version == true)
362
+ version = lockfile.version(podCoreName).to_s
363
+ if !version.empty?
364
+ local_stable_data[podName] = version
365
+ is_resave_stable_data = true
366
+ puts "update pod #{podName} (#{version})".green
367
+ end
368
+ end
369
+ end
370
+ end
371
+ end
372
+ end
373
+ if is_resave_stable_data == true
374
+ puts "[PodAssistant] 更新本地stable数据".yellow
375
+ update_localstable_datas(local_stable_data)
376
+ end
377
+ end
378
+ private def podCoreNames_from_podmodules(pod_lists)
379
+ need_update_pod_lists = []
380
+ pod_lists.each do |podName|
381
+ podCoreName = subspec_podname(podName)
382
+ if !need_update_pod_lists.include?(podCoreName)
383
+ need_update_pod_lists.push(podCoreName)
384
+ end
385
+ end
386
+ return need_update_pod_lists
387
+ end
388
+ end
389
+ end
@@ -0,0 +1,7 @@
1
+ module BB
2
+ class StableSource
3
+ def self.stable_default_source
4
+ return "https://git.babybus.co/babybus/ios/Specs/stable-specs.git"
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,27 @@
1
+ require 'cocoapods-bb-PodAssistant/helpers'
2
+
3
+ # 公共spec配置库
4
+ # 业务线公共spec配置库
5
+ # 本地spec配置库 = 公共spec+业务线spec合并数据
6
+ # 数据格式 json {key,val}
7
+ module BB
8
+ class StableSpecs
9
+ def readData(yml_path)
10
+ return YamlFilesHelper.read_stable_lock_yaml(yml_path)
11
+ end
12
+ def writeData(yml_path, data)
13
+ YamlFilesHelper.save_stable_lock_yaml(yml_path, data)
14
+ end
15
+ # podfile 更新配置文件使用(通用)
16
+ def update_stable_lock(yml_path, pod_targets)
17
+ YamlFilesHelper.save_stable_podlock(yml_path, pod_targets)
18
+ puts "[成功] 更新ymal配置文件#{yml_path}".green
19
+ end
20
+ # 更新podfile配置文件使用(项目)
21
+ def update_local_stable_lock(yml_path, pod_targets)
22
+ YamlFilesHelper.save_local_stable_podlock(yml_path, pod_targets)
23
+ puts "[成功] 更新ymal配置文件#{yml_path}".green
24
+ end
25
+
26
+ end
27
+ end
@@ -0,0 +1,3 @@
1
+ module CocoapodsBbPodassistant
2
+ VERSION = "0.1.5"
3
+ end