Repository/Find-Repository.ps1

function Find-Repository {
    [CmdletBinding()]
    Param ()

    filter FindDotGitDirectory {
        if (Test-Path $_\.git) {
            return $_
        }

        Get-ChildItem -Directory $_ | FindDotGitDirectory
    }

    if ($null -eq $GitManagement.Repositories -or ((Get-Date) - $GitManagement.LastRepositoryScan).TotalSeconds -gt 300) {
        Write-Debug "Updating repository cache"

        $baseDirectory = Get-BaseDirectory
        $repositoryPaths = ($baseDirectory | FindDotGitDirectory).FullName
        $providers = Get-Provider

        $GitManagement.LastRepositoryScan = Get-Date
        $GitManagement.Repositories = $repositoryPaths | ForEach-Object {
            $splitPath = [io.path]::GetRelativePath($baseDirectory, $_).Split([io.path]::DirectorySeparatorChar)
            $provider = $providers | Where-Object Name -EQ $splitPath[0]
            $directories = $splitPath[1..($splitPath.Count - 1)]

            $repository = [PSCustomObject]@{
                PSTypeName = "GitManagement.GitRepository"
                Provider   = $provider.Name
                Path       = $_
            }

            $properties = [ordered]@{ }
            for ($ii = 0; $ii -lt $directories.Length; $ii++) {
                $hierarchicalDirectory = $provider.DirectoryHierarchy[$ii]
                $properties.Add($hierarchicalDirectory, $directories[$ii])
            }

            $repository | Add-Member Properties $properties
            $repository
        }
    }

    $GitManagement.Repositories
}