disko cli: add --version command

Fixes #745

This adds a script to create a release. Running it will create two
commits that would appear like this in `git log --oneline`:

    67b5fff (master) release: reset released flag
    0b808f3 (tag: v1.8.1) release: v1.8.1
    100d2f3 docs: last change before release

It also re-creates the `version.nix` file, which is used by the flake
to determine the final version the disko CLI will print.

If `disko --version` is run from exactly the commit tagged `v1.8.1`, it
will print `1.8.1`. If it is run from any commit past that (like
master), it will print `1.8.1-67b5fff`, and if it is run from a local
folder with uncommitted changes, it will print `1.8.1-67b5fff-dirty`.
This commit is contained in:
Felix Uhl
2024-10-11 15:14:56 +00:00
committed by mergify[bot]
parent 6af4e02b9c
commit aee84b5fb3
7 changed files with 105 additions and 8 deletions
+14
View File
@@ -10,6 +10,10 @@ declare disko_config
mode=mount
nix_args=()
# DISKO_VERSION is set by the wrapper in package.nix
DISKO_VERSION="${DISKO_VERSION:="unknown! This is a bug, please report it!"}"
onlyPrintVersion=false
showUsage() {
cat <<USAGE
Usage: $0 [options] disk-config.nix
@@ -92,6 +96,9 @@ while [[ $# -gt 0 ]]; do
--show-trace)
nix_args+=("$1")
;;
--version)
onlyPrintVersion=true
;;
*)
if [ -z ${disko_config+x} ]; then
disko_config=$1
@@ -104,6 +111,13 @@ while [[ $# -gt 0 ]]; do
shift
done
if [[ "$onlyPrintVersion" = true ]]; then
echo "$DISKO_VERSION"
exit 0
fi
# Always print version information to help with debugging
echo "disko version $DISKO_VERSION"
nixBuild() {
if command -v nom-build > /dev/null; then
nom-build "$@"
+12 -5
View File
@@ -8,13 +8,17 @@
outputs = { self, nixpkgs, ... }:
let
lib = nixpkgs.lib;
supportedSystems = [
"x86_64-linux"
"i686-linux"
"aarch64-linux"
"riscv64-linux"
];
forAllSystems = nixpkgs.lib.genAttrs supportedSystems;
forAllSystems = lib.genAttrs supportedSystems;
versionInfo = import ./version.nix;
version = versionInfo.version + (lib.optionalString (!versionInfo.released) "-dirty");
in
{
nixosModules.default = self.nixosModules.disko; # convention
@@ -27,12 +31,14 @@
pkgs = nixpkgs.legacyPackages.${system};
in
{
disko = pkgs.callPackage ./package.nix { };
disko = pkgs.callPackage ./package.nix { diskoVersion = version; };
# alias to make `nix run` more convenient
disko-install = self.packages.${system}.disko.overrideAttrs (_old: {
name = "disko-install";
});
default = self.packages.${system}.disko;
create-release = pkgs.callPackage ./scripts/create-release.nix { };
} // pkgs.lib.optionalAttrs (!pkgs.buildPlatform.isRiscV64) {
disko-doc = pkgs.callPackage ./doc.nix { };
});
@@ -42,7 +48,7 @@
let
pkgs = nixpkgs.legacyPackages.${system};
# FIXME: aarch64-linux seems to hang on boot
nixosTests = nixpkgs.lib.optionalAttrs pkgs.hostPlatform.isx86_64 (import ./tests {
nixosTests = lib.optionalAttrs pkgs.hostPlatform.isx86_64 (import ./tests {
inherit pkgs;
makeTest = import (pkgs.path + "/nixos/tests/make-test-python.nix");
eval-config = import (pkgs.path + "/nixos/lib/eval-config.nix");
@@ -50,6 +56,7 @@
disko-install = pkgs.callPackage ./tests/disko-install {
inherit self;
diskoVersion = version;
};
shellcheck = pkgs.runCommand "shellcheck" { nativeBuildInputs = [ pkgs.shellcheck ]; } ''
@@ -59,13 +66,13 @@
'';
in
# FIXME: aarch64-linux seems to hang on boot
nixpkgs.lib.optionalAttrs pkgs.hostPlatform.isx86_64 (nixosTests // { inherit disko-install; }) //
lib.optionalAttrs pkgs.hostPlatform.isx86_64 (nixosTests // { inherit disko-install; }) //
pkgs.lib.optionalAttrs (!pkgs.buildPlatform.isRiscV64 && !pkgs.hostPlatform.isx86_32) {
inherit shellcheck;
inherit (self.packages.${system}) disko-doc;
});
nixosConfigurations.testmachine = nixpkgs.lib.nixosSystem {
nixosConfigurations.testmachine = lib.nixosSystem {
system = "x86_64-linux";
modules = [
./tests/disko-install/configuration.nix
+2 -1
View File
@@ -1,4 +1,4 @@
{ stdenvNoCC, makeWrapper, lib, path, nix, coreutils, nixos-install-tools, binlore }:
{ stdenvNoCC, makeWrapper, lib, path, nix, coreutils, nixos-install-tools, binlore, diskoVersion }:
let
self = stdenvNoCC.mkDerivation (finalAttrs: {
@@ -15,6 +15,7 @@ let
sed -e "s|libexec_dir=\".*\"|libexec_dir=\"$out/share/disko\"|" "$i" > "$out/bin/$i"
chmod 755 "$out/bin/$i"
wrapProgram "$out/bin/$i" \
--set DISKO_VERSION "${diskoVersion}" \
--prefix PATH : ${lib.makeBinPath [ nix coreutils nixos-install-tools ]} \
--prefix NIX_PATH : "nixpkgs=${path}"
done
+18
View File
@@ -0,0 +1,18 @@
{
lib,
writeShellApplication,
bash,
coreutils,
git,
nix-fast-build,
}:
writeShellApplication {
name = "create-release";
runtimeInputs = [
bash
git
coreutils
nix-fast-build
];
text = lib.readFile ./create-release.sh;
}
+56
View File
@@ -0,0 +1,56 @@
# Don't run directly! Instead, use
# nix run .#create-release
version=${1:-}
if [[ -z "$version" ]]; then
echo "USAGE: nix run .#create-release -- <version>" >&2
exit 1
fi
# Check if we're running from the root of the repository
if [[ ! -f "flake.nix" || ! -f "version.nix" ]]; then
echo "This script must be run from the root of the repository" >&2
exit 1
fi
# Check if the version matches the semver pattern (without suffixes)
semver_regex="^([0-9]+)\.([0-9]+)\.([0-9]+)$"
if [[ ! "$version" =~ $semver_regex ]]; then
echo "Version must match the semver pattern (e.g., 1.0.0, 2.3.4)" >&2
exit 1
fi
if [[ "$(git symbolic-ref --short HEAD)" != "master" ]]; then
echo "must be on master branch" >&2
exit 1
fi
# Ensure there are no uncommitted or unpushed changes
uncommited_changes=$(git diff --compact-summary)
if [[ -n "$uncommited_changes" ]]; then
echo -e "There are uncommited changes, exiting:\n${uncommited_changes}" >&2
exit 1
fi
git pull git@github.com:nix-community/disko master
unpushed_commits=$(git log --format=oneline origin/master..master)
if [[ "$unpushed_commits" != "" ]]; then
echo -e "\nThere are unpushed changes, exiting:\n$unpushed_commits" >&2
exit 1
fi
# Run all tests to ensure we don't release a broken version
# Two workers are safe on systems with at least 16GB of RAM
nix-fast-build --no-link -j 2 --eval-workers 2 --flake .#checks
# Update the version file
echo "{ version = \"$version\"; released = true; }" > version.nix
# Commit and tag the release
git commit -am "release: v$version"
git tag -a "v$version" -m "release: v$version"
# a revsion suffix when run from the tagged release commit
echo "{ version = \"$version\"; released = false; }" > version.nix
git commit -am "release: reset released flag"
echo "now run 'git push --tags origin master'"
+2 -2
View File
@@ -1,6 +1,6 @@
{ pkgs ? import <nixpkgs> { }, self }:
{ pkgs ? import <nixpkgs> { }, self, diskoVersion }:
let
disko = pkgs.callPackage ../../package.nix { };
disko = pkgs.callPackage ../../package.nix { inherit diskoVersion; };
dependencies = [
self.nixosConfigurations.testmachine.pkgs.stdenv.drvPath
+1
View File
@@ -0,0 +1 @@
{ version = "1.8.0"; released = false; }