podsorz 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +8 -0
- data/Gemfile +6 -0
- data/Gemfile.lock +109 -0
- data/LICENSE.txt +21 -0
- data/Podfile +0 -0
- data/PodsOrzConfig.rb +13 -0
- data/README.md +39 -0
- data/Rakefile +2 -0
- data/bin/podsorz +14 -0
- data/lib/podsorz.rb +40 -0
- data/lib/podsorz/command/commit.rb +35 -0
- data/lib/podsorz/command/install.rb +23 -0
- data/lib/podsorz/command/publish.rb +40 -0
- data/lib/podsorz/command/setup.rb +28 -0
- data/lib/podsorz/command/switch.rb +47 -0
- data/lib/podsorz/core/orz_config_templet.rb +13 -0
- data/lib/podsorz/core/orz_env_detector.rb +56 -0
- data/lib/podsorz/core/pod_orzconfig_parse.rb +24 -0
- data/lib/podsorz/core/podfile_io.rb +188 -0
- data/lib/podsorz/core/podfile_model.rb +34 -0
- data/lib/podsorz/core/pods_detector.rb +96 -0
- data/lib/podsorz/core/pods_git_manager.rb +429 -0
- data/lib/podsorz/core/pods_git_operator.rb +700 -0
- data/lib/podsorz/core/pods_repo.rb +195 -0
- data/lib/podsorz/core/pods_version.rb +138 -0
- data/lib/podsorz/util/git_operator.rb +208 -0
- data/lib/podsorz/util/logger.rb +32 -0
- data/lib/podsorz/util/process_operator.rb +19 -0
- data/lib/podsorz/version.rb +3 -0
- data/podsorz.gemspec +40 -0
- metadata +117 -0
@@ -0,0 +1,195 @@
|
|
1
|
+
require "podsorz/util/logger"
|
2
|
+
require 'open3'
|
3
|
+
|
4
|
+
module PodsOrz
|
5
|
+
class PodsRepo
|
6
|
+
attr_accessor :repo_name, :repo_url
|
7
|
+
|
8
|
+
def check_repo_exist
|
9
|
+
command = Thread.new do
|
10
|
+
@repo_name = "kuxiu_specs"
|
11
|
+
@repo_url = "git@gitlab.91banban.com:ios_pods/Specs.git"
|
12
|
+
|
13
|
+
has_repo = false
|
14
|
+
Open3.popen3("pod repo list") do |stdin , stdout , stderr, wait_thr|
|
15
|
+
while line = stdout.gets
|
16
|
+
has_repo = true if line.include? @repo_name
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
unless has_repo
|
21
|
+
Open3.popen3("pod repo add #{@repo_name} #{@repo_url}") do |stdin , stdout , stderr, wait_thr|
|
22
|
+
while line = stdout.gets
|
23
|
+
puts line
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
Open3.popen3("pod repo update #{@repo_name}") do |stdin , stdout , stderr, wait_thr|
|
29
|
+
while line = stdout.gets
|
30
|
+
puts line
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
Logger.default("#{@repo_name} is update to latest.")
|
35
|
+
end
|
36
|
+
|
37
|
+
command.join
|
38
|
+
end
|
39
|
+
|
40
|
+
def ensure_local_pod_version_tag(pod, pod_version, git_tag)
|
41
|
+
#-1 => error or pod_version less than git_tag, 0 => same version, 1 => need add new tag
|
42
|
+
compare_result = compare_version(pod_version, git_tag)
|
43
|
+
|
44
|
+
case compare_result
|
45
|
+
when 0
|
46
|
+
#same
|
47
|
+
Logger.default("#{pod}:#{pod_version} same with local git_tag:#{git_tag}")
|
48
|
+
when -1
|
49
|
+
#less than git_tag
|
50
|
+
Logger.error("#{pod}:#{pod_version} is less than git tag:#{git_tag} \n please checkout manual,make sure latest_pod_version = (previous_git_tag +1).It would be great if you could also remove the invalid tag:#{pod_version} this time. It doesn't matter if you don't delete it")
|
51
|
+
when 1
|
52
|
+
#large than git_tag
|
53
|
+
Logger.warning("#{pod}:#{pod_version} large than git_tag:#{git_tag}")
|
54
|
+
end
|
55
|
+
|
56
|
+
compare_result;
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
def ensure_remote_pod_version(pod, pod_version)
|
61
|
+
remote_version = "0.0.0"
|
62
|
+
remote_version = fetch_remote_pod_version(pod)
|
63
|
+
|
64
|
+
#-1 => error or pod_version less than git_tag, 0 => same version, 1 => publish new version
|
65
|
+
compare_result = compare_version(pod_version, remote_version)
|
66
|
+
|
67
|
+
case compare_result
|
68
|
+
when 0
|
69
|
+
#same
|
70
|
+
Logger.default("#{pod}:#{pod_version} has nothing to update remote kuxiu_specs")
|
71
|
+
when -1
|
72
|
+
#less than remote version
|
73
|
+
Logger.error("#{pod}:#{pod_version} is less than remote:#{remote_version} \n please checkout manual,make sure local_pod_version = (remote_version +1).It would be great if you could also remove the invalid tag:#{pod_version} this time. It doesn't matter if you don't delete it")
|
74
|
+
when 1
|
75
|
+
#large than remote version
|
76
|
+
Logger.warning("#{pod}:#{pod_version} large than remote:#{remote_version}, will start update remote")
|
77
|
+
end
|
78
|
+
|
79
|
+
compare_result;
|
80
|
+
end
|
81
|
+
|
82
|
+
def fetch_remote_pod_version(pod)
|
83
|
+
version = "0.0.0"
|
84
|
+
|
85
|
+
dir_kuxiu_specs = "#{Dir.home}/.cocoapods/repos/kuxiu_specs"
|
86
|
+
dir_pod_path = File.expand_path("#{pod}", dir_kuxiu_specs)
|
87
|
+
is_dir_exit = File.directory?(dir_pod_path)
|
88
|
+
|
89
|
+
unless is_dir_exit
|
90
|
+
Logger.warning("#{pod} remote spec do not exist, default version: 0.0.0")
|
91
|
+
return version
|
92
|
+
end
|
93
|
+
|
94
|
+
filter_list = []
|
95
|
+
files_list = Dir.entries(dir_pod_path)
|
96
|
+
files_list.each { |e|
|
97
|
+
if /^\d{1,3}\.\d{1,3}/ =~ e.to_s
|
98
|
+
filter_list << e
|
99
|
+
end
|
100
|
+
}
|
101
|
+
|
102
|
+
if filter_list.empty?
|
103
|
+
Logger.warning("#{pod} remote spec do not exist available version, default version: 0.0.0")
|
104
|
+
return version
|
105
|
+
end
|
106
|
+
|
107
|
+
sort_array = filter_list.sort { |a, b|
|
108
|
+
compare_version(a,b)
|
109
|
+
}
|
110
|
+
version = sort_array.pop
|
111
|
+
|
112
|
+
return version
|
113
|
+
end
|
114
|
+
|
115
|
+
def compare_version(pod_version, git_tag)
|
116
|
+
#0 => same , -1 => less , 1 => more
|
117
|
+
result = 0
|
118
|
+
|
119
|
+
pod_version = pod_version.strip.chomp
|
120
|
+
git_tag = git_tag.strip.chomp
|
121
|
+
|
122
|
+
version_parts = pod_version.split('.')
|
123
|
+
tag_parts = git_tag.split('.')
|
124
|
+
|
125
|
+
loop_count = 0
|
126
|
+
if version_parts.size >= tag_parts.size
|
127
|
+
loop_count = version_parts.size - tag_parts.size
|
128
|
+
while loop_count > 0 do
|
129
|
+
tag_parts << "0"
|
130
|
+
loop_count = loop_count - 1
|
131
|
+
end
|
132
|
+
else
|
133
|
+
loop_count = tag_parts.size - version_parts.size
|
134
|
+
while loop_count > 0 do
|
135
|
+
version_parts << "0"
|
136
|
+
loop_count = loop_count - 1
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
loop_count = tag_parts.size
|
141
|
+
while loop_count > 0 do
|
142
|
+
v = version_parts.shift
|
143
|
+
t = tag_parts.shift
|
144
|
+
|
145
|
+
if v.to_i > t.to_i
|
146
|
+
result = 1
|
147
|
+
return result
|
148
|
+
elsif v.to_i < t.to_i
|
149
|
+
result = -1
|
150
|
+
return result
|
151
|
+
else
|
152
|
+
loop_count = loop_count -1
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
return result
|
157
|
+
|
158
|
+
end
|
159
|
+
|
160
|
+
def push_pod_remote(pod, file_path, pod_version)
|
161
|
+
is_push_success = false
|
162
|
+
|
163
|
+
command = Thread.new do
|
164
|
+
repo_push_cmd = []
|
165
|
+
repo_push_cmd << "cd #{file_path}"
|
166
|
+
repo_push_cmd << "pod repo push #{@repo_name} #{pod}.podspec --allow-warnings --use-libraries --skip-import-validation --sources=#{@repo_url}"
|
167
|
+
|
168
|
+
error_info = []
|
169
|
+
|
170
|
+
Logger.default("【#{pod}】:#{pod_version} start push repo remote...")
|
171
|
+
|
172
|
+
IO.popen(repo_push_cmd.join(";")) do |io|
|
173
|
+
io.each do |line|
|
174
|
+
error_info.push(line)
|
175
|
+
is_push_success = true if line.include? "Pushing the `#{@repo_name}' repo"
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
unless is_push_success
|
180
|
+
puts error_info
|
181
|
+
Logger.error("Fail: \'#{pod}\':#{pod_version} push repo remote fail")
|
182
|
+
return is_push_success
|
183
|
+
end
|
184
|
+
|
185
|
+
Logger.highlight(%Q(#{pod}:#{pod_version} push repo success))
|
186
|
+
end
|
187
|
+
|
188
|
+
command.join
|
189
|
+
|
190
|
+
is_push_success
|
191
|
+
end
|
192
|
+
|
193
|
+
end
|
194
|
+
|
195
|
+
end
|
@@ -0,0 +1,138 @@
|
|
1
|
+
require "podsorz/util/logger"
|
2
|
+
|
3
|
+
|
4
|
+
module PodsOrz
|
5
|
+
class PodsVersion
|
6
|
+
attr_accessor :kx_pods_path
|
7
|
+
|
8
|
+
def initialize(main_path)
|
9
|
+
@kx_pods_path = File.expand_path("../kx_pods", main_path)
|
10
|
+
end
|
11
|
+
|
12
|
+
def increase_pod_version(pod)
|
13
|
+
latest_version = ""
|
14
|
+
|
15
|
+
is_increase_success = true
|
16
|
+
is_increase_success = detect_pod_version_file(pod)
|
17
|
+
return latest_version unless is_increase_success
|
18
|
+
|
19
|
+
#increase
|
20
|
+
file_path = File.expand_path("#{pod}/#{pod}.podspec", @kx_pods_path)
|
21
|
+
|
22
|
+
update_lines = []
|
23
|
+
edite_line = ""
|
24
|
+
|
25
|
+
File.open(file_path, "r") do |file|
|
26
|
+
file.readlines.each do |line|
|
27
|
+
l = line.strip.chomp
|
28
|
+
next if l.start_with?("#")
|
29
|
+
|
30
|
+
if /\.(version)(.*) =/ =~ line
|
31
|
+
version_num = $~.post_match.strip.chomp.to_s
|
32
|
+
version_num = version_num.gsub(/[\'\"]/, "")
|
33
|
+
|
34
|
+
unless /\d{1,}\.\d{1,}/ =~ version_num
|
35
|
+
update_lines << line
|
36
|
+
next
|
37
|
+
end
|
38
|
+
|
39
|
+
part_nums = version_num.split('.')
|
40
|
+
last_num = part_nums.pop
|
41
|
+
|
42
|
+
if last_num.to_i >= 99
|
43
|
+
pre_num = part_nums.pop
|
44
|
+
|
45
|
+
if pre_num.to_i >= 99
|
46
|
+
pre_pre_num = part_nums.pop
|
47
|
+
pre_pre_num = (pre_num.to_i + 1).to_s
|
48
|
+
pre_num = "0"
|
49
|
+
|
50
|
+
part_nums << pre_pre_num
|
51
|
+
part_nums << pre_num
|
52
|
+
part_nums << last_num
|
53
|
+
else
|
54
|
+
pre_num = (pre_num.to_i + 1).to_s
|
55
|
+
last_num = "0"
|
56
|
+
|
57
|
+
part_nums << pre_num
|
58
|
+
part_nums << last_num
|
59
|
+
end
|
60
|
+
else
|
61
|
+
last_num = (last_num.to_i + 1).to_s
|
62
|
+
part_nums << last_num
|
63
|
+
end
|
64
|
+
|
65
|
+
latest_version = part_nums.join('.')
|
66
|
+
|
67
|
+
parts_line = line.split('=')
|
68
|
+
edite_line = parts_line[0] + "= " + "\'#{latest_version}\'" + "\n"
|
69
|
+
|
70
|
+
update_lines << edite_line
|
71
|
+
else
|
72
|
+
update_lines << line
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
if edite_line.empty?
|
79
|
+
Logger.error("#{pod}.podspec can not find \'.version = \', increase failure")
|
80
|
+
return latest_version
|
81
|
+
end
|
82
|
+
|
83
|
+
|
84
|
+
File.open(file_path, "w+") {|file|
|
85
|
+
Logger.highlight("#{pod}.podspec version inscrease completed!")
|
86
|
+
update_lines.each do |line|
|
87
|
+
file.write(line)
|
88
|
+
end
|
89
|
+
}
|
90
|
+
|
91
|
+
latest_version
|
92
|
+
end
|
93
|
+
|
94
|
+
def detect_pod_version_file(pod)
|
95
|
+
detect_result = true
|
96
|
+
file_path = File.expand_path("#{pod}/#{pod}.podspec", @kx_pods_path)
|
97
|
+
detect_result = File.exist?(file_path)
|
98
|
+
|
99
|
+
unless detect_result
|
100
|
+
Logger.error("【#{pod}】not exist .podspec file at file path: #{file_path}")
|
101
|
+
end
|
102
|
+
|
103
|
+
detect_result
|
104
|
+
end
|
105
|
+
|
106
|
+
def get_podspec_version(pod)
|
107
|
+
result_version_num = ""
|
108
|
+
|
109
|
+
return result_version_num unless detect_pod_version_file(pod)
|
110
|
+
|
111
|
+
file_path = File.expand_path("#{pod}/#{pod}.podspec", @kx_pods_path)
|
112
|
+
|
113
|
+
File.open(file_path, "r") do |file|
|
114
|
+
file.readlines.each do |line|
|
115
|
+
l = line.strip.chomp
|
116
|
+
next if l.start_with?("#")
|
117
|
+
|
118
|
+
if /\.(version)(.*) =/ =~ line
|
119
|
+
version_num = $~.post_match.strip.chomp.to_s
|
120
|
+
version_num = version_num.gsub(/[\'\"]/, "")
|
121
|
+
|
122
|
+
unless /\d{1,}\.\d{1,}/ =~ version_num
|
123
|
+
next
|
124
|
+
end
|
125
|
+
|
126
|
+
result_version_num = version_num
|
127
|
+
end
|
128
|
+
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
Logger.error("#{pod}.podspec can not find \'.version = \'") if result_version_num.empty?
|
133
|
+
|
134
|
+
result_version_num
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
end
|
@@ -0,0 +1,208 @@
|
|
1
|
+
require File.expand_path("../util/logger.rb", File.dirname(__FILE__))
|
2
|
+
|
3
|
+
module PodsOrz
|
4
|
+
class GitOperator
|
5
|
+
def current_branch(path)
|
6
|
+
Dir.chdir(path) do
|
7
|
+
`git rev-parse --abbrev-ref HEAD`.chop
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def has_remote_branch(path, branch_name)
|
12
|
+
has_branch = false
|
13
|
+
IO.popen("cd '#{path}';git fetch --all;git branch -r") do |io|
|
14
|
+
io.each do |line|
|
15
|
+
has_branch = true if line.include? branch_name
|
16
|
+
end
|
17
|
+
end
|
18
|
+
has_branch
|
19
|
+
end
|
20
|
+
|
21
|
+
def has_local_branch(path, branch_name)
|
22
|
+
has_branch = false
|
23
|
+
IO.popen("cd '#{path}';git branch") do |io|
|
24
|
+
io.each do |line|
|
25
|
+
has_branch = true if line.include? branch_name
|
26
|
+
end
|
27
|
+
end
|
28
|
+
has_branch
|
29
|
+
end
|
30
|
+
|
31
|
+
def has_branch(path, branch_name)
|
32
|
+
has_branch = false
|
33
|
+
IO.popen("cd '#{path}';git fetch --all;git branch -a") do |io|
|
34
|
+
io.each do |line|
|
35
|
+
has_branch = true if line.include? branch_name
|
36
|
+
end
|
37
|
+
end
|
38
|
+
has_branch
|
39
|
+
end
|
40
|
+
|
41
|
+
def checkout(path, branch_name)
|
42
|
+
Dir.chdir(path) do
|
43
|
+
IO.popen("git checkout #{branch_name}") do |io|
|
44
|
+
io.each do |line|
|
45
|
+
Logger.error("Checkout #{branch_name} failed.") if line.include? 'error'
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def fetch(path)
|
52
|
+
Dir.chdir(path) do
|
53
|
+
`git fetch origin`
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def rebase(path, branch_name)
|
58
|
+
Dir.chdir(path) do
|
59
|
+
`git rebase origin/#{branch_name}`
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def clone(path, git_base)
|
64
|
+
Dir.chdir(path) do
|
65
|
+
`git clone #{git_base}`
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def commit(path, message)
|
70
|
+
Dir.chdir(path) do
|
71
|
+
`git add .`
|
72
|
+
`git commit -m "#{message}"`
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def push_to_remote(path, branch_name)
|
77
|
+
Dir.chdir(path) do
|
78
|
+
`git push -u origin #{branch_name}`
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def pull(path)
|
83
|
+
Dir.chdir(path) do
|
84
|
+
`git pull`
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def has_commits(path, branch_name)
|
89
|
+
has_commits = false
|
90
|
+
IO.popen("cd '#{path}'; git log --branches --not --remotes") do |io|
|
91
|
+
io.each do |line|
|
92
|
+
has_commits = true if line.include? "commit"
|
93
|
+
end
|
94
|
+
end
|
95
|
+
has_commits
|
96
|
+
end
|
97
|
+
|
98
|
+
def has_changes(path)
|
99
|
+
has_changes = true
|
100
|
+
clear_flag = 'nothing to commit, working tree clean'
|
101
|
+
IO.popen("cd '#{path}'; git status") do |io|
|
102
|
+
io.each do |line|
|
103
|
+
has_changes = false if line.include? clear_flag
|
104
|
+
end
|
105
|
+
end
|
106
|
+
has_changes
|
107
|
+
end
|
108
|
+
|
109
|
+
def discard(path)
|
110
|
+
Dir.chdir(path) do
|
111
|
+
`git checkout . && git clean -df`
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
def del_local(path, branch_name)
|
116
|
+
Dir.chdir(path) do
|
117
|
+
`git branch -D #{branch_name}`
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
def del_remote(path, branch_name)
|
122
|
+
Dir.chdir(path) do
|
123
|
+
`git push origin --delete #{branch_name}`
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
def user
|
128
|
+
name = `git config user.name`.chop
|
129
|
+
cn_reg = /[\u4e00-\u9fa5]{1}/
|
130
|
+
cn_arr = name.scan(cn_reg)
|
131
|
+
if cn_arr.count > 0
|
132
|
+
Logger.error("git config user.name has Chinese character")
|
133
|
+
else
|
134
|
+
name.gsub(/[^0-9A-Za-z]/, '').downcase
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
def tag(path, version)
|
139
|
+
tags = Array.new
|
140
|
+
IO.popen("cd '#{path}'; git tag") do |io|
|
141
|
+
io.each do |line|
|
142
|
+
tags << line
|
143
|
+
end
|
144
|
+
end
|
145
|
+
unless tags.include? "#{version}\n"
|
146
|
+
Dir.chdir(path) do
|
147
|
+
`git tag -a #{version} -m "release: V #{version}" master;`
|
148
|
+
`git push --tags`
|
149
|
+
end
|
150
|
+
return
|
151
|
+
end
|
152
|
+
Logger.highlight("tag already exists in the remote, skip this step")
|
153
|
+
end
|
154
|
+
|
155
|
+
def tag_list(path)
|
156
|
+
tag_list = Array.new
|
157
|
+
IO.popen("cd '#{path}'; git tag -l --sort=-version:refname") do |io|
|
158
|
+
io.each do |line|
|
159
|
+
tag_list << line
|
160
|
+
end
|
161
|
+
end
|
162
|
+
tag_list
|
163
|
+
end
|
164
|
+
|
165
|
+
def check_merge(path, condition)
|
166
|
+
unmerged_branch = Array.new
|
167
|
+
IO.popen("cd '#{path}'; git branch --no-merged") do |io|
|
168
|
+
io.each do |line|
|
169
|
+
unmerged_branch.push(line) if line.include? "#{condition}"
|
170
|
+
end
|
171
|
+
end
|
172
|
+
if (unmerged_branch.size > 0)
|
173
|
+
unmerged_branch.map { |item|
|
174
|
+
Logger.default(item)
|
175
|
+
}
|
176
|
+
Logger.error("Still has unmerged feature branch, please check")
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
def merge(path, branch_name)
|
181
|
+
IO.popen("cd '#{path}'; git merge #{branch_name}") do |line|
|
182
|
+
Logger.error("Merge conflict in #{branch_name}") if line.include? 'Merge conflict'
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
186
|
+
def compare_branch(path, branch, compare_branch)
|
187
|
+
diff_commit_list = []
|
188
|
+
|
189
|
+
compare_cmd_list = []
|
190
|
+
compare_cmd_list << "cd #{path}"
|
191
|
+
compare_cmd_list << "git log --left-right #{branch}...#{compare_branch} --pretty=oneline"
|
192
|
+
|
193
|
+
IO.popen(compare_cmd_list.join(";")) do |io|
|
194
|
+
io.each do |line|
|
195
|
+
diff_commit_list << line unless line.strip.chomp.empty?
|
196
|
+
end
|
197
|
+
|
198
|
+
end
|
199
|
+
|
200
|
+
diff_commit_list
|
201
|
+
end
|
202
|
+
|
203
|
+
|
204
|
+
|
205
|
+
|
206
|
+
end
|
207
|
+
|
208
|
+
end
|