pindo 5.18.20 → 5.19.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. checksums.yaml +4 -4
  2. data/lib/pindo/base/git_handler.rb +38 -60
  3. data/lib/pindo/command/android/autobuild.rb +8 -4
  4. data/lib/pindo/command/ios/autobuild.rb +8 -4
  5. data/lib/pindo/command/repo/create.rb +1 -1
  6. data/lib/pindo/command/repo/search.rb +1 -1
  7. data/lib/pindo/command/unity/autobuild.rb +1 -1
  8. data/lib/pindo/command/utils/installskills.rb +2 -2
  9. data/lib/pindo/command/utils/renewproj.rb +0 -1
  10. data/lib/pindo/command/web/autobuild.rb +8 -4
  11. data/lib/pindo/module/android/android_build_helper.rb +39 -16
  12. data/lib/pindo/module/android/gradle_helper.rb +8 -14
  13. data/lib/pindo/module/cert/cert_helper.rb +2 -2
  14. data/lib/pindo/module/pgyer/pgyerhelper.rb +18 -20
  15. data/lib/pindo/module/task/model/build/android_build_dev_task.rb +1 -37
  16. data/lib/pindo/module/task/model/build/android_build_task.rb +40 -0
  17. data/lib/pindo/module/task/model/build/ios_build_adhoc_task.rb +5 -5
  18. data/lib/pindo/module/task/model/build/ios_build_appstore_task.rb +5 -5
  19. data/lib/pindo/module/task/model/build/ios_build_dev_task.rb +2 -2
  20. data/lib/pindo/module/task/model/build_task.rb +2 -0
  21. data/lib/pindo/module/task/model/git/git_commit_task.rb +11 -1
  22. data/lib/pindo/module/task/model/git/git_tag_task.rb +2 -2
  23. data/lib/pindo/module/task/model/jps/jps_workflow_message_task.rb +8 -10
  24. data/lib/pindo/module/task/pindo_task.rb +2 -2
  25. data/lib/pindo/module/task/task_manager.rb +14 -6
  26. data/lib/pindo/module/unity/nuget_helper.rb +5 -20
  27. data/lib/pindo/module/utils/git_repo_helper.rb +40 -45
  28. data/lib/pindo/module/xcode/ipa_resign_helper.rb +33 -62
  29. data/lib/pindo/options/groups/unity_options.rb +1 -1
  30. data/lib/pindo/version.rb +1 -1
  31. metadata +1 -1
@@ -86,10 +86,10 @@ module Pindo
86
86
  tmp_dir = File.join(ipa_dir, tmp_time)
87
87
  FileUtils.mkdir(tmp_dir) unless File.exist?(tmp_dir)
88
88
 
89
- # 解压 IPA
90
- command = "unzip -q \"#{resign_ipa_full_name}\" -d #{tmp_dir}"
91
- puts command
92
- system command
89
+ # 解压 IPA(数组参数避免注入;失败立即报错,不静默继续)
90
+ unless system("unzip", "-q", resign_ipa_full_name, "-d", tmp_dir)
91
+ raise Informative, "IPA 解压失败: #{resign_ipa_full_name}"
92
+ end
93
93
 
94
94
  payload_path = File.join(tmp_dir, "Payload")
95
95
  if File.exist?(payload_path)
@@ -129,14 +129,13 @@ module Pindo
129
129
  # 修改 Info.plist 中的 Bundle ID
130
130
  modify_ipa_info_plist(modify_content_path: modify_content_path, bundle_id: new_bundle_id)
131
131
 
132
- # 重新打包 IPA
133
- current_dir = Dir.pwd
132
+ # 重新打包 IPA(数组参数 + chdir,避免 shell;* 由 Ruby 展开;失败立即报错)
134
133
  if File.exist?(payload_path)
135
- Dir.chdir(tmp_dir)
136
- command = "zip -qry \"#{resign_ipa_full_name}\" * "
137
- puts command
138
- system command
139
- Dir.chdir(current_dir)
134
+ # 排除点文件,对齐原 shell `*` 语义(避免把 .DS_Store 等打进 IPA 根目录)
135
+ entries = Dir.children(tmp_dir).reject { |e| e.start_with?('.') }
136
+ unless system("zip", "-qry", resign_ipa_full_name, *entries, chdir: tmp_dir)
137
+ raise Informative, "IPA 重新打包失败: #{resign_ipa_full_name}"
138
+ end
140
139
  end
