Compare commits

..

22 Commits
v5.0.0 ... v3

Author SHA1 Message Date
semantic-release-bot
2daab132aa chore(release): 3.9.0 [skip ci]
# [3.9.0](https://github.com/rlespinasse/github-slug-action/compare/v3.8.0...v3.9.0) (2024-01-28)

### Features

* use node20 as action run mode ([#138](https://github.com/rlespinasse/github-slug-action/issues/138)) ([26c5c6b](26c5c6b51c))
2024-01-28 19:30:34 +00:00
Romain Lespinasse
26c5c6b51c feat: use node20 as action run mode (#138) 2024-01-28 20:25:18 +01:00
semantic-release-bot
4a00c29bc1 chore(release): 3.8.0 [skip ci]
# [3.8.0](https://github.com/rlespinasse/github-slug-action/compare/v3.7.1...v3.8.0) (2023-10-20)

### Features

* use node16 as action run mode ([7bf92d8](7bf92d88ff))
2023-10-20 10:59:54 +00:00
Romain Lespinasse
c0fb0bc1a5 build: update dependencies to fix vulnerabilities 2023-10-20 12:50:55 +02:00
Romain Lespinasse
60beba5b25 build: update dependencies to fix vulnerabilities (#133) 2023-07-19 21:30:03 +02:00
Romain Lespinasse
7bf92d88ff feat: use node16 as action run mode 2023-03-29 08:31:58 +02:00
Romain Lespinasse
ae2f6b069b docs(readme): remove badges
Signed-off-by: Romain Lespinasse <romain.lespinasse@gmail.com>
2023-03-28 20:05:30 +02:00
Romain Lespinasse
7c02e68015 build: fix security vulnerabilities 2023-02-03 16:43:05 +01:00
semantic-release-bot
5150a26d43 chore(release): 3.7.1 [skip ci]
## [3.7.1](https://github.com/rlespinasse/github-slug-action/compare/v3.7.0...v3.7.1) (2022-10-15)

### Bug Fixes

* use environment file to manage outputs ([dedf4ac](dedf4ac5bb))
2022-10-15 18:55:42 +00:00
Romain Lespinasse
dedf4ac5bb fix: use environment file to manage outputs
use @actions/core v1.10.0
so setOutput uses the new GITHUB_OUTPUT environment file
2022-10-15 20:54:46 +02:00
semantic-release-bot
ebfc49c0e9 chore(release): 3.7.0 [skip ci]
# [3.7.0](https://github.com/rlespinasse/github-slug-action/compare/v3.6.1...v3.7.0) (2022-10-02)

### Features

* generate proper git tag ([68babf6](68babf69b3))
2022-10-02 19:53:01 +00:00
Romain Lespinasse
68babf69b3 feat: generate proper git tag 2022-10-02 21:52:10 +02:00
semantic-release-bot
1bf76b7bc6 chore(release): 3.6.1 [skip ci]
## [3.6.1](https://github.com/rlespinasse/github-slug-action/compare/3.6.0...3.6.1) (2022-08-22)

### Bug Fixes

* remove trailing hyphens if any after cut ([19f9c84](19f9c84ac6))
2022-08-22 21:11:18 +00:00
rlespinasse
46a738e36b ci: use checkout v3 2022-08-22 23:07:07 +02:00
Romain Lespinasse
82da1fd43c ci(release): use github token 2022-08-22 23:02:40 +02:00
rlespinasse
99afdf4551 ci: use semantic release action v3 2022-08-22 22:58:21 +02:00
rlespinasse
944fee4603 ci: remove release dry-run 2022-06-16 22:26:11 +02:00
rlespinasse
19f9c84ac6 fix: remove trailing hyphens if any after cut 2022-06-16 22:26:11 +02:00
rlespinasse
596b602d8a docs(README): improve the overwrite troubleshooting section 2022-04-16 19:25:35 +02:00
Romain Lespinasse
b98d94bda3 ci: remove unused workflow 2022-04-07 20:50:05 +02:00
Romain Lespinasse
e8c1f6060b ci: rename workflows used on v3 only 2022-04-07 20:49:21 +02:00
Romain Lespinasse
f80aa0fae4 tests: add more test cases on v3 around underscore 2022-04-07 20:35:46 +02:00
46 changed files with 18980 additions and 988 deletions

6
.dependabot/config.xml Normal file
View File

@@ -0,0 +1,6 @@
version: 2
updates:
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "daily"

3
.eslintignore Normal file
View File

@@ -0,0 +1,3 @@
dist/
lib/
node_modules/

54
.eslintrc.json Normal file
View File

@@ -0,0 +1,54 @@
{
"plugins": ["jest", "@typescript-eslint"],
"extends": ["plugin:github/recommended"],
"parser": "@typescript-eslint/parser",
"parserOptions": {
"ecmaVersion": 9,
"sourceType": "module",
"project": "./tsconfig.json"
},
"rules": {
"eslint-comments/no-use": "off",
"import/no-namespace": "off",
"no-unused-vars": "off",
"@typescript-eslint/no-unused-vars": "error",
"@typescript-eslint/explicit-member-accessibility": ["error", {"accessibility": "no-public"}],
"@typescript-eslint/no-require-imports": "error",
"@typescript-eslint/array-type": "error",
"@typescript-eslint/await-thenable": "error",
"@typescript-eslint/ban-ts-comment": "error",
"camelcase": "off",
"@typescript-eslint/consistent-type-assertions": "error",
"@typescript-eslint/explicit-function-return-type": ["error", {"allowExpressions": true}],
"@typescript-eslint/func-call-spacing": ["error", "never"],
"@typescript-eslint/no-array-constructor": "error",
"@typescript-eslint/no-empty-interface": "error",
"@typescript-eslint/no-explicit-any": "error",
"@typescript-eslint/no-extraneous-class": "error",
"@typescript-eslint/no-for-in-array": "error",
"@typescript-eslint/no-inferrable-types": "error",
"@typescript-eslint/no-misused-new": "error",
"@typescript-eslint/no-namespace": "error",
"@typescript-eslint/no-non-null-assertion": "warn",
"@typescript-eslint/no-unnecessary-qualifier": "error",
"@typescript-eslint/no-unnecessary-type-assertion": "error",
"@typescript-eslint/no-useless-constructor": "error",
"@typescript-eslint/no-var-requires": "error",
"@typescript-eslint/prefer-for-of": "warn",
"@typescript-eslint/prefer-function-type": "warn",
"@typescript-eslint/prefer-includes": "error",
"@typescript-eslint/prefer-string-starts-ends-with": "error",
"@typescript-eslint/promise-function-async": "error",
"@typescript-eslint/require-array-sort-compare": "error",
"@typescript-eslint/restrict-plus-operands": "error",
"semi": "off",
"@typescript-eslint/semi": ["error", "never"],
"@typescript-eslint/type-annotation-spacing": "error",
"@typescript-eslint/unbound-method": "error"
},
"env": {
"node": true,
"es6": true,
"jest/globals": true
}
}

View File

@@ -1,27 +0,0 @@
version: 2
updates:
- package-ecosystem: "github-actions"
directory: "/.github/"
schedule:
interval: "weekly"
groups:
dependencies:
patterns:
- "*"
reviewers:
- "rlespinasse"
labels: [ ]
- package-ecosystem: "github-actions"
directory: "/"
commit-message:
prefix: "feat: "
schedule:
interval: "weekly"
groups:
dependencies:
patterns:
- "rlespinasse/slugify-value"
- "rlespinasse/shortify-git-revision"
reviewers:
- "rlespinasse"
labels: [ ]

31
.github/workflows/codeql-analysis.yml vendored Normal file
View File

@@ -0,0 +1,31 @@
name: '[v3] CodeQL'
on:
push:
branches:
- v3.x
pull_request:
branches:
- v3.x
schedule:
- cron: '0 6 * * 1'
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
analyse:
name: analyze
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
language: ['javascript']
steps:
- uses: actions/checkout@v3
- uses: github/codeql-action/init@v2
with:
languages: ${{ matrix.language }}
- uses: github/codeql-action/autobuild@v2
- uses: github/codeql-action/analyze@v2

74
.github/workflows/github-slug.yml vendored Normal file
View File

@@ -0,0 +1,74 @@
name: '[v3] Testing'
on: [push]
jobs:
github-slug-on-os:
strategy:
fail-fast: false
matrix:
os: [macos-latest, ubuntu-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- name: Checkout
uses: actions/checkout@v3
- run: npm install
shell: bash
- run: npm run all
shell: bash
- uses: ./
- name: Partial variables
run: |
echo "repository owner : ${{ env.GITHUB_REPOSITORY_OWNER_PART }}"
echo "repository name : ${{ env.GITHUB_REPOSITORY_NAME_PART }}"
shell: bash
- name: Slug variables
run: |
echo "repository : ${{ env.GITHUB_REPOSITORY_SLUG }}"
echo "repository owner : ${{ env.GITHUB_REPOSITORY_OWNER_PART_SLUG }}"
echo "repository name : ${{ env.GITHUB_REPOSITORY_NAME_PART_SLUG }}"
echo "ref : ${{ env.GITHUB_REF_SLUG }}"
echo "head ref : ${{ env.GITHUB_HEAD_REF_SLUG }}"
echo "base ref : ${{ env.GITHUB_BASE_REF_SLUG }}"
echo "event ref : ${{ env.GITHUB_EVENT_REF_SLUG }}"
- name: Slug variables (Case Sensitive)
run: |
echo "repository : ${{ env.GITHUB_REPOSITORY_SLUG_CS }}"
echo "repository owner : ${{ env.GITHUB_REPOSITORY_OWNER_PART_SLUG_CS }}"
echo "repository name : ${{ env.GITHUB_REPOSITORY_NAME_PART_SLUG_CS }}"
echo "ref : ${{ env.GITHUB_REF_SLUG_CS }}"
echo "head ref : ${{ env.GITHUB_HEAD_REF_SLUG_CS }}"
echo "base ref : ${{ env.GITHUB_BASE_REF_SLUG_CS }}"
echo "event ref : ${{ env.GITHUB_EVENT_REF_SLUG_CS }}"
shell: bash
- name: Slug URL variables
run: |
echo "repository : ${{ env.GITHUB_REPOSITORY_SLUG_URL }}"
echo "repository owner : ${{ env.GITHUB_REPOSITORY_OWNER_PART_SLUG_URL }}"
echo "repository name : ${{ env.GITHUB_REPOSITORY_NAME_PART_SLUG_URL }}"
echo "ref : ${{ env.GITHUB_REF_SLUG_URL }}"
echo "head ref : ${{ env.GITHUB_HEAD_REF_SLUG_URL }}"
echo "base ref : ${{ env.GITHUB_BASE_REF_SLUG_URL }}"
echo "event ref : ${{ env.GITHUB_EVENT_REF_SLUG_URL }}"
shell: bash
- name: Slug URL variables (Case Sensitive)
run: |
echo "repository : ${{ env.GITHUB_REPOSITORY_SLUG_URL_CS }}"
echo "repository owner : ${{ env.GITHUB_REPOSITORY_OWNER_PART_SLUG_URL_CS }}"
echo "repository name : ${{ env.GITHUB_REPOSITORY_NAME_PART_SLUG_URL_CS }}"
echo "ref : ${{ env.GITHUB_REF_SLUG_URL_CS }}"
echo "head ref : ${{ env.GITHUB_HEAD_REF_SLUG_URL_CS }}"
echo "base ref : ${{ env.GITHUB_BASE_REF_SLUG_URL_CS }}"
echo "event ref : ${{ env.GITHUB_EVENT_REF_SLUG_URL_CS }}"
shell: bash
- name: Ref Name
run: |
echo "raw : ${{ env.GITHUB_REF_NAME }}"
echo "slug : ${{ env.GITHUB_REF_NAME_SLUG }}"
echo "slug url : ${{ env.GITHUB_REF_NAME_SLUG_URL }}"
echo "slug (Case Sensitive) : ${{ env.GITHUB_REF_NAME_SLUG_CS }}"
echo "slug url (Case Sensitive) : ${{ env.GITHUB_REF_NAME_SLUG_URL_CS }}"
shell: bash
- name: Short SHA variables
run: |
echo "sha : ${{ env.GITHUB_SHA_SHORT }}"
echo "pull request sha : ${{ env.GITHUB_EVENT_PULL_REQUEST_HEAD_SHA_SHORT }}"
shell: bash

View File

@@ -1,32 +0,0 @@
---
name: Lint Code Base
on: pull_request
permissions: read-all
jobs:
build:
name: Lint Code Base
runs-on: ubuntu-latest
permissions:
contents: read
packages: read
statuses: write
steps:
- name: Checkout Code
uses: actions/checkout@v4
with:
# Full git history is needed to get a proper
# list of changed files within `super-linter`
fetch-depth: 0
- name: Lint Code Base
uses: github/super-linter@v7
env:
VALIDATE_ALL_CODEBASE: false
VALIDATE_JSCPD: false
VALIDATE_JSON_PRETTIER: false
VALIDATE_MARKDOWN_PRETTIER: false
DEFAULT_BRANCH: v5.x
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

29
.github/workflows/release-dryrun.yml vendored Normal file
View File

@@ -0,0 +1,29 @@
name: '[v3] Release DryRun'
on:
push:
branches-ignore:
- v*.x
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
jobs:
release-dryrun:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- run: npm install
shell: bash
- run: npm run all
shell: bash
- uses: ./
- uses: cycjimmy/semantic-release-action@v3
with:
branches: |
[
"${{ env.GITHUB_REF_NAME }}"
]
dry_run: true
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

22
.github/workflows/release.yml vendored Normal file
View File

@@ -0,0 +1,22 @@
name: '[v3] Release'
on:
push:
branches:
- v*.x
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
jobs:
release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- run: npm install
shell: bash
- run: npm run all
shell: bash
- uses: cycjimmy/semantic-release-action@v3
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

View File

@@ -1,402 +0,0 @@
name: "[v5] Test and Release"
on: [push, pull_request]
permissions: read-all
jobs:
check-v4-compatibility:
name: "Check v4 compatibility"
strategy:
fail-fast: false
matrix:
os: [macos-latest, ubuntu-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Load this action from HEAD
uses: ./
- name: Load using v4
uses: rlespinasse/github-slug-action@v4
with:
prefix: V4_
- name: Validate // Partial variables
run: |
[[ "${{ env.GITHUB_REPOSITORY_OWNER_PART }}" == "${{ env.V4_GITHUB_REPOSITORY_OWNER_PART }}" ]]
[[ "${{ env.GITHUB_REPOSITORY_NAME_PART }}" == "${{ env.V4_GITHUB_REPOSITORY_NAME_PART }}" ]]
shell: bash
- name: Validate // Slug variables
run: |
[[ "${{ env.GITHUB_REPOSITORY_SLUG }}" == "${{ env.V4_GITHUB_REPOSITORY_SLUG }}" ]]
[[ "${{ env.GITHUB_REPOSITORY_OWNER_PART_SLUG }}" == "${{ env.V4_GITHUB_REPOSITORY_OWNER_PART_SLUG }}" ]]
[[ "${{ env.GITHUB_REPOSITORY_NAME_PART_SLUG }}" == "${{ env.V4_GITHUB_REPOSITORY_NAME_PART_SLUG }}" ]]
[[ "${{ env.GITHUB_REF_SLUG }}" == "${{ env.V4_GITHUB_REF_SLUG }}" ]]
[[ "${{ env.GITHUB_HEAD_REF_SLUG }}" == "${{ env.V4_GITHUB_HEAD_REF_SLUG }}" ]]
[[ "${{ env.GITHUB_BASE_REF_SLUG }}" == "${{ env.V4_GITHUB_BASE_REF_SLUG }}" ]]
[[ "${{ env.GITHUB_EVENT_REF_SLUG }}" == "${{ env.V4_GITHUB_EVENT_REF_SLUG }}" ]]
shell: bash
- name: Validate // Slug variables (Case Sensitive)
run: |
[[ "${{ env.GITHUB_REPOSITORY_SLUG_CS }}" == "${{ env.V4_GITHUB_REPOSITORY_SLUG_CS }}" ]]
[[ "${{ env.GITHUB_REPOSITORY_OWNER_PART_SLUG_CS }}" == "${{ env.V4_GITHUB_REPOSITORY_OWNER_PART_SLUG_CS }}" ]]
[[ "${{ env.GITHUB_REPOSITORY_NAME_PART_SLUG_CS }}" == "${{ env.V4_GITHUB_REPOSITORY_NAME_PART_SLUG_CS }}" ]]
[[ "${{ env.GITHUB_REF_SLUG_CS }}" == "${{ env.V4_GITHUB_REF_SLUG_CS }}" ]]
[[ "${{ env.GITHUB_HEAD_REF_SLUG_CS }}" == "${{ env.V4_GITHUB_HEAD_REF_SLUG_CS }}" ]]
[[ "${{ env.GITHUB_BASE_REF_SLUG_CS }}" == "${{ env.V4_GITHUB_BASE_REF_SLUG_CS }}" ]]
[[ "${{ env.GITHUB_EVENT_REF_SLUG_CS }}" == "${{ env.V4_GITHUB_EVENT_REF_SLUG_CS }}" ]]
shell: bash
- name: Validate // Slug URL variables
run: |
[[ "${{ env.GITHUB_REPOSITORY_SLUG_URL }}" == "${{ env.V4_GITHUB_REPOSITORY_SLUG_URL }}" ]]
[[ "${{ env.GITHUB_REPOSITORY_OWNER_PART_SLUG_URL }}" == "${{ env.V4_GITHUB_REPOSITORY_OWNER_PART_SLUG_URL }}" ]]
[[ "${{ env.GITHUB_REPOSITORY_NAME_PART_SLUG_URL }}" == "${{ env.V4_GITHUB_REPOSITORY_NAME_PART_SLUG_URL }}" ]]
[[ "${{ env.GITHUB_REF_SLUG_URL }}" == "${{ env.V4_GITHUB_REF_SLUG_URL }}" ]]
[[ "${{ env.GITHUB_HEAD_REF_SLUG_URL }}" == "${{ env.V4_GITHUB_HEAD_REF_SLUG_URL }}" ]]
[[ "${{ env.GITHUB_BASE_REF_SLUG_URL }}" == "${{ env.V4_GITHUB_BASE_REF_SLUG_URL }}" ]]
[[ "${{ env.GITHUB_EVENT_REF_SLUG_URL }}" == "${{ env.V4_GITHUB_EVENT_REF_SLUG_URL }}" ]]
shell: bash
- name: Validate // Slug URL variables (Case Sensitive)
run: |
[[ "${{ env.GITHUB_REPOSITORY_SLUG_URL_CS }}" == "${{ env.V4_GITHUB_REPOSITORY_SLUG_URL_CS }}" ]]
[[ "${{ env.GITHUB_REPOSITORY_OWNER_PART_SLUG_URL_CS }}" == "${{ env.V4_GITHUB_REPOSITORY_OWNER_PART_SLUG_URL_CS }}" ]]
[[ "${{ env.GITHUB_REPOSITORY_NAME_PART_SLUG_URL_CS }}" == "${{ env.V4_GITHUB_REPOSITORY_NAME_PART_SLUG_URL_CS }}" ]]
[[ "${{ env.GITHUB_REF_SLUG_URL_CS }}" == "${{ env.V4_GITHUB_REF_SLUG_URL_CS }}" ]]
[[ "${{ env.GITHUB_HEAD_REF_SLUG_URL_CS }}" == "${{ env.V4_GITHUB_HEAD_REF_SLUG_URL_CS }}" ]]
[[ "${{ env.GITHUB_BASE_REF_SLUG_URL_CS }}" == "${{ env.V4_GITHUB_BASE_REF_SLUG_URL_CS }}" ]]
[[ "${{ env.GITHUB_EVENT_REF_SLUG_URL_CS }}" == "${{ env.V4_GITHUB_EVENT_REF_SLUG_URL_CS }}" ]]
shell: bash
- name: Validate // Ref Point
run: |
[[ "${{ env.GITHUB_REF_POINT }}" == "${{ env.V4_GITHUB_REF_NAME }}" ]]
[[ "${{ env.GITHUB_REF_POINT_SLUG }}" == "${{ env.V4_GITHUB_REF_NAME_SLUG }}" ]]
[[ "${{ env.GITHUB_REF_POINT_SLUG_URL }}" == "${{ env.V4_GITHUB_REF_NAME_SLUG_URL }}" ]]
[[ "${{ env.GITHUB_REF_POINT_SLUG_CS }}" == "${{ env.V4_GITHUB_REF_NAME_SLUG_CS }}" ]]
[[ "${{ env.GITHUB_REF_POINT_SLUG_URL_CS }}" == "${{ env.V4_GITHUB_REF_NAME_SLUG_URL_CS }}" ]]
shell: bash
- name: Validate // Short SHA variables
run: |
[[ "${{ env.GITHUB_SHA_SHORT }}" == "${{ env.V4_GITHUB_SHA_SHORT }}" ]]
[[ "${{ env.GITHUB_EVENT_PULL_REQUEST_HEAD_SHA_SHORT }}" == "${{ env.V4_GITHUB_EVENT_PULL_REQUEST_HEAD_SHA_SHORT }}" ]]
shell: bash
check-v4-compatibility-without-checkout:
name: "Check v4 compatibility (without checkout)"
needs:
- check-v4-compatibility
strategy:
fail-fast: false
matrix:
os: [macos-latest, ubuntu-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- name: Checkout
uses: actions/checkout@v4
with:
path: this-action
ref: ${{ github.ref }}
- name: Load this action from HEAD
uses: ./this-action
- name: Load using v4
uses: rlespinasse/github-slug-action@v4
with:
prefix: V4_
- name: Validate // Short SHA variables
run: |
[[ "${{ env.GITHUB_SHA_SHORT }}" == "${{ env.V4_GITHUB_SHA_SHORT }}" ]]
[[ "${{ env.GITHUB_EVENT_PULL_REQUEST_HEAD_SHA_SHORT }}" == "${{ env.V4_GITHUB_EVENT_PULL_REQUEST_HEAD_SHA_SHORT }}" ]]
shell: bash
display:
name: "Display produced variables"
strategy:
fail-fast: false
matrix:
os: [macos-latest, ubuntu-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Load this action from HEAD
uses: ./
- name: Partial variables
run: |
echo "repository owner : ${{ env.GITHUB_REPOSITORY_OWNER_PART }}"
echo "repository name : ${{ env.GITHUB_REPOSITORY_NAME_PART }}"
shell: bash
- name: Slug variables
run: |
echo "repository : ${{ env.GITHUB_REPOSITORY_SLUG }}"
echo "repository owner : ${{ env.GITHUB_REPOSITORY_OWNER_PART_SLUG }}"
echo "repository name : ${{ env.GITHUB_REPOSITORY_NAME_PART_SLUG }}"
echo "ref : ${{ env.GITHUB_REF_SLUG }}"
echo "ref name : ${{ env.GITHUB_REF_NAME_SLUG }}"
echo "head ref : ${{ env.GITHUB_HEAD_REF_SLUG }}"
echo "base ref : ${{ env.GITHUB_BASE_REF_SLUG }}"
echo "event ref : ${{ env.GITHUB_EVENT_REF_SLUG }}"
shell: bash
- name: Slug variables (Case Sensitive)
run: |
echo "repository : ${{ env.GITHUB_REPOSITORY_SLUG_CS }}"
echo "repository owner : ${{ env.GITHUB_REPOSITORY_OWNER_PART_SLUG_CS }}"
echo "repository name : ${{ env.GITHUB_REPOSITORY_NAME_PART_SLUG_CS }}"
echo "ref : ${{ env.GITHUB_REF_SLUG_CS }}"
echo "ref name : ${{ env.GITHUB_REF_NAME_SLUG_CS }}"
echo "head ref : ${{ env.GITHUB_HEAD_REF_SLUG_CS }}"
echo "base ref : ${{ env.GITHUB_BASE_REF_SLUG_CS }}"
echo "event ref : ${{ env.GITHUB_EVENT_REF_SLUG_CS }}"
shell: bash
- name: Slug URL variables
run: |
echo "repository : ${{ env.GITHUB_REPOSITORY_SLUG_URL }}"
echo "repository owner : ${{ env.GITHUB_REPOSITORY_OWNER_PART_SLUG_URL }}"
echo "repository name : ${{ env.GITHUB_REPOSITORY_NAME_PART_SLUG_URL }}"
echo "ref : ${{ env.GITHUB_REF_SLUG_URL }}"
echo "ref name : ${{ env.GITHUB_REF_NAME_SLUG_URL }}"
echo "head ref : ${{ env.GITHUB_HEAD_REF_SLUG_URL }}"
echo "base ref : ${{ env.GITHUB_BASE_REF_SLUG_URL }}"
echo "event ref : ${{ env.GITHUB_EVENT_REF_SLUG_URL }}"
shell: bash
- name: Slug URL variables (Case Sensitive)
run: |
echo "repository : ${{ env.GITHUB_REPOSITORY_SLUG_URL_CS }}"
echo "repository owner : ${{ env.GITHUB_REPOSITORY_OWNER_PART_SLUG_URL_CS }}"
echo "repository name : ${{ env.GITHUB_REPOSITORY_NAME_PART_SLUG_URL_CS }}"
echo "ref : ${{ env.GITHUB_REF_SLUG_URL_CS }}"
echo "ref name : ${{ env.GITHUB_REF_NAME_SLUG_URL_CS }}"
echo "head ref : ${{ env.GITHUB_HEAD_REF_SLUG_URL_CS }}"
echo "base ref : ${{ env.GITHUB_BASE_REF_SLUG_URL_CS }}"
echo "event ref : ${{ env.GITHUB_EVENT_REF_SLUG_URL_CS }}"
shell: bash
- name: Ref Point
run: |
echo "raw : ${{ env.GITHUB_REF_POINT }}"
echo "slug : ${{ env.GITHUB_REF_POINT_SLUG }}"
echo "slug url : ${{ env.GITHUB_REF_POINT_SLUG_URL }}"
echo "slug (Case Sensitive) : ${{ env.GITHUB_REF_POINT_SLUG_CS }}"
echo "slug url (Case Sensitive) : ${{ env.GITHUB_REF_POINT_SLUG_URL_CS }}"
shell: bash
- name: Short SHA variables
run: |
echo "sha : ${{ env.GITHUB_SHA_SHORT }}"
echo "pull request sha : ${{ env.GITHUB_EVENT_PULL_REQUEST_HEAD_SHA_SHORT }}"
shell: bash
display-without-checkout:
name: "Display produced variables (without checkout)"
needs:
- display
strategy:
fail-fast: false
matrix:
os: [macos-latest, ubuntu-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- name: Checkout
uses: actions/checkout@v4
with:
path: this-action
ref: ${{ github.ref }}
- name: Load this action from HEAD
uses: ./this-action
- name: Short SHA variables
run: |
echo "sha : ${{ env.GITHUB_SHA_SHORT }}"
echo "pull request sha : ${{ env.GITHUB_EVENT_PULL_REQUEST_HEAD_SHA_SHORT }}"
shell: bash
input-short-length:
name: "Input 'short-length'"
strategy:
fail-fast: false
matrix:
os: [macos-latest, ubuntu-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- name: Checkout
uses: actions/checkout@v4
# Test 1
- name: Using correct short length
uses: ./
with:
prefix: "CSL_"
short-length: 4
- name: Using correct length // Validate that all short variables lengths are equals to short-length
run: |
env | grep "CSL_" | grep "_SHORT" | cut -d"=" -f2 | while read -r value; do [ "${#value}" -le 5 ] ; done
shell: bash
# Test 2
- name: Using wrong short length
id: using-wrong-short-length
uses: ./
with:
prefix: "WSL_"
short-length: "wrong"
continue-on-error: true
- name: Using wrong short length // Validate that the action end with an error
run: |
[[ "$(env | grep "WSL_" | grep "_SHORT" -c)" -eq 0 ]]
[[ "${{ steps.using-wrong-short-length.outcome }}" == "failure" ]]
[[ "${{ steps.using-wrong-short-length.conclusion }}" == "success" ]]
shell: bash
input-short-length-without-checkout:
name: "Input 'short-length' (without checkout)"
needs:
- input-short-length
strategy:
fail-fast: false
matrix:
os: [macos-latest, ubuntu-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- name: Checkout
uses: actions/checkout@v4
with:
path: this-action
ref: ${{ github.ref }}
# Test 1
- name: Using correct short length
uses: ./this-action
with:
prefix: "CSL_"
short-length: 4
- name: Using correct length // Validate that all short variables lengths are equals to short-length
run: |
env | grep "CSL_" | grep "_SHORT" | cut -d"=" -f2 | while read -r value; do [ "${#value}" -le 5 ] ; done
shell: bash
# Test 2
- name: Using empty short length
id: using-empty-short-length
uses: ./this-action
with:
prefix: "ESL_"
continue-on-error: true
- name: Using empty short length // Validate that the action don't end with an error
run: |
[[ "$(env | grep "ESL_" | grep "_SHORT" -c)" -gt 0 ]]
[[ "${{ steps.using-empty-short-length.outcome }}" == "success" ]]
[[ "${{ steps.using-empty-short-length.conclusion }}" == "success" ]]
shell: bash
# Test 3
- name: Using wrong short length
id: using-wrong-short-length
uses: ./this-action
with:
prefix: "WSL_"
short-length: "wrong"
continue-on-error: true
- name: Using wrong short length // Validate that the action end with an error
run: |
[[ "$(env | grep "WSL_" | grep "_SHORT" -c)" -eq 0 ]]
[[ "${{ steps.using-wrong-short-length.outcome }}" == "failure" ]]
[[ "${{ steps.using-wrong-short-length.conclusion }}" == "success" ]]
shell: bash
input-slug-maxlength:
name: "Input 'slug-maxlength'"
strategy:
fail-fast: false
matrix:
os: [macos-latest, ubuntu-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- name: Checkout
uses: actions/checkout@v4
# Test 1
- name: Using correct slug max length
uses: ./
with:
prefix: "CML_"
slug-maxlength: 1
- name: Using correct max length // Validate that all slug variables lengths are equals or under the slug-maxlength
run: |
env | grep "CML_" | grep "_SLUG" | cut -d"=" -f2 | while read -r value; do [ "${#value}" -le 2 ] ; done
shell: bash
# Test 2
- name: Using wrong slug max length
id: using-wrong-slug-max-length
uses: ./
with:
prefix: "WML_"
slug-maxlength: "wrong"
continue-on-error: true
- name: Using wrong slug max length // Validate that the action end with an error
run: |
[[ "$(env | grep "WML_" | grep "_SLUG" -c)" -eq 0 ]]
[[ "${{ steps.using-wrong-slug-max-length.outcome }}" == "failure" ]]
[[ "${{ steps.using-wrong-slug-max-length.conclusion }}" == "success" ]]
shell: bash
# Test 3
- name: Using empty slug max length
id: using-empty-slug-max-length
uses: ./
with:
prefix: "EML_"
slug-maxlength: ""
continue-on-error: true
- name: Using empty slug max length // Validate that the action end with an error
run: |
[[ "$(env | grep "EML_" | grep "_SLUG" -c)" -eq 0 ]]
[[ "${{ steps.using-empty-slug-max-length.outcome }}" == "failure" ]]
[[ "${{ steps.using-empty-slug-max-length.conclusion }}" == "success" ]]
shell: bash
# Test 4
- name: Using no limit on slug max length
id: using-nolimit-slug-max-length
uses: ./
with:
prefix: "NLML_"
slug-maxlength: "nolimit"
- name: Using no limit on slug max length // Validate that the action end with an error
run: |
[[ "$(env | grep "NLML_" | grep "_SLUG" -c)" -gt 0 ]]
[[ "${{ steps.using-nolimit-slug-max-length.outcome }}" == "success" ]]
[[ "${{ steps.using-nolimit-slug-max-length.conclusion }}" == "success" ]]
shell: bash
release:
runs-on: ubuntu-latest
permissions:
contents: write
issues: write
id-token: write
packages: write
concurrency:
group: release-${{ github.ref }}-${{ github.event_name }}
needs:
- display-without-checkout
- input-short-length-without-checkout
- input-slug-maxlength
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Release this GitHub Action
uses: rlespinasse/release-that@v1
with:
github-token: ${{ secrets.GH_TOKEN }}

99
.gitignore vendored Normal file
View File

@@ -0,0 +1,99 @@
# Dependency directory
node_modules
# Rest pulled from https://github.com/github/gitignore/blob/master/Node.gitignore
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
lerna-debug.log*
# Diagnostic reports (https://nodejs.org/api/report.html)
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
*.lcov
# nyc test coverage
.nyc_output
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# Bower dependency directory (https://bower.io/)
bower_components
# node-waf configuration
.lock-wscript
# Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release
# Dependency directories
jspm_packages/
# TypeScript v1 declaration files
typings/
# TypeScript cache
*.tsbuildinfo
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
*.tgz
# Yarn Integrity file
.yarn-integrity
# dotenv environment variables file
.env
.env.test
# parcel-bundler cache (https://parceljs.org/)
.cache
# next.js build output
.next
# nuxt.js build output
.nuxt
# vuepress build output
.vuepress/dist
# Serverless directories
.serverless/
# FuseBox cache
.fusebox/
# DynamoDB Local files
.dynamodb/
# OS metadata
.DS_Store
Thumbs.db
# Ignore built ts files
__tests__/runner/*
lib/**/*

3
.prettierignore Normal file
View File

@@ -0,0 +1,3 @@
dist/
lib/
node_modules/

10
.prettierrc.json Normal file
View File

@@ -0,0 +1,10 @@
{
"printWidth": 80,
"tabWidth": 2,
"useTabs": false,
"semi": false,
"singleQuote": true,
"trailingComma": "none",
"bracketSpacing": false,
"arrowParens": "avoid"
}

114
CHANGELOG.md Normal file
View File

@@ -0,0 +1,114 @@
# [3.9.0](https://github.com/rlespinasse/github-slug-action/compare/v3.8.0...v3.9.0) (2024-01-28)
### Features
* use node20 as action run mode ([#138](https://github.com/rlespinasse/github-slug-action/issues/138)) ([26c5c6b](https://github.com/rlespinasse/github-slug-action/commit/26c5c6b51cfc01c811f8a14ddd9d9bcb43948328))
# [3.8.0](https://github.com/rlespinasse/github-slug-action/compare/v3.7.1...v3.8.0) (2023-10-20)
### Features
* use node16 as action run mode ([7bf92d8](https://github.com/rlespinasse/github-slug-action/commit/7bf92d88ffb302024ab1f11ced51360f041f1b5e))
## [3.7.1](https://github.com/rlespinasse/github-slug-action/compare/v3.7.0...v3.7.1) (2022-10-15)
### Bug Fixes
* use environment file to manage outputs ([dedf4ac](https://github.com/rlespinasse/github-slug-action/commit/dedf4ac5bbb50aeb6992c8323d2862843079f1b4))
# [3.7.0](https://github.com/rlespinasse/github-slug-action/compare/v3.6.1...v3.7.0) (2022-10-02)
### Features
* generate proper git tag ([68babf6](https://github.com/rlespinasse/github-slug-action/commit/68babf69b34f4c4b556ea350616c5408d627937e))
## [3.6.1](https://github.com/rlespinasse/github-slug-action/compare/3.6.0...3.6.1) (2022-08-22)
### Bug Fixes
* remove trailing hyphens if any after cut ([19f9c84](https://github.com/rlespinasse/github-slug-action/commit/19f9c84ac61b17071a3cfc4ae984ac0e2ba1cdae))
# [3.6.0](http://github.com/rlespinasse/github-slug-action/compare/3.5.1...3.6.0) (2021-09-15)
### Features
* add GITHUB_REF_NAME env var ([12a7510](http://github.com/rlespinasse/github-slug-action/commit/12a75106304d45442301df66d3ba38e1ac002649))
## [3.5.1](http://github.com/rlespinasse/github-slug-action/compare/3.5.0...3.5.1) (2021-03-31)
### Bug Fixes
* update dist files ([e6c550f](http://github.com/rlespinasse/github-slug-action/commit/e6c550f88ccca52a82675b89186b6b72864f087c))
# [3.5.0](http://github.com/rlespinasse/github-slug-action/compare/3.4.0...3.5.0) (2021-03-30)
### Features
* allow underscore in slug values ([475d293](http://github.com/rlespinasse/github-slug-action/commit/475d293680b998a3315846828329f05bfff4ac9c))
# [3.4.0](http://github.com/rlespinasse/github-slug-action/compare/3.3.0...3.4.0) (2021-03-02)
### Features
* add _CS suffix to keep value case-sensitive ([6c93fcb](http://github.com/rlespinasse/github-slug-action/commit/6c93fcbf53da9c6415bd7f5e37579b488f34339e))
# [3.3.0](http://github.com/rlespinasse/github-slug-action/compare/3.2.0...3.3.0) (2021-01-25)
### Bug Fixes
* support pull-request for slug and slug url ([78985f8](http://github.com/rlespinasse/github-slug-action/commit/78985f84eca97ef1c5262e85e8a73a277494c4ed))
### Features
* support partial GITHUB_REPOSITORY ([75ce03b](http://github.com/rlespinasse/github-slug-action/commit/75ce03b6a055a3be9d936a3a99c51038bd72298c))
# [3.2.0](http://github.com/rlespinasse/github-slug-action/compare/3.1.0...3.2.0) (2021-01-12)
### Features
* expose GITHUB_EVENT_PULL_REQUEST_HEAD_SHA_SHORT ([5b9fe60](http://github.com/rlespinasse/github-slug-action/commit/5b9fe6015d2facc71c81d53bf3b08f04e0f3f743))
# [3.1.0](http://github.com/rlespinasse/github-slug-action/compare/3.0.0...3.1.0) (2020-11-01)
### Features
* **action:** improve marketplace information ([3cddc4f](http://github.com/rlespinasse/github-slug-action/commit/3cddc4f12d7a6fdbb8b1221dc02a2c64670e54bf))
# [3.0.0](http://github.com/rlespinasse/github-slug-action/compare/2.1.0...3.0.0) (2020-10-26)
### Bug Fixes
* upgrade actions core due to CVE fix ([d0549c1](http://github.com/rlespinasse/github-slug-action/commit/d0549c1f85ab9567b439f9d660b01ce1142b9fbe))
### Features
* add support for windows and macos jobs ([13c2f38](http://github.com/rlespinasse/github-slug-action/commit/13c2f38dad5f32529f37c25736412b1e4cf687fe))
### BREAKING CHANGES
* The action implementation move from container action to node.js action
Co-authored-by: Romain Lespinasse <romain.lespinasse@gmail.com>
# [2.1.0](http://github.com/rlespinasse/github-slug-action/compare/2.0.0...2.1.0) (2020-07-28)
### Features
* expose slug variables for github.event.ref ([5a334a8](http://github.com/rlespinasse/github-slug-action/commit/5a334a8573fc27451af5b2a6ee175d8e11579e10))

View File

@@ -18,7 +18,7 @@ Include the relevant issue number if applicable.
## Do you intend to add a new feature or change an existing one ## Do you intend to add a new feature or change an existing one
* Suggest your change by [opening a 'Feature request' issue][5] * Suggest your change by [opening a 'Feature request' issue][5] and start writing code (following the [developers guide](DEVELOPERS.md))
## Do you have questions about the source code ## Do you have questions about the source code

38
DEVELOPERS.md Normal file
View File

@@ -0,0 +1,38 @@
# Developers guide
## Prepare
Install the dependencies
```bash
npm install
```
## Develop
Build the typescript and package it for distribution
```bash
npm run build && npm run package
```
Run the tests
```bash
$ npm test
PASS ./index.test.js
✓ throws invalid number (3ms)
wait 500 ms (504ms)
test runs (95ms)
...
```
## Contribute
Before creating a commit, validate your changes and build the associated distribution files
```bash
npm run all
```

292
README.md
View File

@@ -2,6 +2,26 @@
This GitHub Action will expose the slug/short values of [some GitHub environment variables][default-environment-variables] inside your GitHub workflow. This GitHub Action will expose the slug/short values of [some GitHub environment variables][default-environment-variables] inside your GitHub workflow.
## Table of Contents
- [GitHub Slug action](#github-slug-action)
- [Table of Contents](#table-of-contents)
- [Overview](#overview)
- [Use this action](#use-this-action)
- [Available Environment variables](#available-environment-variables)
- [Enhanced variables](#enhanced-variables)
- [Partial variables](#partial-variables)
- [Slug variables](#slug-variables)
- [Slug URL variables](#slug-url-variables)
- [Short variables](#short-variables)
- [Contribute](#contribute)
- [Troubleshooting](#troubleshooting)
- [One of the environment variables doesn't work as intended](#one-of-the-environment-variables-doesnt-work-as-intended)
- [Known environment variable conflicts](#known-environment-variable-conflicts)
- [GITHUB_REF_NAME](#github_ref_name)
- [An action could not be found at the URI](#an-action-could-not-be-found-at-the-uri)
- [Thanks for talking about us](#thanks-for-talking-about-us)
## Overview ## Overview
`SLUG` on a variable will `SLUG` on a variable will
@@ -12,192 +32,100 @@ This GitHub Action will expose the slug/short values of [some GitHub environment
- limit the string size to 63 characters - limit the string size to 63 characters
- remove trailing `-` characters - remove trailing `-` characters
### Others Slug-ish variables are available <details>
<summary>Others <b>Slug-ish</b> commands are available</summary>
<p>
- `SLUG_URL` on a variable to have a `slug` variable compliant to be used in a URL - `SLUG_URL` on a variable to have a `slug` variable compliant to be used in an URL
- Like `SLUG` but `.`, and `_` are also replaced by `-` - Like `SLUG` but `.` is also replaced by `-`
- `SHORT` on a variable will limit the string size to ~8 characters - `SHORT` on a variable will limit the string size to 8 characters
- Useful for _sha_ value - Useful for _sha_ value
- `<KEY>_PART` on a variable will give a part of a variable defined by a key - `<KEY>_PART` on a variable will give a part of a variable defined by a key
- Like `GITHUB_REPOSITORY_OWNER_PART` for the owner part of `GITHUB_REPOSITORY` - Like `GITHUB_REPOSITORY_OWNER_PART` for the owner part of `GITHUB_REPOSITORY`
- `<VAR>_CS` on others variables to keep the value case-sensitive - `<VAR>_CS` on others variables to keep the value case-sensitive
- Like `GITHUB_REF_SLUG_CS` - Like `GITHUB_REF_SLUG_CS`
## Installation </p>
</details>
Add this step to your workflow Additional enhanced environment variables can be compute to help you around GitHub environment variables.
## Use this action
Add this in your workflow
```yaml ```yaml
steps: - name: Inject slug/short variables
- name: Inject enhanced GitHub environment variables uses: rlespinasse/github-slug-action@v3.x
uses: rlespinasse/github-slug-action@v5
``` ```
> [!CAUTION] Check for more [examples][examples] (OS usage, URL use, ...)
> Use [Dependabot][dependabot] to maintain your `github-slug-action` version updated in your GitHub workflows.
## Configuration Options **Tip:** Use [Dependabot][dependabot] to maintain your `github-slug-action` version updated in your GitHub workflows.
> [!TIP]
> Check for more [examples][examples] (OS usage, URL use, ...)
### With a prefix
```yaml
steps:
- name: Inject enhanced GitHub environment variables
uses: rlespinasse/github-slug-action@v5
with:
prefix: CI_
```
### With another max length for slug values
```yaml
steps:
- name: Inject enhanced GitHub environment variables
uses: rlespinasse/github-slug-action@v5
with:
slug-maxlength: 80 # Use 'nolimit' to remove use of a max length (Default to 63)
```
### With another length for short values
```yaml
steps:
- name: Inject enhanced GitHub environment variables
uses: rlespinasse/github-slug-action@v5
with:
short-length: 7 # By default it's up to Git to decide, use 8 to have the v3.x behavior
```
> [!WARNING]
> If you leave it empty, you need to checkout the source first in order to let Git decide the size by itself.
## Available Environment variables ## Available Environment variables
> [!TIP] **Note**: If you don't find what you search for, read more about [available `GitHub` variables](docs/github-variables.md), and propose a [new custom variable][custom-variable].
> If you don't find what you search for
>
> - Read more about [available `GitHub` variables](docs/github-variables.md), and propose a [new custom variable][custom-variable].
> - Use your own variable with [slugify-value][slugify-value], or [shortify-git-revision][shortify-git-revision] for git reference.
### Enhanced variables ### Enhanced variables
- `GITHUB_REF_POINT` will contains the reference name (branch or tag) - `GITHUB_REF_NAME` will contains the reference name (branch or tag)
- based on `GITHUB_HEAD_REF` in a [`pull-request*`][webhooks-and-events] event context, - based on `GITHUB_HEAD_REF` in a [`pull-request*`][webhooks-and-events] event context,
- based on `GITHUB_REF_NAME` in others event context. - based on `GITHUB_REF` in others event context.
> [!NOTE] **NOTE:** All enhanced variables are available in all **slug** formats.
> All enhanced variables are available in all **slug** formats.
### Partial variables ### Partial variables
| Variable | Description | | Variable | Partial version of | Description |
| -------- | ----------- | | -------------------------------------------------------------------------------------- | ------------------ | ------------------------------------------------------ |
| [GITHUB_REPOSITORY_OWNER_PART](docs/partial-variables.md#github_repository_owner_part) | The Owner part of GITHUB_REPOSITORY variable | | [GITHUB_REPOSITORY_OWNER_PART](docs/partial-variables.md#github_repository_owner_part) | GITHUB_REPOSITORY | The Owner part of GITHUB_REPOSITORY variable |
| [GITHUB_REPOSITORY_NAME_PART](docs/partial-variables.md#github_repository_name_part) | The Repository name part of GITHUB_REPOSITORY variable | | [GITHUB_REPOSITORY_NAME_PART](docs/partial-variables.md#github_repository_name_part) | GITHUB_REPOSITORY | The Repository name part of GITHUB_REPOSITORY variable |
### Slug variables ### Slug variables
> [!TIP] **NOTE:** `_CS` suffix available
> Available in standard and case-sensitive (`_CS`) versions.
| Variable | Description | | Variable | Slug version of | Description |
| -------- | ----------- | | ------------------------------------------------------------------------------------------------- | ---------------------------- | -------------------------------------------------------------------------------------------------------------------- |
| [GITHUB_REPOSITORY_SLUG](docs/slug-variables.md#github_repository_slug) | The owner and repository name. | | [GITHUB_REPOSITORY_SLUG](docs/slug-variables.md#github_repository_slug) | GITHUB_REPOSITORY | The owner and repository name. |
| [GITHUB_REPOSITORY_OWNER_PART_SLUG](docs/slug-variables.md#github_repository_owner_part_slug) | The owner name. | | [GITHUB_REPOSITORY<br>_OWNER_PART_SLUG](docs/slug-variables.md#github_repository_owner_part_slug) | GITHUB_REPOSITORY_OWNER_PART | The owner name. |
| [GITHUB_REPOSITORY_NAME_PART_SLUG](docs/slug-variables.md#github_repository_name_part_slug) | The repository name. | | [GITHUB_REPOSITORY<br>_NAME_PART_SLUG](docs/slug-variables.md#github_repository_name_part_slug) | GITHUB_REPOSITORY_NAME_PART | The repository name. |
| [GITHUB_REF_SLUG](docs/slug-variables.md#github_ref_slug) | The branch or tag ref that triggered the workflow. | | [GITHUB_REF_SLUG](docs/slug-variables.md#github_ref_slug) | GITHUB_REF | The branch or tag ref that triggered the workflow. |
| [GITHUB_REF_NAME_SLUG](docs/slug-variables.md#github_ref_name_slug) | This value matches the branch or tag name shown on GitHub. | | [GITHUB_HEAD_REF_SLUG](docs/slug-variables.md#github_head_ref_slug) | GITHUB_HEAD_REF | The branch of the head repository.<br>Only set for [pull-request][event-pull-request] event and forked repositories. |
| [GITHUB_HEAD_REF_SLUG](docs/slug-variables.md#github_head_ref_slug) | The branch of the head repository. | | [GITHUB_BASE_REF_SLUG](docs/slug-variables.md#github_base_ref_slug) | GITHUB_BASE_REF | The branch of the base repository.<br>Only set for [pull-request][event-pull-request] event and forked repositories. |
| [GITHUB_BASE_REF_SLUG](docs/slug-variables.md#github_base_ref_slug) | The branch of the base repository. | | [GITHUB_EVENT_REF_SLUG](docs/slug-variables.md#github_event_ref_slug) | _github.event.ref_ | <br>Only set for [following webhook events][webhooks-and-events]<ul><li>`create`</li><li>`delete`</li></ul> |
| [GITHUB_EVENT_REF_SLUG](docs/slug-variables.md#github_event_ref_slug) | The Git reference resource associated to triggered webhook. |
### URL-Safe Slug variables ### Slug URL variables
Same as slug variables but URL-compliant **NOTE:** `_CS` suffix available
> [!TIP] | Variable | Slug URL version of | Description |
> Available in standard and case-sensitive (`_CS`) versions. | --------------------------------------------------------------------------------------------------------- | ---------------------------- | --------------------------------------------------------------------------------------------------------------------- |
| [GITHUB_REPOSITORY_SLUG_URL](docs/slug-url-variables.md#github_repository_slug_url) | GITHUB_REPOSITORY | The owner and repository name. |
| Variable | Description | | [GITHUB_REPOSITORY<br>_OWNER_PART_SLUG_URL](docs/slug-variables.md#github_repository_owner_part_slug_url) | GITHUB_REPOSITORY_OWNER_PART | The owner name. |
| -------- | ----------- | | [GITHUB_REPOSITORY<br>_NAME_PART_SLUG_URL](docs/slug-variables.md#github_repository_name_part_slug_url) | GITHUB_REPOSITORY_NAME_PART | The repository name. |
| [GITHUB_REPOSITORY_SLUG_URL](docs/slug-url-variables.md#github_repository_slug_url) | The owner and repository name. | | [GITHUB_REF_SLUG_URL](docs/slug-url-variables.md#github_ref_slug_url) | GITHUB_REF | The branch or tag ref that triggered the workflow. |
| [GITHUB_REPOSITORY_OWNER_PART_SLUG_URL](docs/slug-variables.md#github_repository_owner_part_slug_url) | The owner name. | | [GITHUB_HEAD_REF_SLUG_URL](docs/slug-url-variables.md#github_head_ref_slug_url) | GITHUB_HEAD_REF | The branch of the head repository.<br>Only set for [pull-request][webhooks-and-events] event and forked repositories. |
| [GITHUB_REPOSITORY_NAME_PART_SLUG_URL](docs/slug-variables.md#github_repository_name_part_slug_url) | The repository name. | | [GITHUB_BASE_REF_SLUG_URL](docs/slug-url-variables.md#github_base_ref_slug_url) | GITHUB_BASE_REF | The branch of the base repository.<br>Only set for [pull-request][webhooks-and-events] event and forked repositories. |
| [GITHUB_REF_SLUG_URL](docs/slug-url-variables.md#github_ref_slug_url) | The branch or tag ref that triggered the workflow. | | [GITHUB_EVENT_REF_SLUG_URL](docs/slug-url-variables.md#github_event_ref_slug_url) | _github.event.ref_ | <br>Only set for [following webhook events][webhooks-and-events]<ul><li>`create`</li><li>`delete`</li></ul> |
| [GITHUB_REF_NAME_SLUG_URL](docs/slug-url-variables.md#github_ref_slug_url) | This value matches the branch or tag name shown on GitHub. |
| [GITHUB_HEAD_REF_SLUG_URL](docs/slug-url-variables.md#github_head_ref_slug_url) | The branch of the head repository. |
| [GITHUB_BASE_REF_SLUG_URL](docs/slug-url-variables.md#github_base_ref_slug_url) | The branch of the base repository. |
| [GITHUB_EVENT_REF_SLUG_URL](docs/slug-url-variables.md#github_event_ref_slug_url) | The Git reference resource associated to triggered webhook. |
### Short variables ### Short variables
| Variable | Description | | Variable | Short version of | Description |
| -------- | ----------- | | -------------------------------------------------------------------------------------------------------------------- | -------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [GITHUB_SHA_SHORT](docs/short-variables.md#github_sha_short) | The commit SHA that triggered the workflow. | | [GITHUB_SHA_SHORT](docs/short-variables.md#github_sha_short) | GITHUB_SHA | The commit SHA that triggered the workflow. |
| [GITHUB_EVENT_PULL_REQUEST_HEAD_SHA_SHORT](docs/short-variables.md#github_event_pull_request_head_sha_short) | The commit SHA on pull request that trigger workflow. | | [GITHUB_EVENT<br>_PULL_REQUEST<br>_HEAD_SHA_SHORT](docs/short-variables.md#github_event_pull_request_head_sha_short) | _github.event<br>.pull_request<br>.head.sha_ | The commit SHA on pull request that trigger workflow.<br>Only set for [following webhook events][webhooks-and-events]<ul><li>`pull_request`</li><li>`pull_request_review`</li><li>`pull_request_review_comment`</li><li>`pull_request_target`</li></ul> |
## Migration from previous versions ## Contribute
### v4 to v5 Follow [Developers guide](DEVELOPERS.md)
The **GITHUB_REF_NAME SLUG/SLUG_URL** variables doesn't work the same way as before
> [!TIP]
> If you use `v5` or related versions, you need to use `GITHUB_REF_POINT` instead of `GITHUB_REF_NAME` to get the behavior of the `v4` action.
Before `v5`, the behavior was the same as the GitHub one except on `pull_request*` workflows ([Ready the full story][issue-104]).
- `${{ env.GITHUB_REF_NAME }}` will serve the behavior of this action,
- `$GITHUB_REF_NAME` will serve the behavior of GitHub Action.
On `pull_request*` workflows, the content will be `<PR-number>/merge` instead of the branch name.
So you need to use `GITHUB_REF_POINT` instead
```yaml
steps:
- name: Inject enhanced GitHub environment variables
uses: rlespinasse/github-slug-action@v5
- run: |
echo "Branch Name: ${GITHUB_REF_POINT}"
shell: bash
```
Then `${{ env.GITHUB_REF_POINT }}`, and `$GITHUB_REF_POINT` will serve the behavior of this action.
And `${{ env.GITHUB_REF_NAME }}`, and `$GITHUB_REF_NAME` will serve the behavior of GitHub Action.
### v3 to v4
Since `v4`, it's Git who manage the short variables by using [`git rev-parse`][git-revparse] behaviour.
The length of a short sha depends of the size of our repository and can differ over time.
To manage that moving length, you can use `short-length` input
- set `7` to reproduce `small repository` behavior
- set `8` to reproduce `v3` behavior
> [!WARNING]
> The minimum length is 4, the default is the effective value of the [core.abbrev][git-core-abbrev] configuration variable.
So to reproduce previous behavior, use
```yaml
steps:
- name: Inject enhanced GitHub environment variables
uses: rlespinasse/github-slug-action@v5
with:
short-length: 8 # Same as v3 and before
```
## Troubleshooting ## Troubleshooting
### One of the environment variables doesn't work as intended ### One of the environment variables doesn't work as intended
> [!WARNING] [**Note**][naming-conventions]: When you set a custom environment variable, you cannot use any of the default environment variable names. For a complete list of these, see [Default environment variables][default-environment-variables]. **If you attempt to override the value of one of these default environment variables, the assignment is ignored.**
> When you set a custom environment variable, you [cannot use any of the default environment variable names][naming-conventions]. For a complete list of these, see [Default environment variables][default-environment-variables]. **If you attempt to override the value of one of these default environment variables, the assignment is ignored.**
If a variable start to be used as default environment variable, the environment variable may have a different behavior than the expected one. If a variable start to be used as default environment variable, the environment variable may have a different behavior than the expected one.
@@ -209,56 +137,61 @@ If this append, the `${{ env.GITHUB_AWESOME_VARIABLE }}` and `$GITHUB_AWESOME_VA
Otherwise the two expression will serve the behavior of this action. Otherwise the two expression will serve the behavior of this action.
This will not occurs if you use the `prefix` input to avoid the issue. This will not occurs if you use the `prefix` input to avoid the issue.
> [!IMPORTANT] **NOTE:** If detected, the maintainers of this action will choose the best course of action depending of the impact.
> If detected, the maintainers of this action will choose the best course of action depending of the impact.
#### Known environment variable conflicts
##### GITHUB_REF_NAME
The behavior is the same as the GitHub one except on `pull_request*` workflows ([Ready the full story][issue-104]).
- `${{ env.GITHUB_REF_NAME }}` will serve the behavior of this action,
- `$GITHUB_REF_NAME` will serve the behavior of GitHub Action.
On `pull_request*` workflows, the content will be `<PR-number>/merge` instead of the branch name.
A possible workaround is to use `prefix` input available in `v4` version
```yaml
- name: Inject slug/short variables
uses: rlespinasse/github-slug-action@v4
with:
prefix: CI_
```
Then `${{ env.CI_GITHUB_REF_NAME }}`, and `$CI_GITHUB_REF_NAME` will serve the behavior of this action.
And `$GITHUB_REF_NAME` will serve the behavior of GitHub Action.
### An action could not be found at the URI ### An action could not be found at the URI
If your workflow fail on the `Set up job` task with this kind of log If your workflow fail on the `Set up job` task with this kind of log :
```text ```text
Download action repository 'rlespinasse/github-slug-action@GIT_REFERENCE' Download action repository 'rlespinasse/github-slug-action@master'
##[error]An action could not be found at the URI 'https://api.github.com/repos/rlespinasse/github-slug-action/tarball/GIT_REFERENCE' ##[error]An action could not be found at the URI 'https://api.github.com/repos/rlespinasse/github-slug-action/tarball/master'
``` ```
If the `GIT_REFERENCE` value is > The master branch doesn't exists anymore.
>
> The master branch EOL has been set to **2020-10-25** after a 6-month deprecation period (more information on the [EOL issue][issue-15])
- `v4.x` or after, the branch don't exists anymore following the [end-of-life for a branch](SECURITY.md#end-of-life-of-a-branch) security process. Please, use the current branch `v3.x` or a version tag (see [releases pages][releases]) in order to fix your workflow.
- `master`, the branch don't exists anymore, read more about it on the corresponding issue ([EOL issue][issue-15])
Please, use the current major tag `v5` or a version tag (see [releases pages][releases]) in order to fix your workflow.
## Thanks for talking about us ## Thanks for talking about us
In English :gb: - [Mettre en place une CI/CD Angular avec GitHub Actions & Netlify][article-1] (in french :fr:)
- [Github Actions : enfin des pipelines accessibles aux développeurs][talk-1] (in french :fr:)
- [Action spotlight by Michael Heap][article-2] - [Action spotlight by Michael Heap][article-2]
- [Serverless Deploy Previews on GitHub Actions][article-3] - The next one is you. _Don't hesitate to add youself to this list._
- [Let's Build a Continuous Delivery and Branching Process with GitHub Actions, Vercel and Heroku][article-4]
In French :fr: [actions]: https://github.com/rlespinasse/github-slug-action/actions
[license]: https://github.com/rlespinasse/github-slug-action/blob/v3.x/LICENSE
- [Mettre en place une CI/CD Angular avec GitHub Actions & Netlify][article-1] [examples]: https://github.com/rlespinasse/github-slug-action/tree/v3.x/examples
- [GitHub Actions : enfin des pipelines accessibles aux développeurs][talk-1]
In Chinese :cn:
- [利用github-slug-action暴漏GitHub Action上下文中的关键变量][article-5]
> The next one is you. _Don't hesitate to add youself to one of these lists._
[examples]: https://github.com/rlespinasse/github-slug-action/tree/v5.x/examples
[custom-variable]: https://github.com/rlespinasse/github-slug-action/issues/new?assignees=&labels=enhancement&template=feature_request.md&title= [custom-variable]: https://github.com/rlespinasse/github-slug-action/issues/new?assignees=&labels=enhancement&template=feature_request.md&title=
[releases]: https://github.com/rlespinasse/github-slug-action/releases [releases]: https://github.com/rlespinasse/github-slug-action/releases
[issue-15]: https://github.com/rlespinasse/github-slug-action/issues/15 [issue-15]: https://github.com/rlespinasse/github-slug-action/issues/15
[issue-104]: https://github.com/rlespinasse/github-slug-action/issues/104 [issue-104]: https://github.com/rlespinasse/github-slug-action/issues/104
[slugify-value]: https://github.com/rlespinasse/slugify-value
[shortify-git-revision]: https://github.com/rlespinasse/shortify-git-revision
[git-revparse]: https://git-scm.com/docs/git-rev-parse#Documentation/git-rev-parse.txt---shortlength
[git-core-abbrev]: https://git-scm.com/docs/git-config#Documentation/git-config.txt-coreabbrev
[default-environment-variables]: https://docs.github.com/en/actions/learn-github-actions/environment-variables#default-environment-variables [default-environment-variables]: https://docs.github.com/en/actions/learn-github-actions/environment-variables#default-environment-variables
[dependabot]: https://docs.github.com/en/code-security/dependabot/working-with-dependabot/keeping-your-actions-up-to-date-with-dependabot [dependabot]: https://docs.github.com/en/code-security/dependabot/working-with-dependabot/keeping-your-actions-up-to-date-with-dependabot
[webhooks-and-events]: https://docs.github.com/en/developers/webhooks-and-events/webhook-events-and-payloads [webhooks-and-events]: https://docs.github.com/en/developers/webhooks-and-events/webhook-events-and-payloads
@@ -266,7 +199,4 @@ In Chinese :cn:
[article-1]: https://esensconsulting.medium.com/mettre-en-place-une-ci-cd-angular-avec-github-actions-netlify-ca0b59b99ed8 [article-1]: https://esensconsulting.medium.com/mettre-en-place-une-ci-cd-angular-avec-github-actions-netlify-ca0b59b99ed8
[article-2]: https://michaelheap.com/github-slug-action/ [article-2]: https://michaelheap.com/github-slug-action/
[article-3]: https://barstool.engineering/serverless-deploy-previews-on-github-actions/ [talk-1]: https://www.youtube.com/watch?v=RHnTJBwcE98
[article-4]: https://javascript.plainenglish.io/lets-build-a-continuous-delivery-and-branching-process-c27dae09f0b6
[article-5]: https://eryajf.github.io/HowToStartOpenSource/views/03-github-tips/10-Use-github-slug-action-to-leak-key-variables-in-the-Github-Action-context.html
[talk-1]: https://www.youtube.com/watch?v=F5mBDmOQcvE

View File

@@ -2,26 +2,23 @@
## Supported Versions and Branches ## Supported Versions and Branches
| Version | Supported | End of Support | Branch | Specific Tags | | Version | Branch | Supported |
| ------- | ------------------ | -------------- | ------ | ------------- | |---------|--------|--------------------|
| 5.x | :white_check_mark: | | v5.x | v5 | | 3.x | v3.x | :white_check_mark: |
| 4.x | :white_check_mark: | 2025-01-31 | v4.x | v4 | | 2.x | v2.x | :white_check_mark: |
| 3.x | :x: | 2024-01-31 | | v3.x, v3 | | 1.1.x | v1.1.x | :x: |
| 2.x | :x: | 2021-04-05 | | v2.x, 2.2.0 | | < 1.x | | :x: |
| 1.x | :x: | 2021-04-05 | | v1.1.x, 1.2.0 |
| 1.0.x | :x: | 2019-11-07 | | 1.0.2 |
A GitHub repository can use one of the available branches as an action inside its workflows. A GitHub repository can used one of the available branches as action inside its workflows.
### End of Life of a branch
Since `2023-10-20`, when a new major version is released,
- The previous one will continue to receive security patches for 3 months,
- After the 3 months, the branch is deleted, and only the tags remain.
## Reporting a Vulnerability ## Reporting a Vulnerability
In this project, you can report a Vulnerability by creating a [draft security advisory](https://github.com/rlespinasse/github-slug-action/security/advisories). You can report a Vulnerability by [my email](mailto:romain.lespinasse@gmail.com).
If the vulnerability is confirmed, a fix will be produced and the advisory will be published. _Vulnerability stages :_
- Reported,
- Confirmed (or declined),
- Fixed on maintained version series.
After a vulnerability fix, an GitHub issue will be created as document this vulnerability.

28
__tests__/partial.test.ts Normal file
View File

@@ -0,0 +1,28 @@
import {sep} from 'path'
import {get_first_part, get_second_part} from '../src/partial'
function test_get_first_part(
input: string,
separator: string,
expected: string
) {
let actual = get_first_part(input, separator)
expect(actual).toEqual(expected)
}
function test_get_second_part(
input: string,
separator: string,
expected: string
) {
let actual = get_second_part(input, separator)
expect(actual).toEqual(expected)
}
test('get_first_part', () => {
test_get_first_part('first/second', '/', 'first')
})
test('get_second_part', () => {
test_get_second_part('first/second', '/', 'second')
})

View File

@@ -0,0 +1,10 @@
import {shortsha} from '../src/short'
function test_short_sha(input: string, expected: string) {
let actual = shortsha(input)
expect(actual).toEqual(expected)
}
test('short_sha: long hash', () => {
test_short_sha('a35a1a486a260cfd99c5b6f8c6034a2929ba9b3f', 'a35a1a48')
})

73
__tests__/slug.test.ts Normal file
View File

@@ -0,0 +1,73 @@
import {slug, slug_cs} from '../src/slug'
function test_slug(input: string, expected: string) {
let actual = slug(input)
expect(actual).toEqual(expected)
}
function test_slug_cs(input: string, expected: string) {
let actual = slug_cs(input)
expect(actual).toEqual(expected)
}
test('slug: a word', () => {
test_slug('word', 'word')
test_slug_cs('word', 'word')
})
test('slug: a string', () => {
test_slug('basic-string', 'basic-string')
test_slug_cs('basic-string', 'basic-string')
})
test('slug: a string in camel case', () => {
test_slug('camelCase', 'camelcase')
test_slug_cs('camelCase', 'camelCase')
})
test('slug: a path', () => {
test_slug('path/to/something', 'path-to-something')
test_slug_cs('path/to/something', 'path-to-something')
})
test('slug: a number', () => {
test_slug('4.2', '4.2')
test_slug_cs('4.2', '4.2')
})
test('slug: an underscore', () => {
test_slug('An_Underscore', 'an_underscore')
test_slug_cs('An_Underscore', 'An_Underscore')
})
test('slug: special character', () => {
test_slug('feat-(!è§-character', 'feat------character')
test_slug_cs('feat-(!è§-character', 'feat------character')
})
test('slug: trailing', () => {
test_slug('-feat-trailing-', 'feat-trailing')
test_slug_cs('-feat-trailing-', 'feat-trailing')
})
test('slug: a very long string', () => {
test_slug(
'has-an-awesome-Feature-Very-Very-Very-Very-Very-Very-Very-Long-moreThan63Characters',
'has-an-awesome-feature-very-very-very-very-very-very-very-long'
)
test_slug_cs(
'has-an-awesome-Feature-Very-Very-Very-Very-Very-Very-Very-Long-moreThan63Characters',
'has-an-awesome-Feature-Very-Very-Very-Very-Very-Very-Very-Long'
)
})
test('slug: short string after trailing', () => {
test_slug(
'-has-an-awesome-Feature-Very-Very-Very-Very-Very-Very-Very-Long-moreThan63Characters-',
'has-an-awesome-feature-very-very-very-very-very-very-very-long'
)
test_slug_cs(
'-has-an-awesome-Feature-Very-Very-Very-Very-Very-Very-Very-Long-moreThan63Characters-',
'has-an-awesome-Feature-Very-Very-Very-Very-Very-Very-Very-Long'
)
})

72
__tests__/slugref.test.ts Normal file
View File

@@ -0,0 +1,72 @@
import {slugref, slugref_cs} from '../src/slug'
function test_slugref(input: string, expected: string) {
let actual = slugref(input)
expect(actual).toEqual(expected)
}
function test_slugref_cs(input: string, expected: string) {
let actual = slugref_cs(input)
expect(actual).toEqual(expected)
}
test('slug_ref:: master branch', () => {
test_slugref('refs/heads/master', 'master')
test_slugref_cs('refs/heads/master', 'master')
})
test('slug_ref: a feature branch', () => {
test_slugref('refs/heads/feat/new_feature', 'feat-new_feature')
test_slugref_cs('refs/heads/feat/new_feature', 'feat-new_feature')
})
test('slug_ref: a fix branch', () => {
test_slugref('refs/heads/fix/issue_number', 'fix-issue_number')
test_slugref_cs('refs/heads/fix/issue_number', 'fix-issue_number')
})
test('slug_ref: an underscore', () => {
test_slugref('refs/heads/An_Underscore', 'an_underscore')
test_slugref_cs('refs/heads/An_Underscore', 'An_Underscore')
})
test('slug_ref: a simple tag', () => {
test_slugref('refs/tags/v1.0.0', 'v1.0.0')
test_slugref_cs('refs/tags/v1.0.0', 'v1.0.0')
})
test('slug_ref: a complex tag', () => {
test_slugref('refs/tags/product@1.0.0-rc.2', 'product-1.0.0-rc.2')
test_slugref_cs('refs/tags/product@1.0.0-rc.2', 'product-1.0.0-rc.2')
})
test('slug_ref: a reference with upper case letters', () => {
test_slugref('refs/heads/New_Awesome_Product', 'new_awesome_product')
test_slugref_cs('refs/heads/New_Awesome_Product', 'New_Awesome_Product')
})
test('slug_ref: test trailing', () => {
test_slugref('refs/heads/-trailing-feat-', 'trailing-feat')
test_slugref_cs('refs/heads/-trailing-feat-', 'trailing-feat')
})
test('slug_ref: test refs inside string', () => {
test_slugref('refs/heads/-refs/tags/feature/-', 'refs-tags-feature')
test_slugref_cs('refs/heads/-refs/tags/feature/-', 'refs-tags-feature')
})
test('slug_ref: a very long name', () => {
test_slugref(
'refs/heads/has-an-awesome-Feature-Very-Very-Very-Very-Very-Very-Very-Long-moreThan63Characters',
'has-an-awesome-feature-very-very-very-very-very-very-very-long'
)
test_slugref_cs(
'refs/heads/has-an-awesome-Feature-Very-Very-Very-Very-Very-Very-Very-Long-moreThan63Characters',
'has-an-awesome-Feature-Very-Very-Very-Very-Very-Very-Very-Long'
)
})
test('slug_ref: on pull-request ref', () => {
test_slugref('refs/pull/branch', 'branch')
test_slugref_cs('refs/pull/branch', 'branch')
})

57
__tests__/slugurl.test.ts Normal file
View File

@@ -0,0 +1,57 @@
import {slugurl, slugurl_cs} from '../src/slug'
function test_slugurl(input: string, expected: string) {
let actual = slugurl(input)
expect(actual).toEqual(expected)
}
function test_slugurl_cs(input: string, expected: string) {
let actual = slugurl_cs(input)
expect(actual).toEqual(expected)
}
test('slug_url: a word', () => {
test_slugurl('word', 'word')
test_slugurl_cs('word', 'word')
})
test('slug_url: a string', () => {
test_slugurl('basic-string', 'basic-string')
test_slugurl_cs('basic-string', 'basic-string')
})
test('slug_url: a string in camel case', () => {
test_slugurl('camelCase', 'camelcase')
test_slugurl_cs('camelCase', 'camelCase')
})
test('slug_url: a path', () => {
test_slugurl('path/to/something', 'path-to-something')
test_slugurl_cs('path/to/something', 'path-to-something')
})
test('slug_url: a number', () => {
test_slugurl('4.2', '4-2')
test_slugurl_cs('4.2', '4-2')
})
test('slug_url: an underscore', () => {
test_slugurl('An_Underscore', 'an-underscore')
test_slugurl_cs('An_Underscore', 'An-Underscore')
})
test('slug_url: trailing', () => {
test_slugurl('.path.to.', 'path-to')
test_slugurl_cs('.path.to.', 'path-to')
})
test('slug_url: a very long string', () => {
test_slugurl(
'has-an-awesome-Feature-Very-Very-Very-Very-Very-Very-Very-Long-moreThan63Characters',
'has-an-awesome-feature-very-very-very-very-very-very-very-long'
)
test_slugurl_cs(
'has-an-awesome-Feature-Very-Very-Very-Very-Very-Very-Very-Long-moreThan63Characters',
'has-an-awesome-Feature-Very-Very-Very-Very-Very-Very-Very-Long'
)
})

View File

@@ -0,0 +1,72 @@
import {slugurlref, slugurlref_cs} from '../src/slug'
function test_slugurlref(input: string, expected: string) {
let actual = slugurlref(input)
expect(actual).toEqual(expected)
}
function test_slugurlref_cs(input: string, expected: string) {
let actual = slugurlref_cs(input)
expect(actual).toEqual(expected)
}
test('slug_url_ref: master branch', () => {
test_slugurlref('refs/heads/master', 'master')
test_slugurlref_cs('refs/heads/master', 'master')
})
test('slug_url_ref: a feature branch', () => {
test_slugurlref('refs/heads/feat/new_feature', 'feat-new-feature')
test_slugurlref_cs('refs/heads/feat/new_feature', 'feat-new-feature')
})
test('slug_url_ref: a fix branch', () => {
test_slugurlref('refs/heads/fix/issue_number', 'fix-issue-number')
test_slugurlref_cs('refs/heads/fix/issue_number', 'fix-issue-number')
})
test('slug_url_ref: an underscore', () => {
test_slugurlref('refs/heads/An_Underscore', 'an-underscore')
test_slugurlref_cs('refs/heads/An_Underscore', 'An-Underscore')
})
test('slug_url_ref: a simple tag', () => {
test_slugurlref('refs/tags/v1.0.0', 'v1-0-0')
test_slugurlref_cs('refs/tags/v1.0.0', 'v1-0-0')
})
test('slug_url_ref: a complex tag', () => {
test_slugurlref('refs/tags/product@1.0.0-rc.2', 'product-1-0-0-rc-2')
test_slugurlref_cs('refs/tags/product@1.0.0-rc.2', 'product-1-0-0-rc-2')
})
test('slug_url_ref: a reference with upper case letters', () => {
test_slugurlref('refs/heads/New_Awesome_Product', 'new-awesome-product')
test_slugurlref_cs('refs/heads/New_Awesome_Product', 'New-Awesome-Product')
})
test('slug_url_ref: a very long name', () => {
test_slugurlref(
'refs/heads/has-an-awesome-Feature-Very-Very-Very-Very-Very-Very-Very-Long-moreThan63Characters',
'has-an-awesome-feature-very-very-very-very-very-very-very-long'
)
test_slugurlref_cs(
'refs/heads/has-an-awesome-Feature-Very-Very-Very-Very-Very-Very-Very-Long-moreThan63Characters',
'has-an-awesome-Feature-Very-Very-Very-Very-Very-Very-Very-Long'
)
})
test('slug_url_ref: test trailing', () => {
test_slugurlref('refs/heads/-an-awesome-Feature-', 'an-awesome-feature')
test_slugurlref_cs('refs/heads/-an-awesome-Feature-', 'an-awesome-Feature')
})
test('slug_url_ref: test trailing with dot', () => {
test_slugurlref('refs/heads/.an-awesome-Feature.', 'an-awesome-feature')
test_slugurlref_cs('refs/heads/.an-awesome-Feature.', 'an-awesome-Feature')
})
test('slug_url_ref: on pull-request ref', () => {
test_slugurlref('refs/pull/branch', 'branch')
test_slugurlref_cs('refs/pull/branch', 'branch')
})

View File

@@ -1,120 +1,9 @@
name: "GitHub Slug Action" name: 'GitHub Slug Action'
description: "GitHub Action to expose slug value of environment variables inside your GitHub workflow" description: 'GitHub Action to expose slug value of environment variables inside your GitHub workflow'
author: "Romain Lespinasse" author: 'rlespinasse'
branding:
icon: "minimize"
color: "blue"
inputs:
prefix:
description: "Value to prepend to each generated variable"
default: ""
required: false
slug-maxlength:
description: "Max length of the slugified values"
default: "63"
required: true
short-length:
description: "Length of the shortify values (git default if empty)"
required: false
runs: runs:
using: "composite" using: 'node20'
steps: main: 'dist/index.js'
- run: $GITHUB_ACTION_PATH/preflight.sh branding:
id: prefligth icon: 'minimize'
shell: bash color: 'blue'
env:
INPUT_SLUG_MAXLENGTH: ${{ inputs.slug-maxlength }}
INPUT_SHORT_LENGTH: ${{ inputs.short-length }}
# From Environment Variables
- uses: rlespinasse/slugify-value@v1.4.0
with:
key: GITHUB_REPOSITORY
value: ${{ github.repository }}
prefix: ${{ inputs.prefix }}
slug-maxlength: ${{ inputs.slug-maxlength }}
- uses: rlespinasse/slugify-value@v1.4.0
with:
key: GITHUB_REF
prefix: ${{ inputs.prefix }}
slug-maxlength: ${{ inputs.slug-maxlength }}
- uses: rlespinasse/slugify-value@v1.4.0
with:
key: GITHUB_HEAD_REF
prefix: ${{ inputs.prefix }}
slug-maxlength: ${{ inputs.slug-maxlength }}
- uses: rlespinasse/slugify-value@v1.4.0
with:
key: GITHUB_BASE_REF
prefix: ${{ inputs.prefix }}
slug-maxlength: ${{ inputs.slug-maxlength }}
# From Specific values
- uses: rlespinasse/slugify-value@v1.4.0
with:
key: GITHUB_EVENT_REF
value: ${{ github.event.ref }}
prefix: ${{ inputs.prefix }}
slug-maxlength: ${{ inputs.slug-maxlength }}
- uses: rlespinasse/slugify-value@v1.4.0
with:
key: GITHUB_REF_NAME
value: ${{ github.ref_name }}
prefix: ${{ inputs.prefix }}
slug-maxlength: ${{ inputs.slug-maxlength }}
- uses: rlespinasse/slugify-value@v1.4.0
with:
key: GITHUB_REF_POINT
value: ${{ env.GITHUB_HEAD_REF_RAW || env.GITHUB_REF_NAME_RAW }}
prefix: ${{ inputs.prefix }}
slug-maxlength: ${{ inputs.slug-maxlength }}
env:
GITHUB_HEAD_REF_RAW: ${{ github.head_ref }}
GITHUB_REF_NAME_RAW: ${{ github.ref_name }}
# From Calculated values
- id: get-github-repository-owner-part
run: |
ownerpart=$(echo $GITHUB_REPOSITORY | cut -d/ -f1)
if [ -f "$GITHUB_OUTPUT" ]; then
echo "github-repository-owner-part=${ownerpart}" >> "$GITHUB_OUTPUT"
else
echo "::set-output name=github-repository-owner-part::${ownerpart}"
fi
shell: bash
- uses: rlespinasse/slugify-value@v1.4.0
with:
key: GITHUB_REPOSITORY_OWNER_PART
value: ${{ steps.get-github-repository-owner-part.outputs.github-repository-owner-part }}
prefix: ${{ inputs.prefix }}
slug-maxlength: ${{ inputs.slug-maxlength }}
- id: get-github-repository-name-part
run: |
namepart=$(echo $GITHUB_REPOSITORY | cut -d/ -f2)
if [ -f "$GITHUB_OUTPUT" ]; then
echo "github-repository-name-part=${namepart}" >> "$GITHUB_OUTPUT"
else
echo "::set-output name=github-repository-name-part::${namepart}"
fi
shell: bash
- uses: rlespinasse/slugify-value@v1.4.0
with:
key: GITHUB_REPOSITORY_NAME_PART
value: ${{ steps.get-github-repository-name-part.outputs.github-repository-name-part }}
prefix: ${{ inputs.prefix }}
slug-maxlength: ${{ inputs.slug-maxlength }}
# From sha
- uses: rlespinasse/shortify-git-revision@v1.6.0
with:
name: GITHUB_SHA
short-on-error: true
length: ${{ steps.prefligth.outputs.PREFLIGHT_SHORT_LENGTH }}
prefix: ${{ inputs.prefix }}
- uses: rlespinasse/shortify-git-revision@v1.6.0
with:
name: GITHUB_EVENT_PULL_REQUEST_HEAD_SHA
revision: ${{ github.event.pull_request.head.sha }}
short-on-error: true
length: ${{ steps.prefligth.outputs.PREFLIGHT_SHORT_LENGTH }}
prefix: ${{ inputs.prefix }}

3337
dist/index.js vendored Normal file

File diff suppressed because it is too large Load Diff

1
dist/index.js.map vendored Normal file

File diff suppressed because one or more lines are too long

1
dist/sourcemap-register.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@@ -12,10 +12,10 @@ All `GitHub` variables availables in your workflow in addition of ones exposed b
- [Action-managed Event Variables](#action-managed-event-variables) - [Action-managed Event Variables](#action-managed-event-variables)
- [create](#create) - [create](#create)
- [delete](#delete) - [delete](#delete)
- [pull\_request](#pull_request) - [pull_request](#pull_request)
- [pull\_request\_review](#pull_request_review) - [pull_request_review](#pull_request_review)
- [pull\_request\_review\_comment](#pull_request_review_comment) - [pull_request_review_comment](#pull_request_review_comment)
- [pull\_request\_target](#pull_request_target) - [pull_request_target](#pull_request_target)
## Default environment variables ## Default environment variables
@@ -23,14 +23,13 @@ Read the official documentation about [Default environment variables][1].
### Action-managed Environment Variables ### Action-managed Environment Variables
| Action-managed Variables | Can be suffix by | | Action-managed Variables | Can be suffix by |
| ------------------------ | --------------- | | ------------------------ | -------------------- |
| GITHUB_REPOSITORY | `_SLUG`, `_SLUG_URL` | | GITHUB_REPOSITORY | `_SLUG`, `_SLUG_URL` |
| GITHUB_REF | `_SLUG`, `_SLUG_URL` | | GITHUB_REF | `_SLUG`, `_SLUG_URL` |
| GITHUB_REF_NAME | `_SLUG`, `_SLUG_URL` | | GITHUB_HEAD_REF | `_SLUG`, `_SLUG_URL` |
| GITHUB_HEAD_REF | `_SLUG`, `_SLUG_URL` | | GITHUB_BASE_REF | `_SLUG`, `_SLUG_URL` |
| GITHUB_BASE_REF | `_SLUG`, `_SLUG_URL` | | GITHUB_SHA | `_SHORT` |
| GITHUB_SHA | `_SHORT` |
## Variables from events ## Variables from events
@@ -42,50 +41,50 @@ Read the official documentation about [Events that trigger workflows][2].
Checkout [create][3] webhook payload content Checkout [create][3] webhook payload content
| Action-managed Variables | Available as | | Action-managed Variables | Available as |
| ------------------------ | ------------ | | ------------------------ | ------------------------- |
| github.event.ref | GITHUB_EVENT_REF_SLUG | | github.event.ref | GITHUB_EVENT_REF_SLUG |
| github.event.ref | GITHUB_EVENT_REF_SLUG_URL | | github.event.ref | GITHUB_EVENT_REF_SLUG_URL |
#### delete #### delete
Checkout [delete][4] webhook payload content Checkout [delete][4] webhook payload content
| Action-managed Variables | Available as | | Action-managed Variables | Available as |
| ------------------------ | ------------ | | ------------------------ | ------------------------- |
| github.event.ref | GITHUB_EVENT_REF_SLUG | | github.event.ref | GITHUB_EVENT_REF_SLUG |
| github.event.ref | GITHUB_EVENT_REF_SLUG_URL | | github.event.ref | GITHUB_EVENT_REF_SLUG_URL |
#### pull_request #### pull_request
Checkout [pull_request][5] webhook payload content Checkout [pull_request][5] webhook payload content
| Action-managed Variables | Available as | | Action-managed Variables | Available as |
| ------------------------ | ------------ | | ---------------------------------- | ---------------------------------------- |
| github.event.pull_request.head.sha | GITHUB_EVENT_PULL_REQUEST_HEAD_SHA_SHORT | | github.event.pull_request.head.sha | GITHUB_EVENT_PULL_REQUEST_HEAD_SHA_SHORT |
#### pull_request_review #### pull_request_review
Checkout [pull_request_review][6] webhook payload content Checkout [pull_request_review][6] webhook payload content
| Action-managed Variables | Available as | | Action-managed Variables | Available as |
| ------------------------ | ------------ | | ---------------------------------- | ---------------------------------------- |
| github.event.pull_request.head.sha | GITHUB_EVENT_PULL_REQUEST_HEAD_SHA_SHORT | | github.event.pull_request.head.sha | GITHUB_EVENT_PULL_REQUEST_HEAD_SHA_SHORT |
#### pull_request_review_comment #### pull_request_review_comment
Checkout [pull_request_review_comment][7] webhook payload content Checkout [pull_request_review_comment][7] webhook payload content
| Action-managed Variables | Available as | | Action-managed Variables | Available as |
| ------------------------ | ------------ | | ---------------------------------- | ---------------------------------------- |
| github.event.pull_request.head.sha | GITHUB_EVENT_PULL_REQUEST_HEAD_SHA_SHORT | | github.event.pull_request.head.sha | GITHUB_EVENT_PULL_REQUEST_HEAD_SHA_SHORT |
#### pull_request_target #### pull_request_target
Checkout [pull_request][5] webhook payload content Checkout [pull_request][5] webhook payload content
| Action-managed Variables | Available as | | Action-managed Variables | Available as |
| ------------------------ | ------------ | | ---------------------------------- | ---------------------------------------- |
| github.event.pull_request.head.sha | GITHUB_EVENT_PULL_REQUEST_HEAD_SHA_SHORT | | github.event.pull_request.head.sha | GITHUB_EVENT_PULL_REQUEST_HEAD_SHA_SHORT |
[1]: https://docs.github.com/en/actions/reference/environment-variables#default-environment-variables [1]: https://docs.github.com/en/actions/reference/environment-variables#default-environment-variables

View File

@@ -4,25 +4,25 @@
- [Partial Variables](#partial-variables) - [Partial Variables](#partial-variables)
- [Table of Contents](#table-of-contents) - [Table of Contents](#table-of-contents)
- [GITHUB\_REPOSITORY\_OWNER\_PART](#github_repository_owner_part) - [GITHUB_REPOSITORY_OWNER_PART](#github_repository_owner_part)
- [GITHUB\_REPOSITORY\_NAME\_PART](#github_repository_name_part) - [GITHUB_REPOSITORY_NAME_PART](#github_repository_name_part)
## GITHUB_REPOSITORY_OWNER_PART ## GITHUB_REPOSITORY_OWNER_PART
Owner part of the environment variable **GITHUB_REPOSITORY** Owner part of the environment variable **GITHUB_REPOSITORY**
| GITHUB_REPOSITORY | GITHUB_REPOSITORY_OWNER_PART | | GITHUB_REPOSITORY | GITHUB_REPOSITORY_OWNER_PART |
| ----------------- | ---------------------------- | | ---------------------------- | ---------------------------- |
| octocat/Hello-World | octocat | | octocat/Hello-World | octocat |
| rlespinasse/Hello-World.go | rlespinasse | | rlespinasse/Hello-World.go | rlespinasse |
| AnotherPerson/SomeRepository | AnotherPerson | | AnotherPerson/SomeRepository | AnotherPerson |
## GITHUB_REPOSITORY_NAME_PART ## GITHUB_REPOSITORY_NAME_PART
Repository name part of the environment variable **GITHUB_REPOSITORY** Repository name part of the environment variable **GITHUB_REPOSITORY**
| GITHUB_REPOSITORY | GITHUB_REPOSITORY_NAME_PART | | GITHUB_REPOSITORY | GITHUB_REPOSITORY_NAME_PART |
| ----------------- | --------------------------- | | ---------------------------- | --------------------------- |
| octocat/Hello-World | Hello-World | | octocat/Hello-World | Hello-World |
| rlespinasse/Hello-World.go | Hello-World.go | | rlespinasse/Hello-World.go | Hello-World.go |
| AnotherPerson/SomeRepository | SomeRepository | | AnotherPerson/SomeRepository | SomeRepository |

View File

@@ -4,8 +4,8 @@
- [Short Variables](#short-variables) - [Short Variables](#short-variables)
- [Table of Contents](#table-of-contents) - [Table of Contents](#table-of-contents)
- [GITHUB\_SHA\_SHORT](#github_sha_short) - [GITHUB_SHA_SHORT](#github_sha_short)
- [GITHUB\_EVENT\_PULL\_REQUEST\_HEAD\_SHA\_SHORT](#github_event_pull_request_head_sha_short) - [GITHUB_EVENT_PULL_REQUEST_HEAD_SHA_SHORT](#github_event_pull_request_head_sha_short)
## GITHUB_SHA_SHORT ## GITHUB_SHA_SHORT
@@ -13,15 +13,15 @@ Short the environment variable **GITHUB_SHA**
The commit SHA that triggered the workflow The commit SHA that triggered the workflow
| GITHUB_SHA | GITHUB_SHA_SHORT | | GITHUB_SHA | GITHUB_SHA_SHORT |
| ---------- | ---------------- | | ---------------------------------------- | ---------------- |
| ffac537e6cbbf934b08745a378932722df287a53 | ffac537e | | ffac537e6cbbf934b08745a378932722df287a53 | ffac537e |
## GITHUB_EVENT_PULL_REQUEST_HEAD_SHA_SHORT ## GITHUB_EVENT_PULL_REQUEST_HEAD_SHA_SHORT
Short the value of `github.event.pull_request.head.sha` that represents the last commit Short the value of `github.event.pull_request.head.sha` that represents the last commit
used for triggering an action for a pull request. used for triggering an action for a pull request.
| github.event.pull_request.head.sha | GITHUB_EVENT_PULL_REQUEST_HEAD_SHA_SHORT | | github.event.pull_request.head.sha | GITHUB_EVENT_PULL_REQUEST_HEAD_SHA_SHORT |
| ---------------------------------- | ---------------------------------------- | | ---------------------------------------- | ---------------------------------------- |
| ffac537e6cbbf934b08745a378932722df287a53 | ffac537e | | ffac537e6cbbf934b08745a378932722df287a53 | ffac537e |

View File

@@ -4,14 +4,13 @@
- [Slug URL Variables](#slug-url-variables) - [Slug URL Variables](#slug-url-variables)
- [Table of Contents](#table-of-contents) - [Table of Contents](#table-of-contents)
- [GITHUB\_REPOSITORY\_SLUG\_URL](#github_repository_slug_url) - [GITHUB_REPOSITORY_SLUG_URL](#github_repository_slug_url)
- [GITHUB\_REPOSITORY\_OWNER\_PART\_SLUG\_URL](#github_repository_owner_part_slug_url) - [GITHUB_REPOSITORY_OWNER_PART_SLUG_URL](#github_repository_owner_part_slug_url)
- [GITHUB\_REPOSITORY\_NAME\_PART\_SLUG\_URL](#github_repository_name_part_slug_url) - [GITHUB_REPOSITORY_NAME_PART_SLUG_URL](#github_repository_name_part_slug_url)
- [GITHUB\_REF\_SLUG\_URL](#github_ref_slug_url) - [GITHUB_REF_SLUG_URL](#github_ref_slug_url)
- [GITHUB\_REF\_NAME\_SLUG\_URL](#github_ref_name_slug_url) - [GITHUB_HEAD_REF_SLUG_URL](#github_head_ref_slug_url)
- [GITHUB\_HEAD\_REF\_SLUG\_URL](#github_head_ref_slug_url) - [GITHUB_BASE_REF_SLUG_URL](#github_base_ref_slug_url)
- [GITHUB\_BASE\_REF\_SLUG\_URL](#github_base_ref_slug_url) - [GITHUB_EVENT_REF_SLUG_URL](#github_event_ref_slug_url)
- [GITHUB\_EVENT\_REF\_SLUG\_URL](#github_event_ref_slug_url)
## GITHUB_REPOSITORY_SLUG_URL ## GITHUB_REPOSITORY_SLUG_URL
@@ -19,10 +18,10 @@ Slug URL the environment variable **GITHUB_REPOSITORY**
The owner and repository name. The owner and repository name.
| GITHUB_REPOSITORY | GITHUB_REPOSITORY_SLUG_URL | | GITHUB_REPOSITORY | GITHUB_REPOSITORY_SLUG_URL |
| ----------------- | ---------------------------- | | ---------------------------- | ---------------------------- |
| octocat/Hello-World | octocat-hello-world | | octocat/Hello-World | octocat-hello-world |
| rlespinasse/Hello-World.go | rlespinasse-hello-world-go | | rlespinasse/Hello-World.go | rlespinasse-hello-world-go |
| AnotherPerson/SomeRepository | anotherperson-somerepository | | AnotherPerson/SomeRepository | anotherperson-somerepository |
## GITHUB_REPOSITORY_OWNER_PART_SLUG_URL ## GITHUB_REPOSITORY_OWNER_PART_SLUG_URL
@@ -33,9 +32,9 @@ The Owner part of **GITHUB_REPOSITORY** variable.
| GITHUB_REPOSITORY_OWNER_PART | GITHUB_REPOSITORY_OWNER_PART_SLUG_URL | | GITHUB_REPOSITORY_OWNER_PART | GITHUB_REPOSITORY_OWNER_PART_SLUG_URL |
| ---------------------------- | ------------------------------------- | | ---------------------------- | ------------------------------------- |
| octocat | octocat | | octocat | octocat |
| rlespinasse | rlespinasse | | rlespinasse | rlespinasse |
| AnotherPerson | anotherperson | | AnotherPerson | anotherperson |
## GITHUB_REPOSITORY_NAME_PART_SLUG_URL ## GITHUB_REPOSITORY_NAME_PART_SLUG_URL
@@ -45,9 +44,9 @@ The Repository name part of **GITHUB_REPOSITORY** variable.
| GITHUB_REPOSITORY_NAME_PART | GITHUB_REPOSITORY_NAME_PART_SLUG_URL | | GITHUB_REPOSITORY_NAME_PART | GITHUB_REPOSITORY_NAME_PART_SLUG_URL |
| --------------------------- | ------------------------------------ | | --------------------------- | ------------------------------------ |
| Hello-World | hello-world | | Hello-World | hello-world |
| Hello-World.go | hello-world-go | | Hello-World.go | hello-world-go |
| SomeRepository | somerepository | | SomeRepository | somerepository |
## GITHUB_REF_SLUG_URL ## GITHUB_REF_SLUG_URL
@@ -56,30 +55,17 @@ Slug URL the environment variable **GITHUB_REF**
The branch or tag ref that triggered the workflow. The branch or tag ref that triggered the workflow.
_If neither a branch or tag is available for the event type, the variable will not exist._ _If neither a branch or tag is available for the event type, the variable will not exist._
| GITHUB_REF | GITHUB_REF_SLUG_URL | | GITHUB_REF | GITHUB_REF_SLUG_URL |
| ---------- | ------------------- | | ------------------------------ | ------------------- |
| refs/heads/main | main | | refs/heads/main | main |
| refs/heads/feat/new_feature | feat-new-feature | | refs/heads/feat/new_feature | feat-new-feature |
| refs/tags/v1.0.0 | v1-0-0 | | refs/tags/v1.0.0 | v1-0-0 |
| refs/pull/42/merge | 42-merge | | refs/pull/42-merge | 42-merge |
| refs/tags/product@1.0.0-rc.2 | product-1-0-0-rc-2 | | refs/tags/product@1.0.0-rc.2 | product-1-0-0-rc-2 |
| refs/heads/New_Awesome_Product | new-awesome-product | | refs/heads/New_Awesome_Product | new-awesome-product |
## GITHUB_REF_NAME_SLUG_URL **Caution**: From v3.0.0 to v3.2.0 included, `GITHUB_REF_SLUG` have the wrong value on `pull_request` event.
`refs/pull/42-merge` become `refs-pull-42-merge` instead of `42-merge`. The bug have been fixed in v3.3.0
Slug URL the environment variable **GITHUB_REF_NAME**
The branch or tag ref that triggered the workflow.
_If neither a branch or tag is available for the event type, the variable will not exist._
| GITHUB_REF_NAME | GITHUB_REF_SLUG_URL |
| --------------- | ------------------- |
| refs/heads/main | main |
| refs/heads/feat/new_feature | feat-new-feature |
| refs/tags/v1.0.0 | v1-0-0 |
| refs/pull/42/merge | 42-merge |
| refs/tags/product@1.0.0-rc.2 | product-1-0-0-rc-2 |
| refs/heads/New_Awesome_Product | new-awesome-product |
## GITHUB_HEAD_REF_SLUG_URL ## GITHUB_HEAD_REF_SLUG_URL
@@ -88,11 +74,11 @@ Slug URL the environment variable **GITHUB_HEAD_REF**
The branch of the head repository. The branch of the head repository.
_Only set for forked repositories._ _Only set for forked repositories._
| GITHUB_REF | GITHUB_HEAD_REF_SLUG_URL | | GITHUB_REF | GITHUB_HEAD_REF_SLUG_URL |
| ---------- | ------------------------ | | ------------------------------ | ------------------------ |
| refs/heads/main | main | | refs/heads/main | main |
| refs/heads/feat/new_feature | feat-new-feature | | refs/heads/feat/new_feature | feat-new-feature |
| refs/heads/New_Awesome_Product | new-awesome-product | | refs/heads/New_Awesome_Product | new-awesome-product |
## GITHUB_BASE_REF_SLUG_URL ## GITHUB_BASE_REF_SLUG_URL
@@ -101,23 +87,23 @@ Slug URL the environment variable **GITHUB_BASE_REF**
The branch of the base repository. The branch of the base repository.
_Only set for forked repositories._ _Only set for forked repositories._
| GITHUB_REF | GITHUB_HEAD_REF_SLUG_URL | | GITHUB_REF | GITHUB_HEAD_REF_SLUG_URL |
| ---------- | ------------------------ | | ------------------------------ | ------------------------ |
| refs/heads/main | main | | refs/heads/main | main |
| refs/heads/feat/new_feature | feat-new-feature | | refs/heads/feat/new_feature | feat-new-feature |
| refs/heads/New_Awesome_Product | new-awesome-product | | refs/heads/New_Awesome_Product | new-awesome-product |
## GITHUB_EVENT_REF_SLUG_URL ## GITHUB_EVENT_REF_SLUG_URL
Slug URL the variable **github.event.ref** Slug URL the variable **github.event.ref**
The Git reference resource associated to triggered webhook. The git reference resource associated to triggered webhook.
_Only set for [`create`, and `delete`][1] events._ _Only set for [`create`, and `delete`][1] events._
| GITHUB_REF | GITHUB_HEAD_REF_SLUG_URL | | GITHUB_REF | GITHUB_HEAD_REF_SLUG_URL |
| ---------- | ------------------------ | | ------------------------------ | ------------------------ |
| refs/heads/main | main | | refs/heads/main | main |
| refs/heads/feat/new_feature | feat-new-feature | | refs/heads/feat/new_feature | feat-new-feature |
| refs/heads/New_Awesome_Product | new-awesome-product | | refs/heads/New_Awesome_Product | new-awesome-product |
[1]: https://docs.github.com/en/developers/webhooks-and-events/webhook-events-and-payloads [1]: https://docs.github.com/en/developers/webhooks-and-events/webhook-events-and-payloads

View File

@@ -4,14 +4,13 @@
- [Slug Variables](#slug-variables) - [Slug Variables](#slug-variables)
- [Table of Contents](#table-of-contents) - [Table of Contents](#table-of-contents)
- [GITHUB\_REPOSITORY\_SLUG](#github_repository_slug) - [GITHUB_REPOSITORY_SLUG](#github_repository_slug)
- [GITHUB\_REPOSITORY\_OWNER\_PART\_SLUG](#github_repository_owner_part_slug) - [GITHUB_REPOSITORY_OWNER_PART_SLUG](#github_repository_owner_part_slug)
- [GITHUB\_REPOSITORY\_NAME\_PART\_SLUG](#github_repository_name_part_slug) - [GITHUB_REPOSITORY_NAME_PART_SLUG](#github_repository_name_part_slug)
- [GITHUB\_REF\_SLUG](#github_ref_slug) - [GITHUB_REF_SLUG](#github_ref_slug)
- [GITHUB\_REF\_NAME\_SLUG](#github_ref_name_slug) - [GITHUB_HEAD_REF_SLUG](#github_head_ref_slug)
- [GITHUB\_HEAD\_REF\_SLUG](#github_head_ref_slug) - [GITHUB_BASE_REF_SLUG](#github_base_ref_slug)
- [GITHUB\_BASE\_REF\_SLUG](#github_base_ref_slug) - [GITHUB_EVENT_REF_SLUG](#github_event_ref_slug)
- [GITHUB\_EVENT\_REF\_SLUG](#github_event_ref_slug)
## GITHUB_REPOSITORY_SLUG ## GITHUB_REPOSITORY_SLUG
@@ -19,10 +18,10 @@ Slug the environment variable **GITHUB_REPOSITORY**
The owner and repository name. The owner and repository name.
| GITHUB_REPOSITORY | GITHUB_REPOSITORY_SLUG | | GITHUB_REPOSITORY | GITHUB_REPOSITORY_SLUG |
| ----------------- | ---------------------- | | ---------------------------- | ---------------------------- |
| octocat/Hello-World | octocat-hello-world | | octocat/Hello-World | octocat-hello-world |
| rlespinasse/Hello-World.go | rlespinasse-hello-world.go | | rlespinasse/Hello-World.go | rlespinasse-hello-world.go |
| AnotherPerson/SomeRepository | anotherperson-somerepository | | AnotherPerson/SomeRepository | anotherperson-somerepository |
## GITHUB_REPOSITORY_OWNER_PART_SLUG ## GITHUB_REPOSITORY_OWNER_PART_SLUG
@@ -33,9 +32,9 @@ The Owner part of **GITHUB_REPOSITORY** variable.
| GITHUB_REPOSITORY_OWNER_PART | GITHUB_REPOSITORY_OWNER_PART_SLUG | | GITHUB_REPOSITORY_OWNER_PART | GITHUB_REPOSITORY_OWNER_PART_SLUG |
| ---------------------------- | --------------------------------- | | ---------------------------- | --------------------------------- |
| octocat | octocat | | octocat | octocat |
| rlespinasse | rlespinasse | | rlespinasse | rlespinasse |
| AnotherPerson | anotherperson | | AnotherPerson | anotherperson |
## GITHUB_REPOSITORY_NAME_PART_SLUG ## GITHUB_REPOSITORY_NAME_PART_SLUG
@@ -45,9 +44,9 @@ The Repository name part of **GITHUB_REPOSITORY** variable.
| GITHUB_REPOSITORY_NAME_PART | GITHUB_REPOSITORY_NAME_PART_SLUG | | GITHUB_REPOSITORY_NAME_PART | GITHUB_REPOSITORY_NAME_PART_SLUG |
| --------------------------- | -------------------------------- | | --------------------------- | -------------------------------- |
| Hello-World | hello-world | | Hello-World | hello-world |
| Hello-World.go | hello-world.go | | Hello-World.go | hello-world.go |
| SomeRepository | somerepository | | SomeRepository | somerepository |
## GITHUB_REF_SLUG ## GITHUB_REF_SLUG
@@ -56,30 +55,14 @@ Slug the environment variable **GITHUB_REF**
The branch or tag ref that triggered the workflow. The branch or tag ref that triggered the workflow.
_If neither a branch or tag is available for the event type, the variable will not exist._ _If neither a branch or tag is available for the event type, the variable will not exist._
| GITHUB_REF | GITHUB_REF_SLUG | | GITHUB_REF | GITHUB_REF_SLUG |
| ---------- | --------------- | | ------------------------------ | ------------------- |
| refs/heads/main | main | | refs/heads/main | main |
| refs/heads/feat/new_feature | feat-new-feature | | refs/heads/feat/new_feature | feat-new-feature |
| refs/tags/v1.0.0 | v1.0.0 | | refs/tags/v1.0.0 | v1.0.0 |
| refs/tags/product@1.0.0-rc.2 | product-1.0.0-rc.2 | | refs/tags/product@1.0.0-rc.2 | product-1.0.0-rc.2 |
| refs/heads/New_Awesome_Product | new-awesome-product | | refs/heads/New_Awesome_Product | new-awesome-product |
## GITHUB_REF_NAME_SLUG
Slug the environment variable **GITHUB_REF_NAME**
The branch or tag ref that triggered the workflow.
_If neither a branch or tag is available for the event type, the variable will not exist._
| GITHUB_REF_NAME | GITHUB_REF_SLUG |
| --------------- | --------------- |
| main | main |
| feat/new_feature | feat-new-feature |
| v1.0.0 | v1.0.0 |
| product@1.0.0-rc.2 | product-1.0.0-rc.2 |
| New_Awesome_Product | new-awesome-product |
| 42/merge | 42-merge |
## GITHUB_HEAD_REF_SLUG ## GITHUB_HEAD_REF_SLUG
Slug the environment variable **GITHUB_HEAD_REF** Slug the environment variable **GITHUB_HEAD_REF**
@@ -87,11 +70,11 @@ Slug the environment variable **GITHUB_HEAD_REF**
The branch of the head repository. The branch of the head repository.
_Only set for [`pull-request`][1] event and forked repositories._ _Only set for [`pull-request`][1] event and forked repositories._
| GITHUB_REF | GITHUB_HEAD_REF_SLUG | | GITHUB_REF | GITHUB_HEAD_REF_SLUG |
| ---------- | -------------------- | | ------------------------------ | -------------------- |
| refs/heads/main | main | | refs/heads/main | main |
| refs/heads/feat/new_feature | feat-new-feature | | refs/heads/feat/new_feature | feat-new-feature |
| refs/heads/New_Awesome_Product | new-awesome-product | | refs/heads/New_Awesome_Product | new-awesome-product |
## GITHUB_BASE_REF_SLUG ## GITHUB_BASE_REF_SLUG
@@ -100,23 +83,23 @@ Slug the environment variable **GITHUB_BASE_REF**
The branch of the base repository. The branch of the base repository.
_Only set for [`pull-request`][1] event and forked repositories._ _Only set for [`pull-request`][1] event and forked repositories._
| GITHUB_REF | GITHUB_HEAD_REF_SLUG | | GITHUB_REF | GITHUB_HEAD_REF_SLUG |
| ---------- | -------------------- | | ------------------------------ | -------------------- |
| refs/heads/main | main | | refs/heads/main | main |
| refs/heads/feat/new_feature | feat-new-feature | | refs/heads/feat/new_feature | feat-new-feature |
| refs/heads/New_Awesome_Product | new-awesome-product | | refs/heads/New_Awesome_Product | new-awesome-product |
## GITHUB_EVENT_REF_SLUG ## GITHUB_EVENT_REF_SLUG
Slug the variable **github.event.ref** Slug the variable **github.event.ref**
The Git reference resource associated to triggered webhook. The git reference resource associated to triggered webhook.
_Only set for [`create`, and `delete`][1] events._ _Only set for [`create`, and `delete`][1] events._
| GITHUB_REF | GITHUB_HEAD_REF_SLUG | | GITHUB_REF | GITHUB_HEAD_REF_SLUG |
| ---------- | -------------------- | | ------------------------------ | -------------------- |
| refs/heads/main | main | | refs/heads/main | main |
| refs/heads/feat/new_feature | feat-new-feature | | refs/heads/feat/new_feature | feat-new-feature |
| refs/heads/New_Awesome_Product | new-awesome-product | | refs/heads/New_Awesome_Product | new-awesome-product |
[1]: https://docs.github.com/en/developers/webhooks-and-events/webhook-events-and-payloads [1]: https://docs.github.com/en/developers/webhooks-and-events/webhook-events-and-payloads

View File

@@ -6,8 +6,8 @@ jobs:
usage: usage:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v2
- uses: rlespinasse/github-slug-action@v5 - uses: rlespinasse/github-slug-action@v3.x
- name: Output - name: Output
run: | run: |
echo "Partial variables" echo "Partial variables"

View File

@@ -6,8 +6,8 @@ jobs:
usage: usage:
runs-on: macos-latest runs-on: macos-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v2
- uses: rlespinasse/github-slug-action@v5 - uses: rlespinasse/github-slug-action@v3.x
- name: Output - name: Output
run: | run: |
echo "Partial variables" echo "Partial variables"

View File

@@ -6,15 +6,15 @@ jobs:
as_subdomain: as_subdomain:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v2
- uses: rlespinasse/github-slug-action@v5 - uses: rlespinasse/github-slug-action@v3.x
- run: | - run: |
./deploy-application.sh --url "https://${{ env.GITHUB_REF_SLUG_URL }}.staging.app.example.com" ./deploy-application.sh --url "https://${{ env.GITHUB_REF_SLUG_URL }}.staging.app.example.com"
as_resource_path: as_resource_path:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v2
- uses: rlespinasse/github-slug-action@v5 - uses: rlespinasse/github-slug-action@v3.x
- run: | - run: |
./deploy-application.sh --url "https://staging.app.example.com/${{ env.GITHUB_REF_SLUG_URL }}" ./deploy-application.sh --url "https://staging.app.example.com/${{ env.GITHUB_REF_SLUG_URL }}"

View File

@@ -6,8 +6,8 @@ jobs:
usage: usage:
runs-on: windows-latest runs-on: windows-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v2
- uses: rlespinasse/github-slug-action@v5 - uses: rlespinasse/github-slug-action@v3.x
- name: Output - name: Output
run: | run: |
echo "Partial variables" echo "Partial variables"

11
jest.config.js Normal file
View File

@@ -0,0 +1,11 @@
module.exports = {
clearMocks: true,
moduleFileExtensions: ['js', 'ts'],
testEnvironment: 'node',
testMatch: ['**/*.test.ts'],
testRunner: 'jest-circus/runner',
transform: {
'^.+\\.ts$': 'ts-jest'
},
verbose: true
}

13921
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

72
package.json Normal file
View File

@@ -0,0 +1,72 @@
{
"name": "github-slug-action",
"version": "0.0.0",
"license": "MIT",
"private": true,
"description": "Github slug action",
"main": "lib/main.js",
"scripts": {
"release": "semantic-release",
"build": "tsc",
"format": "prettier --write **/*.ts",
"format-check": "prettier --check **/*.ts",
"lint": "eslint src/**/*.ts",
"package": "ncc build --source-map",
"test": "jest",
"all": "npm run build && npm run format && npm run lint && npm run package && npm test"
},
"repository": {
"type": "git",
"url": "https://github.com/rlespinasse/github-slug-action.git"
},
"keywords": [
"actions",
"node",
"setup"
],
"author": "rlespinasse",
"dependencies": {
"@actions/core": "^1.10.0"
},
"devDependencies": {
"@semantic-release/changelog": "^6.0.1",
"@semantic-release/exec": "^6.0.0",
"@semantic-release/git": "^10.0.1",
"@types/jest": "^26.0.24",
"@types/node": "^14.18.25",
"@typescript-eslint/eslint-plugin": "^5.38.1",
"@vercel/ncc": "^0.36.1",
"eslint": "^8.0.1",
"eslint-plugin-github": "^4.3.7",
"eslint-plugin-jest": "^23.20.0",
"jest": "^26.6.3",
"jest-circus": "^26.6.3",
"js-yaml": "^3.14.1",
"prettier": "^2.7.1",
"semantic-release": "^19.0.3",
"ts-jest": "^26.5.6",
"typescript": "^4.2.0"
},
"files": [
"/dist"
],
"release": {
"tagFormat": "v${version}",
"plugins": [
"@semantic-release/commit-analyzer",
"@semantic-release/release-notes-generator",
"@semantic-release/changelog",
[
"@semantic-release/exec",
{
"prepareCmd": "git add dist"
}
],
"@semantic-release/git",
"@semantic-release/github"
],
"branches": [
"v3.x"
]
}
}

View File

@@ -1,38 +0,0 @@
#!/usr/bin/env bash
if [ -z "${INPUT_SLUG_MAXLENGTH}" ]; then
echo "::error ::slug-maxlength cannot be empty"
exit 1
elif [ "${INPUT_SLUG_MAXLENGTH}" != "nolimit" ] && [ ! "${INPUT_SLUG_MAXLENGTH}" -eq "${INPUT_SLUG_MAXLENGTH}" ] 2>/dev/null; then
echo "::error ::slug-maxlength must be a number or equals to 'nolimit'"
exit 1
fi
if [ ! "${INPUT_SHORT_LENGTH}" -eq "${INPUT_SHORT_LENGTH}" ] 2>/dev/null; then
echo "::error ::short-length must be a number"
exit 1
fi
echo "::debug ::Control preflight short-length setup"
PREFLIGHT_SHORT_LENGTH=""
if [ -n "${INPUT_SHORT_LENGTH}" ]; then
PREFLIGHT_SHORT_LENGTH="${INPUT_SHORT_LENGTH}"
echo "::debug ::Use input value: $PREFLIGHT_SHORT_LENGTH"
elif [ "$(git rev-parse --is-inside-work-tree)" == "true" ]; then
echo "::debug ::The action run inside a git repository, short-length can be empty"
else
echo "::debug ::The action run outside a git repository, need to set short-length"
PREFLIGHT_SHORT_LENGTH="$(git config --get core.abbrev)"
if [ -n "${PREFLIGHT_SHORT_LENGTH}" ]; then
echo "::debug ::Git Configuration 'core.abbrev' is set, using it as short-length"
else
PREFLIGHT_SHORT_LENGTH="7"
echo "::debug ::Using fallback value for short-length"
fi
fi
echo "::debug ::Set PREFLIGHT_SHORT_LENGTH=$PREFLIGHT_SHORT_LENGTH"
if [ -f "$GITHUB_OUTPUT" ]; then
echo "PREFLIGHT_SHORT_LENGTH=${PREFLIGHT_SHORT_LENGTH}" >> "$GITHUB_OUTPUT"
else
echo "::set-output name=PREFLIGHT_SHORT_LENGTH::${PREFLIGHT_SHORT_LENGTH}"
fi

401
src/main.ts Normal file
View File

@@ -0,0 +1,401 @@
import * as core from '@actions/core'
import {
removeRef,
slug,
slug_cs,
slugref,
slugref_cs,
slugurl,
slugurl_cs,
slugurlref,
slugurlref_cs
} from './slug'
import {shortsha} from './short'
import {get_first_part, get_second_part} from './partial'
const SEPARATOR = '/'
/**
* Inputs environments variables keys from Github actions job
* see https://docs.github.com/en/actions/configuring-and-managing-workflows/using-environment-variables#default-environment-variables
*/
const GITHUB_REPOSITORY = 'GITHUB_REPOSITORY'
const GITHUB_REF = 'GITHUB_REF'
const GITHUB_HEAD_REF = 'GITHUB_HEAD_REF'
const GITHUB_BASE_REF = 'GITHUB_BASE_REF'
const GITHUB_SHA = 'GITHUB_SHA'
const GITHUB_EVENT_PATH = 'GITHUB_EVENT_PATH'
/**
* Partial outputs environments variables keys
*/
const GITHUB_REPOSITORY_OWNER_PART = 'GITHUB_REPOSITORY_OWNER_PART'
const GITHUB_REPOSITORY_NAME_PART = 'GITHUB_REPOSITORY_NAME_PART'
/**
* New environments variables keys
*/
const GITHUB_REF_NAME = 'GITHUB_REF_NAME'
/**
* Slugged outputs environments variables keys
*/
const GITHUB_REPOSITORY_SLUG = 'GITHUB_REPOSITORY_SLUG'
const GITHUB_REPOSITORY_SLUG_CS = 'GITHUB_REPOSITORY_SLUG_CS'
const GITHUB_REPOSITORY_OWNER_PART_SLUG = 'GITHUB_REPOSITORY_OWNER_PART_SLUG'
const GITHUB_REPOSITORY_OWNER_PART_SLUG_CS =
'GITHUB_REPOSITORY_OWNER_PART_SLUG_CS'
const GITHUB_REPOSITORY_NAME_PART_SLUG = 'GITHUB_REPOSITORY_NAME_PART_SLUG'
const GITHUB_REPOSITORY_NAME_PART_SLUG_CS =
'GITHUB_REPOSITORY_NAME_PART_SLUG_CS'
const GITHUB_REF_SLUG = 'GITHUB_REF_SLUG'
const GITHUB_REF_SLUG_CS = 'GITHUB_REF_SLUG_CS'
const GITHUB_HEAD_REF_SLUG = 'GITHUB_HEAD_REF_SLUG'
const GITHUB_HEAD_REF_SLUG_CS = 'GITHUB_HEAD_REF_SLUG_CS'
const GITHUB_BASE_REF_SLUG = 'GITHUB_BASE_REF_SLUG'
const GITHUB_BASE_REF_SLUG_CS = 'GITHUB_BASE_REF_SLUG_CS'
const GITHUB_EVENT_REF_SLUG = 'GITHUB_EVENT_REF_SLUG'
const GITHUB_EVENT_REF_SLUG_CS = 'GITHUB_EVENT_REF_SLUG_CS'
const GITHUB_REF_NAME_SLUG = 'GITHUB_REF_NAME_SLUG'
const GITHUB_REF_NAME_SLUG_CS = 'GITHUB_REF_NAME_SLUG_CS'
/**
* URL-Slugged outputs environments variables keys
*/
const GITHUB_REPOSITORY_SLUG_URL = 'GITHUB_REPOSITORY_SLUG_URL'
const GITHUB_REPOSITORY_SLUG_URL_CS = 'GITHUB_REPOSITORY_SLUG_URL_CS'
const GITHUB_REPOSITORY_OWNER_PART_SLUG_URL =
'GITHUB_REPOSITORY_OWNER_PART_SLUG_URL'
const GITHUB_REPOSITORY_OWNER_PART_SLUG_URL_CS =
'GITHUB_REPOSITORY_OWNER_PART_SLUG_URL_CS'
const GITHUB_REPOSITORY_NAME_PART_SLUG_URL =
'GITHUB_REPOSITORY_NAME_PART_SLUG_URL'
const GITHUB_REPOSITORY_NAME_PART_SLUG_URL_CS =
'GITHUB_REPOSITORY_NAME_PART_SLUG_URL_CS'
const GITHUB_REF_SLUG_URL = 'GITHUB_REF_SLUG_URL'
const GITHUB_REF_SLUG_URL_CS = 'GITHUB_REF_SLUG_URL_CS'
const GITHUB_HEAD_REF_SLUG_URL = 'GITHUB_HEAD_REF_SLUG_URL'
const GITHUB_HEAD_REF_SLUG_URL_CS = 'GITHUB_HEAD_REF_SLUG_URL_CS'
const GITHUB_BASE_REF_SLUG_URL = 'GITHUB_BASE_REF_SLUG_URL'
const GITHUB_BASE_REF_SLUG_URL_CS = 'GITHUB_BASE_REF_SLUG_URL_CS'
const GITHUB_EVENT_REF_SLUG_URL = 'GITHUB_EVENT_REF_SLUG_URL'
const GITHUB_EVENT_REF_SLUG_URL_CS = 'GITHUB_EVENT_REF_SLUG_URL_CS'
const GITHUB_REF_NAME_SLUG_URL = 'GITHUB_REF_NAME_SLUG_URL'
const GITHUB_REF_NAME_SLUG_URL_CS = 'GITHUB_REF_NAME_SLUG_URL_CS'
/**
* Shorted outputs environments variables keys
*/
const GITHUB_SHA_SHORT = 'GITHUB_SHA_SHORT'
const GITHUB_EVENT_PULL_REQUEST_HEAD_SHA_SHORT =
'GITHUB_EVENT_PULL_REQUEST_HEAD_SHA_SHORT'
async function run(): Promise<void> {
try {
const eventPath = process.env[GITHUB_EVENT_PATH]
if (eventPath) {
const eventData = await import(eventPath)
if (eventData.hasOwnProperty('ref')) {
core.exportVariable(GITHUB_EVENT_REF_SLUG, slugref(eventData.ref))
core.exportVariable(GITHUB_EVENT_REF_SLUG_CS, slugref_cs(eventData.ref))
core.exportVariable(
GITHUB_EVENT_REF_SLUG_URL,
slugurlref(eventData.ref)
)
core.exportVariable(
GITHUB_EVENT_REF_SLUG_URL_CS,
slugurlref_cs(eventData.ref)
)
} else if (eventData.hasOwnProperty('pull_request')) {
core.exportVariable(
GITHUB_EVENT_PULL_REQUEST_HEAD_SHA_SHORT,
shortsha(eventData.pull_request.head.sha)
)
}
}
exportFirstPart(GITHUB_REPOSITORY, SEPARATOR, GITHUB_REPOSITORY_OWNER_PART)
exportSecondPart(GITHUB_REPOSITORY, SEPARATOR, GITHUB_REPOSITORY_NAME_PART)
exportSlug(GITHUB_REPOSITORY, GITHUB_REPOSITORY_SLUG)
exportSlugCS(GITHUB_REPOSITORY, GITHUB_REPOSITORY_SLUG_CS)
exportFirstPartSlug(
GITHUB_REPOSITORY,
SEPARATOR,
GITHUB_REPOSITORY_OWNER_PART_SLUG
)
exportFirstPartSlugCS(
GITHUB_REPOSITORY,
SEPARATOR,
GITHUB_REPOSITORY_OWNER_PART_SLUG_CS
)
exportSecondPartSlug(
GITHUB_REPOSITORY,
SEPARATOR,
GITHUB_REPOSITORY_NAME_PART_SLUG
)
exportSecondPartSlugCS(
GITHUB_REPOSITORY,
SEPARATOR,
GITHUB_REPOSITORY_NAME_PART_SLUG_CS
)
exportSlugUrl(GITHUB_REPOSITORY, GITHUB_REPOSITORY_SLUG_URL)
exportSlugUrlCS(GITHUB_REPOSITORY, GITHUB_REPOSITORY_SLUG_URL_CS)
exportFirstPartSlugUrl(
GITHUB_REPOSITORY,
SEPARATOR,
GITHUB_REPOSITORY_OWNER_PART_SLUG_URL
)
exportFirstPartSlugUrlCS(
GITHUB_REPOSITORY,
SEPARATOR,
GITHUB_REPOSITORY_OWNER_PART_SLUG_URL_CS
)
exportSecondPartSlugUrl(
GITHUB_REPOSITORY,
SEPARATOR,
GITHUB_REPOSITORY_NAME_PART_SLUG_URL
)
exportSecondPartSlugUrlCS(
GITHUB_REPOSITORY,
SEPARATOR,
GITHUB_REPOSITORY_NAME_PART_SLUG_URL_CS
)
exportSlugRef(GITHUB_REF, GITHUB_REF_SLUG)
exportSlugRefCS(GITHUB_REF, GITHUB_REF_SLUG_CS)
exportSlugRef(GITHUB_HEAD_REF, GITHUB_HEAD_REF_SLUG)
exportSlugRefCS(GITHUB_HEAD_REF, GITHUB_HEAD_REF_SLUG_CS)
exportSlugRef(GITHUB_BASE_REF, GITHUB_BASE_REF_SLUG)
exportSlugRefCS(GITHUB_BASE_REF, GITHUB_BASE_REF_SLUG_CS)
exportSlugUrlRef(GITHUB_REF, GITHUB_REF_SLUG_URL)
exportSlugUrlRefCS(GITHUB_REF, GITHUB_REF_SLUG_URL_CS)
exportSlugUrlRef(GITHUB_HEAD_REF, GITHUB_HEAD_REF_SLUG_URL)
exportSlugUrlRefCS(GITHUB_HEAD_REF, GITHUB_HEAD_REF_SLUG_URL_CS)
exportSlugUrlRef(GITHUB_BASE_REF, GITHUB_BASE_REF_SLUG_URL)
exportSlugUrlRefCS(GITHUB_BASE_REF, GITHUB_BASE_REF_SLUG_URL_CS)
exportShortSha(GITHUB_SHA, GITHUB_SHA_SHORT)
exportBranchName()
} catch (error) {
if (error instanceof Error) core.setFailed(error.message)
}
}
function exportFirstPart(
inputKey: string,
separator: string,
outputKey: string
): void {
const envVar = process.env[inputKey]
if (envVar) {
core.exportVariable(outputKey, get_first_part(envVar, separator))
}
}
function exportSecondPart(
inputKey: string,
separator: string,
outputKey: string
): void {
const envVar = process.env[inputKey]
if (envVar) {
core.exportVariable(outputKey, get_second_part(envVar, separator))
}
}
function exportSlugCS(inputKey: string, outputKey: string): void {
const envVar = process.env[inputKey]
if (envVar) {
core.exportVariable(outputKey, slug_cs(envVar))
}
}
function exportSlug(inputKey: string, outputKey: string): void {
const envVar = process.env[inputKey]
if (envVar) {
core.exportVariable(outputKey, slug(envVar))
}
}
function exportFirstPartSlugCS(
inputKey: string,
separator: string,
outputKey: string
): void {
const envVar = process.env[inputKey]
if (envVar) {
const value = get_first_part(envVar, separator)
core.exportVariable(outputKey, slug_cs(value))
}
}
function exportFirstPartSlug(
inputKey: string,
separator: string,
outputKey: string
): void {
const envVar = process.env[inputKey]
if (envVar) {
const value = get_first_part(envVar, separator)
core.exportVariable(outputKey, slug(value))
}
}
function exportSecondPartSlugCS(
inputKey: string,
separator: string,
outputKey: string
): void {
const envVar = process.env[inputKey]
if (envVar) {
const value = get_second_part(envVar, separator)
core.exportVariable(outputKey, slug_cs(value))
}
}
function exportSecondPartSlug(
inputKey: string,
separator: string,
outputKey: string
): void {
const envVar = process.env[inputKey]
if (envVar) {
const value = get_second_part(envVar, separator)
core.exportVariable(outputKey, slug(value))
}
}
function exportSlugRefCS(inputKey: string, outputKey: string): void {
const envVar = process.env[inputKey]
if (envVar) {
exportSlugRefCSValue(envVar, outputKey)
}
}
function exportSlugRefCSValue(envVar: string, outputKey: string): void {
core.exportVariable(outputKey, slugref_cs(envVar))
}
function exportSlugRef(inputKey: string, outputKey: string): void {
const envVar = process.env[inputKey]
if (envVar) {
exportSlugRefValue(envVar, outputKey)
}
}
function exportSlugRefValue(envVar: string, outputKey: string): void {
core.exportVariable(outputKey, slugref(envVar))
}
function exportSlugUrlCS(inputKey: string, outputKey: string): void {
const envVar = process.env[inputKey]
if (envVar) {
core.exportVariable(outputKey, slugurl_cs(envVar))
}
}
function exportSlugUrl(inputKey: string, outputKey: string): void {
const envVar = process.env[inputKey]
if (envVar) {
core.exportVariable(outputKey, slugurl(envVar))
}
}
function exportFirstPartSlugUrlCS(
inputKey: string,
separator: string,
outputKey: string
): void {
const envVar = process.env[inputKey]
if (envVar) {
const value = get_first_part(envVar, separator)
core.exportVariable(outputKey, slugurl_cs(value))
}
}
function exportFirstPartSlugUrl(
inputKey: string,
separator: string,
outputKey: string
): void {
const envVar = process.env[inputKey]
if (envVar) {
const value = get_first_part(envVar, separator)
core.exportVariable(outputKey, slugurl(value))
}
}
function exportSecondPartSlugUrlCS(
inputKey: string,
separator: string,
outputKey: string
): void {
const envVar = process.env[inputKey]
if (envVar) {
const value = get_second_part(envVar, separator)
core.exportVariable(outputKey, slugurl_cs(value))
}
}
function exportSecondPartSlugUrl(
inputKey: string,
separator: string,
outputKey: string
): void {
const envVar = process.env[inputKey]
if (envVar) {
const value = get_second_part(envVar, separator)
core.exportVariable(outputKey, slugurl(value))
}
}
function exportSlugUrlRefCS(inputKey: string, outputKey: string): void {
const envVar = process.env[inputKey]
if (envVar) {
exportSlugUrlRefCSValue(envVar, outputKey)
}
}
function exportSlugUrlRefCSValue(envVar: string, outputKey: string): void {
core.exportVariable(outputKey, slugurlref_cs(envVar))
}
function exportSlugUrlRef(inputKey: string, outputKey: string): void {
const envVar = process.env[inputKey]
if (envVar) {
exportSlugUrlRefValue(envVar, outputKey)
}
}
function exportSlugUrlRefValue(envVar: string, outputKey: string): void {
core.exportVariable(outputKey, slugurlref(envVar))
}
function exportShortSha(inputKey: string, outputKey: string): void {
const envVar = process.env[inputKey]
if (envVar) {
core.exportVariable(outputKey, shortsha(envVar))
}
}
function exportBranchName(): void {
//GITHUB_HEAD_REF is only set for pull request events https://docs.github.com/en/actions/reference/environment-variables
const isPullRequest = !!process.env.GITHUB_HEAD_REF
let refName
if (isPullRequest) {
refName = process.env.GITHUB_HEAD_REF
} else {
refName = process.env.GITHUB_REF
}
if (refName) {
core.exportVariable(GITHUB_REF_NAME, removeRef(refName))
exportSlugRefValue(refName, GITHUB_REF_NAME_SLUG)
exportSlugRefCSValue(refName, GITHUB_REF_NAME_SLUG_CS)
exportSlugUrlRefValue(refName, GITHUB_REF_NAME_SLUG_URL)
exportSlugUrlRefCSValue(refName, GITHUB_REF_NAME_SLUG_URL_CS)
}
}
run()

17
src/partial.ts Normal file
View File

@@ -0,0 +1,17 @@
/**
* Get the first part of envVar
* @param envVar to be split
* @param separator of the split
*/
export function get_first_part(envVar: string, separator: string): string {
return envVar.replace(RegExp(`${separator}.*$`), '')
}
/**
* Get the second part of envVar
* @param envVar to be split
* @param separator of the split
*/
export function get_second_part(envVar: string, separator: string): string {
return envVar.replace(RegExp(`^.*${separator}`), '')
}

10
src/short.ts Normal file
View File

@@ -0,0 +1,10 @@
const SHORT_SHA_SIZE = 8
/**
* slug will take envVar and then :
* - limit the string size to 8 characters
* @param envVar to be slugged
*/
export function shortsha(envVar: string): string {
return envVar.substring(0, SHORT_SHA_SIZE)
}

129
src/slug.ts Normal file
View File

@@ -0,0 +1,129 @@
const MAX_SLUG_STRING_SIZE = 63
/**
* slug_cs will take envVar and then :
* - replace any character by `-` except `0-9`, `a-z`, `.`, and `_`
* - remove leading `-` characters
* - limit the string size to 63 characters
* - remove trailing `-` characters
* @param envVar to be slugged
*/
export function slug_cs(envVar: string): string {
return removeTrailingHyphens(
removeLeadingHyphens(replaceAnyNonAlphanumericCharacter(envVar)).substring(
0,
MAX_SLUG_STRING_SIZE
)
)
}
/**
* slug will take envVar and then :
* - put the variable content in lower case
* - replace any character by `-` except `0-9`, `a-z`, `.`, and `_`
* - remove leading `-` characters
* - limit the string size to 63 characters
* - remove trailing `-` characters
* @param envVar to be slugged
*/
export function slug(envVar: string): string {
return slug_cs(envVar.toLowerCase())
}
/**
* slugref_cs will take envVar and then :
* - remove refs/(heads|tags|pull)/
* - replace any character by `-` except `0-9`, `a-z`, `.`, and `_`
* - remove leading `-` characters
* - limit the string size to 63 characters
* - remove trailing `-` characters
* @param envVar to be slugged
*/
export function slugref_cs(envVar: string): string {
return slug_cs(removeRef(envVar))
}
/**
* slugref will take envVar and then :
* - remove refs/(heads|tags|pull)/
* - put the variable content in lower case
* - replace any character by `-` except `0-9`, `a-z`, `.`, and `_`
* - remove leading `-` characters
* - limit the string size to 63 characters
* - remove trailing `-` characters
* @param envVar to be slugged
*/
export function slugref(envVar: string): string {
return slugref_cs(envVar.toLowerCase())
}
/**
* slugurl_cs will take envVar and then :
* - replace any character by `-` except `0-9`, `a-z`
* - remove leading `-` characters
* - limit the string size to 63 characters
* - remove trailing `-` characters
* @param envVar to be slugged
*/
export function slugurl_cs(envVar: string): string {
return slug_cs(replaceAnyNonUrlCharactersWithHyphen(envVar))
}
/**
* slugurl will take envVar and then :
* - put the variable content in lower case
* - replace any character by `-` except `0-9`, `a-z`
* - remove leading `-` characters
* - limit the string size to 63 characters
* - remove trailing `-` characters
* @param envVar to be slugged
*/
export function slugurl(envVar: string): string {
return slugurl_cs(envVar.toLowerCase())
}
/**
* slugurlref_cs will take envVar and then :
* - remove refs/(heads|tags|pull)/
* - replace any character by `-` except `0-9`, `a-z`
* - remove leading `-` characters
* - limit the string size to 63 characters
* - remove trailing `-` characters
* @param envVar to be slugged
*/
export function slugurlref_cs(envVar: string): string {
return slugurl_cs(removeRef(envVar))
}
/**
* slugurlref will take envVar and then :
* - remove refs/(heads|tags|pull)/
* - put the variable content in lower case
* - replace any character by `-` except `0-9`, `a-z`
* - remove leading `-` characters
* - limit the string size to 63 characters
* - remove trailing `-` characters
* @param envVar to be slugged
*/
export function slugurlref(envVar: string): string {
return slugurlref_cs(envVar.toLowerCase())
}
function removeLeadingHyphens(envVar: string): string {
return envVar.replace(RegExp('^-*', 'g'), '')
}
function removeTrailingHyphens(envVar: string): string {
return envVar.replace(RegExp('-*$', 'g'), '')
}
function replaceAnyNonAlphanumericCharacter(envVar: string): string {
return envVar.replace(RegExp('[^a-zA-Z0-9._]', 'g'), '-')
}
function replaceAnyNonUrlCharactersWithHyphen(envVar: string): string {
return envVar.replace(RegExp('[._]', 'g'), '-')
}
export function removeRef(envVar: string): string {
return envVar.replace(RegExp('^refs/(heads|tags|pull)/'), '')
}

12
tsconfig.json Normal file
View File

@@ -0,0 +1,12 @@
{
"compilerOptions": {
"target": "es6", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */
"module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */
"outDir": "./lib", /* Redirect output structure to the directory. */
"rootDir": "./src", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
"strict": true, /* Enable all strict type-checking options. */
"noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */
"esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
},
"exclude": ["node_modules", "**/*.test.ts"]
}