about summary refs log tree commit diff
path: root/lib
diff options
context:
space:
mode:
authorzimbatm <zimbatm@zimbatm.com>2020-03-26 12:47:15 +0100
committerGitHub <noreply@github.com>2020-03-26 12:47:15 +0100
commitd8f0c5407e62c4360f569be211d6778119c696c6 (patch)
tree62152b52b92dc50de40de6a4577cdd6b9070e427 /lib
parente71419b11cced2639b56402a1017a787c0164e2e (diff)
parentd37a0dca1322126097431d27336384e436687d5e (diff)
downloadnixlib-d8f0c5407e62c4360f569be211d6778119c696c6.tar
nixlib-d8f0c5407e62c4360f569be211d6778119c696c6.tar.gz
nixlib-d8f0c5407e62c4360f569be211d6778119c696c6.tar.bz2
nixlib-d8f0c5407e62c4360f569be211d6778119c696c6.tar.lz
nixlib-d8f0c5407e62c4360f569be211d6778119c696c6.tar.xz
nixlib-d8f0c5407e62c4360f569be211d6778119c696c6.tar.zst
nixlib-d8f0c5407e62c4360f569be211d6778119c696c6.zip
Merge pull request #82929 from zimbatm/nixos-gerrit
nixos gerrit module
Diffstat (limited to 'lib')
-rw-r--r--lib/generators.nix53
1 files changed, 53 insertions, 0 deletions
diff --git a/lib/generators.nix b/lib/generators.nix
index 240a19789b54..efe6ea6031d3 100644
--- a/lib/generators.nix
+++ b/lib/generators.nix
@@ -126,6 +126,59 @@ rec {
       # map input to ini sections
       mapAttrsToStringsSep "\n" mkSection attrsOfAttrs;
 
+  /* Generate a git-config file from an attrset.
+   *
+   * It has two major differences from the regular INI format:
+   *
+   * 1. values are indented with tabs
+   * 2. sections can have sub-sections
+   *
+   * generators.toGitINI {
+   *   url."ssh://git@github.com/".insteadOf = "https://github.com";
+   *   user.name = "edolstra";
+   * }
+   *
+   *> [url "ssh://git@github.com/"]
+   *>   insteadOf = https://github.com/
+   *>
+   *> [user]
+   *>   name = edolstra
+   */
+  toGitINI = attrs:
+    with builtins;
+    let
+      mkSectionName = name:
+        let
+          containsQuote = libStr.hasInfix ''"'' name;
+          sections = libStr.splitString "." name;
+          section = head sections;
+          subsections = tail sections;
+          subsection = concatStringsSep "." subsections;
+        in if containsQuote || subsections == [ ] then
+          name
+        else
+          ''${section} "${subsection}"'';
+
+      # generation for multiple ini values
+      mkKeyValue = k: v:
+        let mkKeyValue = mkKeyValueDefault { } " = " k;
+        in concatStringsSep "\n" (map (kv: "\t" + mkKeyValue kv) (lib.toList v));
+
+      # converts { a.b.c = 5; } to { "a.b".c = 5; } for toINI
+      gitFlattenAttrs = let
+        recurse = path: value:
+          if isAttrs value then
+            lib.mapAttrsToList (name: value: recurse ([ name ] ++ path) value) value
+          else if length path > 1 then {
+            ${concatStringsSep "." (lib.reverseList (tail path))}.${head path} = value;
+          } else {
+            ${head path} = value;
+          };
+      in attrs: lib.foldl lib.recursiveUpdate { } (lib.flatten (recurse [ ] attrs));
+
+      toINI_ = toINI { inherit mkKeyValue mkSectionName; };
+    in
+      toINI_ (gitFlattenAttrs attrs);
 
   /* Generates JSON from an arbitrary (non-function) value.
     * For more information see the documentation of the builtin.