Tags.psm1

function Get-GitlabTag {
    [CmdletBinding()]
    [OutputType('Gitlab.Tag')]
    [Alias('tags')]
    param (
        [Parameter(ValueFromPipelineByPropertyName)]
        [string]
        $ProjectId = '.',

        [Parameter(Position=0)]
        [string]
        $Name,

        [Parameter()]
        [string]
        $Search,

        [Parameter()]
        [ValidateSet([SortDirection])]
        [string]
        $Sort,

        [Parameter()]
        [ValidateSet('name', 'updated', 'version')]
        [string]
        $OrderBy,

        [Parameter()]
        [uint]
        $MaxPages,

        [switch]
        [Parameter()]
        $All,

        [Parameter()]
        [string]
        $SiteUrl
    )

    $ProjectId = Resolve-GitlabProjectId $ProjectId

    $Path = "projects/$ProjectId/repository/tags"
    $Query = @{}

    if ($Name) {
        $Path += "/$Name"
    } else {
        if ($Search) {
            $Query.search = $Search
        }
        if ($Sort) {
            $Query.sort = $Sort
        }
        if ($OrderBy) {
            $Query.order_by = $OrderBy
        }
    }

    $MaxPages = Resolve-GitlabMaxPages -MaxPages:$MaxPages -All:$All

    # https://docs.gitlab.com/ee/api/tags.html#list-project-repository-tags
    Invoke-GitlabApi GET $Path -Query $Query -MaxPages $MaxPages |
        New-GitlabObject 'Gitlab.Tag'
}

function New-GitlabTag {
    [CmdletBinding(SupportsShouldProcess)]
    [OutputType('Gitlab.Tag')]
    param (
        [Parameter(ValueFromPipelineByPropertyName)]
        [string]
        $ProjectId = '.',

        [Parameter(Mandatory, Position=0)]
        [string]
        $Name,

        [Parameter()]
        [Alias('Branch')]
        [string]
        $Ref = '.',

        [Parameter()]
        [string]
        $Message,

        [Parameter()]
        [string]
        $SiteUrl
    )

    $ProjectId = Resolve-GitlabProjectId $ProjectId
    $Ref       = Resolve-GitlabBranch $Ref

    $Body = @{
        tag_name = $Name
        ref      = $Ref
    }
    if ($Message) {
        $Body.message = $Message
    }

    if ($PSCmdlet.ShouldProcess("project $ProjectId", "create tag '$Name' from '$Ref'")) {
        # https://docs.gitlab.com/ee/api/tags.html#create-a-new-tag
        Invoke-GitlabApi POST "projects/$ProjectId/repository/tags" -Body $Body |
            New-GitlabObject 'Gitlab.Tag'
    }
}

function Remove-GitlabTag {
    [CmdletBinding(SupportsShouldProcess, ConfirmImpact='High')]
    [OutputType([void])]
    param (
        [Parameter(ValueFromPipelineByPropertyName)]
        [string]
        $ProjectId = '.',

        [Parameter(Mandatory, Position=0, ValueFromPipelineByPropertyName)]
        [string]
        $Name,

        [Parameter()]
        [string]
        $SiteUrl
    )

    $ProjectId = Resolve-GitlabProjectId $ProjectId

    if ($PSCmdlet.ShouldProcess("project $ProjectId", "delete tag '$Name'")) {
        # https://docs.gitlab.com/ee/api/tags.html#delete-a-tag
        Invoke-GitlabApi DELETE "projects/$ProjectId/repository/tags/$Name" | Out-Null
    }
}