Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
124e634
refactor(mcl/dub): Remove deprecated dflags for improved build config…
monyarm Apr 2, 2025
80dfd51
fix(ci_matrix): Initialize params directly in ci_matrix function
monyarm Apr 2, 2025
c03af2c
feat(mcl/main): Integrate argparse for command-line argument parsing …
monyarm Apr 2, 2025
000ee13
feat(commands/get_fstab): Enhance get_fstab command with argparse int…
monyarm Apr 2, 2025
2eff735
feat(commands/deploy_spec): Enhance deploy_spec command with argparse…
monyarm Apr 2, 2025
3378d0e
feat(commands/host_info): Enhance host_info command with argparse int…
monyarm Apr 2, 2025
46131a9
feat(commands/config): Enhance config command with argparse integrati…
monyarm Apr 2, 2025
6463b58
feat(commands/machine): Enhance machine command with argparse integra…
monyarm Apr 2, 2025
02da4ea
feat(commands): Enhance ci/matrix commands with argparse integration …
monyarm Apr 2, 2025
96e0b8d
fix(actions): Correct command names in GitHub workflows and action co…
monyarm Apr 10, 2025
5c6224a
fix(commands/machine): Correct command name in createMachine function…
monyarm Apr 10, 2025
e413b22
feat(mcl): Add command aliases for backwards compatibility
monyarm Apr 11, 2025
30e153e
fix(mcl.commands): Fix function signature of `ci` and `ci_matrix` com…
PetarKirov Nov 14, 2025
ae0ac08
refactor(mcl.commands): Improve meta-programming to automatically def…
PetarKirov Nov 14, 2025
df6e63b
fix(mcl.commands.config): Update nixos config repo names
PetarKirov Nov 14, 2025
80f00e0
feat(mcl): `PascalCase` all command arg structs
reo101 Nov 18, 2025
7d473e1
refactor(mcl.commands): Use selective import for `argparse`
PetarKirov Nov 18, 2025
ad51992
style(mcl.commands): Reformat command definition
PetarKirov Nov 18, 2025
4587205
refactor(mcl.env): Remove the requirement of a `setup` function
PetarKirov Nov 18, 2025
cfd622a
feat(mcl): Upgrade `argparse`: `1.4.1` -> `2.0.2`
PetarKirov Nov 19, 2025
ccb2c67
fix(mcl.commands.shard_matrix): Fallback to `GITHUB_OUTPUT` env variable
PetarKirov Nov 18, 2025
6160e6e
Revert "fix(ci_matrix): Initialize params directly in ci_matrix funct…
PetarKirov Nov 19, 2025
2662d7a
refactor(): Remove Params and switch it to argparse
monyarm Nov 20, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/print-matrix/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ runs:
CACHIX_AUTH_TOKEN: ${{ inputs.cachix-auth-token }}
PRECALC_MATRIX: ${{ inputs.precalc_matrix }}
MCL_BRANCH: ${{ github.repository == 'metacraft-labs/nixos-modules' && github.sha || 'main' }}
run: nix run --accept-flake-config github:metacraft-labs/nixos-modules/${{ env.MCL_BRANCH }}#mcl print_table
run: nix run --accept-flake-config github:metacraft-labs/nixos-modules/${{ env.MCL_BRANCH }}#mcl print-table

- name: Update GitHub Comment
uses: marocchino/sticky-pull-request-comment@v2.9.0
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/reusable-flake-checks-ci-matrix.yml
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ jobs:
CACHIX_CACHE: ${{ vars.CACHIX_CACHE }}
CACHIX_AUTH_TOKEN: ${{ secrets.CACHIX_AUTH_TOKEN }}
MCL_BRANCH: ${{ github.repository == 'metacraft-labs/nixos-modules' && github.sha || 'main' }}
run: nix run --accept-flake-config github:metacraft-labs/nixos-modules/${{ env.MCL_BRANCH }}#mcl shard_matrix
run: nix run --accept-flake-config github:metacraft-labs/nixos-modules/${{ env.MCL_BRANCH }}#mcl shard-matrix
outputs:
gen_matrix: ${{ steps.generate-matrix.outputs.gen_matrix }}

Expand Down Expand Up @@ -100,7 +100,7 @@ jobs:
FLAKE_PRE: ${{ matrix.prefix }}
FLAKE_POST: ${{ matrix.postfix }}
MCL_BRANCH: ${{ github.repository == 'metacraft-labs/nixos-modules' && github.sha || 'main' }}
run: nix run --accept-flake-config github:metacraft-labs/nixos-modules/${{ env.MCL_BRANCH }}#mcl ci_matrix
run: nix run --accept-flake-config github:metacraft-labs/nixos-modules/${{ env.MCL_BRANCH }}#mcl ci-matrix

