cocoapods-tools 0.1.1 → 0.1.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 89cd61478c61af9d6ccd3dc9dbc35619446a20986b670b50cfec9acbff2a70ce
4
- data.tar.gz: af3adc677e9b1951620889c2bcdf2124ed62735d7a977f99436de399514fec42
3
+ metadata.gz: fbf3c000c6d717670638d82e28cfc181c9228b3242301300af3e4ba9f142ad28
4
+ data.tar.gz: d5f9c0d4bca3e37cd5e8440ac49327b6deaf8e01bdf94164d6cb08249d69a56f
5
5
  SHA512:
6
- metadata.gz: 6884d09b4062e435a76690aea519f95fa1026cb98ca1c2394d49ed872096636c0b9a5bd68e638291a74af09f69e3801395e0d4808d8dd625df6d29e8ab9e0376
7
- data.tar.gz: ede81f910049610f3c86de6ecccdd4f2010a7b15092b6ba6f6acfb8c7f8504174df4bbad744643caf22298784eda629789c53cd6492f2fdb88f90a635c2cb3be
6
+ metadata.gz: 32317ed32996bfe9032242e04bcea0202e80f4be79ed89aa09334349383381f186f35d595ab6af8e671a8360fa0b7ed8dcea9a1ea22183d5b177606f8f06d846
7
+ data.tar.gz: c263bc69d9c0db096bf53ea627ce94ffd6d989b5ba8b451dea169839bb55c5448f05ec0b01a92825df7508ee60497088466e34efcd049438a3110197a0f19f9d
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CocoapodsTools
4
+ # 组件类
5
+ class Component
6
+
7
+ attr_accessor :component_name, :component_url, :component_branch
8
+
9
+ def initialize(name, url, branch)
10
+ @component_name = name
11
+ @component_url = url
12
+ @component_branch = branch
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,27 @@
1
+ require 'cocoapods-tools/helper/color'
2
+
3
+ module CocoapodsTools
4
+ # This command uses an argument for the extra parameter, instead of
5
+ # subcommands for each of the flavor.
6
+ class GT < Command
7
+
8
+ require 'cocoapods-tools/command/git/merge'
9
+
10
+ self.summary = 'cocoapods gt'
11
+
12
+ self.description = 'cocoapods gt'
13
+
14
+ self.arguments = [
15
+ CLAide::Argument.new('merge', '1.0')
16
+ ]
17
+
18
+ def self.options
19
+ [%w[merge 自动打合并组件]].concat(super)
20
+ end
21
+
22
+ def initialize(argv)
23
+ @tag = argv.flag?('merge')
24
+ super
25
+ end
26
+ end
27
+ end
File without changes
@@ -0,0 +1,180 @@
1
+ require 'cocoapods-tools/helper/color'
2
+ require 'fileutils'
3
+ require 'git'
4
+ require 'rubygems'
5
+ require 'cocoapods-tools/command/git/component'
6
+
7
+ module CocoapodsTools
8
+ # This command uses an argument for the extra parameter, instead of
9
+ # subcommands for each of the flavor
10
+ class Merge < GT
11
+
12
+ self.summary = 'ht git merge'
13
+
14
+ self.description = 'ht git merge'
15
+
16
+ self.arguments = [
17
+ # CLAide::Argument.new('TAG_VERSION', false, false),
18
+ ]
19
+
20
+ def self.options
21
+ []
22
+ end
23
+
24
+ def initialize(argv)
25
+ @arguments = argv.arguments!
26
+ super
27
+ end
28
+
29
+ def validate!
30
+ super
31
+ # puts Color.color_text('validate spec', Color.green)
32
+ help! '输入参数过多' if @arguments.count > 1
33
+ end
34
+
35
+ def run
36
+ super
37
+
38
+ return
39
+ # 1. 初始化
40
+ # current_branch:当前分支(主工程)。验证是否时最大分支,不是则报错提醒
41
+ # develop_branch:版本开发主分支
42
+ # need_merges: 需要手动合并的分支
43
+ # success_merges: 合并成功的分支
44
+ # pod_file: 读取 Podfile 文件
45
+ # change_components: 解析当前分支改动的组件,以当前分支名匹配
46
+ #
47
+ # 2. 遍历所有组件,进行合并分支操作
48
+ # component_dir: 修改工作目录,进入组件文件夹
49
+ # git reset:根据主工程当前分支,拉取组件远端仓库最新代码
50
+ # set-upstream-to:关联当前分支与 develop 分支
51
+ # git merge:检查当前分支与 develop 分支有无变动
52
+ # 有变动:加入 need_merges
53
+ # 无变动:合并操作
54
+
55
+ # 3. 输出执行结果
56
+ # ["need_merges": [], "success_merges": []]
57
+
58
+ # current_branch:当前分支(主工程)。验证是否时最大分支,不是则报错提醒
59
+ working_dir = Pathname.pwd
60
+ g = Git.open(working_dir)
61
+ current_branch = g.current_branch
62
+ puts Color.color_text "当前分支: #{current_branch}", Color.red
63
+
64
+ # 主业务线分支
65
+ business_branches = %w[/keep/ /voiceroom/ /live/ /vip/]
66
+ # 判断当前分支是否为业务线分支
67
+ is_business_branch = false
68
+ business_name = ''
69
+ business_version = ''
70
+ business_branches.each do |business|
71
+ next unless current_branch.include?(business)
72
+
73
+ business_version = current_branch.split(business).last
74
+ business_branch = (business_version.gsub '.', '').to_i
75
+ unless business_branch.is_a?(Numeric)
76
+ puts Color.color_text '非业务线版本分支,停止合并操作', Color.red
77
+ return
78
+ end
79
+
80
+ is_business_branch = true
81
+ business_name = business
82
+
83
+ remote_branches = g.branches.remote.select { |bran| bran.name.include? business }
84
+ remote_branches.each do |bran|
85
+ version = (bran.name.split(business).last.gsub! '.', '').to_i
86
+ if version.is_a?(Numeric) && version > business_branch
87
+ puts Color.color_text '非业务线最新版本分支,停止合并操作', Color.red
88
+ return
89
+ end
90
+ end
91
+
92
+ break
93
+ end
94
+
95
+ unless is_business_branch
96
+ puts Color.color_text '非业务线分支,停止合并操作', Color.red
97
+ return
98
+ end
99
+
100
+ puts Color.color_text "#{business_name.gsub! '/', ''} 业务线最新分支为:#{business_version}", Color.green
101
+
102
+ business_version.join('.') unless business_version.include? '.'
103
+ # 版本开发主分支
104
+ develop_branch = "develop/#{business_version}"
105
+ # 需要手动合并的分支
106
+ need_merges = []
107
+ # 合并成功的分支
108
+ success_merges = []
109
+ # change_components: 解析当前分支改动的组件,以当前分支名匹配
110
+ change_components = []
111
+ # 读取 Podfile 文件
112
+ File.open('Demo/Podfile').each do |line|
113
+ current_branch_without_dot = current_branch.gsub '.', ''
114
+ unless !(line.include? '#') && ((line.include? current_branch) || (line.include? current_branch_without_dot))
115
+ next
116
+ end
117
+
118
+ params = line.split ','
119
+ name = (params.first.split '\'').last
120
+ url = (params[1].split '\'').last
121
+ branch = (params[2].strip.split '\'').last
122
+ change_components.append(Component.new(name, url, branch))
123
+ end
124
+
125
+ # 测试用例
126
+ component = Component.new('Test2', 'ssh://git@git', '466')
127
+
128
+ # 对所有变动分支进行合并
129
+ # change_components.each do |component|
130
+ [component].each do |component|
131
+
132
+ # 组件总文件夹
133
+ component_parent_path = '../iOSLib'
134
+ FileUtils.makedirs(component_parent_path) unless File.exists? component_parent_path
135
+ Dir.chdir(component_parent_path) do
136
+ unless File.exists? component.component_name
137
+ Git.clone(component.component_url, component.component_name, branch: component.component_branch)
138
+ end
139
+
140
+ Dir.chdir(component.component_name) do
141
+ component_git = Git.open('./')
142
+ feature_branch_name = component.component_branch
143
+ component_git.checkout(feature_branch_name)
144
+ remote_develop_branch = component_git.branches["origin/#{develop_branch}"]
145
+ component_git.branch(develop_branch).checkout
146
+
147
+ # 每个组件都合并业务线分支和主分支
148
+ ['origin/master', "origin/#{feature_branch_name}"].each do |branch|
149
+ puts Color.color_text "=======开始合并 #{component.component_name} 组件 #{branch} 分支=======", Color.green
150
+ merge_result = system("git merge #{branch} -m '合并组件分支'")
151
+
152
+ if remote_develop_branch.nil? # 开发分支当前版本不存在
153
+ system("git push --set-upstream origin #{develop_branch}")
154
+ puts Color.color_text "#{component.component_name} 组件 #{branch} 分支合并成功!", Color.green
155
+ success_merges.append("#{component.component_name}-#{branch}")
156
+ elsif merge_result # 合并成功
157
+ system("git push origin #{develop_branch}")
158
+ puts Color.color_text "#{component.component_name} 组件 #{branch} 分支合并成功!", Color.green
159
+ success_merges.append("#{component.component_name}-#{branch}")
160
+ else # 存在冲突
161
+ abort_result = system('git merge --abort')
162
+ if abort_result
163
+ puts Color.color_text "#{component.component_name} 组件 #{branch} 分支存在冲突,请手动合并!", Color.red
164
+ need_merges.append("#{component.component_name}-#{branch}")
165
+ else
166
+ puts Color.color_text "#{component.component_name} 组件 #{branch} 无变更,不需要合并!", Color.green
167
+ end
168
+ end
169
+ end
170
+ end
171
+ end
172
+
173
+ puts '==============合并结果=============='
174
+ puts Color.color_text "合并成功:#{success_merges}", Color.green
175
+ puts Color.color_text "需要手动合并:#{need_merges}", Color.red
176
+ puts '==================================='
177
+ end
178
+ end
179
+ end
180
+ end
@@ -1,5 +1,8 @@
1
1
  require 'cocoapods-tools/helper/color'
