feat(release): SemVer + ludicc --version, changesets, and x release
The project had no versioning discipline: 0 tags, no CHANGELOG, no way for the compiler to report a version. Add a lightweight, native release flow. - Versioning: SemVer, with VERSION as the single source of truth. `ludicc --version` (and `ludic --version`) read it at runtime — so a bump touches one file and never reseeds the compiler. `x version` reports it too. - Changesets: one small Markdown file per user-facing change under changes/ (bump level + type + summary; see changes/README.md). This replaces "remember to edit the changelog" with a mergeable artifact, no Node changeset tool. - `x release [major|minor|patch] [--publish]`: fold the pending changesets into a new CHANGELOG.md section (grouped by type), bump VERSION, commit, and tag vX.Y.Z. The level defaults to the highest changeset bump. `--publish` also pushes and creates the Forgejo release with source + toolchain tarballs; tools/ci/forgejo_release.py is the small stdlib-Python HTTP glue for the release API (a native Http client is issue #6). Seed the initial changesets describing the shipped surface; the first `x release` turns them into the v0.1.0 CHANGELOG. Reseeded for the --version flag; C-free bootstrap fixpoint holds; suites 56 / 29 / 29 on macOS, 51 / 28 (+skips) on Linux CI, bootstrap-cfree byte-identical on both. Part of the repository-cleanup / DX pass (with #32, #34). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
709465cdd8
commit
fed80f2152
15 changed files with 787 additions and 293 deletions
|
|
@ -51,6 +51,24 @@ function die(msg: pointer) -> void {
|
|||
exit(1)
|
||||
}
|
||||
|
||||
# strip trailing newline/carriage-return/space (the VERSION file's trailing \n)
|
||||
function chomp(s: pointer) -> pointer {
|
||||
var n = len(s)
|
||||
while (n > 0) and ((s[n - 1] == 10) or (s[n - 1] == 13) or (s[n - 1] == 32)) { n = n - 1 }
|
||||
return s[0..n]
|
||||
}
|
||||
|
||||
# print "ludic <version>" and exit. The version is read at runtime from the
|
||||
# VERSION file next to LUDIC_HOME (the single source of truth a release bumps),
|
||||
# so a version change never requires reseeding the compiler.
|
||||
function show_version() -> void {
|
||||
let home = ensure_slash(getenv_or("LUDIC_HOME", dir_of(arg(0))))
|
||||
let v = read_file(path_join(home, "VERSION"))
|
||||
if (v == null) { print("ludic (version unknown)") }
|
||||
else { print(`ludic {chomp(v)}`) }
|
||||
exit(0)
|
||||
}
|
||||
|
||||
entry {
|
||||
var path = null
|
||||
var out = null
|
||||
|
|
@ -66,7 +84,8 @@ entry {
|
|||
var ai = 1
|
||||
while ai < arg_count() {
|
||||
let a = arg(ai)
|
||||
if (a == ("--windowed")) { want = 1 }
|
||||
if (a == ("--version")) { show_version() }
|
||||
else { if (a == ("--windowed")) { want = 1 }
|
||||
else { if (a == ("--headless")) { want = 2 }
|
||||
else { if (a == ("--emit-llvm")) { emit_ir = true }
|
||||
else { if (a == ("--fmt")) { fmt = true }
|
||||
|
|
@ -80,7 +99,7 @@ entry {
|
|||
let m = `ludicc: ignoring unknown flag {a}\n`
|
||||
file_write(file_stderr(), m, len(m))
|
||||
} else { path = a }
|
||||
} } } } } } }
|
||||
} } } } } } } }
|
||||
ai = ai + 1
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue