Class: Pindo::VersionHelper
- Inherits:
-
Object
- Object
- Pindo::VersionHelper
- Includes:
- Githelper, Singleton
- Defined in:
- lib/pindo/module/build/versionhelper.rb
Class Method Summary collapse
Instance Method Summary collapse
-
#get_build_number_from_commit(project_dir: nil) ⇒ Integer
获取Build号(从commit hash转换而来).
-
#get_commit_hash_from_build_number(build_number: nil) ⇒ String
从Build号反推commit hash前缀.
-
#get_version_from_tag(project_dir: nil) ⇒ String
从Git tag获取版本号.
-
#get_version_info(project_dir: nil) ⇒ Hash
获取版本信息摘要.
-
#valid_build_number?(build_number) ⇒ Boolean
验证Build号是否在有效范围内.
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_instance ⇒ Object
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转换而来)
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.("获取commit hash失败: #{e.}") # 如果获取失败,返回基于时间戳的默认值 Time.now.to_i % 1000000 + 1 end end |
#get_commit_hash_from_build_number(build_number: nil) ⇒ String
从Build号反推commit hash前缀
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获取版本号
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
获取版本信息摘要
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号是否在有效范围内
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 |