2
2
  require 'fileutils'
3
+ require 'git'
4
+ require 'open3'
5
+ require 'cocoapods-tools/helper/color'
3
6
 
4
7
  module CocoapodsTools
5
8
  # This command uses an argument for the extra parameter, instead of
@@ -12,7 +15,7 @@ module CocoapodsTools
12
15
  self.description = 'cocoapods spec tag'
13
16
 
14
17
  self.arguments = [
15
- # CLAide::Argument.new('TAG_VERSION', false, false),
18
+ CLAide::Argument.new('TAG_VERSION', false, false),
16
19
  ]
17
20
 
18
21
  def self.options
@@ -33,276 +36,132 @@ module CocoapodsTools
33
36
  def run
34
37
  super
35
38
 
36
- # 搜索podspec路径
37
- podspec_path = ''
38
- find_podspec_path = Pathname.pwd
39
-
40
- # 有可能存在多个 podspec,当用户没有指定时,需要给用户自主选择
41
- pod_specs = find_podspec_path.children.select { |pn| pn.extname == '.podspec' }
42
- example_path = Pathname.new("#{find_podspec_path}/Example").expand_path
43
- project_path = example_path.children.select { |pn| pn.extname == '.xcodeproj' }.first
44
- project_name = File.basename(project_path, '.*')
45
- default_name = "#{project_name}.podspec"
46
- podspec_path = default_name
47
-
48
- # 默认为工程名同名的 spec
49
- # default_name = "#{project_name}.podspec"
50
- # spec_default = pod_specs.select { |path| path.basename.to_s == default_name }.first
51
- spec_default = "#{project_name}.podspec"
52
-
53
- if pod_specs.count > 1
54
- input_tag = true
55
- serial = 0
56
- puts Color.color_text(
57
- "Find #{pod_specs.count} podspec files, please enter the serial number selection:\n(default:#{spec_default})", Color.white)
58
- while input_tag
59
- (0...pod_specs.count).each do |i|
60
- puts "#{i + 1}. #{pod_specs[i]}"
61
- end
62
- serial = $stdin.gets.chomp
63
- input_tag = (serial.to_i > pod_specs.count || serial.to_i <= 0)
64
- if serial.empty?
65
- input_tag = false
66
- podspec_path = spec_default
67
- elsif input_tag
68
- puts "Input serial = #{serial}, it's invalid and you need to input 1~#{pod_specs.count}:"
69
- else
70
- input_tag = false
71
- podspec_path = pod_specs[serial.to_i - 1]
72
- end
39
+ # 工作目录
40
+ working_dir = Pathname.pwd
41
+ # pod 私有源库名
42
+ pod_spec_name = 'libspec'
43
+ # pod 私有源路径
44
+ pod_spec_path = Pathname.pwd.parent + pod_spec_name
45
+ # pod 私有源仓库
46
+ pod_repo_url = 'ssh://git@htsz.hellotalk.net:7999/~panda/libspec.git'
47
+
48
+ # 上传私有索引库
49
+ # tag
50
+ new_tag_name = @arguments[0].to_s
51
+ # 版本号
52
+ last_tag_name = ''
53
+
54
+ # 初始化组件源码 git
55
+ pod_source_git = Git.open(working_dir)
56
+
57
+ # 取最近的 tag 号
58
+ max_tag_no = -1
59
+ pod_source_git.tags.each do |tag|
60
+ tag_name = tag.name
61
+ tag_no = (tag_name.gsub '.', '').to_i
62
+ if max_tag_no < tag_no
63
+ max_tag_no = tag_no
64
+ last_tag_name = tag_name
73
65
  end
