86 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			86 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
{ pkgs ? (import ./.. { }), nixpkgs ? { }}:
 | 
						|
let
 | 
						|
  revision = pkgs.lib.trivial.revisionWithDefault (nixpkgs.revision or "master");
 | 
						|
 | 
						|
  libDefPos = set:
 | 
						|
    builtins.map
 | 
						|
      (name: {
 | 
						|
        name = name;
 | 
						|
        location = builtins.unsafeGetAttrPos name set;
 | 
						|
      })
 | 
						|
      (builtins.attrNames set);
 | 
						|
 | 
						|
  libset = toplib:
 | 
						|
    builtins.map
 | 
						|
      (subsetname: {
 | 
						|
        subsetname = subsetname;
 | 
						|
        functions = libDefPos toplib.${subsetname};
 | 
						|
      })
 | 
						|
      (builtins.filter
 | 
						|
        (name: builtins.isAttrs toplib.${name})
 | 
						|
        (builtins.attrNames toplib));
 | 
						|
 | 
						|
  nixpkgsLib = pkgs.lib;
 | 
						|
 | 
						|
  flattenedLibSubset = { subsetname, functions }:
 | 
						|
  builtins.map
 | 
						|
    (fn: {
 | 
						|
      name = "lib.${subsetname}.${fn.name}";
 | 
						|
      value = fn.location;
 | 
						|
    })
 | 
						|
    functions;
 | 
						|
 | 
						|
  locatedlibsets = libs: builtins.map flattenedLibSubset (libset libs);
 | 
						|
  removeFilenamePrefix = prefix: filename:
 | 
						|
    let
 | 
						|
    prefixLen = (builtins.stringLength prefix) + 1; # +1 to remove the leading /
 | 
						|
      filenameLen = builtins.stringLength filename;
 | 
						|
      substr = builtins.substring prefixLen filenameLen filename;
 | 
						|
      in substr;
 | 
						|
 | 
						|
  removeNixpkgs = removeFilenamePrefix (builtins.toString pkgs.path);
 | 
						|
 | 
						|
  liblocations =
 | 
						|
    builtins.filter
 | 
						|
      (elem: elem.value != null)
 | 
						|
      (nixpkgsLib.lists.flatten
 | 
						|
        (locatedlibsets nixpkgsLib));
 | 
						|
 | 
						|
  fnLocationRelative = { name, value }:
 | 
						|
    {
 | 
						|
      inherit name;
 | 
						|
      value = value // { file = removeNixpkgs value.file; };
 | 
						|
    };
 | 
						|
 | 
						|
  relativeLocs = (builtins.map fnLocationRelative liblocations);
 | 
						|
  sanitizeId = builtins.replaceStrings
 | 
						|
    [ "'"      ]
 | 
						|
    [ "-prime" ];
 | 
						|
 | 
						|
  urlPrefix = "https://github.com/NixOS/nixpkgs/blob/${revision}";
 | 
						|
  xmlstrings = (nixpkgsLib.strings.concatMapStrings
 | 
						|
      ({ name, value }:
 | 
						|
      ''
 | 
						|
      <section><title>${name}</title>
 | 
						|
        <para xml:id="${sanitizeId name}">
 | 
						|
        Located at
 | 
						|
        <link
 | 
						|
          xlink:href="${urlPrefix}/${value.file}#L${builtins.toString value.line}">${value.file}:${builtins.toString value.line}</link>
 | 
						|
        in  <literal><nixpkgs></literal>.
 | 
						|
        </para>
 | 
						|
        </section>
 | 
						|
      '')
 | 
						|
      relativeLocs);
 | 
						|
 | 
						|
in pkgs.writeText
 | 
						|
    "locations.xml"
 | 
						|
    ''
 | 
						|
    <section xmlns="http://docbook.org/ns/docbook"
 | 
						|
         xmlns:xlink="http://www.w3.org/1999/xlink"
 | 
						|
         version="5">
 | 
						|
         <title>All the locations for every lib function</title>
 | 
						|
         <para>This file is only for inclusion by other files.</para>
 | 
						|
         ${xmlstrings}
 | 
						|
    </section>
 | 
						|
    ''
 |