Files
lux/modules/capabilities/git.nix
T

102 lines
2.8 KiB
Nix

{ config, lib, ... }:
let
account = config.facts.account;
mkScope =
config: scope:
let
email = account.emails.${scope}.address;
key = config.facts.machine.sshKeys.${scope} or null;
hasSigningKey = key != null;
privateKeyPath =
if hasSigningKey && key.privateKeyPath != null then key.privateKeyPath else "~/.ssh/id_${scope}";
in
{
allowedSigners = lib.optional hasSigningKey "${email} ${key.publicKey}";
git = {
user = {
name = account.realName;
inherit email;
}
// lib.optionalAttrs hasSigningKey {
signingKey = "${privateKeyPath}.pub";
};
}
// lib.optionalAttrs hasSigningKey {
core.sshCommand = "ssh -i ${privateKeyPath} -o IdentitiesOnly=yes";
gpg.ssh.allowedSignersFile = "${config.xdg.configHome}/git/allowed_signers";
};
};
in
{
flake.modules.homeManager.git =
{ config, ... }:
let
personal = mkScope config "personal";
in
{
xdg.configFile."git/allowed_signers".text = lib.concatStringsSep "\n" personal.allowedSigners;
programs.git = {
enable = true;
signing.format = "ssh";
ignores = [
".claude/"
".codex"
];
settings = {
init.defaultBranch = "main";
user = {
name = account.realName;
email = account.emails.personal.address;
};
};
includes =
map
(path: {
condition = "gitdir:${path}/";
contents = personal.git;
})
[
account.nixosConfigurationPath
"${config.xdg.userDirs.projects}/own"
"${config.xdg.userDirs.projects}/ext"
"${config.xdg.userDirs.projects}/forks"
];
};
programs.gh = {
enable = true;
settings.git_protocol = "ssh";
};
};
flake.modules.homeManager.work-git =
{ config, pkgs, ... }:
let
work = mkScope config "work";
githubTokenFile = "${config.xdg.configHome}/yookr/github-read-only.token";
gh = pkgs.symlinkJoin {
name = "gh-with-read-only-token-${pkgs.gh.version}";
paths = [ pkgs.gh ];
nativeBuildInputs = [ pkgs.makeWrapper ];
meta.mainProgram = "gh";
postBuild = ''
wrapProgram "$out/bin/gh" \
--run 'if [[ -z "''${GH_TOKEN:-}" && -r "${githubTokenFile}" ]]; then export GH_TOKEN="$(< "${githubTokenFile}")"; fi'
'';
};
in
{
xdg.configFile."git/allowed_signers".text = lib.mkAfter (
lib.concatStringsSep "\n" work.allowedSigners
);
programs.git.includes = [
{
condition = "gitdir:${config.home.homeDirectory}/yookr/";
contents = work.git;
}
];
programs.gh.package = gh;
};
}