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:
@@ -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 "$@"
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
Executable
+56
@@ -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'"
|
||||
@@ -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
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
{ version = "1.8.0"; released = false; }
|
||||
Reference in New Issue
Block a user