Public/Api/Git/ConvertTo-CommitArtifactUriObject.ps1

function ConvertTo-CommitArtifactUriObject {

    <#
        .SYNOPSIS
            Converts commit's uri to Artifact Uri usable for ArtifactUriQuery.
            Returns CollectionUri and ArtifactUri tuples.

        .PARAMETER CommitUri
            Uri of the commit from the API.
    #>


    [CmdletBinding()]
    param(
        [Parameter(Mandatory, ValueFromPipeline)]
        [Alias('Uri','InputObject')]
        $CommitUri
    )

    begin {
        $regex = '^(?<collection>.+)\/(?<project>.+)\/_apis\/git\/repositories\/(?<repository>.+)\/commits\/(?<commit>[^\/]+)\/(?:.*)?$'
    }

    # Example:
    # Commit URI is:
    # ```
    # https://dev-tfs/tfs/internal_projects/890669f3-5144-4962-a81f-a96feb160a10/_apis/git/repositories/c2b7419e-9006-4d2c-9f7e-e9f29a89adce/commits/548ded02bb9b602833ddefe26347e99e71ef434d
    # collection ------------------------->/
    # project -----------------------------/<---------------------------------->/
    # repository --------------------------------------------------------------------------------------/<---------------------------------->/
    # commit ---------------------------------------------------------------------------------------------------------------------------------------/<-------------------------------------->
    # ```
    # Artifact URI is:
    # ```
    # vstfs:///Git/Commit/3065bb47-8344-4370-982a-5183abf197fa%2F649107bd-ab35-4192-8584-601f64172f80%2F548ded02bb9b602833ddefe26347e99e71ef434d
    # project ------------<---------------------------------->%2F
    # repository ---------------------------------------------%2F<---------------------------------->%2F
    # commit ----------------------------------------------------------------------------------------%2F<-------------------------------------->
    # ```

    process {

        $CommitUri | ForEach-Object {

            $item = $_

            # Skip empty items
            if (!$item) {
                return
            }

            # Match the Uri to the regex
            $parts = Split-ApiUri -Uri $item -Pattern $regex -UseOnlyProvidedPatterns

            # If not matched, skip
            if (!$parts) {
                return
            }

            # Construct the Artifact Uri object:
            $result = [PSCustomObject] @{
                CollectionUri = $parts.collection
                ProjectId     = $parts.project
                RepositoryId  = $parts.repository
                CommitId      = $parts.commit
                ArtifactUri   = "vstfs:///Git/Commit/$($parts.project)%2F$($parts.repository)%2F$($parts.commit)"
                Uri           = $CommitUri
            }

            return $result
        }
    }
}