- uses: actions/upload-artifact@v5
with:
Expand Down Expand Up @@ -259,4 +259,4 @@ jobs:
CACHIX_AUTH_TOKEN: ${{ secrets.CACHIX_AUTH_TOKEN }}
CACHIX_ACTIVATE_TOKEN: '${{ secrets.CACHIX_ACTIVATE_TOKEN }}'
MCL_BRANCH: ${{ github.repository == 'metacraft-labs/nixos-modules' && github.sha || 'main' }}
run: nix run --accept-flake-config github:metacraft-labs/nixos-modules/${{ env.MCL_BRANCH }}#mcl deploy_spec
run: nix run --accept-flake-config github:metacraft-labs/nixos-modules/${{ env.MCL_BRANCH }}#mcl deploy-spec
4 changes: 1 addition & 3 deletions packages/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -67,9 +67,7 @@
}
// optionalAttrs (system == "x86_64-linux") {
mcl = pkgs.callPackage ./mcl {
buildDubPackage = inputs'.dlang-nix.legacyPackages.buildDubPackage.override {
dCompiler = inputs'.dlang-nix.packages."ldc-binary-1_38_0";
};
dCompiler = inputs'.dlang-nix.packages."ldc-binary-1_38_0";
inherit (legacyPackages.inputs.nixpkgs) cachix nix nix-eval-jobs;
};
};
Expand Down
32 changes: 22 additions & 10 deletions packages/mcl/default.nix
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
lib,
buildDubPackage,
dCompiler,
pkgs,
nix,
nix-eval-jobs,
Expand Down Expand Up @@ -43,9 +43,10 @@ let
]
);
in
buildDubPackage rec {
pkgs.buildDubPackage rec {
pname = "mcl";
version = "unstable";

src = lib.fileset.toSource {
root = ./.;
fileset = lib.fileset.fileFilter (
Expand All @@ -59,22 +60,33 @@ buildDubPackage rec {
) ./.;
};

inherit dCompiler;

dubLock = ./dub-lock.json;

nativeBuildInputs = [ pkgs.makeWrapper ] ++ deps;

postFixup = ''
wrapProgram $out/bin/${pname} --set PATH "${lib.makeBinPath deps}" --set LD_LIBRARY_PATH "${lib.makeLibraryPath deps}"
'';
dubBuildType = "debug";

dubBuildFlags = [
"-b"
"debug"
];
doCheck = true;

dubTestFlags = [
"--"
"-e"
excludedTests
(lib.escapeShellArg excludedTests)
];

installPhase = ''
runHook preInstall
install -Dm755 ./build/${pname} -t $out/bin/
runHook postInstall
'';

postFixup = ''
wrapProgram $out/bin/${pname} \
--set PATH "${lib.makeBinPath deps}" \
--set LD_LIBRARY_PATH "${lib.makeLibraryPath deps}"
'';

meta.mainProgram = pname;
}
20 changes: 20 additions & 0 deletions packages/mcl/dub-lock.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{
"dependencies": {
"argparse": {
"version": "2.0.2",
"sha256": "1p3496rcndgaf68mxizfi4wrkf5frgzzfpp9frlvbjnkinizb2q9"
},
"mir-core": {
"version": "1.7.3",
"sha256": "0yy1jg1b0i2n7xzkj5ykl1sg3qljna9nhjid4mfjz7ncybls49l9"
},
"mir-cpuid": {
"version": "1.2.11",
"sha256": "1gxrnvvy34cfi71p8a0s904z3zp1l7k9qvliacxmhvykxr1nhrsf"
},
"silly": {
"version": "1.1.1",
"sha256": "0fz7ib715sfk3w69i6xns5pwd4caahvfqjf32v13daxm1ms8xdzz"
}
}
}
3 changes: 1 addition & 2 deletions packages/mcl/dub.sdl
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,11 @@ buildType "unittest-debug" {
buildOptions "unittests" "debugMode" "debugInfo"
}

dflags "-preview=in"
dflags "-preview=shortenedMethods"
dflags "-defaultlib=libphobos2.so" platform="dmd"
lflags "-fuse-ld=gold" platform="dmd"
dflags "-mcpu=generic" platform="ldc"
dflags "-mcpu=baseline" platform="dmd"

dependency "mir-cpuid" version="~>1.2.11"
dependency "silly" version="~>1.1.1"
dependency "argparse" version="~>2.0.2"
3 changes: 2 additions & 1 deletion packages/mcl/dub.selections.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
{
"fileVersion": 1,
"versions": {
"mir-core": "1.7.1",
"argparse": "2.0.2",
"mir-core": "1.7.3",
"mir-cpuid": "1.2.11",
"silly": "1.1.1"
}
Expand Down
87 changes: 37 additions & 50 deletions packages/mcl/src/main.d
Original file line number Diff line number Diff line change
@@ -1,73 +1,60 @@
module mcl.main;

import std.stdio : writefln, writeln, stderr;
import std.array : replace;
import std.getopt : getopt;
import std.logger : infof, errorf, LogLevel;

import std.sumtype : SumType, match;
import std.string : stripRight, stripLeft;
import std.algorithm : endsWith;
import std.format : format;
import std.meta : staticMap;
import std.traits : Parameters;
import mcl.utils.path : rootDir;
import mcl.utils.tui : bold;

import cmds = mcl.commands;
import mcl.commands : SubCommandFunctions;

alias supportedCommands = imported!`std.traits`.AliasSeq!(
cmds.get_fstab,
cmds.deploy_spec,
cmds.ci_matrix,
cmds.print_table,
cmds.shard_matrix,
cmds.host_info,
cmds.ci,
cmds.machine,
cmds.config,
);
import argparse : Command, Description, SubCommand, NamedArgument, Default, CLI, matchCmd;

int main(string[] args)
@(Command(" ").Description(" "))
struct UnknownCommandArgs { }
int unknown_command(UnknownCommandArgs unused)
{
if (args.length < 2)
return wrongUsage("no command selected");
stderr.writeln("Unknown command. Use --help for a list of available commands.");
return 1;
}

string cmd = args[1];
LogLevel logLevel = LogLevel.info;
args.getopt("log-level", &logLevel);
struct MCLArgs
{
@NamedArgument(["log-level"])
LogLevel logLevel = cast(LogLevel)-1;

setLogLevel(logLevel);
SubCommand!(
staticMap!(Parameters, SubCommandFunctions),
Default!UnknownCommandArgs
) cmd;
}

infof("Git root: '%s'", rootDir.bold);
alias SumTypeCase(alias func) = (Parameters!func args) => func(args);

try switch (cmd)
{
default:
return wrongUsage("unknown command: `" ~ cmd ~ "`");
mixin CLI!MCLArgs.main!((args)
{
LogLevel logLevel = LogLevel.info;
if (args.logLevel != cast(LogLevel)-1)
logLevel = args.logLevel;
setLogLevel(logLevel);

static foreach (command; supportedCommands)
case __traits(identifier, command):
{
int result = args.cmd.matchCmd!(
staticMap!(SumTypeCase, unknown_command, SubCommandFunctions),
);

infof("Running %s task", cmd.bold);
command(args[2..$]);
infof("Execution Succesfull");
return 0;
}
}
catch (Exception e)
{
errorf("Task %s failed. Error:\n%s", cmd.bold, e);
return 1;
}
}
return 0;
});

void setLogLevel(LogLevel l)
{
import std.logger : globalLogLevel, sharedLog;
globalLogLevel = l;
(cast()sharedLog()).logLevel = l;
}

int wrongUsage(string error)
{
writefln("Error: %s.", error);
writeln("Usage:\n");
static foreach (cmd; supportedCommands)
writefln(" mcl %s", __traits(identifier, cmd));

return 1;
}
32 changes: 18 additions & 14 deletions packages/mcl/src/src/mcl/commands/ci.d
Original file line number Diff line number Diff line change
Expand Up @@ -8,31 +8,34 @@ import std.array : array, join;
import std.conv : to;
import std.process : ProcessPipes;

import mcl.utils.env : optional, parseEnv;
import mcl.commands.ci_matrix: nixEvalJobs, SupportedSystem, Params, flakeAttr;
import argparse : Command, Description;

import mcl.commands.ci_matrix: nixEvalJobs, SupportedSystem, flakeAttr, CiMatrixBaseArgs;
import mcl.commands.shard_matrix: generateShardMatrix;
import mcl.utils.path : rootDir, createResultDirs;
import mcl.utils.process : execute;
import mcl.utils.nix : nix;
import mcl.utils.json : toJSON;

Params params;

export void ci(string[] args)
{
params = parseEnv!Params;
@(Command("ci").Description("Run CI"))
struct CiArgs {
mixin CiMatrixBaseArgs!();
}

export int ci(CiArgs args)
{
auto shardMatrix = generateShardMatrix();
foreach (shard; shardMatrix.include)
{
params.flakePre = shard.prefix;
params.flakePost = shard.postfix;
args.flakePre = shard.prefix;
args.flakePost = shard.postfix;

if (params.flakePre == "")
if (args.flakePre == "")
{
params.flakePre = "checks";
args.flakePre = "checks";
}
string cachixUrl = "https://" ~ params.cachixCache ~ ".cachix.org";
string cachixUrl = "https://" ~ args.cachixCache ~ ".cachix.org";
version (AArch64) {
string arch = "aarch64";
}
Expand All @@ -47,8 +50,8 @@ export void ci(string[] args)
string os = "darwin";
}

auto matrix = flakeAttr(params.flakePre, arch, os, params.flakePost)
.nixEvalJobs(cachixUrl, false);
auto matrix = flakeAttr(args.flakePre, arch, os, args.flakePost)
.nixEvalJobs(cachixUrl, args, false);

foreach (pkg; matrix)
{
Expand All @@ -65,8 +68,9 @@ export void ci(string[] args)
"".writeln;
auto json = parseJSON(res.stdout.byLine.join("\n").to!string);
auto path = json.array[0]["outputs"]["out"].str;
execute(["cachix", "push", params.cachixCache, path], false, true).writeln;
execute(["cachix", "push", args.cachixCache, path], false, true).writeln;
}

}
return 0;
}
Loading
Loading