74
- elsif pod_specs.count == 1
75
- podspec_path = pod_specs.first.split.last
76
- else
77
- puts color_text("Can't find any podspec file", Color.red)
78
- return
79
66
  end
80
67
 
81
- if !File.exist?(podspec_path)
82
- puts ("找不到 podspec 文件: #{podspec_path}, 请确认当前路径")
83
- return
84
- else
85
- puts "Ready to deal with podspec named #{Color.color_text(podspec_path.to_s, Color.white)}"
86
- end
87
-
88
- # 在当前podspec目录下新建一个临时 need_delete_temp.podspec 文件
89
- podspec_dir = File.dirname podspec_path
90
- podspec_absolute_path = "#{find_podspec_path}/#{podspec_path}"
91
- temp_podspec_path = "#{podspec_dir}/need_delete_temp.podspec"
92
- temp_podspec_absolute_path = "#{find_podspec_path}/#{temp_podspec_path}"
93
-
94
- cur_version = ''
95
- # 读取当前podspec文件的版本
96
- File.open(podspec_absolute_path, 'r+') do |f|
97
- f.each_line do |line|
98
- # 查找.version
99
- version_desc = /.*\.version\s*=.*/.match line
100
- next if version_desc.nil?
101
-
102
- cur_version = version_desc.to_s.split('=').last.to_s.gsub("'", '')
103
- cur_version = cur_version.gsub(' ', '')
104
- break
105
- end
68
+ # 上次提交 sha
69
+ last_commit = pod_source_git.log(1).first
70
+ # 最近 tag 对应的提交 sha
71
+ last_tag = pod_source_git.tag(last_tag_name)
72
+ # 读取两个 sha 间的文件变更
73
+ changes = `git log --name-only --pretty=oneline --full-index #{last_commit}...#{last_tag} | grep -vE '^[0-9a-f]{40} ' | sort | uniq`
74
+ puts Color.color_text "===== 与 tag:#{last_tag_name} 对比,所有文件变更如下 ======", Color.green
75
+ puts changes
76
+ puts Color.color_text '==================变更文件打印结束=================', Color.green
77
+
78
+ specs = []
79
+ Dir.entries(working_dir).each do |sub|
80
+ specs.push(sub) if File.directory?(sub) && !sub.include?('.') && changes.include?("#{sub}/#{sub}")
106
81
  end
107
82
 
