flake/modules/home/terminal/hr.nix
2026-01-20 14:39:01 +00:00

134 lines
4.2 KiB
Nix
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
pkgs,
lib,
config,
...
}: let
cfg = config.mods.terminal;
hr-script = pkgs.writeShellScriptBin "hr" ''
#!/usr/bin/env bash
set -e
if [ "$1" = "init" ] && [ "$2" = "py" ]; then
echo "Initializing python devenv..."
# 1. Init devenv
if [ -f .gitignore ]; then
cp .gitignore .gitignore.bak
fi
if command -v devenv >/dev/null; then
devenv init
echo "Direnv allowed"
else
echo "Error: devenv not found in path."
exit 1
fi
if [ -f .gitignore.bak ]; then
mv .gitignore.bak .gitignore
elif [ -f .gitignore ]; then
rm .gitignore
fi
# 2. Replace devenv.nix
cat <<EOF > devenv.nix
{pkgs, ...}: {
packages = [ pkgs.google-cloud-sdk ];
languages.python = {
enable = true;
venv.enable = true;
uv = {
enable = true;
sync.enable = false;
};
};
# We use the named index "google" defined in pyproject.toml
# This environment variable overrides the URL for that index, allow it to be configured here
env.UV_INDEX_GOOGLE_URL = "https://europe-west1-python.pkg.dev/mk2-prod/python-packages/simple/";
env.UV_INDEX_GOOGLE_USERNAME = "oauth2accesstoken";
enterShell = \'\'
if ! gcloud auth print-access-token >/dev/null 2>&1; then
echo " gcloud not authenticated. Run 'gcloud auth login' to access Google Artifact Registry."
else
export UV_INDEX_GOOGLE_PASSWORD=$(gcloud auth print-access-token)
fi
uv sync
\'\';
}
EOF
# 3. Add to local git exclude
if git rev-parse --git-dir > /dev/null 2>&1; then
EXCLUDE_FILE=$(git rev-parse --git-path info/exclude)
mkdir -p "$(dirname "$EXCLUDE_FILE")"
IGNORES=(
".devenv\*"
".direnv"
"devenv.nix"
"devenv.yaml"
"devenv.lock"
"uv.lock"
".envrc"
)
for file in "''${IGNORES[@]}"; do
if ! grep -q "^$file$" "$EXCLUDE_FILE"; then
echo "$file" >> "$EXCLUDE_FILE"
echo "Added $file to local git exclude ($EXCLUDE_FILE)"
fi
done
else
echo "Warning: Not a git repository. Skipping git ignore setup."
fi
# 5. Install dependencies
echo "Installing dependencies..."
direnv exec . pip install keyrings.google-artifactregistry-auth==1.1.2
if [ -f pyproject.toml ]; then
# Extract optional dependencies from [project.optional-dependencies]
OPTIONALS=$(sed -n '/^\[project.optional-dependencies\]/,/^\[/p' pyproject.toml | grep -v '^\[' | grep '=' | cut -d= -f1 | tr -d ' \t' | tr '\n' ',' | sed 's/,$//')
if [ -n "$OPTIONALS" ]; then
echo "Found optional dependencies: $OPTIONALS"
direnv exec . pip install -e ".[$OPTIONALS]"
else
echo "No optional dependencies found in pyproject.toml."
direnv exec . pip install -e .
fi
elif [ -f requirements.txt ]; then
echo "Installing from requirements.txt..."
pip install -r requirements.txt
fi
# 4. Allow direnv
if command -v direnv >/dev/null; then
direnv allow
echo "Direnv allowed"
else
echo "Error: direnv not found in path."
exit 1
fi
else
echo "Usage: hr init py"
echo " init py Initialize a python devenv environment (git-ignored)"
exit 1
fi
'';
in {
options.mods.terminal.hr.enable = lib.mkEnableOption "Hefring (Work Tooling)";
config = lib.mkIf cfg.hr.enable {
home.packages = [hr-script];
};
}