Jacko
Jacko

Reputation: 13195

Need to convert back slashes to forward slashes in github action work flow

In my actions yml file, I set an environment variable pointing to the root directory for my ctest input image files (I run ctest to test an image codec decompressor, and these are the input images).

env:
  DATA_ROOT: ${{github.workspace}}/data

On windows, this is gives me something like c:\Foo\Bar/data, and I would like to convert it to c:/Foo/Bar/data

I can do the conversion in PowerShell:

$temp = ${DATA_ROOT}
$pattern = '[\\]'
$temp = $temp -replace $pattern, '/'

but how do I then reset ${DATA_ROOT} to equal $temp ?

I want subsequent steps to use the new ${DATA_ROOT} .

Upvotes: 5

Views: 3547

Answers (2)

Donovan Baarda
Donovan Baarda

Reputation: 481

Note this is hurting me right now with ${{github.workspace}} using \ path separators on windows, breaking any "run" actions using the bash shell. So this doesn't work;

defaults:
  run:
    shell: bash

jobs:
  build:
    steps:
    - name: Configure CMake
      run: cmake -B ${{github.workspace}}/build 

A workaround is to put single quotes around '${{github.workspace}}/build' which prevents bash from treating the \ path separators as escapes.

Upvotes: 8

Alex Reinking
Alex Reinking

Reputation: 19996

I'm not sure why this is tagged CMake, but you can set environment variables in GitHub Actions by writing a line containing NAME=VALUE to $GITHUB_ENV.

From the GitHub Actions documentation:

echo "{name}={value}" >> $GITHUB_ENV

Creates or updates an environment variable for any actions running next in a job. The action that creates or updates the environment variable does not have access to the new value, but all subsequent actions in a job will have access. Environment variables are case-sensitive and you can include punctuation.

Example

steps:
  - name: Set the value
    id: step_one
    run: |
        echo "action_state=yellow" >> $GITHUB_ENV
  - name: Use the value
    id: step_two
    run: |
        echo "${{ env.action_state }}" # This will output 'yellow'

Multiline strings

For multiline strings, you may use a delimiter with the following syntax.

{name}<<{delimiter}
{value}
{delimiter}

For a CMake solution, if you have a path with potentially mixed slashes, you can use file(TO_CMAKE_PATH)

file(TO_CMAKE_PATH "c:\\Foo\\Bar/data" path)
message(STATUS "path = ${path}")  # prints: path = c:/Foo/Bar/data

Note that this function assumes the incoming path is a native path for the platform on which CMake is running. So on Linux, an input with a drive letter would be invalid (the : would be interpreted as a PATH separator and converted to a ;)

Upvotes: 1

Related Questions