<#
.SYNOPSIS
	Removes a Git tag (locally, remote, or both)
.DESCRIPTION
	This PowerShell script removes a Git tag, either locally, remote, or both.
.PARAMETER TagName
	Specifies the Git tag name
.PARAMETER Mode
	Specifies either locally, remote, or both
.PARAMETER RepoDir
	Specifies the path to the Git repository
.EXAMPLE
	PS> ./remove-tag v1.7 locally
.LINK
	https://github.com/fleschutz/PowerShell
.NOTES
	Author: Markus Fleschutz | License: CC0
#>

param([string]$TagName = "", [string]$Mode = "", [string]$RepoDir = "$PWD")

try {
	if ($TagName -eq "") { $TagName = read-host "Enter new tag name" }
	if ($Mode -eq "") { $Mode = read-host "Remove the tag locally, remote, or both" }

	$StopWatch = [system.diagnostics.stopwatch]::startNew()

	if (-not(test-path "$RepoDir" -pathType container)) { throw "Can't access directory: $RepoDir" }

	$Null = (git --version)
	if ($lastExitCode -ne "0") { throw "Can't execute 'git' - make sure Git is installed and available" }

	if (($Mode -eq "locally") -or ($Mode -eq "both")) {
		"Removing local tag..."
		& git -C "$RepoDir" tag --delete $TagName
		if ($lastExitCode -ne "0") { throw "'git tag --delete' failed with exit code $lastExitCode" }
	}

	if (($Mode -eq "remote") -or ($Mode -eq "both")) {
		"Removing remote tag..."
		& git -C "$RepoDir" push origin :refs/tags/$TagName
		if ($lastExitCode -ne "0") { throw "'git push origin' failed with exit code $lastExitCode" }
	}

	[int]$Elapsed = $StopWatch.Elapsed.TotalSeconds
	"✔️ removed tag '$TagName' in $Elapsed sec"
	exit 0 # success
} catch {
	"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
	exit 1
}
