style: format entire depot with nixpkgs-fmt

This CL can be used to compare the style of nixpkgs-fmt against other
formatters (nixpkgs, alejandra).

Change-Id: I87c6abff6bcb546b02ead15ad0405f81e01b6d9e
Reviewed-on: https://cl.tvl.fyi/c/depot/+/4397
Tested-by: BuildkiteCI
Reviewed-by: sterni <sternenseemann@systemli.org>
Reviewed-by: lukegb <lukegb@tvl.fyi>
Reviewed-by: wpcarro <wpcarro@gmail.com>
Reviewed-by: Profpatsch <mail@profpatsch.de>
Reviewed-by: kanepyork <rikingcoding@gmail.com>
Reviewed-by: tazjin <tazjin@tvl.su>
Reviewed-by: cynthia <cynthia@tvl.fyi>
Reviewed-by: edef <edef@edef.eu>
Reviewed-by: eta <tvl@eta.st>
Reviewed-by: grfn <grfn@gws.fyi>
This commit is contained in:
Vincent Ambo 2022-01-30 19:06:58 +03:00 committed by tazjin
parent 2d10d60fac
commit aa122cbae7
310 changed files with 7278 additions and 5490 deletions

View file

@ -90,7 +90,7 @@ let
# Feed generation functions:
renderEpoch = epoch: removeSuffix "\n" (readFile (runCommandNoCC "date-${toString epoch}" {} ''
renderEpoch = epoch: removeSuffix "\n" (readFile (runCommandNoCC "date-${toString epoch}" { } ''
date --date='@${toString epoch}' --utc --iso-8601='seconds' > $out
''));
@ -147,6 +147,7 @@ let
${concatStrings (map renderEntry (sortEntries f.entries))}
</feed>
'');
in {
in
{
inherit entry feed renderFeed renderEpoch;
}

View file

@ -40,7 +40,7 @@ let
fragments = import ./fragments.nix args;
# Functions for generating feeds for these blogs using //web/atom-feed.
toFeedEntry = { baseUrl, ...}: defun [ post atom-feed.entry ] (post: rec {
toFeedEntry = { baseUrl, ... }: defun [ post atom-feed.entry ] (post: rec {
id = "${baseUrl}/${post.key}";
title = post.title;
content = readFile (renderMarkdown post.content);
@ -52,7 +52,8 @@ let
href = id;
};
});
in {
in
{
inherit post toFeedEntry;
inherit (fragments) renderPost;

View file

@ -20,29 +20,29 @@ let
escape = replaceStrings [ "<" ">" "&" "'" ] [ "&lt;" "&gt;" "&amp;" "&#39;" ];
header = name: title: ''
<!DOCTYPE html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="${escape name}">
<link rel="stylesheet" type="text/css" href="${staticUrl}/tvl.css" media="all">
<link rel="icon" type="image/webp" href="/static/favicon.webp">
<link rel="alternate" type="application/atom+xml" title="Atom Feed" href="https://tvl.fyi/feed.atom">
<title>${escape name}: ${escape title}</title>
</head>
<body class="light">
<header>
<h1><a class="blog-title" href="/">${escape name}</a> </h1>
<hr>
</header>
<!DOCTYPE html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="${escape name}">
<link rel="stylesheet" type="text/css" href="${staticUrl}/tvl.css" media="all">
<link rel="icon" type="image/webp" href="/static/favicon.webp">
<link rel="alternate" type="application/atom+xml" title="Atom Feed" href="https://tvl.fyi/feed.atom">
<title>${escape name}: ${escape title}</title>
</head>
<body class="light">
<header>
<h1><a class="blog-title" href="/">${escape name}</a> </h1>
<hr>
</header>
'';
fullFooter = content: ''
<hr>
<footer>
${content}
</footer>
</body>
<hr>
<footer>
${content}
</footer>
</body>
'';
draftWarning = writeText "draft.html" ''
@ -61,7 +61,7 @@ let
<hr>
'';
renderPost = { name, footer, ... }: post: runCommandNoCC "${post.key}.html" {} ''
renderPost = { name, footer, ... }: post: runCommandNoCC "${post.key}.html" { } ''
cat ${writeText "header.html" (header name post.title)} > $out
# Write the post title & date
@ -90,6 +90,7 @@ let
cat ${writeText "footer.html" (fullFooter footer)} >> $out
'';
in {
in
{
inherit isDraft isUnlisted renderPost;
}

View file

@ -134,20 +134,23 @@ let
code = statusCodes."${statusArg}" or null;
line = statusArg;
} else {
code = null; line = null;
code = null;
line = null;
};
renderedHeaders = lib.concatStrings
(lib.mapAttrsToList (n: v: "${n}: ${toString v}\r\n") headers);
internalError = msg: respond 500 {
Content-type = "text/plain";
} "bubblegum error: ${msg}";
internalError = msg: respond 500
{
Content-type = "text/plain";
} "bubblegum error: ${msg}";
body = builtins.tryEval bodyArg;
in
if status.code == null || status.line == null
then internalError "Invalid status ${lib.generators.toPretty {} statusArg}."
else if !body.success
then internalError "Unknown evaluation error in user code"
else lib.concatStrings [
if status.code == null || status.line == null
then internalError "Invalid status ${lib.generators.toPretty {} statusArg}."
else if !body.success
then internalError "Unknown evaluation error in user code"
else
lib.concatStrings [
"Status: ${toString status.code} ${status.line}\r\n"
renderedHeaders
"\r\n"
@ -169,9 +172,9 @@ let
let
p = builtins.getEnv "PATH_INFO";
in
if builtins.stringLength p == 0
then "/"
else p;
if builtins.stringLength p == 0
then "/"
else p;
/* Helper function which converts a path from the
root of the CGI script (i. e. something which
@ -187,12 +190,13 @@ let
else "${scriptName}/${path}";
bins = getBins pkgs.coreutils [ "env" "tee" "cat" "printf" "chmod" ]
// getBins nint [ "nint" ];
// getBins nint [ "nint" ];
/* Type: args -> either path derivation string -> derivation
*/
writeCGI =
{ # if given sets the `PATH` to search for `nix-instantiate`
{
# if given sets the `PATH` to search for `nix-instantiate`
# Useful when using for example thttpd which unsets `PATH`
# in the CGI environment.
binPath ? ""
@ -202,7 +206,8 @@ let
, name ? null
, ...
}@args:
input: let
input:
let
drvName =
if builtins.isString input || args ? name
then args.name
@ -227,20 +232,31 @@ let
# always pass depot so scripts can use this library
"--arg depot '(import ${minimalDepot} {})'"
]);
in runExecline.local drvName {} [
"importas" "out" "out"
"pipeline" [
"foreground" [
"if" [ bins.printf "%s\n" shebang ]
in
runExecline.local drvName { } [
"importas"
"out"
"out"
"pipeline"
[
"foreground"
[
"if"
[ bins.printf "%s\n" shebang ]
]
"if" [ bins.cat script ]
"if"
[ bins.cat script ]
]
"if" [ bins.tee "$out" ]
"if" [ bins.chmod "+x" "$out" ]
"exit" "0"
"if"
[ bins.tee "$out" ]
"if"
[ bins.chmod "+x" "$out" ]
"exit"
"0"
];
in {
in
{
inherit
respond
pathInfo

View file

@ -26,17 +26,17 @@ let
let
matched = builtins.match "/?([0-9]+)-([0-9]+)-([0-9]+)-.+" post;
in
if matched == null
then [ 0 0 0 ]
else builtins.map builtins.fromJSON matched;
if matched == null
then [ 0 0 0 ]
else builtins.map builtins.fromJSON matched;
parseTitle = post:
let
matched = builtins.match "/?[0-9]+-[0-9]+-[0-9]+-(.+).html" post;
in
if matched == null
then "no title"
else builtins.head matched;
if matched == null
then "no title"
else builtins.head matched;
dateAtLeast = a: b:
builtins.all fun.id
@ -68,11 +68,13 @@ let
<main>
<h1>blog posts</h1>
<ul>
'' + lib.concatMapStrings (post: ''
'' + lib.concatMapStrings
(post: ''
<li>
<a href="${absolutePath (url.encode {} post)}">${parseTitle post}</a>
</li>
'') posts + ''
'')
posts + ''
</ul>
</main>
'';
@ -80,10 +82,14 @@ let
formatDate =
let
# Assume we never deal with years < 1000
formatDigit = d: string.fit {
char = "0"; width = 2;
} (toString d);
in lib.concatMapStringsSep "-" formatDigit;
formatDigit = d: string.fit
{
char = "0";
width = 2;
}
(toString d);
in
lib.concatMapStringsSep "-" formatDigit;
post = title: post: ''
<main>
@ -101,8 +107,9 @@ let
validatePathInfo = pathInfo:
let
chars = string.toChars pathInfo;
in builtins.length chars > 1
&& !(builtins.elem "/" (builtins.tail chars));
in
builtins.length chars > 1
&& !(builtins.elem "/" (builtins.tail chars));
response =
if pathInfo == "/"
@ -129,6 +136,8 @@ let
inner = "<h1>404 not found</h1>";
};
in
respond response.status {
"Content-type" = "text/html";
} (generic response)
respond response.status
{
"Content-type" = "text/html";
}
(generic response)

View file

@ -29,33 +29,54 @@ let
;
bins = (getBins pkgs.thttpd [ "thttpd" ])
// (getBins pkgs.coreutils [ "printf" "cp" "mkdir" ]);
// (getBins pkgs.coreutils [ "printf" "cp" "mkdir" ]);
webRoot =
let
copyScripts = lib.concatMap
(path: let
cgi = writeCGI {
# assume we are on NixOS since thttpd doesn't set PATH.
# using third_party.nix is tricky because not everyone
# has a tvix daemon running.
binPath = "/run/current-system/sw/bin";
} path;
in [
"if" [ bins.cp cgi "\${out}/${cgi.name}" ]
]) scripts;
in runExecline.local "webroot" {} ([
"importas" "out" "out"
"if" [ bins.mkdir "-p" "$out" ]
(path:
let
cgi = writeCGI
{
# assume we are on NixOS since thttpd doesn't set PATH.
# using third_party.nix is tricky because not everyone
# has a tvix daemon running.
binPath = "/run/current-system/sw/bin";
}
path;
in
[
"if"
[ bins.cp cgi "\${out}/${cgi.name}" ]
])
scripts;
in
runExecline.local "webroot" { } ([
"importas"
"out"
"out"
"if"
[ bins.mkdir "-p" "$out" ]
] ++ copyScripts);
port = 9000;
in
writeExecline "serve-examples" {} [
"foreground" [
bins.printf "%s\n" "Running on http://localhost:${toString port}"
]
"${bins.thttpd}" "-D" "-p" (toString port) "-l" "/dev/stderr"
"-c" "*.nix" "-d" webRoot
writeExecline "serve-examples" { } [
"foreground"
[
bins.printf
"%s\n"
"Running on http://localhost:${toString port}"
]
"${bins.thttpd}"
"-D"
"-p"
(toString port)
"-l"
"/dev/stderr"
"-c"
"*.nix"
"-d"
webRoot
]

View file

@ -6,6 +6,8 @@ let
respond
;
in
respond "OK" {
Content-type = "image/svg+xml";
} (builtins.readFile "${depot.tvix.docs.svg}/component-flow.svg")
respond "OK"
{
Content-type = "image/svg+xml";
}
(builtins.readFile "${depot.tvix.docs.svg}/component-flow.svg")

View file

@ -87,6 +87,8 @@ let
response = routes."${pathInfo}" or notFound;
in
respond response.status {
"Content-type" = "text/html";
} (template response)
respond response.status
{
"Content-type" = "text/html";
}
(template response)

View file

@ -63,12 +63,13 @@ let
envp[envn++] = build_env( "PATH=%s", CGI_PATH );
#ifdef CGI_LD_LIBRARY_PATH
'';
thttpdCgit = thttpd.overrideAttrs(old: {
thttpdCgit = thttpd.overrideAttrs (old: {
patches = [
./thttpd_cgi_idx.patch
thttpdConfigPatch
];
});
in writeShellScriptBin "cgit-launch" ''
in
writeShellScriptBin "cgit-launch" ''
exec ${thttpdCgit}/bin/thttpd -D -C ${thttpdConfig}
''

View file

@ -1,4 +1,4 @@
{ depot ? import ../.. {} }:
{ depot ? import ../.. { } }:
with depot.third_party;

View file

@ -5,7 +5,9 @@
let
storeDirLength = with builtins; (stringLength storeDir) + 1;
logo = depot.web.tvl.logo;
in lib.fix(self: pkgs.runCommand "tvl-static" {
in
lib.fix (self: pkgs.runCommand "tvl-static"
{
passthru = {
# Preserving the string context here makes little sense: While we are
# referencing this derivation, we are not doing so via the nix store,

View file

@ -39,7 +39,7 @@ let
user = string;
};
allTodos = fromJSON (readFile (runCommandNoCC "depot-todos.json" {} ''
allTodos = fromJSON (readFile (runCommandNoCC "depot-todos.json" { } ''
${ripgrep}/bin/rg --json 'TODO\(\w+\):.*$' ${depot.path} | \
${jq}/bin/jq -s -f ${./extract-todos.jq} > $out
''));
@ -58,22 +58,23 @@ let
'');
userParagraph = todos:
let user = (head todos).user;
in ''
<p>
<h3>
<a style="color:inherit; text-decoration: none;"
name="${user}"
href="#${user}">${user}</a>
</h3>
${concatStringsSep "\n" (map todoElement todos)}
</p>
<hr>
'';
let user = (head todos).user;
in ''
<p>
<h3>
<a style="color:inherit; text-decoration: none;"
name="${user}"
href="#${user}">${user}</a>
</h3>
${concatStringsSep "\n" (map todoElement todos)}
</p>
<hr>
'';
staticUrl = "https://static.tvl.fyi/${depot.web.static.drvHash}";
in writeTextFile {
in
writeTextFile {
name = "tvl-todos";
destination = "/index.html";
text = ''

View file

@ -3,7 +3,7 @@
{
config = {
name = "TVL's blog";
footer = depot.web.tvl.footer {};
footer = depot.web.tvl.footer { };
baseUrl = "https://tvl.fyi/blog";
};

View file

@ -16,9 +16,10 @@ let
(map (p: "cp ${blog.renderPost tvl.blog.config p} $out/blog/${p.key}.html") posts)
);
tvlGraph = runCommandNoCC "tvl.svg" {
nativeBuildInputs = with pkgs; [ fontconfig freetype cairo jetbrains-mono ];
} ''
tvlGraph = runCommandNoCC "tvl.svg"
{
nativeBuildInputs = with pkgs; [ fontconfig freetype cairo jetbrains-mono ];
} ''
${graphviz}/bin/neato -Tsvg ${./tvl.dot} > $out
'';
@ -121,7 +122,8 @@ let
</style>
'';
};
in runCommandNoCC "website" {} ''
in
runCommandNoCC "website" { } ''
mkdir -p $out/blog
cp ${homepage} $out/index.html
${postRenderingCommands tvl.blog.posts}

View file

@ -15,7 +15,7 @@ args: ''
<a class="uncoloured-link" href="https://todo.tvl.fyi/">todos</a>
|
<a class="uncoloured-link" href="https://atward.tvl.fyi/">search</a>
'' + lib.optionalString (args ? extraFooter) args.extraFooter + ''
'' + lib.optionalString (args ? extraFooter) args.extraFooter + ''
</p>
<p class="lod">_</p>
''

View file

@ -21,20 +21,22 @@ let
# Create an animated CSS that equally spreads out the colours over
# the animation duration (1min).
animatedCss = colours: let
# Calculate at which percentage offset each colour should appear.
stepSize = 100 / ((builtins.length colours) - 1);
frames = lib.imap0 (idx: colour: { inherit colour; at = idx * stepSize; }) colours;
frameCss = frame: "${toString frame.at}% { fill: ${frame.colour}; }";
in ''
#armchair-background {
animation: 30s infinite alternate armchairPalette;
}
animatedCss = colours:
let
# Calculate at which percentage offset each colour should appear.
stepSize = 100 / ((builtins.length colours) - 1);
frames = lib.imap0 (idx: colour: { inherit colour; at = idx * stepSize; }) colours;
frameCss = frame: "${toString frame.at}% { fill: ${frame.colour}; }";
in
''
#armchair-background {
animation: 30s infinite alternate armchairPalette;
}
@keyframes armchairPalette {
${lib.concatStringsSep "\n" (map frameCss frames)}
}
'';
@keyframes armchairPalette {
${lib.concatStringsSep "\n" (map frameCss frames)}
}
'';
# Dark version of the logo, suitable for light backgrounds.
darkCss = armchairCss: ''
@ -67,7 +69,8 @@ let
</svg>
'';
in depot.nix.readTree.drvTargets(lib.fix (self: {
in
depot.nix.readTree.drvTargets (lib.fix (self: {
# Expose the logo construction functions.
inherit palette darkCss lightCss animatedCss staticCss;
@ -75,7 +78,7 @@ in depot.nix.readTree.drvTargets(lib.fix (self: {
logoSvg = style: pkgs.writeText "logo.svg" (logoSvg style);
# Create a PNG of the TVL logo with the specified style and DPI.
logoPng = style: dpi: pkgs.runCommandNoCC "logo.png" {} ''
logoPng = style: dpi: pkgs.runCommandNoCC "logo.png" { } ''
${pkgs.inkscape}/bin/inkscape \
--export-area-drawing \
--export-background-opacity 0 \
@ -87,7 +90,8 @@ in depot.nix.readTree.drvTargets(lib.fix (self: {
pastelRainbow = self.logoSvg (darkCss (animatedCss (lib.attrValues palette)));
}
# Add individual outputs for static dark logos of each colour.
// (lib.mapAttrs'
(k: v: lib.nameValuePair "${k}Png"
(self.logoPng (darkCss (staticCss v)) 96)) palette)))
# Add individual outputs for static dark logos of each colour.
// (lib.mapAttrs'
(k: v: lib.nameValuePair "${k}Png"
(self.logoPng (darkCss (staticCss v)) 96))
palette)))

View file

@ -1,6 +1,7 @@
{ depot, pkgs, lib, ... }:
{ # content of the <title> tag
{
# content of the <title> tag
title
# main part of the page, usually wrapped with <main>
, content
@ -17,7 +18,8 @@ let
inherit (depot.tools) cheddar;
in
runCommandNoCC "${lib.strings.sanitizeDerivationName title}-index.html" {
runCommandNoCC "${lib.strings.sanitizeDerivationName title}-index.html"
{
headerPart = ''
<!DOCTYPE html>
<head>
@ -36,11 +38,11 @@ runCommandNoCC "${lib.strings.sanitizeDerivationName title}-index.html" {
inherit content;
footerPart = ''
<hr>
<footer>
${depot.web.tvl.footer args}
</footer>
</body>
<hr>
<footer>
${depot.web.tvl.footer args}
</footer>
</body>
'';
passAsFile = [ "headerPart" "content" "footerPart" ];