Publish-Packages.psm1

<#
.Synopsis
   Automatic Publish Tool (APT)
.DESCRIPTION
   Publish or rewrite nugets (feed/local nuget storage)
.EXAMPLE
   Publish-Packages -Path D:\Projects\ActiveOffice.NET\ActiveOffice.NET\devops\output\ -Feed Lomtec.ActiveOffice
 .EXAMPLE
   Publish-Packages -Path D:\Projects\ActiveOffice.NET\ActiveOffice.NET\devops\output\ -ProjectPackages D:\Projects\CISSS\src\packages\ -EnableDebug
.EXAMPLE
   Publish-Packages -Path D:\Projects\ActiveOffice.NET\ActiveOffice.NET\devops\output\ -ProjectPackages D:\Projects\CISSS\src\packages\ -EnableDebug -ResetFeed
 .NOTES
   Author: Imrich Szolik
#>

function Publish-Packages {
    [CmdletBinding()]
    param (
        #Packages path
        [Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$false, HelpMessage="Packages path")]
        [string]
        $Path,
        #Package feed name
        [Parameter(Mandatory=$false, ValueFromPipelineByPropertyName=$false, HelpMessage="Packages feed name.")]
        [string]
        $Feed,
        #Disable deploy to nuget server, rewrite local packages for debug
        [switch]
        [Parameter(Mandatory=$false, ValueFromPipelineByPropertyName=$false, HelpMessage="Disable deploy to nuget server, rewrite local packages for debug!")]
        $EnableDebug,
        #Delete global and locel feed
        [switch]
        [Parameter(Mandatory=$false, ValueFromPipelineByPropertyName=$false, HelpMessage="Delete global and locel feed")]
        $ResetFeed,
        #Project packages path
        [string[]]
        [Parameter(Mandatory=$false, ValueFromPipelineByPropertyName=$false, HelpMessage="Project packages path.")]
        $ProjectPackages,
        #Publish verbosity
        [Parameter(Mandatory=$false, ValueFromPipelineByPropertyName=$false, HelpMessage="Verbosity")]
        $Verbosity = "quiet"
    )
    begin {
        if(-not $EnableDebug.IsPresent){
            if([string]::IsInterned($Feed)){
                throw "Feed is required!"
            }
        }
    }
    process {
        $files = Get-ChildItem -Path $Path -Filter *.nupkg
        #to local files
        if($EnableDebug.IsPresent){
            #
            $match = [regex] '(?<name>.+)\.(?<major>\d+)\.(?<minor>\d+)\.(?<revison>\d+)\.nupkg'
            $globalNuget =  Join-Path -Path (Join-Path -Path $env:USERPROFILE -ChildPath ".nuget") -ChildPath "packages"
            #
            foreach($file in $files){
                $result = $match.Match($file)
                if($result.Success){
                    #rename .nuget to zip (Expand-Archive powershell 5.0)
                    $zipFile = "$file.FullName.zip" 
                    Copy-Item $file.FullName $zipFile
                    #
                    $name = Split-Path -Path $result.Groups['name'] -Leaf
                    $version = "$($result.Groups['major']).$($result.Groups['minor']).$($result.Groups['revison'])"
                    $globalPackages = Join-Path $globalNuget -ChildPath $name
                    #
                    Write-Host "#### APT NUGET rewrite: $name.$version ####"
                    if( Test-Path -Type  Container $globalPackages){
                        $packageDirectory = Join-Path $globalPackages -ChildPath $version
                        #
                        Remove-Item -Force -Recurse $packageDirectory -ErrorAction SilentlyContinue
                        #
                        if(-not $ResetFeed.IsPresent){
                            Write-Verbose "Rewrite user-global package: $name.$version"
                            Expand-Archive -Force -Path $zipFile -DestinationPath $packageDirectory
                        }
                        else{
                            Write-Verbose "Reset user-global package: $name.$version"
                        }
                    }
                    #
                    if($null -ne $ProjectPackages -and $ProjectPackages.Length -gt 0){
                        #
                        foreach($p in $ProjectPackages){
                            #
                            $localPackage = Join-Path $p -ChildPath "$name.$version"
                            #
                            if( Test-Path -Type  Container $localPackage){
                                #
                                Remove-Item -Force -Recurse $localPackage -ErrorAction SilentlyContinue
                                #
                                if(-not $ResetFeed.IsPresent){
                                    Write-Verbose "Rewrite project package: $name.$version"
                                    Expand-Archive -Force -Path $zipFile -DestinationPath $localPackage 
                                }
                                else{
                                    Write-Verbose "Reset project package: $name.$version"
                                }
                            }
                        }
                    }
                    #
                    Remove-Item $zipFile -Force -ErrorAction SilentlyContinue
                }
            }
        }
        #to nuget server
        else{
            $exists = nuget.exe list -Source $Feed | Select-Object  @{name='Item';expression={$_.Replace(" ",".")}} -Skip 1 | Select-Object -ExpandProperty Item
            #
            foreach($file in $files){
                $filename = $file.Name
                $name = $filename.SubString(0,$filename.Length-6)
                #
                if($exists -notcontains $name){
                    Write-Host "#### APT NUGET deploy: $name ####"
                    nuget.exe push -Source $Feed -ApiKey az $file.FullName -Verbosity $Verbosity
                }
                else{
                    Write-Verbose "Found $name, not deployed."
                }
            }
        }
    }
    end {
    }
}

