sapling: add module

Adds a program module for [Sapling](https://sapling-scm.com/).

Since Sapling itself is very similar in nature to Mercurial,
`modules/programs/mercurial.nix` was copied to make this module with
the ignore pieces removed (Sapling respects gitignore).
This commit is contained in:
Pierce Bartine 2023-05-08 10:40:07 -07:00 committed by Robert Helgesson
parent ebeeef94ab
commit efc177c15f
No known key found for this signature in database
GPG key ID: 36BDAA14C2797E89
7 changed files with 170 additions and 0 deletions

View file

@ -1334,6 +1334,13 @@ in
to keep the previous behaviour.
'';
}
{
time = "2023-12-19T22:57:52+00:00";
message = ''
A new module is available: 'programs.sapling'.
'';
}
];
};
}

View file

@ -192,6 +192,7 @@ let
./programs/rtx.nix
./programs/ruff.nix
./programs/sagemath.nix
./programs/sapling.nix
./programs/sbt.nix
./programs/scmpuff.nix
./programs/script-directory.nix

View file

@ -0,0 +1,83 @@
{ config, lib, pkgs, ... }:
with lib;
let
cfg = config.programs.sapling;
iniFormat = pkgs.formats.ini { };
in {
meta.maintainers = [ maintainers.pbar ];
options = {
programs.sapling = {
enable = mkEnableOption "Sapling";
package = mkPackageOption pkgs "sapling" { };
userName = mkOption {
type = types.str;
description = "Default user name to use.";
};
userEmail = mkOption {
type = types.str;
description = "Default user email to use.";
};
aliases = mkOption {
type = types.attrsOf types.str;
default = { };
description = "Sapling aliases to define.";
};
extraConfig = mkOption {
type = types.attrsOf types.anything;
default = { };
description = "Additional configuration to add.";
};
iniContent = mkOption {
type = iniFormat.type;
internal = true;
};
};
};
config = mkIf cfg.enable (mkMerge [
{
home.packages = [ cfg.package ];
programs.sapling.iniContent.ui = {
username = cfg.userName + " <" + cfg.userEmail + ">";
};
}
(mkIf (!pkgs.stdenv.isDarwin) {
xdg.configFile."sapling/sapling.conf".source =
iniFormat.generate "sapling.conf" cfg.iniContent;
})
(mkIf (pkgs.stdenv.isDarwin) {
home.file."Library/Preferences/sapling/sapling.conf".source =
iniFormat.generate "sapling.conf" cfg.iniContent;
})
(mkIf (cfg.aliases != { }) {
programs.sapling.iniContent.alias = cfg.aliases;
})
(mkIf (lib.isAttrs cfg.extraConfig) {
programs.sapling.iniContent = cfg.extraConfig;
})
(mkIf (lib.isString cfg.extraConfig && !pkgs.stdenv.isDarwin) {
xdg.configFile."sapling/sapling.conf".text = cfg.extraConfig;
})
(mkIf (lib.isString cfg.extraConfig && pkgs.stdenv.isDarwin) {
home.file."Library/Preferences/sapling/sapling.conf".text =
cfg.extraConfig;
})
]);
}

View file

@ -135,6 +135,7 @@ import nmt {
./modules/programs/rtx
./modules/programs/ruff
./modules/programs/sagemath
./modules/programs/sapling
./modules/programs/sbt
./modules/programs/scmpuff
./modules/programs/sioyek

View file

@ -0,0 +1,4 @@
{
sapling-basic = ./sapling-basic.nix;
sapling-most = ./sapling-most.nix;
}

View file

@ -0,0 +1,26 @@
{ pkgs, ... }:
{
programs.sapling = {
enable = true;
userName = "John Doe";
userEmail = "johndoe@example.com";
};
test.stubs.sapling = { };
nmt.script = let
configfile = if pkgs.stdenv.isDarwin then
"Library/Preferences/sapling/sapling.conf"
else
".config/sapling/sapling.conf";
expected = builtins.toFile "sapling.conf" ''
[ui]
username=John Doe <johndoe@example.com>
'';
in ''
assertFileExists home-files/${configfile}
assertFileContent home-files/${configfile} ${expected}
'';
}

View file

@ -0,0 +1,48 @@
{ pkgs, ... }:
{
programs.sapling = {
enable = true;
userName = "John Doe";
userEmail = "johndoe@example.com";
aliases = {
cm = "commit";
d = "diff --exclude=*.lock";
s = "status";
view = "!$HG config paths.default | xargs open";
};
extraConfig = {
pager.pager = "delta";
gpg.key = "not-an-actual-key";
};
};
test.stubs.sapling = { };
nmt.script = let
configfile = if pkgs.stdenv.isDarwin then
"Library/Preferences/sapling/sapling.conf"
else
".config/sapling/sapling.conf";
expected = builtins.toFile "sapling.conf" ''
[alias]
cm=commit
d=diff --exclude=*.lock
s=status
view=!$HG config paths.default | xargs open
[gpg]
key=not-an-actual-key
[pager]
pager=delta
[ui]
username=John Doe <johndoe@example.com>
'';
in ''
assertFileExists home-files/${configfile}
assertFileContent home-files/${configfile} ${expected}
'';
}