lhj-tools 0.1.5 → 0.1.9
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 +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
|