Skip to content

Commit 50dcb12

Browse files
authored
Merge pull request #305 from OpenSourceAWE/agent/280-bin-release-the-version-check-scans-ever
bin/release: the version check scans every `## ` header, so an `## Unreleased` section makes it re-register the last release
2 parents 0f958d0 + 5bd8329 commit 50dcb12

3 files changed

Lines changed: 73 additions & 1 deletion

File tree

bin/release

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ if [[ -z "$_version" ]]; then
5353
exit 1
5454
fi
5555

56-
_changelog_version=$(awk '/^## / {for (i = 1; i <= NF; i++) if ($i ~ /^v[0-9]/) {print $i; exit}}' CHANGELOG.md)
56+
_changelog_version=$(awk '/^## / {for (i = 1; i <= NF; i++) if ($i ~ /^v[0-9]/) print $i; exit}' CHANGELOG.md)
5757
if [[ "$_changelog_version" != "v$_version" ]]; then
5858
echo "Version mismatch: Project.toml is $_version but CHANGELOG top is" \
5959
"$_changelog_version (expected v$_version)." >&2

test/bin/test_release.jl

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
using Test
2+
3+
"""
4+
dry_run_release(top_header, older_header) -> (exit_code, stderr_text)
5+
6+
Run `bin/release --dry-run` against a throwaway repository at version 5.0.0
7+
whose `CHANGELOG.md` holds a section under each of the two headers, with a stub
8+
`gh` on `PATH` so nothing reaches GitHub.
9+
"""
10+
function dry_run_release(top_header, older_header)
11+
root = mktempdir()
12+
repo = mkpath(joinpath(root, "repo"))
13+
write(joinpath(repo, "Project.toml"), """
14+
name = "Fixture"
15+
version = "5.0.0"
16+
""")
17+
write(joinpath(repo, "CHANGELOG.md"), """
18+
# Changelog
19+
20+
$top_header
21+
22+
### Added
23+
24+
- the newer note
25+
26+
$older_header
27+
28+
### Fixed
29+
30+
- the older note
31+
""")
32+
run(`git -C $repo init --quiet`)
33+
run(`git -C $repo add --all`)
34+
run(`git -C $repo -c user.email=fixture@example.com -c user.name=Fixture
35+
commit --quiet -m "fixture"`)
36+
37+
stub = mkpath(joinpath(root, "stub"))
38+
gh_stub = joinpath(stub, "gh")
39+
write(gh_stub, """
40+
#!/bin/bash
41+
case "\$1" in
42+
repo) echo "OpenSourceAWE/Fixture" ;;
43+
esac
44+
""")
45+
chmod(gh_stub, 0o755)
46+
47+
script = normpath(joinpath(@__DIR__, "..", "..", "bin", "release"))
48+
stderr_file = joinpath(root, "stderr.txt")
49+
env = copy(ENV)
50+
env["PATH"] = stub * ":" * ENV["PATH"]
51+
command = setenv(`bash $script --dry-run`, env; dir=repo)
52+
process = run(pipeline(ignorestatus(command); stdout=devnull, stderr=stderr_file))
53+
return process.exitcode, read(stderr_file, String)
54+
end
55+
56+
@testset "bin/release" begin
57+
@testset "release refuses an unversioned top section above the last release" begin
58+
exit_code, stderr_text =
59+
dry_run_release("## Unreleased", "## Fixture v5.0.0 2026-09-07")
60+
@test exit_code != 0
61+
@test occursin("Version mismatch", stderr_text)
62+
end
63+
64+
@testset "release accepts a top section naming the package version" begin
65+
exit_code, stderr_text =
66+
dry_run_release("## Fixture v5.0.0 2026-09-07", "## Fixture v4.3.1 2026-08-01")
67+
@test exit_code == 0
68+
@test isempty(stderr_text)
69+
end
70+
end

test/runtests.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,8 @@ function include_selected_tests()
6565
should_run_test("airfoil_aero/test_live_polar.jl") && include("airfoil_aero/test_live_polar.jl")
6666
should_run_test("obj_adapter/test_obj_adapter.jl") && include("obj_adapter/test_obj_adapter.jl")
6767
should_run_test("surfplan/test_surfplan.jl") && include("surfplan/test_surfplan.jl")
68+
# bin/release is a bash script, so only the unix runners can run it.
69+
Sys.isunix() && should_run_test("bin/test_release.jl") && include("bin/test_release.jl")
6870
should_run_test("Aqua.jl") && include("Aqua.jl")
6971
end
7072

0 commit comments

Comments
 (0)