1
0
Fork 0
mirror of https://github.com/nix-community/home-manager synced 2024-09-30 10:17:27 +02:00
home-manager/modules/programs/gh.nix
Harsh Shandilya 2939d49036 gh: test for existence of hosts file
Having the module enabled but never using gh will result in the config file
existing but no hosts.yml. In that scenario we won't have anything to
migrate, so only test for hosts.yml.
2023-12-27 15:02:56 +05:30

164 lines
4.5 KiB
Nix

{ config, lib, pkgs, ... }:
with lib;
let
cfg = config.programs.gh;
yamlFormat = pkgs.formats.yaml { };
settingsType = types.submodule {
freeformType = yamlFormat.type;
# These options are only here for the mkRenamedOptionModule support
options = {
aliases = mkOption {
type = with types; attrsOf str;
default = { };
example = literalExpression ''
{
co = "pr checkout";
pv = "pr view";
}
'';
description = ''
Aliases that allow you to create nicknames for gh commands.
'';
};
editor = mkOption {
type = types.str;
default = "";
description = ''
The editor that gh should run when creating issues, pull requests, etc.
If blank, will refer to environment.
'';
};
git_protocol = mkOption {
type = types.str;
default = "https";
example = "ssh";
description = ''
The protocol to use when performing Git operations.
'';
};
};
};
in {
meta.maintainers = [ maintainers.gerschtli maintainers.berbiche ];
imports = (map (x:
mkRenamedOptionModule [ "programs" "gh" x ] [
"programs"
"gh"
"settings"
x
]) [ "aliases" "editor" ]) ++ [
(mkRenamedOptionModule [ "programs" "gh" "gitProtocol" ] [
"programs"
"gh"
"settings"
"git_protocol"
])
(mkRenamedOptionModule [ "programs" "gh" "enableGitCredentialHelper" ] [
"programs"
"gh"
"gitCredentialHelper"
"enable"
])
];
options.programs.gh = {
enable = mkEnableOption "GitHub CLI tool";
package = mkOption {
type = types.package;
default = pkgs.gh;
defaultText = literalExpression "pkgs.gh";
description = "Package providing {command}`gh`.";
};
settings = mkOption {
type = settingsType;
default = { };
description =
"Configuration written to {file}`$XDG_CONFIG_HOME/gh/config.yml`.";
example = literalExpression ''
{
git_protocol = "ssh";
prompt = "enabled";
aliases = {
co = "pr checkout";
pv = "pr view";
};
};
'';
};
gitCredentialHelper = {
enable = mkEnableOption "the gh git credential helper" // {
default = true;
};
hosts = mkOption {
type = types.listOf types.str;
default = [ "https://github.com" ];
description = "GitHub hosts to enable the gh git credential helper for";
example = literalExpression ''
[ "https://github.com" "https://github.example.com" ]
'';
};
};
extensions = mkOption {
type = types.listOf types.package;
default = [ ];
description = ''
gh extensions, see <https://cli.github.com/manual/gh_extension>.
'';
example = literalExpression "[ pkgs.gh-eco ]";
};
};
config = mkIf cfg.enable {
home.packages = [ cfg.package ];
xdg.configFile."gh/config.yml".source =
yamlFormat.generate "gh-config.yml" ({ version = "1"; } // cfg.settings);
# Version 2.40.0+ of gh needs to migrate account formats, this needs to
# happen before the version = 1 is placed in the configuration file. Running
# `gh help` is sufficient to perform the migration. If the migration already
# has occurred, then this is a no-op.
#
# See https://github.com/nix-community/home-manager/issues/4744 for details.
home.activation.migrateGhAccounts =
hm.dag.entryBetween [ "linkGeneration" ] [ "writeBoundary" ] ''
if [[ -e "${config.xdg.configHome}/gh/hosts.yml" ]]; then
(
TMP_DIR=$(mktemp -d)
trap "rm --force --recursive $TMP_DIR" EXIT
cp "${config.xdg.configHome}/gh/hosts.yml" $TMP_DIR/
export GH_CONFIG_DIR=$TMP_DIR
$DRY_RUN_CMD ${getExe cfg.package} help 2>&1 > $DRY_RUN_NULL
cp $TMP_DIR/hosts.yml "${config.xdg.configHome}/gh/hosts.yml"
)
fi
'';
programs.git.extraConfig.credential = mkIf cfg.gitCredentialHelper.enable
(builtins.listToAttrs (map (host:
lib.nameValuePair host {
helper = "${cfg.package}/bin/gh auth git-credential";
}) cfg.gitCredentialHelper.hosts));
xdg.dataFile."gh/extensions" = mkIf (cfg.extensions != [ ]) {
source = pkgs.linkFarm "gh-extensions" (builtins.map (p: {
name = p.pname;
path = "${p}/bin";
}) cfg.extensions);
};
};
}