108
- puts Color.color_text('Current version = ', Color.white) + Color.color_text(cur_version.to_s, Color.green)
109
-
110
- # 自定义版本号
111
- if @arguments.count == 1
112
-
113
- input_version = @arguments.first
114
- puts Color.color_text "不输入时默认自增。本次已输入,版本号:#{input_version}", Color.white
115
-
116
- # 判断输入的version是否>当前的版本号
117
- input_v_s = input_version.to_s.split('.')
118
- cur_v_s = cur_version.split('.')
119
- # 比较的位置,从最左边开始
120
- v_index = 0
121
- # 输入的version是否有效
122
- input_valid = false
123
- while v_index < cur_v_s.count && v_index < input_v_s.count do
124
- if input_v_s[v_index].to_i > cur_v_s[v_index].to_i
125
- # 说明用户输入的version比当前的大
126
- input_valid = true
127
- break
128
- elsif input_v_s[v_index].to_i == cur_v_s[v_index].to_i
129
- v_index += 1
130
- else
131
- break
132
- end
133
- end
134
-
135
- puts Color.color_text "版本号 #{input_version} 无效,默认自增", Color.natural if input_valid == false
136
- end
137
-
138
- system("touch #{temp_podspec_path}") unless File.exist? temp_podspec_absolute_path
139
-
140
- new_version = ''
141
- git_source = ''
142
-
143
- File.open(temp_podspec_absolute_path, 'r+') do |t|
144
- File.open(podspec_absolute_path) do |f|
145
- f.each_line do |line|
146
- # # 查找.version
147
- # s.version = "0.0.2"
148
- # 需要注意的是,版本号可以是'',也可以是""
149
- write_line = line
150
- version_desc = /.*\.version\s*=.*/.match line
151
- unless version_desc.nil?
152
- version_comes = version_desc.to_s.split('=')
153
- if (input_valid == true) && (@arguments.count == 1)
154
- new_version = input_version.to_s
155
- else
156
- version_num = version_comes.last.to_s.gsub("'", '').gsub('"', '').gsub(' ', '')
157
- v_s = version_num.split('.')
158
- # 处理版本号 0.0.1
159
- (0...v_s.count).each do |i|
160
- new_version += if i == v_s.count - 1
161
- (v_s[i].to_i + 1).to_s
162
- else
163
- "#{v_s[i]}."
164
- end
165
- end
83
+ puts Color.color_text "开始更新组件列表:#{specs}", Color.red
84
+
85
+ # 更新组件源码版本号
86
+ specs.each do |spec|
87
+ # 读取 podspec 文件
88
+ podspec_path = working_dir + spec + "#{spec}.podspec"
89
+ # 修改当前podspec文件的版本
90
+ File.open(podspec_path, 'r+') do |t|
91
+ File.open(podspec_path) do |f|
92
+ f.each_line do |line|
93
+ # 查找.version
94
+ # s.version = "0.0.2"
95
+ # 需要注意的是,版本号可以是'',也可以是""
96
+ write_line = line
97
+ version_desc = /.*\.version\s*=.*/.match line
98
+ unless version_desc.nil?
99
+ version_comes = version_desc.to_s.split('=')
100
+ puts Color.color_text('New Tag Name = ', Color.white) + Color.color_text(new_tag_name.to_s, Color.green)
101
+ write_line = "#{version_comes.first}= '#{new_tag_name}'\n"
166
102
  end
167
- puts Color.color_text('New version = ', Color.white) + Color.color_text(new_version.to_s, Color.green)
168
- write_line = "#{version_comes.first}= '#{new_version}'\n"
103
+ t.write write_line
169
104
  end
170
- source_desc = /.*\.source\s*=.*/.match line
171
- unless source_desc.nil?
172
- source_desc = /:git.*,/.match source_desc.to_s
173
- source_desc = /'.*'/.match source_desc.to_s
174
- git_source = source_desc.to_s.gsub("'", '')
175
- puts "git source is #{git_source}"
176
- end
177
- t.write write_line
178
105
  end
179
106
  end
107
+ puts Color.color_text('当前版本号 = ', Color.white) + Color.color_text(last_tag_name, Color.green)
180
108
  end
181
109
 
182
- puts Color.color_text('Update version from ',
183
- Color.white) + Color.color_text(cur_version.to_s,
184
- Color.green) + Color.color_text(' to ', Color.white) + Color.color_text(new_version.to_s, Color.green)
185
-
186
- # 将新数据反写回到原始podspec中
187
- system("cp -f #{temp_podspec_path} #{podspec_path}")
188
- system("rm -f #{temp_podspec_path}")
189
-
190
- # pod_repo_name = 'third_specs'
191
- # pod_repo_name = ''
192
- pod_repo_source = 'ssh://git@office.hellotalk.net:7999/third/third_specs.git'
193
- #pod_repo_source = 'ssh://git@172.16.6.10:7999/third/third_specs.git'
194
-
195
- # 处理正式 repo 逻辑,解析当前 repos
196
- # pod_repos = `pod repo list`
197
- #
198
- # # pod_repos = Array.new
199
- # # pod_repo = Array.new
200
- # curren_pod_name = ''
201
- # temp_pod_name = ''
202
- # last_line = ''
203
- # pod_repos.each_line do |line|
204
- # continue if line == '\n'
205
- #
206
- # line = line.gsub(/\n/, '')
207
- #
208
- # if line.include?('- Type:')
209
- # temp_pod_name = last_line
210
- # elsif line.include?('- URL:')
211
- # repo_url = line.split('- URL:').last.gsub(/ /, '')
212
- # if repo_url == pod_repo_source
213
- # pod_repo_name = temp_pod_name
214
- # break
215
- # end
216
- # end
217
- # last_line = line
218
- # end
219
- #
220
- # if pod_repo_name == ''
221
- pod_repo_name = pod_repo_source.split('/').last.split('.').first
222
- # puts Color.color_text("Add pod repo named '#{pod_repo_name}' with source: #{pod_repo_source}", Color.white)
223
- # system("pod repo add #{pod_repo_name} #{pod_repo_source}")
224
- # end
225
-
226
- # 提交代码到远程仓库
227
- puts Color.color_text('Start upload code to remote', Color.white)
228
-
229
- system("git commit -am 'update version to #{new_version}'")
230
- Color.die_log('[!] git push code error') if system('git push origin master') == false
231
- system("git tag #{new_version}")
232
- if system('git push origin --tags') == false
233
- Color.die_log('[!] git push tags error')
234
- return
110
+ # 更新组件版本号私有库
111
+ unless File.exists? pod_spec_path
112
+ puts Color.color_text("Init Spec Repo... ☕️! Current tag = #{last_tag_name}", Color.green)
113
+ Git.clone(pod_repo_url, podspec_path, tag: last_tag_name)
235
114
  end
236
115
 
237
- # 获取当前 repo 缓存路径,建立新版本 spec 的文件夹
238
- home_dir ||= Pathname.new(ENV['CP_HOME_DIR'] || '~/.cocoapods').expand_path
239
- specs_git_syn = Pathname.new("#{home_dir}/specs_git_syn").expand_path
240
- FileUtils.mkdir_p(specs_git_syn) unless specs_git_syn.exist?
241
-
242
- pod_spec_dir = Pathname.new("#{specs_git_syn}/#{pod_repo_name}").expand_path
243
-
244
- Dir.chdir(specs_git_syn) do
245
- # 同步文件夹中,没有当前源则克隆
246
-
247
- system("git clone #{pod_repo_source} #{pod_spec_dir}") unless pod_spec_dir.exist?
248
-
249
- pod_repo_dir = Pathname.new("#{pod_spec_dir}/#{project_name}").expand_path
250
-
251
- # 添加最新版本文件夹
252
- version_dir = Pathname.new("#{pod_repo_dir}/#{new_version.to_s}").expand_path
253
- FileUtils.mkdir_p(version_dir, mode: 0o755)
254
-
255
- # 将修改版本号的 spec 文件拷贝进去
256
- spec_repo_path = Pathname.new("#{version_dir}/#{podspec_path}").expand_path
257
- system("cp -f #{podspec_absolute_path} #{spec_repo_path}")
116
+ # 更新组件版本号私有库
117
+ Dir.chdir(pod_spec_path) do
118
+
119
+ pod_spec_git = Git.open(pod_spec_path)
120
+ # ruby open 会重置代码,下方操作没必要
121
+ # pod_spec_git.checkout('master', { f: true })
122
+ # pod_spec_git.pull
123
+
124
+ specs.each do |spec|
125
+ pod_repo_spec_sorce = working_dir + spec + "#{spec}.podspec"
126
+ pod_repo_path = pod_spec_path + spec
127
+ new_tag_path = pod_repo_path + new_tag_name
128
+ FileUtils.mkdir_p(pod_repo_path, mode: 0o755) unless pod_repo_path.exist?
129
+ Dir.chdir(pod_repo_path) do
130
+ if new_tag_path.exist?
131
+ Color.die_log("[!] #{spec}组件#{new_tag_name}版本已存在,请确认后继续执行。")
132
+ # 发布时打开
133
+ # return
134
+ else
135
+ FileUtils.mkdir_p(new_tag_path, mode: 0o755)
136
+ end
258
137
 
259
- # 进入当前源对应的同步文件夹
260
- Dir.chdir(pod_spec_dir) do
261
- # git 提交到私有源
262
- puts Color.color_text("Start push pod '#{pod_spec_dir}' to remote repo '#{pod_repo_name}'", Color.white)
263
- system('git add .')
264
- system("git commit -am 'update version to #{new_version}'")
265
- Color.die_log('[!] git push code error') if system('git push origin master') == false
266
- system("git tag #{new_version}")
267
- if system('git push origin --tags') == false
268
- Color.die_log('[!] git push tags error')
269
- return
138
+ pod_repo_spec_dest = new_tag_path + "#{spec}.podspec"
139
+ if pod_repo_spec_dest.exist?
140
+ Color.die_log("[!] #{spec}组件#{new_tag_name}版本 podspec 已存在,请确认后继续执行。")
141
+ # 发布时打开
142
+ # return
143
+ else
144
+ FileUtils.copy_file(pod_repo_spec_sorce, pod_repo_spec_dest)
145
+ end
270
146
  end
271
- puts Color.color_text("Update success ☕️! Current version = #{new_version}", Color.green)
272
-
273
147
  end
274
148
 
149
+ # git 提交到私有源
150
+ puts Color.color_text("Start push pod repo to remote repo '#{pod_spec_name}'", Color.white)
151
+ pod_spec_git.add
152
+ pod_spec_git.commit_all("组件库tag:#{new_tag_name}")
153
+ pod_spec_git.push
154
+ puts Color.color_text("Update success ☕️! Current version = #{new_tag_name}", Color.green)
275
155
  end
276
- end
277
-
278
- # system("pod repo update #{pod_repo_name}") unless specs_dir.exist?
279
- # FileUtils.mkdir_p(specs_dir) unless specs_dir.exist?
280
-
281
- # 验证podspec格式是否正确
282
- # if verify_podspec_format == true
283
- # puts Color.color_text("Start verify podspec '#{podspec_path}'...", Color.white)
284
- # if system("pod lib lint #{podspec_path} --allow-warnings") == false
285
- # die_log("[!] pod spec' format invalid")
286
- # return
287
- # end
288
- # end
289
156
 
290
- # 提交pod spec到spec仓库
291
- # puts Color.color_text("Start push pod '#{podspec_path}' to remote repo '#{pod_repo_name}'", Color.white)
292
- # system("pod repo push #{pod_repo_name} #{podspec_path} --allow-warnings")
293
- # puts Color.color_text("Update success ☕️! Current version = #{new_version}", Color.green)
294
-
295
- # if pod_repo_name == 'trunk'
296
- # if (is_static_lib == true ? system("pod trunk push #{podspec_path} --allow-warnings --use-libraries") : system("pod trunk push #{podspec_path} --allow-warnings")) == false
297
- # puts "If not timeout, you need to check your 'trunk' account like: 'pod trunk me', and register code is 'pod trunk register <your email> <your name>'"
298
- # return
299
- # end
300
- # else
301
- # if (is_static_lib == true ? system("pod repo push #{pod_repo_name} #{podspec_path} --allow-warnings --use-libraries") : system("pod repo push #{pod_repo_name} #{podspec_path} --allow-warnings")) == false
302
- # return
303
- # end
304
- # end
305
- #
157
+ # 提交组件代码到远程仓库
158
+ puts Color.color_text('Start upload source code to remote', Color.white)
159
+ pod_source_git.add
160
+ pod_source_git.commit("组件库tag:#{new_tag_name}")
161
+ pod_source_git.push
162
+ pod_source_git.add_tag(new_tag_name)
163
+ puts Color.color_text("Update success ☕️! Current version = #{new_tag_name}", Color.green)
306
164
 
165
+ end
307
166
  end
308
167
  end