141
140
 
142
141
  # 清理临时目录
@@ -160,24 +159,21 @@ module Pindo
160
159
 
161
160
  # 确保 PlistBuddy 可用
162
161
  unless File.exist?("/usr/local/bin/PlistBuddy")
163
- command = 'ln -s /usr/libexec/PlistBuddy /usr/local/bin/PlistBuddy'
164
- system command
162
+ system("ln", "-s", "/usr/libexec/PlistBuddy", "/usr/local/bin/PlistBuddy")
165
163
  end
166
164
 
167
- # 读取旧的 Bundle ID
168
- old_bundle_id_command = '/usr/local/bin/PlistBuddy -c "Print :CFBundleIdentifier" ' + main_info_plist
169
- puts old_bundle_id_command
165
+ # 读取旧的 Bundle ID(数组参数,避免路径拼接进 shell)
170
166
  old_bundle_id = ""
171
- IO.popen(old_bundle_id_command) { |f| old_bundle_id = f.gets }
172
- old_bundle_id = old_bundle_id.strip
167
+ IO.popen(["/usr/local/bin/PlistBuddy", "-c", "Print :CFBundleIdentifier", main_info_plist]) { |f| old_bundle_id = f.gets }
168
+ old_bundle_id = old_bundle_id.to_s.strip
173
169
  puts "旧 Bundle ID: #{old_bundle_id}"
174
170
 
175
- # 修改主应用的 Bundle ID
171
+ # 修改主应用的 Bundle ID(失败立即报错)
176
172
  new_main_bundle_id = bundle_id
177
173
 
178
- exchange_bundleid_command = '/usr/local/bin/PlistBuddy -c "Set :CFBundleIdentifier ' + new_main_bundle_id + '" ' + main_info_plist
179
- puts exchange_bundleid_command
180
- system exchange_bundleid_command
174
+ unless system("/usr/local/bin/PlistBuddy", "-c", "Set :CFBundleIdentifier #{new_main_bundle_id}", main_info_plist)
175
+ raise Informative, "修改主应用 Bundle ID 失败: #{main_info_plist}"
176
+ end
181
177
 
182
178
  # 如果 Bundle ID 发生变化,更新 URL Schemes
183
179
  if old_bundle_id != new_main_bundle_id
@@ -193,10 +189,8 @@ module Pindo
193
189
  appex_path = File.join(plugin_path, file)
194
190
  tmp_info_plist = File.join(appex_path, "Info.plist")
195
191
 
196
- old_bundle_id_command = '/usr/local/bin/PlistBuddy -c "Print :CFBundleIdentifier" ' + tmp_info_plist
197
- puts old_bundle_id_command
198
192
  old_plugin_bundle_id = ""
199
- IO.popen(old_bundle_id_command) { |f| old_plugin_bundle_id = f.gets }
193
+ IO.popen(["/usr/local/bin/PlistBuddy", "-c", "Print :CFBundleIdentifier", tmp_info_plist]) { |f| old_plugin_bundle_id = f.gets }
200
194
  puts "old_bundle_id = #{old_plugin_bundle_id}"
201
195
 
202
196
  # 根据插件类型修改 Bundle ID
@@ -219,9 +213,9 @@ module Pindo
219
213
  plugin_types.each do |suffix|
220
214
  if old_bundle_id.include?(suffix)
221
215
  new_plugin_bundle_id = new_base_bundle_id + suffix
222
- exchange_bundleid_command = '/usr/local/bin/PlistBuddy -c "Set :CFBundleIdentifier ' + new_plugin_bundle_id + '" ' + plist_path
223
- puts exchange_bundleid_command
224
- system exchange_bundleid_command
216
+ unless system("/usr/local/bin/PlistBuddy", "-c", "Set :CFBundleIdentifier #{new_plugin_bundle_id}", plist_path)
217
+ puts " ⚠ 修改插件 Bundle ID 失败: #{plist_path}"
218
+ end
225
219
  break
226
220
  end
227
221
  end
