Give Effector a version and a changelog, shown from the menu

The version is the project() line of CMakeLists.txt and nowhere else:
CMake writes it, with the text of CHANGELOG.md, into a generated
core/version.hpp, so the number and the release notes the binary shows
are the ones it was built from. effector --version (-V) prints it, and
the header-bar menu gains a section with Changelog, a window laying the
Markdown out as headings and bullets, and About Effector.

The core tests hold the newest changelog entry to the current version,
so a bump cannot go in without its notes. Releases are tagged vX.Y.Z;
this is 0.5.0, and the changelog reconstructs 0.1.0-0.4.0 from the
history.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Si
2026-09-26 10:14:43 +02:00
co-authored by Claude Opus 5.5
parent 431fcf9c58
commit b9f905e04c
12 changed files with 350 additions and 2 deletions
+16
View File
@@ -24,6 +24,7 @@
#include "core/registry.hpp"
#include "core/rng.hpp"
#include "core/style.hpp"
#include "core/version.hpp"
#include "effects/blur.hpp"
#include "effects/grain.hpp"
#include "effects/monochrome.hpp"
@@ -1715,6 +1716,21 @@ int main() {
std::filesystem::remove_all(dir);
}
std::cout << "version\n";
{
// A release is the version in CMakeLists.txt and its entry at the top
// of CHANGELOG.md; bumping one without the other fails here.
const std::string_view log = kChangelog;
const auto newest = log.find("\n## [");
check(newest != std::string_view::npos &&
log.substr(newest + 5).starts_with(std::string(kVersion) + "]"),
"the newest changelog entry is this version");
const auto options = parsedOptions({"--version"});
check(options && options->showVersion, "--version is understood");
const auto shortOptions = parsedOptions({"-V"});
check(shortOptions && shortOptions->showVersion, "and so is -V");
}
std::cout << (failures == 0 ? "\nall checks passed\n" : "\n" + std::to_string(failures) + " failed\n");
return failures == 0 ? 0 : 1;
}