@@ -0,0 +1,308 @@
1
+ require 'cocoapods-tools/helper/color'
2
+ require 'fileutils'
3
+
4
+ module CocoapodsTools
5
+ # This command uses an argument for the extra parameter, instead of
6
+ # subcommands for each of the flavor.
7
+
8
+ class Tag < Spec
9
+
10
+ self.summary = 'cocoapods spec tag'
11
+
12
+ self.description = 'cocoapods spec tag'
13
+
14
+ self.arguments = [
15
+ # CLAide::Argument.new('TAG_VERSION', false, false),
16
+ ]
17
+
18
+ def self.options
19
+ []
20
+ end
21
+
22
+ def initialize(argv)
23
+ @arguments = argv.arguments!
24
+ super
25
+ end
26
+
27
+ def validate!
28
+ super
29
+ # puts Color.color_text('validate spec', Color.green)
30
+ help! '输入参数过多' if @arguments.count > 1
31
+ end
32
+
33
+ def run
34
+ super
35
+
36
+ # 搜索podspec路径
37
+ podspec_path = ''
38
+ find_podspec_path = Pathname.pwd
39
+
40
+ # 有可能存在多个 podspec,当用户没有指定时,需要给用户自主选择
41
+ pod_specs = find_podspec_path.children.select { |pn| pn.extname == '.podspec' }
42
+ example_path = Pathname.new("#{find_podspec_path}/Example").expand_path
43
+ project_path = example_path.children.select { |pn| pn.extname == '.xcodeproj' }.first
44
+ project_name = File.basename(project_path, '.*')
45
+ default_name = "#{project_name}.podspec"
46
+ podspec_path = default_name
47
+
48
+ # 默认为工程名同名的 spec
49
+ # default_name = "#{project_name}.podspec"
50
+ # spec_default = pod_specs.select { |path| path.basename.to_s == default_name }.first
51
+ spec_default = "#{project_name}.podspec"
52
+
53
+ if pod_specs.count > 1
54
+ input_tag = true
55
+ serial = 0
56
+ puts Color.color_text(
57
+ "Find #{pod_specs.count} podspec files, please enter the serial number selection:\n(default:#{spec_default})", Color.white)
58
+ while input_tag
59
+ (0...pod_specs.count).each do |i|
60
+ puts "#{i + 1}. #{pod_specs[i]}"
61
+ end
62
+ serial = $stdin.gets.chomp
63
+ input_tag = (serial.to_i > pod_specs.count || serial.to_i <= 0)
64
+ if serial.empty?
65
+ input_tag = false
66
+ podspec_path = spec_default
67
+ elsif input_tag
68
+ puts "Input serial = #{serial}, it's invalid and you need to input 1~#{pod_specs.count}:"
69
+ else
70
+ input_tag = false
71
+ podspec_path = pod_specs[serial.to_i - 1]
72
+ end
73
+ end
74
+ elsif pod_specs.count == 1
75
+ podspec_path = pod_specs.first.split.last
76
+ else
77
+ puts Color.color_text("Can't find any podspec file", Color.red)
78
+ return
79
+ end
80
+
81
+ if !File.exist?(podspec_path)
82
+ puts ("找不到 podspec 文件: #{podspec_path}, 请确认当前路径")
83
+ return
84
+ else
85
+ puts "Ready to deal with podspec named #{Color.color_text(podspec_path.to_s, Color.white)}"
86
+ end
87
+
88
+ # 在当前podspec目录下新建一个临时 need_delete_temp.podspec 文件
89
+ podspec_dir = File.dirname podspec_path
90
+ podspec_absolute_path = "#{find_podspec_path}/#{podspec_path}"
91
+ temp_podspec_path = "#{podspec_dir}/need_delete_temp.podspec"
92
+ temp_podspec_absolute_path = "#{find_podspec_path}/#{temp_podspec_path}"
93
+
94
+ cur_version = ''
95
+ # 读取当前podspec文件的版本
96
+ File.open(podspec_path, 'r+') do |f|
97
+ f.each_line do |line|
98
+ # 查找.version
99
+ version_desc = /.*\.version\s*=.*/.match line
100
+ next if version_desc.nil?
101
+
102
+ cur_version = version_desc.to_s.split('=').last.to_s.gsub("'", '')
103
+ cur_version = cur_version.gsub(' ', '')
104
+ break
105
+ end
106
+ end
107
+
108
+ puts Color.color_text('Current version = ', Color.white) + Color.color_text(cur_version.to_s, Color.green)
109
+
110
+ # 自定义版本号
111
+ if @arguments.count == 1
112
+
113
+ input_version = @arguments.first
114
+ puts Color.color_text "不输入时默认自增。本次已输入,版本号:#{input_version}", Color.white
115
+
116
+ # 判断输入的version是否>当前的版本号
117
+ input_v_s = input_version.to_s.split('.')
118
+ cur_v_s = cur_version.split('.')
119
+ # 比较的位置,从最左边开始
120
+ v_index = 0
121
+ # 输入的version是否有效
122
+ input_valid = false
123
+ while v_index < cur_v_s.count && v_index < input_v_s.count do
124
+ if input_v_s[v_index].to_i > cur_v_s[v_index].to_i
125
+ # 说明用户输入的version比当前的大
126
+ input_valid = true
127
+ break
128
+ elsif input_v_s[v_index].to_i == cur_v_s[v_index].to_i
129
+ v_index += 1
130
+ else
131
+ break
132
+ end
133
+ end
134
+
135
+ puts Color.color_text "版本号 #{input_version} 无效,默认自增", Color.natural if input_valid == false
136
+ end
137
+
138
+ system("touch #{temp_podspec_path}") unless File.exist? temp_podspec_absolute_path
139
+
140
+ new_version = ''
141
+ git_source = ''
142
+
143
+ File.open(podspec_path, 'r+') do |t|
144
+ File.open(podspec_path) do |f|
145
+ f.each_line do |line|
146
+ # # 查找.version
147
+ # s.version = "0.0.2"
148
+ # 需要注意的是,版本号可以是'',也可以是""
149
+ write_line = line
150
+ version_desc = /.*\.version\s*=.*/.match line
151
+ unless version_desc.nil?
152
+ version_comes = version_desc.to_s.split('=')
153
+ if (input_valid == true) && (@arguments.count == 1)
154
+ new_version = input_version.to_s
155
+ else
156
+ version_num = version_comes.last.to_s.gsub("'", '').gsub('"', '').gsub(' ', '')
157
+ v_s = version_num.split('.')
158
+ # 处理版本号 0.0.1
159
+ (0...v_s.count).each do |i|
160
+ new_version += if i == v_s.count - 1
161
+ (v_s[i].to_i + 1).to_s
162
+ else
163
+ "#{v_s[i]}."
164
+ end
165
+ end
166
+ end
167
+ puts Color.color_text('New version = ', Color.white) + Color.color_text(new_version.to_s, Color.green)
168
+ write_line = "#{version_comes.first}= '#{new_version}'\n"
169
+ end
170
+ source_desc = /.*\.source\s*=.*/.match line
171
+ unless source_desc.nil?
172
+ source_desc = /:git.*,/.match source_desc.to_s
173
+ source_desc = /'.*'/.match source_desc.to_s
174
+ git_source = source_desc.to_s.gsub("'", '')
175
+ puts "git source is #{git_source}"
176
+ end
177
+ t.write write_line
178
+ end
179
+ end
180
+ end
181
+
182
+ puts Color.color_text('Update version from ',
183
+ Color.white) + Color.color_text(cur_version.to_s,
184
+ Color.green) + Color.color_text(' to ', Color.white) + Color.color_text(new_version.to_s, Color.green)
185
+
186
+ # 将新数据反写回到原始podspec中
187
+ system("cp -f #{temp_podspec_path} #{podspec_path}")
188
+ system("rm -f #{temp_podspec_path}")
189
+
190
+ # pod_repo_name = 'third_specs'
191
+ # pod_repo_name = ''
192
+ pod_repo_source = 'ssh://git@office.hellotalk.net:7999/third/third_specs.git'
193
+ #pod_repo_source = 'ssh://git@172.16.6.10:7999/third/third_specs.git'
194
+
195
+ # 处理正式 repo 逻辑,解析当前 repos
196
+ # pod_repos = `pod repo list`
197
+ #
198
+ # # pod_repos = Array.new
199
+ # # pod_repo = Array.new
200
+ # curren_pod_name = ''
201
+ # temp_pod_name = ''
202
+ # last_line = ''
203
+ # pod_repos.each_line do |line|
204
+ # continue if line == '\n'
205
+ #
206
+ # line = line.gsub(/\n/, '')
207
+ #
208
+ # if line.include?('- Type:')
209
+ # temp_pod_name = last_line
210
+ # elsif line.include?('- URL:')
211
+ # repo_url = line.split('- URL:').last.gsub(/ /, '')
212
+ # if repo_url == pod_repo_source
213
+ # pod_repo_name = temp_pod_name
214
+ # break
215
+ # end
216
+ # end
217
+ # last_line = line
218
+ # end
219
+ #
220
+ # if pod_repo_name == ''
221
+ pod_repo_name = pod_repo_source.split('/').last.split('.').first
222
+ # puts Color.color_text("Add pod repo named '#{pod_repo_name}' with source: #{pod_repo_source}", Color.white)
223
+ # system("pod repo add #{pod_repo_name} #{pod_repo_source}")
224
+ # end
225
+
226
+ # 提交代码到远程仓库
227
+ puts Color.color_text('Start upload code to remote', Color.white)
228
+
229
+ system("git commit -am 'update version to #{new_version}'")
230
+ Color.die_log('[!] git push code error') if system('git push origin master') == false
231
+ system("git tag #{new_version}")
232
+ if system('git push origin --tags') == false
233
+ Color.die_log('[!] git push tags error')
234
+ return
235
+ end
236
+
237
+ # 获取当前 repo 缓存路径,建立新版本 spec 的文件夹
238
+ home_dir ||= Pathname.new(ENV['CP_HOME_DIR'] || '~/.cocoapods').expand_path
239
+ specs_git_syn = Pathname.new("#{home_dir}/specs_git_syn").expand_path
240
+ FileUtils.mkdir_p(specs_git_syn) unless specs_git_syn.exist?
241
+
242
+ pod_spec_dir = Pathname.new("#{specs_git_syn}/#{pod_repo_name}").expand_path
243
+
244
+ Dir.chdir(specs_git_syn) do
245
+ # 同步文件夹中,没有当前源则克隆
246
+
247
+ system("git clone #{pod_repo_source} #{pod_spec_dir}") unless pod_spec_dir.exist?
248
+
249
+ pod_repo_dir = Pathname.new("#{pod_spec_dir}/#{project_name}").expand_path
250
+
251
+ # 添加最新版本文件夹
252
+ version_dir = Pathname.new("#{pod_repo_dir}/#{new_version.to_s}").expand_path
253
+ FileUtils.mkdir_p(version_dir, mode: 0o755)
254
+
255
+ # 将修改版本号的 spec 文件拷贝进去
256
+ spec_repo_path = Pathname.new("#{version_dir}/#{podspec_path}").expand_path
257
+ system("cp -f #{podspec_absolute_path} #{spec_repo_path}")
258
+
259
+ # 进入当前源对应的同步文件夹
260
+ Dir.chdir(pod_spec_dir) do
261
+ # git 提交到私有源
262
+ puts Color.color_text("Start push pod '#{pod_spec_dir}' to remote repo '#{pod_repo_name}'", Color.white)
263
+ system('git add .')
264
+ system("git commit -am 'update version to #{new_version}'")
265
+ Color.die_log('[!] git push code error') if system('git push origin master') == false
266
+ system("git tag #{new_version}")
267
+ if system('git push origin --tags') == false
268
+ Color.die_log('[!] git push tags error')
269
+ return
270
+ end
271
+ puts Color.color_text("Update success ☕️! Current version = #{new_version}", Color.green)
272
+
273
+ end
274
+
275
+ end
276
+ end
277
+
278
+ # system("pod repo update #{pod_repo_name}") unless specs_dir.exist?
279
+ # FileUtils.mkdir_p(specs_dir) unless specs_dir.exist?
280
+
281
+ # 验证podspec格式是否正确
282
+ # if verify_podspec_format == true
283
+ # puts Color.color_text("Start verify podspec '#{podspec_path}'...", Color.white)
284
+ # if system("pod lib lint #{podspec_path} --allow-warnings") == false
285
+ # die_log("[!] pod spec' format invalid")
286
+ # return
287
+ # end
288
+ # end
289
+
290
+ # 提交pod spec到spec仓库
291
+ # puts Color.color_text("Start push pod '#{podspec_path}' to remote repo '#{pod_repo_name}'", Color.white)
292
+ # system("pod repo push #{pod_repo_name} #{podspec_path} --allow-warnings")
293
+ # puts Color.color_text("Update success ☕️! Current version = #{new_version}", Color.green)
294
+
295
+ # if pod_repo_name == 'trunk'
296
+ # if (is_static_lib == true ? system("pod trunk push #{podspec_path} --allow-warnings --use-libraries") : system("pod trunk push #{podspec_path} --allow-warnings")) == false
297
+ # puts "If not timeout, you need to check your 'trunk' account like: 'pod trunk me', and register code is 'pod trunk register <your email> <your name>'"
298
+ # return
299
+ # end
300
+ # else
301
+ # if (is_static_lib == true ? system("pod repo push #{pod_repo_name} #{podspec_path} --allow-warnings --use-libraries") : system("pod repo push #{pod_repo_name} #{podspec_path} --allow-warnings")) == false
302
+ # return
303
+ # end
304
+ # end
305
+ #
306
+
307
+ end
308
+ end
@@ -4,6 +4,7 @@ module CocoapodsTools
4
4
  class Command < CLAide::Command
