pindo 5.5.4 → 5.5.7

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b9b78c1d33a386cb6ca94c86474093c790548e29964bc4a20eeb74e987ed8a66
4
- data.tar.gz: 603656976a10b41c86d8f6c3a125601b8120cf9b0c064b3bbd66b1cc22dc0f4f
3
+ metadata.gz: 7936d0bbe9e0a98b963b3fab910bf6f14181cb42d2747dab85c7081dd13f7bb9
4
+ data.tar.gz: f0bf9f4c66846fce60e0095969e20acd9d44050e1b608a5437630ab287bed0b6
5
5
  SHA512:
6
- metadata.gz: 7adaf27919be676327ad4942df3212bf67c18b5c3f550bb8ac70c15bd4d5b3167b0fc5372b5008edf74326af9a768227329634c6b427ece338cb0cc04d12ba69
7
- data.tar.gz: 4b2256dd2a74d7bf251507a0a0335ca8528021f5471dbe27dd5afcb9c21c7b1c504724d633083b753c3c57a70b4cfcf6d968b84e7efb52989f9a9534ee8d66f4
6
+ metadata.gz: 00f7b89309f86b889ef3d4b1ebfcc3e0d6876a24d8587e8335d96c5271da7fa1bb8795183850809cda62d006c1b9af5e960828862c74c8b61d1c0f1652d97679
7
+ data.tar.gz: 00bb957cb9bc2f926534e5ee4b4c3af62d6170ca8ba78b28416364084abd0ec91e733c2b14b1f8d7a7eacae70fd91f061724ed92fc7b542d6b8670129e213c7e
@@ -1,6 +1,7 @@
1
1
  require 'fileutils'
2
2
  require 'pindo/base/executable'
3
3
  require 'etc'
4
+ require 'claide'
4
5
 
5
6
  module Pindo
6
7
  module Githelper
@@ -487,12 +488,27 @@ module Pindo
487
488
  private
488
489
 
489
490
  def display_file_status(branch, files)
490
- puts "========================================"
491
- puts "\n当前所在分支:#{branch}有下面这些文件没有提交:"
491
+ puts "" * 60
492
+ puts "⚠️ 警告:检测到未提交的文件".red
493
+ puts "═" * 60
492
494
  puts
493
- puts "\n#{files}\n"
495
+ puts "当前所在分支: #{branch}".red
496
+ puts "以下文件尚未提交到 Git:".red
494
497
  puts
495
- puts "========================================"
498
+
499
+ # 将文件列表分行并用红色显示
500
+ if files.is_a?(String)
501
+ files.split("\n").each do |file|
502
+ puts " • #{file}".red unless file.empty?
503
+ end
504
+ else
505
+ files.each do |file|
506
+ puts " • #{file}".red unless file.empty?
507
+ end
508
+ end
509
+
510
+ puts
511
+ puts "═" * 60
496
512
  end
497
513
 
498
514
  def process_user_choice(project_dir, branch)
@@ -501,8 +517,8 @@ module Pindo
501
517
  menu_choice = "None"
502
518
 
503
519
  cli.choose do |menu|
504
- menu.header = "对以上未提交的文件, 有下列处理方式"
505
- menu.prompt = "请选择如何处理(1/2/3...):"
520
+ menu.header = "对以上未提交的文件, 有下列处理方式".red
521
+ menu.prompt = "请选择如何处理(1/2/3...):".yellow
506
522
  process_types.each do |item|
507
523
  menu.choice(item) { |choice| menu_choice = choice }
508
524
  end
@@ -11,7 +11,7 @@ module Pindo
11
11
  # 命令的详细说明,包含用法示例
12
12
  self.description = <<-DESC
13
13
  发布代码,添加tag,添加发布信息,并合并到发布分支。
14
-
14
+
15
15
  支持功能:
16
16
 
17
17
  * 处理未提交的文件
@@ -28,6 +28,8 @@ module Pindo
28
28
 
29
29
  $ pindo dev tag --mode=patch # 使用patch模式创建tag
30
30
 
31
+ $ pindo dev tag --tag=1.1.3 # 直接指定版本号创建tag(会自动添加v前缀)
32
+
31
33
  $ pindo dev tag --retag # 强制重新打tag
32
34
  DESC
33
35
 
@@ -2,12 +2,16 @@ require 'highline/import'
2
2
  require 'fileutils'
3
3
  require 'json'
4
4
  require 'jpsclient'
5
+ require 'claide'
5
6
  require 'pindo/module/unity/nugethelper'
