RamblingCookieMonster / BuildHelpers

Helper functions for PowerShell CI/CD scenarios
MIT License
214 stars 47 forks source link

Set-ShieldsIoBadge replaces whole line (until last ')') #131

Open DEberhardt opened 2 years ago

DEberhardt commented 2 years ago

Hello,

first of all, thank you for this, this module helps A LOT - made more progress in the last two weeks learning and understanding the build process, runners, etc. than in the last two years!

I want to utilize Set-ShieldsIoBadge and I have a little table that contains the badges, looks like this:

Component Status

General Documentation - GitHub PowerShell Gallery - TeamsFunctions
Release Release Downloads
Build Build BuildWorkflow Issues
Functions Public Private Live RC BETA ALPHA
Pester Result Passed Failed Skipped NotRun CodeCoverage

after running updates against them, it looks like this:

Component Status

General Documentation - GitHub PowerShell Gallery - TeamsFunctions
Release Release Downloads
Build [Build
Functions Public
Pester Result

Looking into Set-ShieldsIoBadge, I find that the match string is finding too much:

$ReadmeContent = (Get-Content $Path)
$ReadmeContent = $ReadmeContent -replace "!\[$($Subject)\].+\)", "![$($Subject)](https://img.shields.io/badge/$Subject-$Status$Percent-$Color.svg)"
$ReadmeContent | Set-Content -Path $Path

# running this manually to see what matches
❯ $RM =  Get-Content Readme.md
❯ $Subject = "Public"
❯ $RM -match "!\[$($Subject)\].+\)"
| Functions | ![Public](https://img.shields.io/badge/Public-0-blue.svg) ![Private](https://img.shields.io/badge/Private-0-grey.svg) ![Live](https://img.shields.io/badge/Live-0-blue.svg) ![RC](https://img.shields.io/badge/RC-0-green.svg) ![BETA](https://img.shields.io/badge/BETA-3-yellow.svg) ![ALPHA](https://img.shields.io/badge/ALPHA-4-orange.svg)               

It looks like it replaces the whole line until the (last?) ')' rather than the next one found. Playing around with Regex and Lazy operators, but cannot find a suitable match that would reduce the match to the actual.

Is there a way to do this please?

Thank you, David

DEberhardt commented 2 years ago

Found something that could work:

      $ReadmeContent = (Get-Content $Path)
      #$ReadmeContent = $ReadmeContent -replace "!\[$($Subject)\].+\)", "![$($Subject)](https://img.shields.io/badge/$Subject-$Status$Percent-$Color.svg)"
      $Pattern = "!\[$($Subject)\].+?\)"
      $String = "![$($Subject)](https://img.shields.io/badge/$Subject-$Status$Percent-$Color.svg)"

      $ReadmeContent = $ReadmeContent | ForEach-Object { 
        if ( ([regex]::Matches($_, $Pattern).success) ) { $_ -replace $Pattern, $String } else { $_ } 
      }
      $ReadmeContent | Set-Content -Path $Path

for my testing, it did leave the rest alone and just altered the matching string only