5
5
 
6
6
  require 'cocoapods-tools/command/spec/spec'
7
+ require 'cocoapods-tools/command/git/gt'
7
8
 
8
9
  self.abstract_command = true
9
10
 
@@ -1,3 +1,3 @@
1
1
  module CocoapodsTools
2
- VERSION = "0.1.1"
2
+ VERSION = "0.1.3"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cocoapods-tools
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - pandaleecn
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-03-13 00:00:00.000000000 Z
11
+ date: 2022-07-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: claide
@@ -35,9 +35,14 @@ files:
35
35
  - bin/ht
36
36
  - lib/cocoapods-tools.rb
37
37
  - lib/cocoapods-tools/command.rb
38
+ - lib/cocoapods-tools/command/git/component.rb
39
+ - lib/cocoapods-tools/command/git/gt.rb
40
+ - lib/cocoapods-tools/command/git/init.rb
41
+ - lib/cocoapods-tools/command/git/merge.rb
38
42
  - lib/cocoapods-tools/command/spec/init.rb
39
43
  - lib/cocoapods-tools/command/spec/spec.rb
40
44
  - lib/cocoapods-tools/command/spec/tag.rb
45
+ - lib/cocoapods-tools/command/spec/tag_sigle.rb
41
46
  - lib/cocoapods-tools/helper/color.rb
42
47
  - lib/cocoapods-tools/version.rb
43
48
  homepage: https://github.com/pandaleecn/cocoapods-tools