6
7
 
7
8
  module Pindo
8
9
  class Command
9
10
  class Unity < Command
10
11
  class Upload < Unity
12
+ include Pindo::Githelper
13
+ extend Pindo::Executable
14
+ executable :git
11
15
 
12
16
  self.summary = '上传 NuGet 包到 JPS'
13
17
 
@@ -61,25 +65,16 @@ module Pindo
61
65
  def run
62
66
  package_dir = Dir.pwd
63
67
 
64
- puts "=" * 60
65
- puts "🚀 上传到 JPS Nuget 项目"
66
- puts "=" * 60
67
68
  puts
69
+ puts "🚀 上传 Unity Package 到 JPS"
70
+ puts "━" * 40
68
71
 
69
72
  # 如果没有指定文件或文件不存在,则查找
70
73
  if @args_nupkg_file.nil? || !File.exist?(@args_nupkg_file)
71
74
  # 在当前目录查找 .nupkg 文件
72
75
  @args_nupkg_file = Pindo::Unity::NugetHelper.find_nupkg_file(package_dir)
73
76
 
74
- # 如果找到文件,询问用户是否上传
75
- if !@args_nupkg_file.nil?
76
- answer = agree("需要上传的文件是: #{@args_nupkg_file} ?(Y/n)")
77
- if !answer
78
- @args_nupkg_file = nil
79
- end
80
- end
81
-
82
- # 如果还是没有文件,让用户手动输入
77
+ # 如果没有找到文件,让用户手动输入
83
78
  if @args_nupkg_file.nil? || !File.exist?(@args_nupkg_file)
84
79
  @args_nupkg_file = ask('需要上传的文件:') || nil
85
80
  if @args_nupkg_file
@@ -93,19 +88,32 @@ module Pindo
93
88
  raise Informative, "未找到 .nupkg 文件"
94
89
  end
95
90
 
91
+ # 从 nuspec 文件或 package.json 获取包信息
92
+ package_info = get_package_info_for_upload(package_dir)
93
+
94
+ # 显示包信息并一次性确认
96
95
  puts
97
- puts "上传文件:"
98
- puts " #{File.basename(@args_nupkg_file)}"
96
+ puts "📦 包信息:"
97
+ puts
98
+ puts " 名称: #{package_info['displayName']}"
99
+ puts " ID: #{package_info['name']}"
100
+ puts " 版本: #{package_info['version']}"
101
+ puts " 文件: #{@args_nupkg_file}"
99
102
  puts " 大小: #{sprintf('%.2f', File.size(@args_nupkg_file) / 1024.0 / 1024.0)} MB"
100
103
  puts
101
104
 
105
+ # 一次性确认
106
+ answer = agree("确认上传?(Y/n)")
107
+ unless answer
108
+ puts "已取消上传"
109
+ return
110
+ end
111
+
102
112
  # 上传到 JPS
103
- upload_to_jps_nuget(@args_nupkg_file)
113
+ upload_to_jps_nuget(@args_nupkg_file, package_info)
104
114
 
105
115
  puts
106
- puts "=" * 60
107
116
  puts "✅ 上传完成!"
108
- puts "=" * 60
109
117
  puts
110
118
 
111
119
  # 上传成功后自动打 tag
@@ -114,7 +122,7 @@ module Pindo
114
122
 
115
123
  private
116
124
 
117
- def upload_to_jps_nuget(nupkg_file)
125
+ def upload_to_jps_nuget(nupkg_file, package_info)
118
126
  # 1. 登录 JPS
