aboutsummaryrefslogblamecommitdiffstatshomepage
path: root/action.yml
blob: 790f2a96447ea507fe75594c98720c5b1787494e (plain) (tree)












































































                                                                                                                             
name: clang-format (w/ diff)
description: clang-format all C/C++ files in the project, and show the diff

inputs:
  version:
    description: clang-format version
    required: false
  style:
    description: clang-format -style parameter value
    required: false
    default: file
  exclude:
    description: ':-separated list of excluded files and directories'
    required: false
outputs:
  diff:
    description: diff between the actual and the formatted code
    value: '${{ steps.run.outputs.diff }}'

runs:
  using: composite
  steps:
    - id: run
      run: |
        New-Variable version -Value '${{ inputs.version }}' -Option Constant
        New-Variable style -Value '${{ inputs.style }}' -Option Constant
        New-Variable exclude -Value '${{ inputs.exclude }}' -Option Constant

        if (Get-Command python3 -ErrorAction SilentlyContinue) {
            $python = @('python3')
        } elseif (Get-Command py -ErrorAction SilentlyContinue) {
            $python = @('py', '-3')
        } elseif (Get-Command python -ErrorAction SilentlyContinue) {
            $python = @('python')
        } else {
            echo @'
        ::error ::
        egor-tensin/clang-format uses a Python script, which requires Python 3.6 or later.
        We couldn't find a Python installation in this environment.
        '@
            exit 1
        }

        $cmake_common_version = 'v3.2'
        $script_name = 'project-clang-format.py'
        $script_path = Join-Path '${{ github.workspace }}' .. $script_name
        $download_url = "https://raw.githubusercontent.com/egor-tensin/cmake-common/$cmake_common_version/tools/$script_name"

        $ProgressPreference = 'SilentlyContinue'
        Invoke-WebRequest $download_url -OutFile $script_path

        $clang_format = 'clang-format'
        if ($version) {
            $clang_format += "-$version"
        }

        $exclude_list = $exclude.Split(':', [System.StringSplitOptions]::RemoveEmptyEntries)
        if ($exclude_list) {
            $exclude_list = ,'--exclude' + $exclude_list
        }

        $exe, $args = $python
        $output = & $exe $args $script_path --clang-format $clang_format --style $style $exclude_list | Out-String

        $output = $output.TrimEnd("`n")
        $output = $output.TrimEnd("`r")
        Write-Output $output

        # If anyone thinks this workaround is anything but complete batshit
        # insanity, they should just fucking kill themselves.
        # https://github.community/t/set-output-truncates-multiline-strings/16852/3
        $output = $output.replace('%', '%25')
        $output = $output.replace("`n", '%0A')
        $output = $output.replace("`r", '%0D')

        Write-Output "::set-output name=diff::$output"
      shell: pwsh