forked from mirrors/nixpkgs
nixos/gitolite: customize .gitolite.rc declaratively
Add the `extraGitoliteRc` option to customize the `.gitolite.rc` configuration file declaratively. Resolves #29249.
This commit is contained in:
parent
24bed29809
commit
c73a3813fa
|
@ -49,6 +49,35 @@ in
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
extraGitoliteRc = mkOption {
|
||||||
|
type = types.lines;
|
||||||
|
default = "";
|
||||||
|
example = literalExample ''
|
||||||
|
$RC{UMASK} = 0027;
|
||||||
|
$RC{SITE_INFO} = 'This is our private repository host';
|
||||||
|
push( @{$RC{ENABLE}}, 'Kindergarten' ); # enable the command/feature
|
||||||
|
@{$RC{ENABLE}} = grep { $_ ne 'desc' } @{$RC{ENABLE}}; # disable the command/feature
|
||||||
|
'';
|
||||||
|
description = ''
|
||||||
|
Extra configuration to append to the default <literal>~/.gitolite.rc</literal>.
|
||||||
|
|
||||||
|
This should be Perl code that modifies the <literal>%RC</literal>
|
||||||
|
configuration variable. The default <literal>~/.gitolite.rc</literal>
|
||||||
|
content is generated by invoking <literal>gitolite print-default-rc</literal>,
|
||||||
|
and extra configuration from this option is appended to it. The result
|
||||||
|
is placed to Nix store, and the <literal>~/.gitolite.rc</literal> file
|
||||||
|
becomes a symlink to it.
|
||||||
|
|
||||||
|
If you already have a customized (or otherwise changed)
|
||||||
|
<literal>~/.gitolite.rc</literal> file, NixOS will refuse to replace
|
||||||
|
it with a symlink, and the `gitolite-init` initialization service
|
||||||
|
will fail. In this situation, in order to use this option, you
|
||||||
|
will need to take any customizations you may have in
|
||||||
|
<literal>~/.gitolite.rc</literal>, convert them to appropriate Perl
|
||||||
|
statements, add them to this option, and remove the file.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
user = mkOption {
|
user = mkOption {
|
||||||
type = types.str;
|
type = types.str;
|
||||||
default = "gitolite";
|
default = "gitolite";
|
||||||
|
@ -59,7 +88,34 @@ in
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
config = mkIf cfg.enable {
|
config = mkIf cfg.enable (
|
||||||
|
let
|
||||||
|
manageGitoliteRc = cfg.extraGitoliteRc != "";
|
||||||
|
rcDir = pkgs.runCommand "gitolite-rc" { } rcDirScript;
|
||||||
|
rcDirScript =
|
||||||
|
''
|
||||||
|
mkdir "$out"
|
||||||
|
export HOME=temp-home
|
||||||
|
mkdir -p "$HOME/.gitolite/logs" # gitolite can't run without it
|
||||||
|
'${pkgs.gitolite}'/bin/gitolite print-default-rc >>"$out/gitolite.rc.default"
|
||||||
|
cat <<END >>"$out/gitolite.rc"
|
||||||
|
# This file is managed by NixOS.
|
||||||
|
# Use services.gitolite options to control it.
|
||||||
|
|
||||||
|
END
|
||||||
|
cat "$out/gitolite.rc.default" >>"$out/gitolite.rc"
|
||||||
|
'' +
|
||||||
|
optionalString (cfg.extraGitoliteRc != "") ''
|
||||||
|
echo -n ${escapeShellArg ''
|
||||||
|
|
||||||
|
# Added by NixOS:
|
||||||
|
${removeSuffix "\n" cfg.extraGitoliteRc}
|
||||||
|
|
||||||
|
# per perl rules, this should be the last line in such a file:
|
||||||
|
1;
|
||||||
|
''} >>"$out/gitolite.rc"
|
||||||
|
'';
|
||||||
|
in {
|
||||||
users.extraUsers.${cfg.user} = {
|
users.extraUsers.${cfg.user} = {
|
||||||
description = "Gitolite user";
|
description = "Gitolite user";
|
||||||
home = cfg.dataDir;
|
home = cfg.dataDir;
|
||||||
|
@ -77,10 +133,50 @@ in
|
||||||
serviceConfig.Type = "oneshot";
|
serviceConfig.Type = "oneshot";
|
||||||
serviceConfig.RemainAfterExit = true;
|
serviceConfig.RemainAfterExit = true;
|
||||||
|
|
||||||
path = [ pkgs.gitolite pkgs.git pkgs.perl pkgs.bash config.programs.ssh.package ];
|
path = [ pkgs.gitolite pkgs.git pkgs.perl pkgs.bash pkgs.diffutils config.programs.ssh.package ];
|
||||||
script = ''
|
script =
|
||||||
|
let
|
||||||
|
rcSetupScriptIfCustomFile =
|
||||||
|
if manageGitoliteRc then ''
|
||||||
|
cat <<END
|
||||||
|
<3>ERROR: NixOS can't apply declarative configuration
|
||||||
|
<3>to your .gitolite.rc file, because it seems to be
|
||||||
|
<3>already customized manually.
|
||||||
|
<3>See the services.gitolite.extraGitoliteRc option
|
||||||
|
<3>in "man configuration.nix" for more information.
|
||||||
|
END
|
||||||
|
# Not sure if the line below addresses the issue directly or just
|
||||||
|
# adds a delay, but without it our error message often doesn't
|
||||||
|
# show up in `systemctl status gitolite-init`.
|
||||||
|
journalctl --flush
|
||||||
|
exit 1
|
||||||
|
'' else ''
|
||||||
|
:
|
||||||
|
'';
|
||||||
|
rcSetupScriptIfDefaultFileOrStoreSymlink =
|
||||||
|
if manageGitoliteRc then ''
|
||||||
|
ln -sf "${rcDir}/gitolite.rc" "$GITOLITE_RC"
|
||||||
|
'' else ''
|
||||||
|
[[ -L "$GITOLITE_RC" ]] && rm -f "$GITOLITE_RC"
|
||||||
|
'';
|
||||||
|
in
|
||||||
|
''
|
||||||
cd ${cfg.dataDir}
|
cd ${cfg.dataDir}
|
||||||
mkdir -p .gitolite/logs
|
mkdir -p .gitolite/logs
|
||||||
|
|
||||||
|
GITOLITE_RC=.gitolite.rc
|
||||||
|
GITOLITE_RC_DEFAULT=${rcDir}/gitolite.rc.default
|
||||||
|
if ( [[ ! -e "$GITOLITE_RC" ]] && [[ ! -L "$GITOLITE_RC" ]] ) ||
|
||||||
|
( [[ -f "$GITOLITE_RC" ]] && diff -q "$GITOLITE_RC" "$GITOLITE_RC_DEFAULT" >/dev/null ) ||
|
||||||
|
( [[ -L "$GITOLITE_RC" ]] && [[ "$(readlink "$GITOLITE_RC")" =~ ^/nix/store/ ]] )
|
||||||
|
then
|
||||||
|
'' + rcSetupScriptIfDefaultFileOrStoreSymlink +
|
||||||
|
''
|
||||||
|
else
|
||||||
|
'' + rcSetupScriptIfCustomFile +
|
||||||
|
''
|
||||||
|
fi
|
||||||
|
|
||||||
if [ ! -d repositories ]; then
|
if [ ! -d repositories ]; then
|
||||||
gitolite setup -pk ${pubkeyFile}
|
gitolite setup -pk ${pubkeyFile}
|
||||||
fi
|
fi
|
||||||
|
@ -93,5 +189,5 @@ in
|
||||||
};
|
};
|
||||||
|
|
||||||
environment.systemPackages = [ pkgs.gitolite pkgs.git ];
|
environment.systemPackages = [ pkgs.gitolite pkgs.git ];
|
||||||
};
|
});
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue