Skip to content

Commit efbc673

Browse files
committed
Add --prefix param to cli command and github action [default: v]
Breaking change: refs/tags/1.0.3 is no longer prefixed with v
1 parent 732dab4 commit efbc673

5 files changed

Lines changed: 149 additions & 38 deletions

File tree

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1+
/.upkg
12
/results.tap

README.md

Lines changed: 39 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,34 @@ you need the container image tag variant.
66

77
## Behavior
88

9-
| git ref | program version |
10-
| -------------------------------------------------------------- | --------------- |
11-
| `refs/heads/main` | `main` |
12-
| `refs/heads/master` | `master` |
13-
| `refs/heads/ft-refactor` | `ft-refactor` |
14-
| `refs/tags/v1.0.3` | `v1.0.3` |
15-
| `refs/tags/1.0.3` | `v1.0.3` |
16-
| `refs/tags/very-pinned` (treated just like branches) | `very-pinned` |
17-
| `refs/tags/f1.0.3` (treated just like branches) | `f1.0.3` |
18-
| `refs/tags/v` | `v` |
19-
| `e02d09699ffb56440f34cb7448a0bc436e3ae212` (i.e. non-symbolic) | `e02d0969` |
20-
| `e02d09699ffb56440f34cb7448` (not 40 hex chars) | error |
21-
| `master` (no `refs/heads/` prefix) | error |
22-
| `v1.0.3` (no `refs/tags/` prefix) | error |
23-
| `refs/heads/` (empty branch name) | error |
24-
| `refs/tags/` (empty tag name) | error |
9+
| git ref | program version | prefix |
10+
| -------------------------------------------------------------- | -------------------- | ---------- |
11+
| `refs/heads/main` | `main` | `v` |
12+
| `refs/heads/master` | `master` | `v` |
13+
| `refs/heads/ft-refactor` | `ft-refactor` | `v` |
14+
| `refs/tags/v1.0.3` | `v1.0.3` | `v` |
15+
| `refs/tags/v1.0.3` | `v1.0.3` | `v` |
16+
| `refs/tags/1.0.3` | `1.0.3` | `v` |
17+
| `refs/tags/very-pinned` (prefix must be followed by a number) | `very-pinned` | `v` |
18+
| `refs/tags/v` | `v` | `v` |
19+
| `refs/tags/f1.0.3` (treated just like branches) | `f1.0.3` | `v` |
20+
| `e02d09699ffb56440f34cb7448a0bc436e3ae212` (i.e. non-symbolic) | `e02d0969` | `v` |
21+
| `e02d09699ffb56440f34cb7448` (not 40 hex chars) | error | `v` |
22+
| `master` (no `refs/heads/` prefix) | error | `v` |
23+
| `v1.0.3` (no `refs/tags/` prefix) | error | `v` |
24+
| `refs/heads/` (empty branch name) | error | `v` |
25+
| `refs/tags/` (empty tag name) | error | `v` |
26+
| **Custom prefix** | | |
27+
| `refs/heads/main` | `main` | `mytool-v` |
28+
| `refs/heads/mytool-vmain` | `mytool-vmain` | `mytool-v` |
29+
| `refs/tags/v1.0.3` | `v1.0.3` | `mytool-v` |
30+
| `refs/tags/mytool-v1.0.3` | `v1.0.3` | `mytool-v` |
31+
| `refs/tags/mytool-v1` | `v1` | `mytool-v` |
32+
| `refs/tags/mytool-v1.0.3` (prefix=`v`) | `mytool-v1.0.3` | `v` |
33+
| `refs/tags/1.0.3` | `1.0.3` | `mytool-v` |
34+
| `refs/tags/mytool-very-pinned` | `mytool-very-pinned` | `mytool-v` |
35+
| `refs/tags/mytool-v3ry-pinned` | `v3ry-pinned` | `mytool-v` |
36+
| `refs/tags/mytool-v` | `mytool-v` | `mytool-v` |
2537

2638
## CLI
2739