@@ -322,49 +316,26 @@ module Pindo
322
316
  puts " 旧 Scheme: #{old_scheme} (基于 #{old_bundle_id})"
323
317
  puts " 新 Scheme: #{new_scheme} (基于 #{new_bundle_id})"
324
318
 
325
- # 将 binary plist 转换为 XML 格式
326
- convert_command = "plutil -convert xml1 \"#{plist_path}\" 2>/dev/null"
327
- unless system(convert_command)
319
+ # 将 binary plist 转换为 XML 格式(数组参数,避免 plist_path 拼接进 shell)
320
+ unless system("plutil", "-convert", "xml1", plist_path, err: File::NULL)
328
321
  puts " ✗ 转换 plist 为 XML 失败"
329
322
  return
330
323
  end
331
324
 
332
- # 检查文件中是否存在旧的 scheme
333
- check_command = "grep -q \"#{old_scheme}\" \"#{plist_path}\""
334
- scheme_exists = system(check_command)
335
-
336
- unless scheme_exists
325
+ # Ruby 文件操作做字面量替换,彻底规避 sed/grep 的 shell 注入
326
+ content = File.read(plist_path)
327
+ unless content.include?(old_scheme)
337
328
  puts " ✓ 没有找到需要更新的 URL Scheme"
338
- # 转换回 binary 格式
339
- convert_back_command = "plutil -convert binary1 \"#{plist_path}\" 2>/dev/null"
340
- system(convert_back_command)
329
+ system("plutil", "-convert", "binary1", plist_path, err: File::NULL)
341
330
  return
342
331
  end
343
332
 
344
- # 使用 sed 进行全文替换
345
- # 使用临时文件避免 sed -i 在不同系统上的兼容性问题
346
- temp_file = "#{plist_path}.tmp"
347
- sed_command = "sed 's/#{old_scheme}/#{new_scheme}/g' \"#{plist_path}\" > \"#{temp_file}\" && mv \"#{temp_file}\" \"#{plist_path}\""
333
+ replace_count = content.scan(old_scheme).size
334
+ File.write(plist_path, content.gsub(old_scheme, new_scheme))
348
335
 
349
- if system(sed_command)
350
- # 统计替换次数
351
- count_command = "grep -o \"#{new_scheme}\" \"#{plist_path}\" | wc -l"
352
- replace_count = `#{count_command}`.strip.to_i
353
-
354
- # 转换回 binary 格式
355
- convert_back_command = "plutil -convert binary1 \"#{plist_path}\" 2>/dev/null"
356
- system(convert_back_command)
357
-
358
- puts " ✓ 已替换 #{replace_count} 处 URL Scheme: #{old_scheme} → #{new_scheme}"
359
- else
360
- puts " ✗ 替换 URL Scheme 失败"
361
- # 清理临时文件
362
- FileUtils.rm_f(temp_file) if File.exist?(temp_file)
363
-
364
- # 转换回 binary 格式(即使失败也要转回)
365
- convert_back_command = "plutil -convert binary1 \"#{plist_path}\" 2>/dev/null"
366
- system(convert_back_command)
367
- end
336
+ # 转换回 binary 格式
337
+ system("plutil", "-convert", "binary1", plist_path, err: File::NULL)
338
+ puts " 已替换 #{replace_count} 处 URL Scheme: #{old_scheme} #{new_scheme}"
368
339
  end
369
340
 
370
341
  end
@@ -51,7 +51,7 @@ module Pindo
51
51
  env_name: 'PINDO_KILL_UNITY',
52
52
  default_value: false,
53
53
  optional: true,
54
- example: 'pindo unity autobuild --kill-unity'
54
+ example: 'pindo unity autobuild --kill_unity'
55
55
  )
56
56
  }
57
57
  end
data/lib/pindo/version.rb CHANGED
@@ -6,7 +6,7 @@ require 'time'
6
6
 
7
7
  module Pindo
8
8
 
9
- VERSION = "5.18.20"
9
+ VERSION = "5.19.2"
10
10
 
11
11
  class VersionCheck
12
12
  RUBYGEMS_API = 'https://rubygems.org/api/v1/gems/pindo.json'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pindo
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.18.20
4
+ version: 5.19.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - wade