Public/Edit-FlywayConf.ps1

<#
.SYNOPSIS
This cmdlet edits a 'flyway.conf' file.
 
.DESCRIPTION
This cmdlet will edit a 'flyway.conf' file using the arguments passed. Returns the full path of the file that was edited.
 
.PARAMETER Path
The full path of the configuration file.
 
.PARAMETER Url
The jdbc url to use to connect to the database.
 
.PARAMETER User
The user to use to connect to the database
 
.PARAMETER Password
The password to use to connect to the database.
 
.PARAMETER Locations
A list of locations to scan recursively for migrations.
 
.INPUTS
System.String
System.IO.FileInfo
System.IO.DirectoryInfo
System.Management.Automation.PSCustomObject
 
.OUTPUTS
System.String
 
.EXAMPLE
Edit-FlywayConf "c:\tools\flyway\flyway.conf" -url "localhost" -usr "john" -pwd "pa551";
In this example, the 'flyway.conf' file is modified using the specified values.
 
.LINK
https://flywaydb.org/documentation
#>

function Edit-FlywayConf()
{
    [CmdletBinding(SupportsShouldProcess, ConfirmImpact = "Medium")]
    Param(
        [Alias('c', 'conf', 'path')]
        [Parameter(ValueFromPipeline)]
        $InputObject = "$(Split-Path $PSScriptRoot -Parent)\bin",

        [string]$Url,

        [Alias('u', 'usr')]
        [string]$User,

        [Alias('p', 'pwd')]
        [SecureString]$Password,

        [Alias('l', 'loc')]
        [string[]]$Locations = @()
    )

    # Extract a path from the InputObject if possible.
    $configFile = "";
    if ($InputObject.ConfigFile -ne $null) { $configFile = $InputObject.ConfigFile; }
    elseif (Test-Path $InputObject -PathType Leaf) { $configFile = $InputObject.ToString(); }
    else 
    { 
        try
        {
            $configFile = Get-ChildItem $InputObject -Recurse -Filter "flyway.conf" | Select-Object -ExpandProperty FullName -First 1;
        }
        catch
        {
            throw "the input object does not represent a 'flyway.conf' file.";
        }
    }

    if ([String]::IsNullOrEmpty($configFile) -or (-not (Test-Path $configFile -PathType Leaf))) { throw "cannot find '$configFile'."; }
    else
    {
        # Tranform the given values into compatible flyway args.
        for ($i = 0; $i -lt $Locations.Length; $i++)
        {
            if (-not $Locations[$i].StartsWith("filesystem")) { $Locations[$i] = "filesystem:$($Locations[$i])"; }
        }

        $loc = [String]::Join(",", $Locations);
        $pwd = (New-Object pscredential "usr", $Password).GetNetworkCredential().Password;

        # Edit the 'flyway.conf' file.
        $content = (Get-Content $configFile | Out-String).Trim();
        $map = @{"url"=$Url;"user"=$User;"password"=$pwd;"locations"="$loc"};
        foreach ($key in $map.Keys)
        {
            $value = $map[$key];
            if (-not [string]::IsNullOrEmpty($value))
            {
                $content = $content -replace "(#\s*)?flyway\.$key=.*", "flyway.$key=$value";
                Write-Verbose "flyway.$key was set to '$value'.";
            }
        }

        if ($PSCmdlet.ShouldProcess($configFile))
        {
            $content | Out-File $configFile -Encoding utf8;
            Write-Verbose "modified '$configFile'.";
        }
    }

    return $configFile;
}