pindo 4.8.8 → 4.8.9

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '05280c1e438cd48e755e5a943dcb80296ebacec092a3cdd92997141206eeb49e'
4
- data.tar.gz: e3c127d77c032834b54dfee874f9c79499b217afa67e61c99b96bca34d355384
3
+ metadata.gz: 3d618bb3feb5391c7e4c64105f4f34e72fd542421da102a97e7436ed5d02261c
4
+ data.tar.gz: 829babd10a742d61b622e248aa79429c6930f084dfcf90206540fe0fd9b64cf5
5
5
  SHA512:
6
- metadata.gz: 9184262c10bbd7aeec778658d9b267d1fa613dc5065e55bd0f5d3313dbff55dc19e08cb40218eaad9b3a45b4bb583686e67daf810f7f797ccc24b9fa48a5f07d
7
- data.tar.gz: fd7d0b9a6ff225f2ff1f9bcac2557ba1146a1f96e8c6478af12198f3bdcb43b3ac3cce7d512b6a66ce6553e7045247607ad24d04fd459cf759b0c44a5920a9fc
6
+ metadata.gz: f443d03a4934fc8ac2d31ec39bb3ad861a62c28bdd6542a434511cfe1d92f0cb8a6e35736809414e5b564fcec86b0d6393e65d70cec686cd64e518a334ac0277
7
+ data.tar.gz: dd3b27fbcbc5b0392371d6e84feb14a9ece7241b940d7bfc162651d3eee3dd0a74998a5631bb5bb6d9c3115c222d4efff7de3f7df9cb24e85835ba101676ee46
@@ -19,6 +19,27 @@ module Pindo
19
19
 
20
20
  end
21
21
 
