Class: Pindo::VersionHelper

Inherits:
Object
  • Object
show all
Includes:
Githelper, Singleton
Defined in:
lib/pindo/module/build/versionhelper.rb

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Githelper

#add_branch, #add_tag, #add_tag_with_check, #clone_clang_repo, #clone_devclang_repo, #clone_pindo_common_config_repo, #clone_pindo_env_config_repo, #clong_buildconfig_repo, #get_repo_base_name, #getcode_to_dir, #git_addpush_repo, #git_latest_commit_id, #git_root_directory, #is_git_directory?, #local_branch_exists?, #local_tag_exists?, #prepare_gitenv, #process_need_add_files, #remote_branch_exists?, #remote_tag_exists?, #remove_branch, #remove_tag

Methods included from Executable

capture_command, #executable, execute_command, which, which!

Class Method Details

.share_instanceObject



11
12
13
# File 'lib/pindo/module/build/versionhelper.rb', line 11

def share_instance
  instance
end

Instance Method Details

#get_build_number_from_commit(project_dir: nil) ⇒ Integer

获取Build号(从commit hash转换而来)

Parameters:

  • project_dir (String) (defaults to: nil)

    项目目录路径

Returns:

  • (Integer)

    Build号(6位16进制转10进制)

Raises:

  • (ArgumentError)


53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/pindo/module/build/versionhelper.rb', line 53

def get_build_number_from_commit(project_dir: nil)
  raise ArgumentError, "项目目录不能为空" if project_dir.nil?

  # 获取git根目录
  git_root = git_root_directory(local_repo_dir: project_dir)
  return 1 unless git_root

  begin
    # 获取当前HEAD的commit hash前6位
    commit_hash = git!(%W(-C #{git_root} rev-parse HEAD)).strip[0..5]

    # 将16进制转换为10进制
    build_number = commit_hash.to_i(16)

    # 确保在Android versionCode安全范围内(最大值为2^31-1)
    max_value = 2**31 - 1
    build_number = build_number % max_value if build_number > max_value

    # 确保build_number不为0
    build_number = 1 if build_number == 0

    build_number
  rescue StandardError => e
    Funlog.instance.fancyinfo_error("获取commit hash失败: #{e.message}")
    # 如果获取失败,返回基于时间戳的默认值
    Time.now.to_i % 1000000 + 1
  end
end

#get_commit_hash_from_build_number(build_number: nil) ⇒ String

从Build号反推commit hash前缀

Parameters:

  • build_number (Integer) (defaults to: nil)

    Build号

Returns:

  • (String)

    6位16进制commit hash前缀

Raises:

  • (ArgumentError)


85
86
87
88
89
90
# File 'lib/pindo/module/build/versionhelper.rb', line 85

def get_commit_hash_from_build_number(build_number: nil)
  raise ArgumentError, "Build号不能为空" if build_number.nil?

  # 将10进制转换为6位16进制字符串
  "%06x" % build_number.to_i
end

#get_version_from_tag(project_dir: nil) ⇒ String

从Git tag获取版本号

Parameters:

  • project_dir (String) (defaults to: nil)

    项目目录路径

Returns:

  • (String)

    版本号(例如:1.2.0),如果没有tag则返回0.0.1

Raises:

  • (ArgumentError)


19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/pindo/module/build/versionhelper.rb', line 19

def get_version_from_tag(project_dir: nil)
  raise ArgumentError, "项目目录不能为空" if project_dir.nil?

  # 获取git根目录
  git_root = git_root_directory(local_repo_dir: project_dir)
  return "0.0.1" unless git_root

  # 尝试不同的tag前缀
  latest_tag = nil
  ["v", "release", ""].each do |prefix|
    latest_tag = get_latest_version_tag(project_dir: git_root, tag_prefix: prefix)
    break if latest_tag
  end

  return "0.0.1" if latest_tag.nil?

  # 从tag中提取版本号
  version = latest_tag.gsub(/^(v|release[\s_-]*)/, '')

  # 确保版本号格式正确(x.y.z)
  if version =~ /^\d+\.\d+\.\d+$/
    version
  elsif version =~ /^\d+\.\d+$/
    "#{version}.0"
  elsif version =~ /^\d+$/
    "#{version}.0.0"
  else
    "0.0.1"
  end
end

#get_version_info(project_dir: nil) ⇒ Hash

获取版本信息摘要

Parameters:

  • project_dir (String) (defaults to: nil)

    项目目录路径

Returns:

  • (Hash)

    包含版本号、Build号、commit hash等信息

Raises:

  • (ArgumentError)


95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
# File 'lib/pindo/module/build/versionhelper.rb', line 95

def get_version_info(project_dir: nil)
  raise ArgumentError, "项目目录不能为空" if project_dir.nil?

  # 检查是否为Git仓库
  if !is_git_directory?(local_repo_dir: project_dir)
    return {
      is_git_repo: false,
      version: nil,
      build_number: nil,
      message: "项目不在Git仓库中,保持原有版本号"
    }
  end

  git_root = git_root_directory(local_repo_dir: project_dir)
  version = get_version_from_tag(project_dir: project_dir)
  build_number = get_build_number_from_commit(project_dir: project_dir)
  commit_hash_prefix = get_commit_hash_from_build_number(build_number: build_number)

  begin
    full_commit_hash = git!(%W(-C #{git_root} rev-parse HEAD)).strip
    current_branch = git!(%W(-C #{git_root} rev-parse --abbrev-ref HEAD)).strip
    latest_tag = get_latest_version_tag(project_dir: git_root) || ""
  rescue StandardError => e
    full_commit_hash = ""
    current_branch = ""
    latest_tag = ""
  end

  {
    is_git_repo: true,
    version: version,
    build_number: build_number,
    commit_hash_prefix: commit_hash_prefix,
    full_commit_hash: full_commit_hash,
    current_branch: current_branch,
    latest_tag: latest_tag,
    version_string: "#{version} (#{build_number})"
  }
end

#valid_build_number?(build_number) ⇒ Boolean

验证Build号是否在有效范围内

Parameters:

  • build_number (Integer)

    Build号

Returns:

  • (Boolean)

    是否有效



139
140
141
142
143
144
# File 'lib/pindo/module/build/versionhelper.rb', line 139

def valid_build_number?(build_number)
  return false if build_number.nil?

  # Android versionCode的有效范围是1到2^31-1
  build_number >= 1 && build_number <= 2**31 - 1
end