DSCResources/cGitRepositoryBranch/cGitRepositoryBranch.psm1

function Get-TargetResource
{
    [CmdletBinding()]
    [OutputType([System.Collections.Hashtable])]
    param (
        [parameter(Mandatory = $true)]
        [System.String]
        $BaseDirectory,

        [parameter(Mandatory = $true)]
        [System.String]
        $Repository,

        [parameter(Mandatory = $true)]
        [System.String]
        $Branch
    )
    
    $RepositoryName = $Repository.Split('/')[-1]
    $StartingDir = (pwd).Path
    Try
    {
        Set-Location -Path "$($BaseDirectory)\$RepositoryName"
        $BranchOutput = git branch
        if((($BranchOutput -Match '\*') -as [string]) -Match "\* (.*)")
        {
            $Branch = $Matches[1]
        }
        else
        {
            $Branch = [string]::Empty
        }
    }
    Catch { throw }
    Finally { Set-Location -Path $StartingDir }

    Return @{
        'BaseDirectory' = $BaseDirectory
        'Repository' = $Repository
        'Branch' = $Branch
    }
}
Export-ModuleMember -Function Get-TargetResource -Verbose:$false


function Set-TargetResource
{
    [CmdletBinding()]
    param (
        [parameter(Mandatory = $true)]
        [System.String]
        $BaseDirectory,

        [parameter(Mandatory = $true)]
        [System.String]
        $Repository,

        [parameter(Mandatory = $true)]
        [System.String]
        $Branch
    )

    $RepositoryName = $Repository.Split('/')[-1]
    $StartingDir = (pwd).Path
    Try
    {
        Set-Location -Path "$($BaseDirectory)\$RepositoryName"
        $EAPHolder = $ErrorActionPreference
        $ErrorActionPreference = 'SilentlyContinue'
        $Null = git checkout $Branch
        $ErrorActionPreference = [System.Management.Automation.ActionPreference]$EAPHolder
    }
    Catch { throw }
    Finally { Set-Location -Path $StartingDir }
}
Export-ModuleMember -Function Set-TargetResource -Verbose:$false


function Test-TargetResource
{
    [CmdletBinding()]
    [OutputType([System.Boolean])]
    param (
        [parameter(Mandatory = $true)]
        [System.String]
        $BaseDirectory,

        [parameter(Mandatory = $true)]
        [System.String]
        $Repository,

        [parameter(Mandatory = $true)]
        [System.String]
        $Branch
    )

    $Status = Get-TargetResource -BaseDirectory $BaseDirectory -Repository $Repository -Branch $Branch
        
    Return ($Branch -eq $Status.Branch) -as [bool]
}
Export-ModuleMember -Function Test-TargetResource -Verbose:$false