119
127
  config_file = File.join(
120
128
  Pindoconfig.instance.pindo_common_configdir,
@@ -156,9 +164,6 @@ module Pindo
156
164
  # 4. 提交到 JPS 项目
157
165
  puts "📋 提交到 JPS 项目..."
158
166
 
159
- # 读取 package.json 获取包信息
160
- package_info = JSON.parse(File.read(File.join(Dir.pwd, "package.json")))
161
-
162
167
  result = jps_client.upload_project_package(
163
168
  projectId: nuget_project['id'],
164
169
  params: {
@@ -211,24 +216,48 @@ module Pindo
211
216
  end
212
217
 
213
218
  def print_upload_result(result, package_info)
214
- puts
215
- puts "━" * 60
216
- puts "📦 上传信息"
217
- puts "━" * 60
218
- puts "包名称: #{package_info['displayName']}"
219
- puts "包ID: #{package_info['name']}"
220
- puts "版本: #{package_info['version']}"
221
-
222
219
  if result['data'] && result['data']['id']
223
- puts "JPS ID: #{result['data']['id']}"
220
+ puts " JPS ID: #{result['data']['id']}"
224
221
  end
222
+ end
225
223
 
226
- puts "━" * 60
224
+ def get_package_info_for_upload(package_dir)
225
+ # 优先尝试从 nuspec 文件读取
226
+ nuspec_file = Pindo::Unity::NugetHelper.find_nuspec_file(package_dir)
227
+
228
+ if nuspec_file && File.exist?(nuspec_file)
229
+ nuspec_info = Pindo::Unity::NugetHelper.parse_nuspec(nuspec_file)
230
+
231
+ # 转换为统一的格式(与 package.json 兼容)
232
+ # 注意:保持 nuspec 中 ID 的原始格式(驼峰)
233
+ return {
234
+ 'name' => nuspec_info['id'], # 保持原始的驼峰格式
235
+ 'version' => nuspec_info['version'],
236
+ 'displayName' => nuspec_info['title'] || nuspec_info['id'],
237
+ 'description' => nuspec_info['description']
238
+ }
239
+ end
240
+
241
+ # 如果没有 nuspec 文件,尝试从 package.json 读取
242
+ package_json_path = File.join(package_dir, "package.json")
243
+
244
+ if File.exist?(package_json_path)
245
+ return JSON.parse(File.read(package_json_path))
246
+ end
247
+
248
+ # 如果都没有,抛出错误
249
+ raise Informative, "未找到 .nuspec 或 package.json 文件,无法获取包信息"
227
250
  end
228
251
 
229
252
  def create_git_tag_from_nuspec(package_dir)
230
253
  puts "🏷️ 创建 Git Tag..."
231
254
 
255
+ # 检查并更新 .gitignore 文件
256
+ ensure_build_directory_ignored(package_dir)
257
+
258
+ # 检查是否有未提交的文件
259
+ check_uncommitted_files(package_dir)
260
+
232
261
  # 获取 .nuspec 文件并解析版本
233
262
  nuspec_file = Pindo::Unity::NugetHelper.find_nuspec_file(package_dir)
234
263
  unless nuspec_file
@@ -257,6 +286,94 @@ module Pindo
257
286
  end
258
287
  end
259
288
 
289
+ def check_uncommitted_files(package_dir)
290
+ # 获取未跟踪和已修改的文件
291
+ untracked_files = git!(%W(-C #{package_dir} ls-files --others --exclude-standard)).strip
292
+ modified_files = git!(%W(-C #{package_dir} diff --name-only)).strip
293
+ staged_files = git!(%W(-C #{package_dir} diff --cached --name-only)).strip
294
+
295
+ all_uncommitted = []
296
+ all_uncommitted += untracked_files.split("\n").reject(&:empty?) if !untracked_files.empty?
297
+ all_uncommitted += modified_files.split("\n").reject(&:empty?) if !modified_files.empty?
298
+ all_uncommitted += staged_files.split("\n").reject(&:empty?) if !staged_files.empty?
299
+
300
+ # 过滤掉 build 相关目录
301
+ all_uncommitted = all_uncommitted.reject do |file|
302
+ file.start_with?('build/') || file.start_with?('Build/') ||
303
+ file.start_with?('/build/') || file.start_with?('/Build/')
304
+ end
305
+
306
+ if all_uncommitted.any?
307
+ puts
308
+ puts "═" * 60
309
+ puts "⚠️ 警告:检测到未提交的文件".red
310
+ puts "═" * 60
311
+ puts
312
+ puts "以下文件尚未提交到 Git:".red
313
+ puts
314
+ all_uncommitted.each do |file|
315
+ puts " • #{file}".red
316
+ end
317
+ puts
318
+ puts "═" * 60
319
+ puts "建议先提交这些文件,或将它们添加到 .gitignore 中".red
320
+ puts "═" * 60
321
+ puts
322
+ end
323
+ end
324
+
325
+ def ensure_build_directory_ignored(package_dir)
326
+ gitignore_path = File.join(package_dir, '.gitignore')
327
+
328
+ # 要忽略的目录
329
+ build_patterns = [
330
+ 'build/',
331
+ '/build/',
332
+ 'Build/',
333
+ '/Build/'
334
+ ]
335
+
336
+ # 读取现有的 .gitignore 内容
337
+ existing_patterns = []
338
+ if File.exist?(gitignore_path)
339
+ existing_patterns = File.readlines(gitignore_path).map(&:strip).reject(&:empty?)
340
+ end
341
+
342
+ # 检查是否已经包含 build 目录的忽略规则
343
+ has_build_ignore = existing_patterns.any? do |pattern|
344
+ pattern = pattern.strip
345
+ # 检查是否匹配 build 目录的各种形式
346
+ build_patterns.any? { |bp| pattern == bp || pattern == bp.chomp('/') }
347
+ end
348
+
349
+ # 如果没有包含 build 目录,则添加
350
+ unless has_build_ignore
351
+ puts "📝 更新 .gitignore 文件,添加 build/ 目录..."
352
+
353
+ # 追加 build 目录到 .gitignore
354
+ File.open(gitignore_path, 'a') do |file|
355
+ # 如果文件不为空且最后没有换行,添加换行
356
+ file.puts if existing_patterns.any? && !File.read(gitignore_path).end_with?("\n")
357
+ file.puts "# Unity build output"
358
+ file.puts "build/"
359
+ file.puts "Build/"
360
+ end
361
+
362
+ puts "✅ 已将 build 目录添加到 .gitignore"
363
+
364
+ # 提交 .gitignore 的更改
365
+ begin
366
+ git!(%W(-C #{package_dir} add .gitignore))
367
+ git!(%W(-C #{package_dir} commit -m "chore: 添加 build 目录到 .gitignore"))
368
+ puts "✅ 已提交 .gitignore 更改"
369
+ rescue => e
370
+ puts "⚠️ 提交 .gitignore 失败: #{e.message}"
371
+ end
372
+ else
373
+ puts "✅ .gitignore 已包含 build 目录规则"
374
+ end
375
+ end
376
+
260
377
  end
261
378
  end
262
379
  end
@@ -76,6 +76,15 @@ module Pindo
76
76
  package_info['name'] = to_lowercase_id(package_info['name'])
77
77
  update_package_json_name(package_dir, package_info['name'])
78
78
 
79
+ # 检查 README.md 是否存在
80
+ readme_path = File.join(package_dir, "README.md")
81
+ unless File.exist?(readme_path)
82
+ puts "⚠️ 警告: 未找到 README.md 文件"
83
+ puts " README.md 是 NuGet 包的必需文件"
84
+ puts " 请创建 README.md 文件后再运行此命令"
85
+ puts
86
+ end
87
+
79
88
  nuspec_path = File.join(package_dir, "#{package_info['displayName']}.nuspec")
80
89
 
81
90
  # 生成 .nuspec,ID 使用驼峰格式
@@ -85,6 +94,11 @@ module Pindo
85
94
  puts "✅ 根据 package.json 创建了 #{package_info['displayName']}.nuspec"
86
95
  puts " package.json name: #{package_info['name']} (全小写)"
87
96
  puts " .nuspec id: #{nuspec_id} (驼峰)"
97
+
98
+ unless File.exist?(readme_path)
99
+ puts
100
+ puts "⚠️ 重要提示: 打包前请确保创建 README.md 文件!"
101
+ end
88
102
  end
89
103
 
90
104
  # 情况B:只有 .nuspec,创建 package.json
@@ -191,8 +205,8 @@ module Pindo
191
205
  conflicts << "版本不一致: package.json(#{package_info['version']}) vs .nuspec(#{nuspec_info['version']})"
192
206
  end
193
207
 
194
- # displayName/title 对比
195
- if package_info['displayName'] != nuspec_info['title']
208
+ # displayName/title 对比(title 是可选字段)
209
+ if nuspec_info['title'] && package_info['displayName'] != nuspec_info['title']
196
210
  conflicts << "标题不一致: package.json displayName(#{package_info['displayName']}) vs .nuspec title(#{nuspec_info['title']})"
197
211
  end
198
212
 
@@ -218,7 +232,7 @@ module Pindo
218
232
 
219
233
  # 验证 .nuspec
220
234
  def self.validate_nuspec(nuspec_info)
221
- required_fields = ['id', 'version', 'title', 'description', 'releaseNotes', 'readme', 'projectUrl']
235
+ required_fields = ['id', 'version', 'description', 'releaseNotes', 'readme', 'projectUrl']
222
236
  missing = required_fields.select { |field| nuspec_info[field].nil? || nuspec_info[field].empty? }
223
237
 
224
238
  unless missing.empty?
@@ -245,23 +259,44 @@ module Pindo
245
259
  description = package_info['description'] || package_info['displayName'] || 'Unity Package'
246
260
  release_notes = package_info['releaseNotes'] || package_info['changelogUrl'] || 'No release notes'
247
261
 
262
+ # 构建基础的 metadata 内容
263
+ metadata_content = []
264
+ metadata_content << " <id>#{nuspec_id}</id>"
265
+ metadata_content << " <version>#{package_info['version']}</version>"
266
+ # title 是可选字段,只有 displayName 存在时才添加
267
+ if package_info['displayName'] && !package_info['displayName'].empty?
268
+ metadata_content << " <title>#{package_info['displayName']}</title>"
269
+ end
270
+ metadata_content << " <authors>#{package_info['author'] || 'Unity Package'}</authors>"
271
+ metadata_content << " <requireLicenseAcceptance>false</requireLicenseAcceptance>"
272
+ metadata_content << " <license type=\"expression\">MIT</license>"
273
+ metadata_content << " <projectUrl>#{project_url}</projectUrl>"
274
+ metadata_content << " <description>#{description}</description>"
275
+ metadata_content << " <releaseNotes>#{release_notes}</releaseNotes>"
276
+
277
+ # README.md 是必需的,总是添加 readme 标签
278
+ metadata_content << " <readme>README.md</readme>"
279
+
280
+ # 检查 README.md 是否存在,用于 files 部分的处理
281
+ readme_path = File.join(File.dirname(nuspec_path), "README.md")
282
+
283
+ # 构建 files 部分,如果有 README.md 需要特殊处理
284
+ files_content = []
285
+ if File.exist?(readme_path)
286
+ files_content << ' <file src="README.md" target="" />'
287
+ files_content << ' <file src="**" exclude="build/**;.git/**;*.nuspec;*.nupkg;README.md" target="content" />'
288
+ else
289
+ files_content << ' <file src="**" exclude="build/**;.git/**;*.nuspec;*.nupkg" target="content" />'
290
+ end
291
+
248
292
  nuspec_content = <<~XML
249
293
  <?xml version="1.0" encoding="utf-8"?>
250
294
  <package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
251
295
  <metadata>
252
- <id>#{nuspec_id}</id>
253
- <version>#{package_info['version']}</version>
254
- <title>#{package_info['displayName']}</title>
255
- <authors>#{package_info['author'] || 'Unity Package'}</authors>
256
- <requireLicenseAcceptance>false</requireLicenseAcceptance>
257
- <license type="expression">MIT</license>
258
- <projectUrl>#{project_url}</projectUrl>
259
- <description>#{description}</description>
260
- <releaseNotes>#{release_notes}</releaseNotes>
261
- <readme>README.md</readme>
296
+ #{metadata_content.join("\n")}
262
297
  </metadata>
263
298
  <files>
264
- <file src="**" exclude="build/**;.git/**;*.nuspec;*.nupkg" target="content" />
299
+ #{files_content.join("\n")}
265
300
  </files>
266
301
  </package>
267
302
  XML
@@ -274,7 +309,7 @@ module Pindo
274
309
  package_content = {
275
310
  "name" => package_json_name,
276
311
  "version" => nuspec_info['version'],
277
- "displayName" => nuspec_info['title'],
312
+ "displayName" => nuspec_info['title'] || package_json_name, # 如果没有 title,使用 name 作为 displayName
278
313
  "description" => nuspec_info['description'],
279
314
  "unity" => "2020.3",
280
315
  "releaseNotes" => nuspec_info['releaseNotes']
@@ -301,7 +336,8 @@ module Pindo
301
336
  # 更新关键字段
302
337
  package_info['name'] = to_lowercase_id(nuspec_info['id'])
303
338
  package_info['version'] = nuspec_info['version']
304
- package_info['displayName'] = nuspec_info['title']
339
+ # 如果 nuspec 有 title 字段才更新,否则保留原有的 displayName
340
+ package_info['displayName'] = nuspec_info['title'] if nuspec_info['title']
305
341
  package_info['description'] = nuspec_info['description']
306
342
  package_info['releaseNotes'] = nuspec_info['releaseNotes']
307
343
 
data/lib/pindo/version.rb CHANGED
@@ -6,7 +6,7 @@ require 'time'
6
6
 
7
7
  module Pindo
8
8
 
9
- VERSION = "5.5.4"
9
+ VERSION = "5.5.7"
10
10
 
11
11
  class VersionCheck
12
12
  RUBYGEMS_API = 'https://rubygems.org/api/v1/gems/pindo.json'
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: 5.5.4
4
+ version: 5.5.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - wade
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2025-09-28 00:00:00.000000000 Z
10
+ date: 2025-09-29 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: claide