Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore: add update\bump-version.ps1 to bump version in powershell, when clog is not required #1379

Merged
merged 1 commit into from
Oct 4, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
161 changes: 161 additions & 0 deletions update/bump-version.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,161 @@
param( [string]$tag, [switch]$updatelog)
# -tag [new_tag], new tag shall be in format ^\d+\.\d+\.\d+$ and greater than
# the current one
# -updatelog update CHANGELOG.md if this switch used

# get old version info from file, esp from build.bat
function get_old_version{
param ([string]$filePath)
$fileContent = Get-Content -Path $filePath;
$version = @{};
foreach ($line in $fileContent) {
if ($version["major"] -eq $null -and $line -match 'VERSION_MAJOR=(\d+)') {
$version["major"] = $matches[1];
}
if ($version["minor"] -eq $null -and $line -match 'VERSION_MINOR=(\d+)') {
$version["minor"] = $matches[1];
}
if ($version["patch"] -eq $null -and $line -match 'VERSION_PATCH=(\d+)') {
$version["patch"] = $matches[1];
}
if ($version["major"] -ne $null -and $version["minor"] -ne $null -and $version["patch"] -ne $null) {
break;
}
}
$version['str'] = $version["major"] + "." + $version["minor"] + "." + $version["patch"];
return $version;
}

# parse new version info
function parse_new_version {
param([string]$new_version)
$version = @{};
if ($new_version -match "^(\d+)\.(\d+)\.(\d+)$") {
$version['major'] = $matches[1];
$version['minor'] = $matches[2];
$version['patch'] = $matches[3];
}
return $version;
}

# update bat file with param filePath, and tags
function update_bat_file{
param( [string]$filePath, $old_version, $new_version)
$old_major, $old_minor, $old_patch = $old_version['major'], $old_version["minor"], $old_version["patch"];
$new_major, $new_minor, $new_patch = $new_version['major'], $new_version["minor"], $new_version["patch"];
$fileContent = Get-Content -Path $filePath;
$fileContent = $fileContent -replace "VERSION_MAJOR=$old_major", "VERSION_MAJOR=$new_major";
$fileContent = $fileContent -replace "VERSION_MINOR=$old_minor", "VERSION_MINOR=$new_minor";
$fileContent = $fileContent -replace "VERSION_PATCH=$old_patch", "VERSION_PATCH=$new_patch";
Set-Content -Path $filePath -Value $fileContent -Encoding UTF8;
}

# update change log, work like clog-cli
function update_changelog {
param( [string]$new_tag, [string]$old_tag)
# get the current the previous release tag and current release tag
$tags = git tag --sort=creatordate | Select-String -Pattern '^\d+\.\d+\.\d+$' | ForEach-Object { $_.ToString() };
$latestTag = $tags[-1];
$commits = git log "$latestTag..HEAD" --pretty=format:"%s ([%an](https://github.com/rime/weasel/commit/%H))";
# group commit logs
$groupedCommits = @{
build = @(); ci = @(); fix = @(); feat = @(); docs = @(); style = @();
refactor = @(); test = @(); chore = @(); commit = @();
};
$groupedTitle = @{
build = "Builds";
ci = "Continuous Integration";
fix = "Bug Fixes";
feat = "Features";
docs = "Documents";
style = "Code Style";
refactor = "Code Refactor";
test = "Tests";
chore = "Chores";
commit = "Commits";
};
foreach ($commit in $commits) {
if ($commit -match "^(build|ci|fix|feat|docs|style|refactor|test|chore):") {
$prefix = $matches[1];
$groupedCommits[$prefix] += $commit;
} else {
$groupedCommits["commit"] += $commit;
}
}
$changelog = "";
foreach ($group in $groupedCommits.Keys) {
if ($groupedCommits[$group].Count -gt 0) {
$changelog += "`n#### " + $groupedTitle[$group] + "`n"
foreach ($commit in $groupedCommits[$group]) {
$msg = $commit -replace "^" + $group + ":", '';
$changelog += "* $msg`n";
}
}
}
$currentDateTime = Get-Date -Format "yyyy-MM-dd";
$fileContent = Get-Content -Path "CHANGELOG.md" -Raw -Encoding UTF8;
$contentAdd = "<a name=`"$new_tag`"></a>`n" ;
$contentAdd += "## [$new_tag](https://github.com/rime/weasel/compare/$old_tag...$new_tag)($currentDateTime)`n" ;
$contentAdd += $changelog;
Write-Host "`n" + $contentAdd + "`n"
$fileContent = $contentAdd + "`n" + $fileContent;
$fileContent | Out-File -FilePath "CHANGELOG.md" -Encoding UTF8;
}

# update appcast file, with regex patterns
function update_appcast_file {
param( [string]$filePath, [string]$pat_orig, [string]$pat_replace)
$fileContent = Get-Content -Path $filePath;
$fileContent = $fileContent -replace $pat_orig, $pat_replace;
Set-Content -Path $filePath -Value $fileContent;
}
###############################################################################
# program now started
# tag name not match rule, exit
if (-not ($tag -match '^\d+\.\d+\.\d+$')) {
Write-Host "tag name not match rule '^\d+\.\d+\.\d+$'";
Write-Host "please recheck it";
exit;
}
# get old version
$old_version = get_old_version -filePath "build.bat";
$old_major, $old_minor, $old_patch = $old_version['major'], $old_version["minor"], $old_version["patch"];
# get new version
$new_version = parse_new_version -new_version $tag
# check new version is greater than the current one
if ($tag -eq $old_version["str"]) {
Write-Host "the new tag: $tag is the same with the old one:" $old_version["str"];
exit;
} elseif ($tag -lt $old_version["str"]) {
Write-Host "$tag is older version than " $old_version['str']", please recheck your target version.";
exit;
}
Write-Host "bump version to $tag ... "
#get date-time string in english date-time format
$CurrentCulture = [System.Globalization.CultureInfo]::InvariantCulture
$currentDateTime = (Get-Date).ToString("ddd, dd MMM yyyy HH:mm:ss K", $CurrentCulture)

#update appcast files
update_appcast_file -filePath "update/appcast.xml" -pat_orig "$old_major\.$old_minor\.$old_patch" -pat_replace $tag
update_appcast_file -filePath "update/appcast.xml" -pat_orig "<pubDate>.*?</pubDate>" -pat_replace "<pubDate>$currentDateTime</pubDate>"
Write-Host "update/appcast.xml updated"
update_appcast_file -filePath "update/testing-appcast.xml" -pat_orig "$old_major\.$old_minor\.$old_patch" -pat_replace $tag
update_appcast_file -filePath "update/testing-appcast.xml" -pat_orig "<pubDate>.*?</pubDate>" -pat_replace "<pubDate>$currentDateTime</pubDate>"
Write-Host "update/testing-appcast.xml updated"
#update bat files
update_bat_file -filePath "build.bat" -old_version $old_version -new_version $new_version
Write-Host "build.bat updated"
update_bat_file -filePath "xbuild.bat" -old_version $old_version -new_version $new_version
Write-Host "xbuild.bat updated"
#update CHANGELOG.md
if ($updatelog) {
update_changelog -new_tag $tag -old_tag "$old_major.$old_minor.$old_patch"
& git add CHANGELOG.md
Write-Host "CHANGELOG.md updated"
}
#commit changes and make a new tag
$release_message = "chore(release): $tag :tada:"
$release_tag = $tag
& git add update/*.xml build.bat xbuild.bat
& git commit --message $release_message
& git tag --annotate $release_tag --message $release_message