# Close old branches for Mercurial # Copyright (C) 2014 Mikhail Pilin # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. if ($PSVersionTable.PSVersion.Major -lt 3) { throw "PS Version $($PSVersionTable.PSVersion) is below 3.0." } Set-StrictMode -Version Latest $ErrorActionPreference = [System.Management.Automation.ActionPreference]::Stop $script:VerbosePreference = "Continue" $encoding = "cp866" [System.TimeSpan]$alive = [System.TimeSpan]::FromDays(60) [System.DateTime]$now = [System.DateTime]::Now [System.Object]$current = & hg parent --encoding $encoding -T "{node} {branch}" | ForEach-Object { $result = $_ | Select-Object -Property node, name $parts = $_.Split(' ', 2) $result.node = $parts[0] $result.name = $parts[1] $result } | Select-Object Write-Host "Current branch: " -nonewline Write-Host -foregroundcolor gray $current.name [System.Object[]]$branches = @(& hg head --encoding $encoding -T "{date(date,'%Y%m%d%H%M%S')} {node} {branch}\n" | ForEach-Object { $result = $_ | Select-Object -Property date, node, name $parts = $_.Split(' ', 3) [System.DateTime]$result.date = [System.DateTime]::ParseExact($parts[0], "yyyyMMddHHmmss", [System.Globalization.CultureInfo]::InvariantCulture) $result.node = $parts[1] $result.name = $parts[2] $result } | Where-Object { $now - $_.date -gt $alive } | Sort-Object -property date) function EscapeBranchName { Param([System.String]$name) $name.Replace('"', '\"') } if ($branches.Length -eq 0) { Write-Host "No old branches were detected" } else { Write-Host "Closing $($branches.Length) old branches:" $branches | ForEach-Object { Write-Host "[$([System.String]::Format("{0:%d}", $now - $_.date)) days] " -nonewline Write-Host -foregroundcolor gray $_.name & hg debugsetparent $_.node | Out-Null if ($LastExitCode -ne 0) { Write-Warning "Failed to set node (exit code $LastExitCode)." } else { & hg branch $(EscapeBranchName $_.name) | Out-Null if ($LastExitCode -ne 0) { Write-Warning "Failed to set branch (exit code $LastExitCode)." } else { & hg commit --close-branch -X * -m $("The branch was not used for {0:%d} days and closed automatically." -f ($now - $_.date)) | Out-Null if ($LastExitCode -ne 0) { Write-Warning "Failed to commit (exit code $LastExitCode)." } } } } Write-Host "Restore current branch: " -nonewline Write-Host -foregroundcolor gray $current.name & hg debugsetparent $current.node | Out-Null if ($LastExitCode -ne 0) { Write-Warning "Failed to set node (exit code $LastExitCode)." } else { & hg branch $(EscapeBranchName $current.name) | Out-Null if ($LastExitCode -ne 0) { Write-Warning "Failed to set branch (exit code $LastExitCode)." } } }
07 September, 2014
Powershell script to close mercurial branches older then 60 days
GitHub link
Labels:
Hg,
Mercurial,
PowerShell,
Windows
Subscribe to:
Posts (Atom)