anchor.diff:          '';
         };
   
  +      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 {
           type = types.str;
           default = "gitolite";
  
positive.code:     };
    };
  
    config = mkIf cfg.enable {
      users.extraUsers.${cfg.user} = {
        description     = "Gitolite user";
        home            = cfg.dataDir;
  
negative.code:       serviceConfig.Type = "oneshot";
        serviceConfig.RemainAfterExit = true;
  
        path = [ pkgs.gitolite pkgs.git pkgs.perl pkgs.bash pkgs.diffutils config.programs.ssh.package ];
        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}
            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
              gitolite setup -pk ${pubkeyFile}
            fi
            if [ -n "${hooks}" ]; then
              cp ${hooks} .gitolite/hooks/common/
              chmod +x .gitolite/hooks/common/*
            fi
            gitolite setup # Upgrade if needed
          '';
      };
  
      environment.systemPackages = [ pkgs.gitolite pkgs.git ];
    });
  }
  