diff --git a/.gitignore b/.gitignore
index 7166508..ad4e0ed 100644
--- a/.gitignore
+++ b/.gitignore
@@ -18,3 +18,4 @@ devenv.local.nix
.pre-commit-config.yaml
.jekyll-cache/
+result
diff --git a/flake.lock b/flake.lock
new file mode 100644
index 0000000..bc67a31
--- /dev/null
+++ b/flake.lock
@@ -0,0 +1,61 @@
+{
+ "nodes": {
+ "flutils": {
+ "inputs": {
+ "systems": "systems"
+ },
+ "locked": {
+ "lastModified": 1710146030,
+ "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=",
+ "owner": "numtide",
+ "repo": "flake-utils",
+ "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a",
+ "type": "github"
+ },
+ "original": {
+ "owner": "numtide",
+ "repo": "flake-utils",
+ "type": "github"
+ }
+ },
+ "nixpkgs": {
+ "locked": {
+ "lastModified": 1714076141,
+ "narHash": "sha256-Drmja/f5MRHZCskS6mvzFqxEaZMeciScCTFxWVLqWEY=",
+ "owner": "nixos",
+ "repo": "nixpkgs",
+ "rev": "7bb2ccd8cdc44c91edba16c48d2c8f331fb3d856",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nixos",
+ "ref": "nixos-unstable",
+ "repo": "nixpkgs",
+ "type": "github"
+ }
+ },
+ "root": {
+ "inputs": {
+ "flutils": "flutils",
+ "nixpkgs": "nixpkgs"
+ }
+ },
+ "systems": {
+ "locked": {
+ "lastModified": 1681028828,
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "owner": "nix-systems",
+ "repo": "default",
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-systems",
+ "repo": "default",
+ "type": "github"
+ }
+ }
+ },
+ "root": "root",
+ "version": 7
+}
diff --git a/flake.nix b/flake.nix
index c7a9a1c..03c1d4d 100644
--- a/flake.nix
+++ b/flake.nix
@@ -3,13 +3,46 @@
inputs = {
nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable";
+ flutils.url = "github:numtide/flake-utils";
};
- outputs = { self, nixpkgs }: {
+ outputs = { self, nixpkgs, flutils }: flutils.lib.eachDefaultSystem (system:
+ let
+ pkgs = nixpkgs.legacyPackages.${system};
- packages.x86_64-linux.hello = nixpkgs.legacyPackages.x86_64-linux.hello;
+ gems = pkgs.bundlerEnv {
+ name = "blog-pim";
+ gemdir = ./src;
+ };
- packages.x86_64-linux.default = self.packages.x86_64-linux.hello;
+ patch-feed-date = pkgs.stdenv.mkDerivation {
+ name = "path-feed-date";
+ propagatedBuildInputs = [ pkgs.python3 ];
+ dontUnpack = true;
+ installPhase = "install -Dm755 ${./patch-feed-date.py} $out/bin/patch-feed-date";
+ };
+ in
+ {
+ packages.website = pkgs.stdenv.mkDerivation {
+ name = "blog-pim";
+ src = ./src;
+ sourceRoot = "src";
- };
+ buildInputs = [
+ gems
+ gems.wrappedRuby
+ patch-feed-date
+ ];
+
+ buildPhase = ''
+ bundle exec jekyll build
+ '';
+
+ installPhase = ''
+ mkdir -p $out
+ cp -r _site/* $out/
+ patch-feed-date --file _site/feed.xml > $out/feed.xml
+ '';
+ };
+ });
}
diff --git a/patch-feed-date.py b/patch-feed-date.py
new file mode 100755
index 0000000..d8cfb15
--- /dev/null
+++ b/patch-feed-date.py
@@ -0,0 +1,56 @@
+#!/usr/bin/env python3
+
+import argparse
+import re
+from datetime import datetime
+
+updated_pattern = r"(?P.{25})"
+datetime_pattern = "%Y-%m-%dT%H:%M:%S%z"
+
+
+def get_post_datetimes(feed):
+ regex = re.compile(updated_pattern)
+
+ datetimes = list()
+ first_skipped = False
+
+ for match in regex.finditer(feed):
+ # Skip first found datetime, as this is what we want to replace.
+ if not first_skipped:
+ first_skipped = True
+ continue
+ dt = datetime.strptime(match.group("datetime"), datetime_pattern)
+ datetimes.append(dt)
+
+ return datetimes
+
+
+def main():
+ parser = argparse.ArgumentParser(
+ description="Patch the updated date field on an Atom feed."
+ )
+
+ parser.add_argument(
+ "--file", "-f", type=str, required=True, help="Path to the Atom feed file."
+ )
+
+ args = parser.parse_args()
+ with open(args.file, "r") as f:
+ feed = f.read()
+
+ datetimes = get_post_datetimes(feed)
+ newest_datetime = max(datetimes)
+
+ print(
+ re.sub(
+ updated_pattern,
+ f"{newest_datetime.strftime(datetime_pattern)}",
+ feed,
+ count=1,
+ ),
+ end="",
+ )
+
+
+if __name__ == "__main__":
+ main()