Upstream nixpkgs removed a lot of aliases this time, so we needed to do the following transformations. It's a real shame that aliases only really become discoverable easily when they are removed. * runCommandNoCC -> runCommand * gmailieer -> lieer We also need to work around the fact that home-manager hasn't catched on to this rename. * mysql -> mariadb * pkgconfig -> pkg-config This also affects our Nix fork which needs to be bumped. * prometheus_client -> prometheus-client * rxvt_unicode -> rxvt-unicode-unwrapped * nix-review -> nixpkgs-review * oauth2_proxy -> oauth2-proxy Additionally, some Go-related builders decided to drop support for passing the sha256 hash in directly, so we need to use the generic hash arguments. Change-Id: I84aaa225ef18962937f8616a9ff064822f0d5dc3 Reviewed-on: https://cl.tvl.fyi/c/depot/+/6792 Autosubmit: sterni <sternenseemann@systemli.org> Tested-by: BuildkiteCI Reviewed-by: grfn <grfn@gws.fyi> Reviewed-by: flokli <flokli@flokli.de> Reviewed-by: tazjin <tazjin@tvl.su> Reviewed-by: wpcarro <wpcarro@gmail.com>
		
			
				
	
	
		
			153 lines
		
	
	
	
		
			4.8 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			153 lines
		
	
	
	
		
			4.8 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
| # This file defines functions for generating an Atom feed.
 | |
| 
 | |
| { depot, lib, pkgs, ... }:
 | |
| 
 | |
| with depot.nix.yants;
 | |
| 
 | |
| let
 | |
|   inherit (builtins) foldl' map readFile replaceStrings sort;
 | |
|   inherit (lib) concatStrings concatStringsSep max removeSuffix;
 | |
|   inherit (pkgs) runCommand;
 | |
| 
 | |
|   # 'link' describes a related link to a feed, or feed element.
 | |
|   #
 | |
|   # https://validator.w3.org/feed/docs/atom.html#link
 | |
|   link = struct "link" {
 | |
|     rel = string;
 | |
|     href = string;
 | |
|   };
 | |
| 
 | |
|   # 'entry' describes a feed entry, for example a single post on a
 | |
|   # blog. Some optional fields have been omitted.
 | |
|   #
 | |
|   # https://validator.w3.org/feed/docs/atom.html#requiredEntryElements
 | |
|   entry = struct "entry" {
 | |
|     # Identifies the entry using a universally unique and permanent URI.
 | |
|     id = string;
 | |
| 
 | |
|     # Contains a human readable title for the entry. This value should
 | |
|     # not be blank.
 | |
|     title = string;
 | |
| 
 | |
|     # Content of the entry.
 | |
|     content = option string;
 | |
| 
 | |
|     # Indicates the last time the entry was modified in a significant
 | |
|     # way (in seconds since epoch).
 | |
|     updated = int;
 | |
| 
 | |
|     # Names authors of the entry. Recommended element.
 | |
|     authors = option (list string);
 | |
| 
 | |
|     # Related web pages, such as the web location of a blog post.
 | |
|     links = option (list link);
 | |
| 
 | |
|     # Conveys a short summary, abstract, or excerpt of the entry.
 | |
|     summary = option string;
 | |
| 
 | |
|     # Contains the time of the initial creation or first availability
 | |
|     # of the entry.
 | |
|     published = option int;
 | |
| 
 | |
|     # Conveys information about rights, e.g. copyrights, held in and
 | |
|     # over the entry.
 | |
|     rights = option string;
 | |
|   };
 | |
| 
 | |
|   # 'feed' describes the metadata of the Atom feed itself.
 | |
|   #
 | |
|   # Some optional fields have been omitted.
 | |
|   #
 | |
|   # https://validator.w3.org/feed/docs/atom.html#requiredFeedElements
 | |
|   feed = struct "feed" {
 | |
|     # Identifies the feed using a universally unique and permanent URI.
 | |
|     id = string;
 | |
| 
 | |
|     # Contains a human readable title for the feed.
 | |
|     title = string;
 | |
| 
 | |
|     # Indicates the last time the feed was modified in a significant
 | |
|     # way (in seconds since epoch). Will be calculated based on most
 | |
|     # recently updated entry if unset.
 | |
|     updated = option int;
 | |
| 
 | |
|     # Entries contained within the feed.
 | |
|     entries = list entry;
 | |
| 
 | |
|     # Names authors of the feed. Recommended element.
 | |
|     authors = option (list string);
 | |
| 
 | |
|     # Related web locations. Recommended element.
 | |
|     links = option (list link);
 | |
| 
 | |
|     # Conveys information about rights, e.g. copyrights, held in and
 | |
|     # over the feed.
 | |
|     rights = option string;
 | |
| 
 | |
|     # Contains a human-readable description or subtitle for the feed.
 | |
|     subtitle = option string;
 | |
|   };
 | |
| 
 | |
|   # Feed generation functions:
 | |
| 
 | |
|   renderEpoch = epoch: removeSuffix "\n" (readFile (runCommand "date-${toString epoch}" { } ''
 | |
|     date --date='@${toString epoch}' --utc --iso-8601='seconds' > $out
 | |
|   ''));
 | |
| 
 | |
|   escape = replaceStrings [ "<" ">" "&" "'" ] [ "<" ">" "&" "'" ];
 | |
| 
 | |
|   elem = name: content: ''<${name}>${escape content}</${name}>'';
 | |
| 
 | |
|   renderLink = defun [ link string ] (l: ''
 | |
|     <link href="${escape l.href}" rel="${escape l.rel}" />
 | |
|   '');
 | |
| 
 | |
|   # Technically the author element can also contain 'uri' and 'email'
 | |
|   # fields, but they are not used for the purpose of this feed and are
 | |
|   # omitted.
 | |
|   renderAuthor = author: ''<author><name>${escape author}</name></author>'';
 | |
| 
 | |
|   renderEntry = defun [ entry string ] (e: ''
 | |
|     <entry>
 | |
|       ${elem "title" e.title}
 | |
|       ${elem "id" e.id}
 | |
|       ${elem "updated" (renderEpoch e.updated)}
 | |
|       ${if e ? published
 | |
|         then elem "published" (renderEpoch e.published)
 | |
|         else ""
 | |
|       }
 | |
|       ${if e ? content
 | |
|         then ''<content type="html">${escape e.content}</content>''
 | |
|         else ""
 | |
|       }
 | |
|       ${if e ? summary then elem "summary" e.summary else ""}
 | |
|       ${concatStrings (map renderAuthor (e.authors or []))}
 | |
|       ${if e ? subtitle then elem "subtitle" e.subtitle else ""}
 | |
|       ${if e ? rights then elem "rights" e.rights else ""}
 | |
|       ${concatStrings (map renderLink (e.links or []))}
 | |
|     </entry>
 | |
|   '');
 | |
| 
 | |
|   mostRecentlyUpdated = defun [ (list entry) int ] (entries:
 | |
|     foldl' max 0 (map (e: e.updated) entries)
 | |
|   );
 | |
| 
 | |
|   sortEntries = sort (a: b: a.published > b.published);
 | |
| 
 | |
|   renderFeed = defun [ feed string ] (f: ''
 | |
|     <?xml version="1.0" encoding="utf-8"?>
 | |
|     <feed xmlns="http://www.w3.org/2005/Atom">
 | |
|       ${elem "id" f.id}
 | |
|       ${elem "title" f.title}
 | |
|       ${elem "updated" (renderEpoch (f.updated or (mostRecentlyUpdated f.entries)))}
 | |
|       ${concatStringsSep "\n" (map renderAuthor (f.authors or []))}
 | |
|       ${if f ? subtitle then elem "subtitle" f.subtitle else ""}
 | |
|       ${if f ? rights then elem "rights" f.rights else ""}
 | |
|       ${concatStrings (map renderLink (f.links or []))}
 | |
|       ${concatStrings (map renderEntry (sortEntries f.entries))}
 | |
|     </feed>
 | |
|   '');
 | |
| in
 | |
| {
 | |
|   inherit entry feed renderFeed renderEpoch;
 | |
| }
 |