lhj-tools 0.1.5 → 0.1.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/lhj/action/sh_helper.rb +138 -0
- data/lib/lhj/command/config/info.rb +47 -0
- data/lib/lhj/command/config.rb +11 -0
- data/lib/lhj/command/file_path.rb +20 -0
- data/lib/lhj/command/head_import.rb +19 -3
- data/lib/lhj/command/http.rb +14 -0
- data/lib/lhj/command/init.rb +4 -4
- data/lib/lhj/command/local/fetch.rb +1 -1
- data/lib/lhj/command/local/filter.rb +1 -1
- data/lib/lhj/command/local/local.rb +1 -1
- data/lib/lhj/command/local/local_upload.rb +1 -1
- data/lib/lhj/command/local/micro_service.rb +1 -1
- data/lib/lhj/command/oss/del.rb +18 -5
- data/lib/lhj/command/oss/list.rb +1 -1
- data/lib/lhj/command/oss/upload.rb +7 -3
- data/lib/lhj/command/refactor_rename.rb +1 -1
- data/lib/lhj/command/rename_image.rb +1 -1
- data/lib/lhj/command/sync_pod_repo.rb +149 -0
- data/lib/lhj/command/trans.rb +1 -1
- data/lib/lhj/command/yapi.rb +15 -14
- data/lib/lhj/command.rb +25 -6
- data/lib/lhj/tools/version.rb +1 -1
- data/lib/lhj/tools.rb +1 -0
- data/lib/lhj/tree/hash_walker.rb +1 -1
- data/lib/lhj/tree/path_walker.rb +1 -2
- data/lib/lhj/tree/tree.rb +5 -5
- data/lib/lhj/ui/errors/lhj_common_error.rb +19 -0
- data/lib/lhj/ui/errors/lhj_crash.rb +11 -0
- data/lib/lhj/ui/errors/lhj_error.rb +25 -0
- data/lib/lhj/ui/errors/lhj_exception.rb +19 -0
- data/lib/lhj/ui/errors/lhj_shell_error.rb +11 -0
- data/lib/lhj/ui/errors.rb +1 -0
- data/lib/lhj/ui/implementations/shell.rb +148 -0
- data/lib/lhj/ui/interface.rb +205 -0
- data/lib/lhj/ui/ui.rb +26 -0
- metadata +51 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 55ea8babd6d7b1aa8bdbc376bd7c624620dc4b868be6fa6decf8ba46443f4e4d
|
4
|
+
data.tar.gz: e802b2a688c86d442a6f2776b7d6ce0abf93edf82ef3b3fe2bdf4624ba8f4aa4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e23b3398d6c629c30814c5a3b0354430b215ce0d0b9f6cab8e499a87da74d0fc6d3a7c174e81d31d53e89a6eab603bc2f572e428f6715e3ab71a739f7e03a24d
|
7
|
+
data.tar.gz: 11872fd8fefb0e3dc88e344f20755bbb1a2615e4e28c91e09e20ff9c616379d35f6a33d57cd0b670a115e31e5725f121919ec74cd5db512423b9a36a28dfb70a
|
@@ -0,0 +1,138 @@
|
|
1
|
+
require "open3"
|
2
|
+
|
3
|
+
module Lhj
|
4
|
+
module Actions
|
5
|
+
# Execute a shell command
|
6
|
+
# This method will output the string and execute it
|
7
|
+
# Just an alias for sh_no_action
|
8
|
+
# When running this in tests, it will return the actual command instead of executing it
|
9
|
+
# @param log [Boolean] should fastlane print out the executed command
|
10
|
+
# @param error_callback [Block] a callback invoked with the command output if there is a non-zero exit status
|
11
|
+
def self.sh(*command, log: true, error_callback: nil, &b)
|
12
|
+
sh_control_output(*command, print_command: log, print_command_output: log, error_callback: error_callback, &b)
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.sh_no_action(*command, log: true, error_callback: nil, &b)
|
16
|
+
sh_control_output(*command, print_command: log, print_command_output: log, error_callback: error_callback, &b)
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.sh_enabled?
|
20
|
+
true
|
21
|
+
end
|
22
|
+
|
23
|
+
# @param command The command to be executed (variadic)
|
24
|
+
# @param print_command [Boolean] Should we print the command that's being executed
|
25
|
+
# @param print_command_output [Boolean] Should we print the command output during execution
|
26
|
+
# @param error_callback [Block] A block that's called if the command exits with a non-zero status
|
27
|
+
# @yield [status, result, cmd] The return status of the command, all output from the command and an equivalent shell command
|
28
|
+
# @yieldparam [Process::Status] status A Process::Status indicating the status of the completed command
|
29
|
+
# @yieldparam [String] result The complete output to stdout and stderr of the completed command
|
30
|
+
# @yieldparam [String] cmd A shell command equivalent to the arguments passed
|
31
|
+
# rubocop: disable Metrics/PerceivedComplexity
|
32
|
+
def self.sh_control_output(*command, print_command: true, print_command_output: true, error_callback: nil)
|
33
|
+
print_command = print_command_output = true if $troubleshoot
|
34
|
+
# Set the encoding first, the user might have set it wrong
|
35
|
+
previous_encoding = [Encoding.default_external, Encoding.default_internal]
|
36
|
+
Encoding.default_external = Encoding::UTF_8
|
37
|
+
Encoding.default_internal = Encoding::UTF_8
|
38
|
+
|
39
|
+
# Workaround to support previous Fastlane syntax.
|
40
|
+
# This has some limitations. For example, it requires the caller to shell escape
|
41
|
+
# everything because of usages like ["ls -la", "/tmp"] instead of ["ls", "-la", "/tmp"].
|
42
|
+
command = [command.first.join(" ")] if command.length == 1 && command.first.kind_of?(Array)
|
43
|
+
|
44
|
+
shell_command = shell_command_from_args(*command)
|
45
|
+
UI.command(shell_command) if print_command
|
46
|
+
|
47
|
+
result = ''
|
48
|
+
exit_status = nil
|
49
|
+
if sh_enabled?
|
50
|
+
# The argument list is passed directly to Open3.popen2e, which
|
51
|
+
# handles the variadic argument list in the same way as Kernel#spawn.
|
52
|
+
# (http://ruby-doc.org/core-2.4.2/Kernel.html#method-i-spawn) or
|
53
|
+
# Process.spawn (http://ruby-doc.org/core-2.4.2/Process.html#method-c-spawn).
|
54
|
+
#
|
55
|
+
# sh "ls -la /Applications/Xcode\ 7.3.1.app"
|
56
|
+
# sh "ls", "-la", "/Applications/Xcode 7.3.1.app"
|
57
|
+
# sh({ "FOO" => "Hello" }, "echo $FOO")
|
58
|
+
Open3.popen2e(*command) do |stdin, io, thread|
|
59
|
+
io.sync = true
|
60
|
+
io.each do |line|
|
61
|
+
UI.command_output(line.strip) if print_command_output
|
62
|
+
result << line
|
63
|
+
end
|
64
|
+
exit_status = thread.value
|
65
|
+
end
|
66
|
+
|
67
|
+
# Checking Process::Status#exitstatus instead of #success? makes for more
|
68
|
+
# testable code. (Tests mock exitstatus only.) This is also consistent
|
69
|
+
# with previous implementations of sh and... probably portable to all
|
70
|
+
# relevant platforms.
|
71
|
+
if exit_status.exitstatus != 0
|
72
|
+
message = if print_command
|
73
|
+
"Exit status of command '#{shell_command}' was #{exit_status.exitstatus} instead of 0."
|
74
|
+
else
|
75
|
+
"Shell command exited with exit status #{exit_status.exitstatus} instead of 0."
|
76
|
+
end
|
77
|
+
message += "\n#{result}" if print_command_output
|
78
|
+
|
79
|
+
if error_callback || block_given?
|
80
|
+
UI.error(message)
|
81
|
+
# block notified below, on success or failure
|
82
|
+
error_callback && error_callback.call(result)
|
83
|
+
else
|
84
|
+
UI.shell_error!(message)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
else
|
88
|
+
result << shell_command # only for the tests
|
89
|
+
end
|
90
|
+
|
91
|
+
if block_given?
|
92
|
+
# Avoid yielding nil in tests. $? will be meaningless, but calls to
|
93
|
+
# it will not crash. There is no Process::Status.new. The alternative
|
94
|
+
# is to move this inside the sh_enabled? check and not yield in tests.
|
95
|
+
return yield(exit_status || $?, result, shell_command)
|
96
|
+
end
|
97
|
+
result
|
98
|
+
rescue => ex
|
99
|
+
raise ex
|
100
|
+
ensure
|
101
|
+
Encoding.default_external = previous_encoding.first
|
102
|
+
Encoding.default_internal = previous_encoding.last
|
103
|
+
end
|
104
|
+
# rubocop: enable Metrics/PerceivedComplexity
|
105
|
+
|
106
|
+
# Used to produce a shell command string from a list of arguments that may
|
107
|
+
# be passed to methods such as Kernel#system, Kernel#spawn and Open3.popen2e
|
108
|
+
# in order to print the command to the terminal. The same *args are passed
|
109
|
+
# directly to a system call (Open3.popen2e). This interpretation is not
|
110
|
+
# used when executing a command.
|
111
|
+
#
|
112
|
+
# @param args Any number of arguments used to construct a command
|
113
|
+
# @raise [ArgumentError] If no arguments passed
|
114
|
+
# @return [String] A shell command representing the arguments passed in
|
115
|
+
def self.shell_command_from_args(*args)
|
116
|
+
raise ArgumentError, "sh requires at least one argument" unless args.count > 0
|
117
|
+
|
118
|
+
command = ""
|
119
|
+
|
120
|
+
# Optional initial environment Hash
|
121
|
+
if args.first.kind_of?(Hash)
|
122
|
+
command = args.shift.map { |k, v| "#{k}=#{v.shellescape}" }.join(" ") + " "
|
123
|
+
end
|
124
|
+
|
125
|
+
# Support [ "/usr/local/bin/foo", "foo" ], "-x", ...
|
126
|
+
if args.first.kind_of?(Array)
|
127
|
+
command += args.shift.first.shellescape + " " + args.shelljoin
|
128
|
+
command.chomp!(" ")
|
129
|
+
elsif args.count == 1 && args.first.kind_of?(String)
|
130
|
+
command += args.first
|
131
|
+
else
|
132
|
+
command += args.shelljoin
|
133
|
+
end
|
134
|
+
|
135
|
+
command
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'highline'
|
2
|
+
require 'lhj/config'
|
3
|
+
|
4
|
+
module Lhj
|
5
|
+
class Command
|
6
|
+
class Config < Command
|
7
|
+
# show config info
|
8
|
+
class Info < Config
|
9
|
+
self.summary = '查看配置信息'
|
10
|
+
|
11
|
+
def initialize(argv)
|
12
|
+
@cli = HighLine.new
|
13
|
+
super
|
14
|
+
end
|
15
|
+
|
16
|
+
def handle
|
17
|
+
show_config
|
18
|
+
end
|
19
|
+
|
20
|
+
def show_config
|
21
|
+
config_arr = Dir.glob("#{config_dir}/**/*.yml")
|
22
|
+
config_arr.each_index { |i| puts "#{i}.#{File.basename(config_arr[i])}".yellow }
|
23
|
+
idx = ask_which_one
|
24
|
+
config_file = config_arr[idx]
|
25
|
+
show_yaml(config_file)
|
26
|
+
end
|
27
|
+
|
28
|
+
def show_yaml(file)
|
29
|
+
table_rows = []
|
30
|
+
yaml = YAML.load_file(file)
|
31
|
+
yaml.each { |key, value| table_rows << [key, value] }
|
32
|
+
title = File.basename(file).to_s
|
33
|
+
table = Terminal::Table.new title: title, headings: %w[键 值], rows: table_rows
|
34
|
+
puts table
|
35
|
+
end
|
36
|
+
|
37
|
+
def ask_which_one
|
38
|
+
@cli.ask('查看哪个配置: '.green).strip.to_i
|
39
|
+
end
|
40
|
+
|
41
|
+
def config_dir
|
42
|
+
Lhj::Config.instance.home_dir
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'lhj/tree/tree'
|
2
|
+
|
3
|
+
module Lhj
|
4
|
+
class Command
|
5
|
+
# show file path
|
6
|
+
class Filepath < Command
|
7
|
+
self.summary = '显示文件目录'
|
8
|
+
|
9
|
+
def initialize(argv)
|
10
|
+
@current_path = argv.shift_argument || Dir.pwd
|
11
|
+
super
|
12
|
+
end
|
13
|
+
|
14
|
+
def handle
|
15
|
+
tree = Lhj::Tree.new(@current_path)
|
16
|
+
puts tree.render
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -5,7 +5,8 @@ require 'fileutils'
|
|
5
5
|
|
6
6
|
module Lhj
|
7
7
|
class Command
|
8
|
-
|
8
|
+
# modify header
|
9
|
+
class HeaderImport < Command
|
9
10
|
self.summary = '更改头文件引入'
|
10
11
|
|
11
12
|
def initialize(argv)
|
@@ -13,14 +14,16 @@ module Lhj
|
|
13
14
|
@framework = argv.option('framework')
|
14
15
|
@header_map = {}
|
15
16
|
@header_folder_map = {}
|
17
|
+
@modify_files = []
|
16
18
|
super
|
17
19
|
end
|
18
20
|
|
19
|
-
def
|
21
|
+
def handle
|
20
22
|
generate_header_map
|
21
23
|
# say_header_map
|
22
24
|
# find_all_sub_folder
|
23
25
|
update_source_header
|
26
|
+
# print_modify_info
|
24
27
|
end
|
25
28
|
|
26
29
|
# @return [@header_map]
|
@@ -109,7 +112,10 @@ module Lhj
|
|
109
112
|
result = line
|
110
113
|
if line =~ /#import/
|
111
114
|
ma = find_head_key(line)
|
112
|
-
|
115
|
+
if ma && !exist_in_file(file, ma[0])
|
116
|
+
result = line.gsub(ma[0], @header_map[ma[0].to_sym] || ma[0])
|
117
|
+
# @modify_files << file unless @modify_files.include?(file)
|
118
|
+
end
|
113
119
|
end
|
114
120
|
result
|
115
121
|
end
|
@@ -123,6 +129,16 @@ module Lhj
|
|
123
129
|
header_reg = /"\D*.h"/
|
124
130
|
line.match(header_reg)
|
125
131
|
end
|
132
|
+
|
133
|
+
def print_modify_info
|
134
|
+
rows = []
|
135
|
+
@modify_files.each do |file|
|
136
|
+
rows << [File.basename(file), File.absolute_path(file)]
|
137
|
+
end
|
138
|
+
title = "修改了#{rows.count}个文件"
|
139
|
+
table = Terminal::Table.new title: title, headings: %w[文件 路径], rows: rows
|
140
|
+
puts table
|
141
|
+
end
|
126
142
|
end
|
127
143
|
end
|
128
144
|
end
|
data/lib/lhj/command/init.rb
CHANGED
@@ -11,18 +11,18 @@ module Lhj
|
|
11
11
|
self.summary = '初始化控件'
|
12
12
|
self.description = '使用工具前先执行`lhj init`'
|
13
13
|
|
14
|
-
def
|
15
|
-
auto_spin
|
14
|
+
def handle
|
16
15
|
FileUtils.mkdir_p(target_folder) unless File.exist?(target_folder)
|
17
16
|
download_file
|
18
|
-
stop
|
19
17
|
end
|
20
18
|
|
21
19
|
def down_load_urls
|
22
20
|
%w[http://aomi-ios-repo.oss-cn-shenzhen.aliyuncs.com/localizable_config.yml
|
23
21
|
http://aomi-ios-repo.oss-cn-shenzhen.aliyuncs.com/oss_config.yml
|
24
22
|
http://aomi-ios-repo.oss-cn-shenzhen.aliyuncs.com/yapi.yml
|
25
|
-
http://aomi-ios-repo.oss-cn-shenzhen.aliyuncs.com/zh2hant.yml
|
23
|
+
http://aomi-ios-repo.oss-cn-shenzhen.aliyuncs.com/zh2hant.yml
|
24
|
+
http://aomi-ios-repo.oss-cn-shenzhen.aliyuncs.com/pod_config.yml
|
25
|
+
http://aomi-ios-repo.oss-cn-shenzhen.aliyuncs.com/main_config.yml]
|
26
26
|
end
|
27
27
|
|
28
28
|
def target_folder
|
data/lib/lhj/command/oss/del.rb
CHANGED
@@ -8,27 +8,40 @@ module Lhj
|
|
8
8
|
self.summary = '删除OSS的key'
|
9
9
|
|
10
10
|
self.arguments = [
|
11
|
-
CLAide::Argument.new('--key=XX', true)
|
11
|
+
CLAide::Argument.new('--key=XX', true),
|
12
|
+
CLAide::Argument.new('--type=XX', true)
|
12
13
|
]
|
13
14
|
|
14
15
|
def self.options
|
15
16
|
[
|
16
|
-
%w[--key OSS对应的key]
|
17
|
+
%w[--key OSS对应的key],
|
18
|
+
%w[--type OSS对应的类型]
|
17
19
|
]
|
18
20
|
end
|
19
21
|
|
20
22
|
def initialize(argv)
|
21
23
|
@key = argv.option('key')
|
24
|
+
@type = argv.option('type')
|
22
25
|
super
|
23
26
|
end
|
24
27
|
|
25
28
|
def validate!
|
26
|
-
help! '请输入key' unless @key
|
29
|
+
help! '请输入key或者类型' unless @key || @type
|
27
30
|
super
|
28
31
|
end
|
29
32
|
|
30
|
-
def
|
31
|
-
|
33
|
+
def handle
|
34
|
+
if @type
|
35
|
+
objects = Lhj::OSS::Helper.instance.list
|
36
|
+
objects.each do |o|
|
37
|
+
if /#{@type}/ =~ o.key
|
38
|
+
puts "成功删除#{o.key}"
|
39
|
+
Lhj::OSS::Helper.instance.delete(o.key)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
else
|
43
|
+
Lhj::OSS::Helper.instance.delete(@key)
|
44
|
+
end
|
32
45
|
end
|
33
46
|
end
|
34
47
|
end
|
data/lib/lhj/command/oss/list.rb
CHANGED
@@ -11,13 +11,15 @@ module Lhj
|
|
11
11
|
|
12
12
|
self.arguments = [
|
13
13
|
CLAide::Argument.new('type', false),
|
14
|
-
CLAide::Argument.new('name', false)
|
14
|
+
CLAide::Argument.new('name', false),
|
15
|
+
CLAide::Argument.new('tag', false)
|
15
16
|
]
|
16
17
|
|
17
18
|
def self.options
|
18
19
|
[
|
19
20
|
%w[--type 文件类型],
|
20
|
-
%w[--name 文件名]
|
21
|
+
%w[--name 文件名],
|
22
|
+
%w[--tag 标签]
|
21
23
|
]
|
22
24
|
end
|
23
25
|
|
@@ -30,10 +32,11 @@ module Lhj
|
|
30
32
|
@current_path = argv.shift_argument || Dir.pwd
|
31
33
|
@type = argv.option('type')
|
32
34
|
@name = argv.option('name')
|
35
|
+
@tag = argv.option('tag')
|
33
36
|
super
|
34
37
|
end
|
35
38
|
|
36
|
-
def
|
39
|
+
def handle
|
37
40
|
Dir.glob("#{@current_path}/*").each do |f|
|
38
41
|
file_name = File.basename(f)
|
39
42
|
if @name && /#{@name}/ =~ file_name
|
@@ -48,6 +51,7 @@ module Lhj
|
|
48
51
|
|
49
52
|
def upload(file, file_name)
|
50
53
|
oss_key = file_name
|
54
|
+
oss_key = "#{@tag}/#{file_name}" if @tag
|
51
55
|
Lhj::OSS::Helper.instance.upload(oss_key, file)
|
52
56
|
url = Lhj::OSS::Helper.instance.object_url(oss_key)
|
53
57
|
puts "云端上传成功:#{url}\n"
|
@@ -0,0 +1,149 @@
|
|
1
|
+
require 'lhj/config'
|
2
|
+
require 'highline'
|
3
|
+
|
4
|
+
module Lhj
|
5
|
+
class Command
|
6
|
+
# sync code to pod
|
7
|
+
class SyncPod < Command
|
8
|
+
self.summary = '同步代码到私用仓库'
|
9
|
+
|
10
|
+
def initialize(argv)
|
11
|
+
@cli = HighLine.new
|
12
|
+
super
|
13
|
+
end
|
14
|
+
|
15
|
+
def handle
|
16
|
+
sync
|
17
|
+
end
|
18
|
+
|
19
|
+
def sync
|
20
|
+
config_file = File.join(Lhj::Config.instance.home_dir, 'pod_config.yml')
|
21
|
+
arr = YAML.load_file(config_file)
|
22
|
+
arr.each_index { |i| puts "#{i}.#{arr[i]['pod']}".yellow }
|
23
|
+
idx = @cli.ask('请选择哪一个库同步: '.green).strip.to_i
|
24
|
+
pod_name = arr[idx]['pod']
|
25
|
+
src = arr[idx]['main_path']
|
26
|
+
dest = arr[idx]['pod_path']
|
27
|
+
FileUtils.cp_r(src, dest, remove_destination: true)
|
28
|
+
puts '1.从主工程复制代码到pod库成功'.green
|
29
|
+
|
30
|
+
ma = nil
|
31
|
+
Dir.chdir(dest) do
|
32
|
+
Dir.glob('*.podspec').each do |p|
|
33
|
+
update_podspec_version(p)
|
34
|
+
version_line = IO.readlines(p).find{ |line| (/\.version/ =~ line) && (version_regex =~ line) }
|
35
|
+
ma = version_line.match(version_regex)
|
36
|
+
end
|
37
|
+
puts '2.更新版本号成功'.green
|
38
|
+
|
39
|
+
Actions.sh('git add .')
|
40
|
+
puts '3.git add成功'.green
|
41
|
+
|
42
|
+
Actions.sh("git commit -m '使用工具同步主工程代码'")
|
43
|
+
puts '4.git 提交成功'.green
|
44
|
+
|
45
|
+
Actions.sh('git push')
|
46
|
+
puts '5.git 推送成功'.green
|
47
|
+
|
48
|
+
add_tag(ma[0]) if ma
|
49
|
+
puts "6.设置tag成功! tag号:#{ma[0]}".green
|
50
|
+
|
51
|
+
push_tag
|
52
|
+
puts '7.推送tag成功'.green
|
53
|
+
|
54
|
+
update_pod_repo
|
55
|
+
puts "8.#{pod_name}推送pod repo成功".green
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
# find src root dir
|
60
|
+
src_root_dir = find_src_root_dir(src)
|
61
|
+
Dir.chdir(src_root_dir) do
|
62
|
+
if ma
|
63
|
+
pod_version = ma[0]
|
64
|
+
update_all_pod_dependency(pod_name, pod_version)
|
65
|
+
puts '9.更新主工程引用pod版本号成功'.green
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
puts '10.手动执行`pod update --verbose --no-repo-update`更新pod'.green
|
70
|
+
end
|
71
|
+
|
72
|
+
def find_src_root_dir(src)
|
73
|
+
ps = []
|
74
|
+
src.scan(%r{(/[^/]*)}).flatten.each do |path|
|
75
|
+
path =~ /Code/ ? break : ps << path
|
76
|
+
end
|
77
|
+
File.join(ps)
|
78
|
+
end
|
79
|
+
|
80
|
+
def version_regex
|
81
|
+
/\d+\.\d+\.(\d+)/
|
82
|
+
end
|
83
|
+
|
84
|
+
def update_podspec_version(path)
|
85
|
+
str = ''
|
86
|
+
File.readlines(path).each do |l|
|
87
|
+
if (/\.version/ =~ l) && (version_regex =~ l)
|
88
|
+
last_version = l.scan(version_regex).flatten.first
|
89
|
+
next_version = last_version.to_i + 1
|
90
|
+
next_version_str = next_version.to_s
|
91
|
+
str += l.gsub(/(\d+\.\d+\.)(\d+)/, '\1' + next_version_str)
|
92
|
+
else
|
93
|
+
str += l.dup
|
94
|
+
end
|
95
|
+
end
|
96
|
+
File.write(path, str)
|
97
|
+
end
|
98
|
+
|
99
|
+
def add_tag(tag)
|
100
|
+
cmd = ['git tag']
|
101
|
+
cmd << '--force'
|
102
|
+
cmd << tag
|
103
|
+
Actions.sh(cmd.join(' '))
|
104
|
+
end
|
105
|
+
|
106
|
+
def push_tag
|
107
|
+
cmd = ['git push --tags']
|
108
|
+
Actions.sh(cmd.join(' '))
|
109
|
+
end
|
110
|
+
|
111
|
+
def update_pod_repo
|
112
|
+
# pod repo push miguatech-aomi_ios-mlspecs *.podspec --sources=miguatech-aomi_ios-mlspecs,aliyun,trunk --allow-warnings --use-libraries --verbose
|
113
|
+
cmd = ['pod repo push']
|
114
|
+
pod_repo_name = 'miguatech-aomi_ios-mlspecs'
|
115
|
+
cmd << pod_repo_name
|
116
|
+
cmd << '*.podspec'
|
117
|
+
cmd << "--sources=#{pod_repo_name},aliyun,trunk"
|
118
|
+
cmd << '--allow-warnings'
|
119
|
+
cmd << '--use-libraries'
|
120
|
+
cmd << '--verbose'
|
121
|
+
Actions.sh(cmd.join(' '), log: true, error_callback: nil)
|
122
|
+
end
|
123
|
+
|
124
|
+
def update_all_pod_dependency(pod_name, pod_version)
|
125
|
+
Dir.glob(%w[./**/*.podspec ./**/Podfile]).each do |p|
|
126
|
+
next if /Example/ =~ p || /temp/ =~ p
|
127
|
+
|
128
|
+
update_main_version(p, pod_name, pod_version)
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
def update_main_version(file, pod_name, pod_version)
|
133
|
+
cont = ''
|
134
|
+
File.readlines(file).each do |l|
|
135
|
+
if (/#{pod_name}/ =~ l) && (/\d+\.\d+\.\d+/ =~ l)
|
136
|
+
path = File.absolute_path(file)
|
137
|
+
puts "更新文件:#{path}".magenta
|
138
|
+
l.scan(/\d+\.\d+\.\d+/).each do |key|
|
139
|
+
cont += l.gsub(key, pod_version)
|
140
|
+
end
|
141
|
+
else
|
142
|
+
cont += l.dup
|
143
|
+
end
|
144
|
+
end
|
145
|
+
File.write(file, cont)
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|