@@ -46,10 +58,18 @@ version=$(program-version "$(jq -re '.version // empty' "$PKGROOT/upkg.json" 2>/
4658

4759
## GitHub action
4860

49-
### Parameters
61+
### Inputs
5062

51-
- `ref`: The git ref to calculate the version from, defaults to
52-
`${{ github.ref }}`.
63+
| Name | Description | Default |
64+
| -------- | ------------------------------------------ | ------------------- |
65+
| `ref` | The git ref to calculate the version from. | `${{ github.ref }}` |
66+
| `prefix` | Prefix to replace with 'v' in tags. | `v` |
67+
68+
### Outputs
69+
70+
| Name | Description |
71+
| --------- | -------------------- |
72+
| `version` | The program version. |
5373

5474
### Usage
5575

action.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ inputs:
55
description: The git ref to use. Defaults to `github.ref`.
66
default: ${{ github.ref }}
77
required: false
8+
prefix:
9+
description: Prefix to replace with 'v' in tags. Defaults to `v``.
10+
default: ${{ github.ref }}
11+
required: false
812
outputs:
913
version:
1014
description: The program version

bin/program-version

Lines changed: 48 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,58 @@
11
#!/usr/bin/env bash
2+
# shellcheck source-path=..
3+
set -Eeo pipefail; shopt -s inherit_errexit
24

35
main() {
4-
set -eo pipefail; shopt -s inherit_errexit
6+
[[ $# -ge 1 ]] || usage
7+
[[ $# -le 3 ]] || usage
8+
local REF P='v'
9+
while [[ $# -gt 0 ]]; do
10+
[[ $1 != --help ]] || usage
11+
if [[ $1 = --prefix=* ]]; then
12+
[[ $P = 'v' ]] || usage
13+
P=${1#'--prefix='}
14+
elif [[ $1 = '--prefix' ]]; then
15+
[[ $# -ge 1 && $P = 'v' ]] || usage
16+
shift
17+
P=$1
18+
elif [[ $1 = '-p' ]]; then
19+
[[ $# -ge 1 && $P = 'v' ]] || usage
20+
shift
21+
P=$1
22+
elif [[ $1 = '-p'* ]]; then
23+
[[ $P = 'v' ]] || usage
24+
P=${1#'-p'}
25+
else
26+
[[ -z $REF ]] || usage
27+
REF=$1
28+
fi
29+
shift
30+
done
31+
[[ -n $REF ]] || usage
532

6-
local ref=${1:?'Usage: program-version REF'}
7-
if [[ $ref =~ refs/tags/v?[0-9]+ ]]; then
8-
local tag=${ref#'refs/tags/'}
9-
printf "v%s\n" "${tag#v}"
10-
elif [[ $ref = refs/tags/* ]]; then
11-
printf "%s\n" "${ref#'refs/tags/'}"
12-
elif [[ $ref = refs/heads/?* ]]; then
13-
printf "%s\n" "${ref#'refs/heads/'}"
14-
elif [[ $ref =~ ^[0-9a-f]{40}$ ]]; then
15-
printf "%s\n" "${ref:0:8}"
33+
if [[ $REF = refs/tags/${P}* && ${REF#"refs/tags/$P"} =~ ^[0-9] ]]; then
34+
printf "v%s\n" "${REF#"refs/tags/$P"}"
35+
elif [[ $REF = refs/tags/* ]]; then
36+
printf "%s\n" "${REF#'refs/tags/'}"
37+
elif [[ $REF = refs/heads/* ]]; then
38+
printf "%s\n" "${REF#'refs/heads/'}"
39+
elif [[ $REF =~ ^[0-9a-f]{40}$ ]]; then
40+
printf "%s\n" "${REF:0:8}"
1641
else
17-
printf "program-version.sh: REF must start with refs/tags/, refs/heads/, or be a shasum. Got '%s'.\n" "$ref" >&2
42+
printf "program-version: REF must start with refs/tags/, refs/heads/, or be a shasum. Got '%s'.\n" "$REF" >&2
1843
return 1
1944
fi
2045
}
2146

47+
usage() {
48+
printf "program-version - Determine the program version based on a git ref.
49+
Usage:
50+
program-version [-p P] REF
51+
52+
Options:
53+
-p --prefix P Prefix to replace with 'v' in tags [default: v]
54+
" >&2
55+
return 1
56+
}
57+
2258
main "$@"

test.bats

Lines changed: 57 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,26 +25,26 @@ setup_file() {
2525
[ "$output" = "v1.0.3" ]
2626
}
2727

28-
@test 'refs/tags/1.0.3=v1.0.3' {
28+
@test 'refs/tags/1.0.3=1.0.3' {
2929
run bin/program-version refs/tags/1.0.3
30-
[ "$output" = "v1.0.3" ]
30+
[ "$output" = "1.0.3" ]
3131
}
3232

3333
@test 'refs/tags/very-pinned=very-pinned' {
3434
run bin/program-version refs/tags/very-pinned
3535
[ "$output" = "very-pinned" ]
3636
}
3737

38-
@test 'refs/tags/f1.0.3=f1.0.3' {
39-
run bin/program-version refs/tags/f1.0.3
40-
[ "$output" = "f1.0.3" ]
41-
}
42-
4338
@test 'refs/tags/v=v' {
4439
run bin/program-version refs/tags/v
4540
[ "$output" = "v" ]
4641
}
4742

43+
@test 'refs/tags/f1.0.3=f1.0.3' {
44+
run bin/program-version refs/tags/f1.0.3
45+
[ "$output" = "f1.0.3" ]
46+
}
47+
4848
@test 'e02d09699ffb56440f34cb7448a0bc436e3ae212=e02d0969' {
4949
run bin/program-version e02d09699ffb56440f34cb7448a0bc436e3ae212
5050
[ "$output" = "e02d0969" ]
@@ -69,3 +69,53 @@ setup_file() {
6969
@test 'refs/tags=error' {
7070
run -1 bin/program-version refs/tags
7171
}
72+
73+
@test '-p=mytool-v refs/heads/main=main' {
74+
run bin/program-version -p mytool-v refs/heads/main
75+
[ "$output" = "main" ]
76+
}
77+
78+
@test '-p=mytool-v refs/heads/mytool-vmain=mytool-vmain' {
79+
run bin/program-version -p mytool-v refs/heads/mytool-vmain
80+
[ "$output" = "mytool-vmain" ]
81+
}
82+
83+
@test '-p=mytool-v refs/tags/v1.0.3=v1.0.3' {
84+
run bin/program-version -p mytool-v refs/tags/v1.0.3
85+
[ "$output" = "v1.0.3" ]
86+
}
87+
88+
@test '-p=mytool-v refs/tags/mytool-v1.0.3=v1.0.3' {
89+
run bin/program-version -p mytool-v refs/tags/mytool-v1.0.3
90+
[ "$output" = "v1.0.3" ]
91+
}
92+
93+
@test '-p=mytool-v refs/tags/mytool-v1=v1' {
94+
run bin/program-version -p mytool-v refs/tags/mytool-v1
95+
[ "$output" = "v1" ]
96+
}
97+
98+
@test '-p=v refs/tags/mytool-v1.0.3=mytool-v1.0.3' {
99+
run bin/program-version -p v refs/tags/mytool-v1.0.3
100+
[ "$output" = "mytool-v1.0.3" ]
101+
}
102+
103+
@test '-p=mytool-v refs/tags/1.0.3=1.0.3' {
104+
run bin/program-version -p mytool-v refs/tags/1.0.3
105+
[ "$output" = "1.0.3" ]
106+
}
107+
108+
@test '-p=mytool-v refs/tags/mytool-very-pinned=mytool-very-pinned' {
109+
run bin/program-version -p mytool-v refs/tags/mytool-very-pinned
110+
[ "$output" = "mytool-very-pinned" ]
111+
}
112+
113+
@test '-p=mytool-v refs/tags/mytool-v3ry-pinned=v3ry-pinned' {
114+
run bin/program-version -p mytool-v refs/tags/mytool-v3ry-pinned
115+
[ "$output" = "v3ry-pinned" ]
116+
}
117+
118+
@test '-p=mytool-v refs/tags/mytool-v=mytool-v' {
119+
run bin/program-version -p mytool-v refs/tags/mytool-v
120+
[ "$output" = "mytool-v" ]
121+
}

0 commit comments

Comments
 (0)