OCram85/DroneHelper
OCram85
/
DroneHelper
Archived
1
0
Fork 0
This repository has been archived on 2023-10-10. You can view files and clone it, but cannot push or open issues or pull requests.
DroneHelper/src/Changelog/Update-Changelog.ps1

94 lines
3.4 KiB
PowerShell

function Update-Changelog {
<#
.SYNOPSIS
Updates the changelog file with recent commits
.DESCRIPTION
This helper function is used to insert recent changes for an upcoming release.
.Parameter NewVersion
Provide a valid semver based version tag for the upcoming release like:
- `v0.0.1-dev1`
- `v1.0.0`
.Parameter SkipCleanup
You can skip the tag update and additional test.
.INPUTS
[None] No pipeline input.
.OUTPUTS
[None] no pipeline putput.
.EXAMPLE
Import-Module -Name DroneHelper; Update-Changelog -NewVersion '0.0.1-dev5'
#>
[CmdletBinding()]
[Diagnostics.CodeAnalysis.SuppressMessageAttribute(
'PSAvoidUsingInvokeExpression',
'',
Justification = 'raw git commands needed'
)]
[Diagnostics.CodeAnalysis.SuppressMessageAttribute(
'PSUseShouldProcessForStateChangingFunctions',
'',
Justification = 'system state does not change permanent in temp build clients.'
)]
param (
[Parameter(Mandatory = $true)]
[ValidatePattern('^(v)?([0-9]+)\.([0-9]+)\.([0-9]+)(-([A-Za-z]+)([0-9]+))?$')]
[String]$NewVersion,
[Parameter(Mandatory = $false)]
[Switch]$SkipCleanup
)
process {
if (-not $SkipCleanup.IsPresent) {
Invoke-Expression -Command 'git tag -d $(git tag -l)' | Write-Verbose
Invoke-Expression -Command 'git fetch --tags --prune' | Write-Verbose
$GitState = Get-GitStatus
if ($GitState.Branch -eq 'master') {
Write-Error -Message 'You can nor update the changelog within the master branch!' -ErrorAction Stop
}
if (
($GitState.BehindBy -ne 0) -or
($GitState.AheadBy -ne 0) -or
($GitState.HasUntracked -ne $false) -or
($GitState.HasWorking -ne $false)
) {
Write-Error -Message 'Your branch is a mess! Cleanup and try it again.' -ErrorAction Stop
}
}
$Repo = Get-RepoPath
$Tags = Invoke-Expression -Command 'git tag'
$NormalizedTags = $Tags | Where-Object { $_ -notmatch '-' } | ForEach-Object {
[PSCustomObject]@{
tag = $_
rawVersion = (
($_ -split '-')[0] -replace 'v', ''
)
}
}
$LTag = $NormalizedTags | Sort-Object -Property 'rawVersion' | Select-Object -ExpandProperty 'tag' -Last 1
Write-Debug -Message ('Last tag: {0}' -f $LTag)
if ($null -eq $LTag) {
Write-Error -Message 'No tags found!' -ErrorAction 'Stop'
}
$Expr = "git log {0}..HEAD --format='- (%h) %s'" -f $LTag
$Res = Invoke-Expression -Command $Expr
Write-Debug -Message ('New Changelog: {0}' -f $Res)
if ($Repo.Changelog.Exists) {
$Content = Get-Content -Path $Repo.Changelog.Item.FullName
$Content[2] += "{0}## ``{2}``{0}{0}{1}" -f [Environment]::NewLine, ($Res | Out-String), $NewVersion
$Content | Out-File -FilePath $Repo.Changelog.Item.FullName -Encoding utf8
Set-EOL -Path $Repo.Changelog.Item.FullName
}
else {
Write-Error -Message 'Changelog file does not exist!' -ErrorAction Stop
}
}
}