22
+ def is_git_directory?(local_repo_dir: nil)
23
+ args = local_repo_dir ? %W(-C #{local_repo_dir} rev-parse --is-inside-work-tree) : %w(rev-parse --is-inside-work-tree)
24
+ begin
25
+ git!(args)
26
+ true
27
+ rescue StandardError => e
28
+ false
29
+ end
30
+ end
31
+
32
+ def git_root_directory(local_repo_dir: nil)
33
+ return nil unless is_git_directory?(local_repo_dir: local_repo_dir)
34
+
35
+ args = local_repo_dir ? %W(-C #{local_repo_dir} rev-parse --show-toplevel) : %w(rev-parse --show-toplevel)
36
+ begin
37
+ git!(args).strip
38
+ rescue StandardError => e
39
+ nil
40
+ end
41
+ end
42
+
22
43
  def add_branch(local_repo_dir: nil, branch: nil)
23
44
 
24
45
  current=Dir.pwd
@@ -0,0 +1,179 @@
1
+ require 'open3'
2
+ require 'json'
3
+ require 'singleton'
4
+
5
+ module Pindo
6
+ module Client
7
+ class UnityHelper
8
+ include Singleton
9
+
10
+ UNITY_MAC_PATHS = [
11
+ "/Applications/Unity/Unity.app/Contents/MacOS/Unity",
12
+ "/Applications/Unity/Hub/Editor/*/Unity.app/Contents/MacOS/Unity"
13
+ ]
14
+
15
+ UNITY_WINDOWS_PATHS = [
16
+ "C:/Program Files/Unity/Editor/Unity.exe",
17
+ "C:/Program Files/Unity/Hub/Editor/*/Unity.exe"
18
+ ]
19
+
20
+ TARGET_UNITY_VERSION = "2021.3"
21
+
22
+ class << self
23
+ def share_instance
24
+ instance
25
+ end
26
+ end
27
+
28
+ def find_unity_path
29
+ paths = case RUBY_PLATFORM
30
+ when /darwin/
31
+ UNITY_MAC_PATHS
32
+ when /mswin|mingw|windows/
33
+ UNITY_WINDOWS_PATHS
34
+ else
35
+ raise "Unsupported platform: #{RUBY_PLATFORM}"
36
+ end
37
+
38
+ unity_versions = []
39
+
40
+ paths.each do |path|
41
+ if path.include?("*")
42
+ Dir.glob(path).each do |expanded_path|
43
+ # 从路径中提取版本号
44
+ version = extract_version_from_path(expanded_path)
45
+ if version && version.start_with?(TARGET_UNITY_VERSION)
46
+ unity_versions << {
47
+ path: expanded_path,
48
+ version: version
49
+ }
50
+ end
51
+ end
52
+ elsif File.exist?(path)
53
+ version = extract_version_from_path(path)
54
+ if version && version.start_with?(TARGET_UNITY_VERSION)
55
+ unity_versions << {
56
+ path: path,
57
+ version: version
58
+ }
59
+ end
60
+ end
61
+ end
62
+
63
+ if unity_versions.empty?
64
+ raise "No Unity #{TARGET_UNITY_VERSION} found in standard locations"
65
+ end
66
+
67
+ # 按版本号排序,取最新的2021.3.x版本
68
+ selected_unity = unity_versions.sort_by { |v| Gem::Version.new(v[:version]) }.last
69
+ puts "Selected Unity version: #{selected_unity[:version]}"
70
+ selected_unity[:path]
71
+ end
72
+
73
+ private
74
+
75
+ def extract_version_from_path(path)
76
+ # macOS路径格式: /Applications/Unity/Hub/Editor/2021.3.45f1/Unity.app/Contents/MacOS/Unity
77
+ # Windows路径格式: C:/Program Files/Unity/Hub/Editor/2021.3.45f1/Editor/Unity.exe
78
+ if match = path.match(/Editor\/([\d.]+[a-zA-Z]\d+)\//)
79
+ match[1]
80
+ else
81
+ nil
82
+ end
83
+ end
84
+
85
+ public
86
+
87
+ def execute_unity_command(project_path, method_name, additional_args = {})
88
+ unity_path = find_unity_path
89
+
90
+ cmd_args = [
91
+ unity_path,
92
+ "-batchmode",
93
+ "-quit",
94
+ "-projectPath",
95
+ project_path.to_s,
96
+ "-executeMethod",
97
+ method_name
98
+ ]
99
+
100
+ # Add any additional arguments
101
+ additional_args.each do |key, value|
102
+ cmd_args << "-#{key}"
103
+ cmd_args << value.to_s if value
104
+ end
105
+
106
+ puts "Executing Unity command: #{cmd_args.join(' ')}"
107
+ stdout, stderr, status = Open3.capture3(*cmd_args)
108
+
109
+ {
110
+ success: status.success?,
111
+ stdout: stdout,
112
+ stderr: stderr,
113
+ exit_status: status.exitstatus,
114
+ unity_version: extract_version_from_path(unity_path)
115
+ }
116
+ end
117
+
118
+ def build_project(project_path, build_method, platform: nil, output_path: nil)
119
+ additional_args = {}
120
+ additional_args[:buildTarget] = platform if platform
121
+ additional_args[:outputPath] = output_path if output_path
122
+
123
+ result = execute_unity_command(project_path, build_method, additional_args)
124
+
125
+ if result[:success]
126
+ puts "Unity build completed successfully"
127
+ puts "Using Unity version: #{result[:unity_version]}"
128
+ puts result[:stdout]
129
+ else
130
+ puts "Unity build failed"
131
+ puts "Unity version: #{result[:unity_version]}"
132
+ puts result[:stderr]
133
+ raise "Unity build failed with status: #{result[:exit_status]}"
134
+ end
135
+
136
+ result
137
+ end
138
+
139
+ def get_project_settings(project_path)
140
+ settings_path = File.join(project_path, "ProjectSettings", "ProjectSettings.asset")
141
+ if File.exist?(settings_path)
142
+ File.read(settings_path)
143
+ else
144
+ raise "Project settings file not found at #{settings_path}"
145
+ end
146
+ end
147
+
148
+ def get_unity_version(project_path)
149
+ version_path = File.join(project_path, "ProjectSettings", "ProjectVersion.txt")
150
+ if File.exist?(version_path)
151
+ content = File.read(version_path)
152
+ if content =~ /m_EditorVersion: (.*)/
153
+ version = $1.strip
154
+ unless version.start_with?(TARGET_UNITY_VERSION)
155
+ raise "Project Unity version (#{version}) does not match required version (#{TARGET_UNITY_VERSION}.x)"
156
+ end
157
+ version
158
+ else
159
+ raise "Could not parse Unity version from #{version_path}"
160
+ end
161
+ else
162
+ raise "Project version file not found at #{version_path}"
163
+ end
164
+ end
165
+
166
+ def verify_unity_version(project_path)
167
+ project_version = get_unity_version(project_path)
168
+ unity_path = find_unity_path
169
+ editor_version = extract_version_from_path(unity_path)
170
+
171
+ if project_version != editor_version
172
+ raise "Project Unity version (#{project_version}) does not match Editor version (#{editor_version})"
173
+ end
174
+
175
+ true
176
+ end
177
+ end
178
+ end
179
+ end
@@ -77,13 +77,12 @@ module Pindo
77
77
  config = FastlaneCore::Configuration.create(Gym::Options.available_options, gym_options)
78
78
  Gym::Manager.new.work(config)
79
79
 
80
-
81
-
82
80
  pindo_new_project_dir = Dir.pwd
83
81
  build_path = File.join(pindo_new_project_dir, "build", "*.ipa")
84
82
  ipa_file_upload = Dir.glob(build_path).max_by {|f| File.mtime(f)}
85
-
83
+
86
84
  if !ipa_file_upload.nil? && !app_info_obj.nil?
85
+
87
86
  description = nil
88
87
  result_data = PgyerHelper.share_instace.start_upload(app_info_obj:app_info_obj, ipa_file_upload:ipa_file_upload, description:description)
89
88
  if !result_data.nil? && !result_data["data"].nil? && !result_data["data"]["id"].nil?
@@ -44,6 +44,7 @@ module Pindo
44
44
  # 命令的选项列表
45
45
  def self.options
46
46
  [
47
+ ['--bundleid', '指定打包的bundleID'],
47
48
  # 指定上传到蒲公英的项目
48
49
  ['--proj', '指定上传到测试平台的项目名称'],
49
50
  # 上传编译包
@@ -59,7 +60,8 @@ module Pindo
59
60
  @args_adhoc_flag = argv.flag?('adhoc', false)
60
61
  @args_upload_flag = argv.flag?('upload', false)
61
62
  @args_send_flag = argv.flag?('send', false)
62
- @args_proj_name = argv.option('proj')
63
+ @args_proj_name = argv.option('proj')
64
+ @args_bundle_id = argv.option('bundleid')
63
65
 
64
66
  if @args_send_flag
65
67
  @args_upload_flag = true
@@ -77,10 +79,14 @@ module Pindo
77
79
  def run
78
80
 
79
81
  mainapp_bundleid= nil
80
- if @args_deploy_flag
81
- mainapp_bundleid = get_selected_deploy_bundleid()
82
+ if @args_bundle_id
83
+ mainapp_bundleid = @args_bundle_id
82
84
  else
83
- mainapp_bundleid = get_selected_dev_bundleid()
85
+ if @args_deploy_flag
86
+ mainapp_bundleid = get_selected_deploy_bundleid()
87
+ else
88
+ mainapp_bundleid = get_selected_dev_bundleid()
89
+ end
84
90
  end
85
91
 
86
92
  app_info_obj = nil
@@ -41,6 +41,7 @@ module Pindo
41
41
 
42
42
  ]
43
43
 
44
+
44
45
  # 命令的选项列表
45
46
  def self.options
46
47
  [
@@ -50,6 +51,7 @@ module Pindo
50
51
  ['--upload', '上传编译后的APK到测试平台'],
51
52
  # 发送通知
52
53
  ['--send', '上传成功后发送测试通知']
54
+
53
55
  ].concat(super)
54
56
  end
55
57
 
@@ -3,11 +3,15 @@ require 'xcodeproj'
3
3
  require 'find'
4
4
  require 'fileutils'
5
5
  require 'pindo/base/executable'
6
+ require 'pindo/client/unityhelper'
6
7
 
7
8
  module Pindo
8
9
  class Command
9
10
  class Unity < Command
10
11
  class Ipa < Unity
12
+
13
+ include Appselect
14
+
11
15
  # Unity IPA包编译和上传命令
12
16
  self.summary = '编译Unity工程生成iOS IPA并支持上传到测试平台'
13
17
 
@@ -54,6 +58,7 @@ module Pindo
54
58
  @args_proj_name = argv.option('proj')
55
59
  @args_upload_flag = argv.flag?('upload', false)
56
60
  @args_send_flag = argv.flag?('send', false)
61
+ @args_deploy_flag = argv.flag?('deploy', false)
57
62
 
58
63
  if @args_send_flag
59
64
  @args_upload_flag = true
@@ -62,10 +67,81 @@ module Pindo
62
67
  super
63
68
  end
64
69
 
70
+ def export_ios_project(project_path)
71
+ begin
72
+ # 获取 UnityHelper 实例
73
+ unity_helper = Pindo::Client::UnityHelper.share_instance
74
+
75
+ # 准备额外的参数
76
+ additional_args = {
77
+ 'platform' => 'iOS'
78
+ }
79
+
80
+ # 执行Unity命令
81
+ result = unity_helper.execute_unity_command(
82
+ project_path,
83
+ 'GoodUnityBuild.BuildManager.BatchBuild',
84
+ additional_args
85
+ )
86
+
87
+ if result[:success]
88
+ puts "Unity iOS library build completed successfully"
89
+ puts "Unity version: #{result[:unity_version]}"
90
+ puts "Output:"
91
+ puts result[:stdout]
92
+ return true
93
+ else
94
+ puts "Unity iOS library build failed"
95
+ puts "Unity version: #{result[:unity_version]}"
96
+ puts "Error:"
97
+ puts result[:stderr]
98
+ raise "Build failed with status: #{result[:exit_status]}"
99
+ end
100
+
101
+ rescue => e
102
+ puts "Error during Unity build: #{e.message}"
103
+ puts e.backtrace
104
+ return false
105
+ end
106
+ end
107
+
65
108
 
66
109
  def run
110
+
111
+ app_info_obj = nil
112
+ if @args_upload_flag
113
+ proj_name = @args_proj_name
114
+ app_info_obj = PgyerHelper.share_instace.prepare_upload(working_directory:Dir.pwd, proj_name:proj_name)
115
+ end
116
+ puts app_info_obj
117
+
118
+ mainapp_bundleid= nil
119
+ if @args_deploy_flag
120
+ mainapp_bundleid = get_selected_deploy_bundleid()
121
+ else
122
+ mainapp_bundleid = get_selected_dev_bundleid()
123
+ end
124
+
125
+ pindo_unity_project_dir = Dir.pwd
126
+ export_ios_project(pindo_unity_project_dir)
127
+
128
+
129
+ pindo_ios_project_dir = File.join(pindo_unity_project_dir, "Builds/iOS")
130
+ args_temp = []
131
+
132
+ args_temp << "--bundleid=#{mainapp_bundleid}"
133
+
134
+ if @args_upload_flag
135
+ args_temp << "--proj=#{app_info_obj["appName"]}"
136
+ args_temp << "--upload"
137
+ end
138
+ if @args_send_flag
139
+ args_temp << "--send"
140
+ end
141
+ Dir.chdir(pindo_ios_project_dir)
142
+
143
+ Pindo::Command::Ios::Debug::run(args_temp)
67
144
 
68
- puts "ipa "
69
145
 
70
146
  end
71
147
 
@@ -172,21 +172,44 @@ module Pindo
172
172
  args_ipa_file_dir = File.expand_path(File::dirname(ipa_file_upload))
173
173
  ipa_file_upload=File.join(args_ipa_file_dir, File.basename(ipa_file_upload))
174
174
  current_project_dir = Dir.pwd
175
- if description.nil? && File.exist?(File.join(current_project_dir, ".git"))
176
- description = git!(%W(-C #{current_project_dir} show -s --format=commit::%H)).strip
175
+ puts "+++++1 current_project_dir = #{current_project_dir}"
176
+
177
+ if description.nil? && is_git_directory?(local_repo_dir: current_project_dir)
178
+ puts "+++++2 current_project_dir = #{current_project_dir}"
179
+
180
+ current_git_root_path = git_root_directory(local_repo_dir: current_project_dir)
181
+ puts "+++++3 current_git_root_path = #{current_git_root_path}"
182
+
177
183
  xcodeproj_file_name = Dir.glob(File.join(current_project_dir, "/*.xcodeproj")).max_by {|f| File.mtime(f)}
178
184
  if !xcodeproj_file_name.nil? && !xcodeproj_file_name.empty? && File.exist?(xcodeproj_file_name)
185
+ puts "+++++4 xcodeproj_file_name = #{xcodeproj_file_name}"
186
+
179
187
  project_obj = Xcodeproj::Project.open(xcodeproj_file_name)
180
188
  main_target = project_obj.targets.select { |target| target.product_type.include?(Xcodeproj::Constants::PRODUCT_TYPE_UTI[:application]) }.first
181
189
  provisioning_profile_name = main_target.build_configurations.first.build_settings['PROVISIONING_PROFILE_SPECIFIER'].downcase.split(" ")
182
190
  if provisioning_profile_name.include?("adhoc")
183
191
  description = git!(%W(-C #{current_project_dir} show -s --format=commit::%H)).strip
184
192
  elsif provisioning_profile_name.include?("development")
185
- if File.exist?(File.join(current_project_dir, ".release_info"))
186
- description = File.read(File.join(current_project_dir, ".release_info"))
193
+ cliff_toml_path = File.join(current_git_root_path, "cliff.toml")
194
+ if File.exist?(cliff_toml_path)
195
+ begin
196
+ `git-cliff --version`
197
+ git_cliff_installed = $?.success?
198
+ if git_cliff_installed
199
+ temp_dir = Dir.pwd
200
+ Dir.chdir(current_git_root_path)
201
+ description = `git-cliff -c #{cliff_toml_path} --latest -o -`.strip
202
+ description = " " if description.empty?
203
+ Dir.chdir(temp_dir)
204
+ else
205
+ description = " "
206
+ end
207
+ rescue StandardError => e
208
+ description = " "
209
+ end
187
210
  else
188
- description = git!(%W(-C #{current_project_dir} show -s --format=%h::%s)).strip
189
- end
211
+ description = " "
212
+ end
190
213
  elsif provisioning_profile_name.include?("appstore")
191
214
  description = "提交包重签名"
192
215
  end
data/lib/pindo/version.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  module Pindo
2
2
 
3
- VERSION = "4.8.8"
3
+ VERSION = "4.8.9"
4
4
 
5
5
  class VersionCheck
6
6
 
data/lib/pindo.rb CHANGED
@@ -13,6 +13,7 @@ module Pindo
13
13
  require 'pindo/command'
14
14
  require 'pindo/version'
15
15
 
16
+
16
17
  class PindoApp
17
18
 
18
19
  def run(argv)
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pindo
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.8.8
4
+ version: 4.8.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - wade
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2025-02-14 00:00:00.000000000 Z
10
+ date: 2025-02-19 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: claide
@@ -240,6 +240,7 @@ files:
240
240
  - lib/pindo/client/pgyerclient.rb
241
241
  - lib/pindo/client/pgyeruploadclient.rb
242
242
  - lib/pindo/client/tgateclient.rb
243
+ - lib/pindo/client/unityhelper.rb
243
244
  - lib/pindo/command.rb
244
245
  - lib/pindo/command/android.rb
245
246
  - lib/pindo/command/android/debug.rb