Export-ModuleMember -Function Publish-Packages
# SIG # Begin signature block
# MIIH7gYJKoZIhvcNAQcCoIIH3zCCB9sCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQU/3Rg/gusLHNBJx+Aa9QgSJ6a
# GSegggUPMIIFCzCCAvOgAwIBAgICAKUwDQYJKoZIhvcNAQELBQAwgaAxCzAJBgNV
# BAYTAlNLMREwDwYDVQQIEwhTbG92YWtpYTETMBEGA1UEBxMKQnJhdGlzbGF2YTET
# MBEGA1UEChMKTG9tdGVjLmNvbTErMCkGA1UEAxMiTG9tdGVjLmNvbSBDZXJ0aWZp
# Y2F0aW9uIEF1dGhvcml0eTEnMCUGCSqGSIb3DQEJARYYSW1yaWNoLlN6b2xpa0Bs
# b210ZWMuY29tMB4XDTE5MDMyNjE1MDQ0M1oXDTMwMDEwMTAwMDAwMFowgZMxCzAJ
# BgNVBAYTAlNLMREwDwYDVQQIEwhTbG92YWtpYTETMBEGA1UEBxMKQnJhdGlzbGF2
# YTETMBEGA1UEChMKTG9tdGVjLmNvbTEeMBwGA1UEAxMVTG9tdGVjLmNvbSBQb3dl
# cnNoZWxsMScwJQYJKoZIhvcNAQkBFhhJbXJpY2guU3pvbGlrQGxvbXRlYy5jb20w
# ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC+J+Jwh25Ha39PSBzRUNj/
# 8+iONxiknLBSTkB1DJEQ9wC6FBS/1EQvbFtn2K6huVZBQCoZzNFcXoiAked3ALIT
# UoYxX+fD4Wkve947QqCXGroCFQVaBSLkPoJzWCadlXQWyDyjFuCY42TsQRJB6TFp
# n4rVylhinlOvEHJ96COjzvmEs7X1y3tTVPtRiDt3wOxNLx1T1H/6lmVzGFORJS0F
# ZvQF231+/Zk4Je+gOe/jguo/gHoZHdjj31JeMLJ6Md3zslAFAPIqI3lofez6V3f7
# PkZLsVnYLAuGElg1I4WUswZJpfbnq2KqPWvlwG9/Xb5KSvUz5d6uRzQUDJAn6fG5
# AgMBAAGjWjBYMAkGA1UdEwQCMAAwCwYDVR0PBAQDAgeAMCsGA1UdJQQkMCIGCCsG
# AQUFBwMDBgorBgEEAYI3AgEVBgorBgEEAYI3AgEWMBEGCWCGSAGG+EIBAQQEAwIE
# sDANBgkqhkiG9w0BAQsFAAOCAgEACSWqb/bJGI4eR07CZ6g3baoe2Djl7gPIPgyg
# Y/uYAxGROVfVYQBVafFCfUaCExhiEU1SHdJanCyYlUkx8d9OVVvWiA/L6O+5H608
# l7z1zSLE7R5z5JMB+O/gqImNyKT0C41AP0OkHasCDb78KJu/1nPjqCKpT3SR+Q2w
# ayMvOXa+jPy5t0cNgaJXE0cF0wd8QIcHrYe/AT+qW3AHd9hXcppEaKSyIobjbO4O
# 2Uf0P+fNNxvjokCDERsk72kPmkIyYBaZM6ezSMIc6LoHwjleO0nPPYxKVKsNeotl
# BX89ssDpVlMmLbntUtT4zNZY4CX0aPntMFJxaYBUM1xhdW02FWkOHt5yZXgA376n
# l6B9gGHgU28/QXKIJJH1EQAt4oqG9WzbOYxNQm6xAwsOpv9N5NKDppt8UJLF8gIQ
# WLlJEcLvY3eMtxcGf7Mgxi892+nGPKNWMiDTjgNwdq/drITbdK1oSbt7/qnCFZhU
# NGipYTTUaIlZUICezYDtFFfr1NpYIrHKVEsRLcSjfuOdK+PbLtOjQOs7Mp9whC1J
# lZD8o8eX8os8LfSsVbmDlEhG99mO0An3xydarRekrkKym4G/9uMu3Ag1ujw1Ubzz
# sklJSrvbD8pCAg4781wb42BCCzOwJrWAiARkIIpgbEL0xKFyV4sADotVzc9y8XI0
# B0P2TOMxggJJMIICRQIBATCBpzCBoDELMAkGA1UEBhMCU0sxETAPBgNVBAgTCFNs
# b3Zha2lhMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpMb210ZWMuY29t
# MSswKQYDVQQDEyJMb210ZWMuY29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MScw
# JQYJKoZIhvcNAQkBFhhJbXJpY2guU3pvbGlrQGxvbXRlYy5jb20CAgClMAkGBSsO
# AwIaBQCgeDAYBgorBgEEAYI3AgEMMQowCKACgAChAoAAMBkGCSqGSIb3DQEJAzEM
# BgorBgEEAYI3AgEEMBwGCisGAQQBgjcCAQsxDjAMBgorBgEEAYI3AgEWMCMGCSqG
# SIb3DQEJBDEWBBSxW0ayqv3eTsl7dhOF+UH3WSmhyzANBgkqhkiG9w0BAQEFAASC
# AQC6pl+5n8Pg41MdIml7wYgFzzlKChj6uRC20TSGJXlPyAcOYnUxJ3K1B1aUPsRi
# Gv2OKq3JY6PaaoNagEjCxIGXPVNAD/f29D2pE99sNYqSig0xQcM15bR/zU0EpZZH
# UbAHv6dDM+X/1a78ZPYwfBmxLM+z3VcgBiZto7Eivxx5V18rhKBuAUkD9o3RL4Vp
# EOqXbD9h+A+bkDxBHpa96/HgXTZGp5Ih6kbkb5YWrdjYMN8myPhgFLa/EsUcxLfA
# rlzO9zGRcOJM7B1VhKszGDZqmXWS1p0jKYKRYnUqYFCzpDorx8YuulTli/qL0uuU
# Mc8M+eXHFAWlKJlL4zjLDhWj
# SIG # End signature block