Compare commits

...

8 Commits

Author SHA1 Message Date
mrtz 010ee782f9 nix: Bump npins and nixpkgs
Cache / build-and-push (push) Successful in 42s
2026-06-12 12:33:25 +02:00
mrtz b091275efd ci: Build packages on push to main
Cache / build-and-push (push) Successful in 3m24s
2026-06-09 16:39:40 +02:00
mrtz 0ecb3a5094 fix: Bump fable to version used in Poseidon 2026-06-02 14:01:32 +02:00
mrtz f0ab1a403f fix: Add mainProgram to dotnet tools 2026-06-02 10:24:23 +02:00
mrtz d5082ae62c refactor: version-suffix fable and fsharp-analyzers package names
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-01 22:20:21 +02:00
mrtz f5f60e7af5 feat: add fable and fsharp-analyzers dotnet global tools
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-01 15:23:31 +02:00
mrtz 3a94fff521 docs: Update Readme 2026-06-01 10:41:19 +02:00
mrtz a39124bffc fix: Add formatter 2026-05-31 21:25:54 +02:00
14 changed files with 238 additions and 34 deletions
+3
View File
@@ -0,0 +1,3 @@
# shellcheck shell=bash
dotenv_if_exists
use nix
+31
View File
@@ -0,0 +1,31 @@
# yaml-language-server: $schema=https://raw.githubusercontent.com/SchemaStore/schemastore/master/src/schemas/json/github-workflow.json
name: Cache
on:
push:
branches: [main]
workflow_dispatch:
jobs:
build-and-push:
runs-on: nix
steps:
- uses: actions/checkout@v6
- name: Write niks3 auth token
run: |
umask 077
printf '%s' "${{ secrets.NIKS3_AUTH_TOKEN }}" > "$RUNNER_TEMP/niks3-auth-token"
- name: Build all packages
run: |
nix-build --no-out-link | tee "$RUNNER_TEMP/built-paths"
- name: Push to niks3 cache
env:
NIKS3_SERVER_URL: https://cache.ekman.oceanbox.io
NIKS3_AUTH_TOKEN_FILE: ${{ runner.temp }}/niks3-auth-token
run: |
niks3="$(nix --extra-experimental-features 'nix-command flakes' \
build --no-link --print-out-paths 'github:Mic92/niks3/v1.6.1#niks3')/bin/niks3"
xargs -r "$niks3" push < "$RUNNER_TEMP/built-paths"
+2
View File
@@ -6,3 +6,5 @@ result-*
# Ignore automatically generated direnv output # Ignore automatically generated direnv output
.direnv .direnv
.env
niks3-token
+97 -1
View File
@@ -1,2 +1,98 @@
# obx-pkgs # Oceanbox Nixpkgs
`obx-pkgs` is the shared Oceanbox Nix overlay. It collects packages that we use
across projects but that are either not in nixpkgs, are stuck on an outdated
version, or need internal patches. Each project that consumes the overlay gets
the same versions, the same fixes, and a single place to update them.
## Usage
### As an overlay on nixpkgs (recommended)
With `npins`:
```nix
{
sources ? import ./npins,
pkgs ? import sources.nixpkgs {
overlays = [ (import "${sources.obx-pkgs}/overlay.nix") ];
},
}:
# pkgs.arcosparse, pkgs.openzl, pkgs.sphinx-shibuya-theme, ... are now available
```
With `flakes`:
```nix
{
inputs.obx-pkgs.url = "git+https://git.oceanbox.io/oceanbox/obx-pkgs";
outputs = { nixpkgs, obx-pkgs, ... }: {
legacyPackages.x86_64-linux = import nixpkgs {
system = "x86_64-linux";
overlays = [ obx-pkgs.overlays.default ];
};
};
}
```
### As a standalone package set
```nix
let
obx = import sources.obx-pkgs { };
in
[ obx.copernicusmarine obx.sz3 ]
```
Useful when you want one of our packages without modifying the rest
of nixpkgs.
## Adding a package
```text
by-name/
<package-name>/
default.nix
```
`default.nix` is a regular `callPackage` function, the same shape you would
write for nixpkgs:
```nix
{ stdenv, fetchFromGitHub, ... }:
stdenv.mkDerivation { ... }
```
Cross-references between our own packages work via the standard argument syntax
name the dependency in the argument list (e.g. `arcosparse`) and the overlay's
`self.callPackage` injects it.
Once the directory exists it is picked up automatically
## Development
```text
nix-shell
```
drops you into a shell with `npins`, `nix-init`, `nix-update`, and a
pre-configured `treefmt`.
Format the tree:
```text
treefmt
```
Update a pin:
```text
npins update nixpkgs
```
Bump a package version:
```text
nix-update -f . <package-name>
```
+7
View File
@@ -0,0 +1,7 @@
{ buildDotnetGlobalTool }:
buildDotnetGlobalTool {
pname = "fable";
version = "4.24.0";
nugetHash = "sha256-ERewWqfEyyZKpHFFALpMGJT0fDWywBYY5buU/wTZZTg=";
meta.mainProgram = "fable";
}
+7
View File
@@ -0,0 +1,7 @@
{ buildDotnetGlobalTool }:
buildDotnetGlobalTool {
pname = "fable";
version = "4.29.0";
nugetHash = "sha256-Eed1bb9heteWOWmv6NnXPzXbf3t218K/eHufwgtRuzI=";
meta.mainProgram = "fable";
}
@@ -0,0 +1,7 @@
{ buildDotnetGlobalTool }:
buildDotnetGlobalTool {
pname = "fsharp-analyzers";
version = "0.35.0";
nugetHash = "sha256-GxQR3Fq28cb+akNbzRTav9nhMtayN/0g2d1G6Ml+ck4=";
meta.mainProgram = "fsharp-analyzers";
}
@@ -46,5 +46,7 @@ python3Packages.buildPythonPackage {
"test_repo_shallow" "test_repo_shallow"
"test_repo_shallow_without_warning" "test_repo_shallow_without_warning"
"test_exclude_patterns_deps_dates" # broken at this rev: exclude pattern on deps doesn't fall back correctly
]; ];
} }
+7 -8
View File
@@ -24,14 +24,13 @@ stdenv.mkDerivation {
pkg-config pkg-config
]; ];
buildInputs = buildInputs = [
[ zstd
zstd gsl
gsl ]
] ++ lib.optionals stdenv.cc.isClang [
++ lib.optionals stdenv.cc.isClang [ llvmPackages.openmp
llvmPackages.openmp ];
];
cmakeFlags = [ cmakeFlags = [
"-DBUILD_SHARED_LIBS=ON" "-DBUILD_SHARED_LIBS=ON"
+1 -1
View File
@@ -18,7 +18,7 @@ let
mkPackages = mkPackages =
fun: dir: fun: dir:
builtins.map (name: { map (name: {
inherit name; inherit name;
value = fun (dir + "/${name}") { }; value = fun (dir + "/${name}") { };
}) (listDirs dir); }) (listDirs dir);
+30 -19
View File
@@ -65,7 +65,9 @@ let
if pkgs == null then if pkgs == null then
{ {
inherit (builtins) fetchTarball fetchurl; inherit (builtins) fetchTarball fetchurl;
# For some fucking reason, fetchGit has a different signature than the other builtin fetchers … # Frustratingly, due to flakes and `fetchTree`, `fetchGit`
# has a different signature than the other builtin
# fetchers
fetchGit = args: (builtins.fetchGit args).outPath; fetchGit = args: (builtins.fetchGit args).outPath;
} }
else else
@@ -95,7 +97,6 @@ let
}; };
}; };
# Dispatch to the correct code path based on the type
path = path =
if spec.type == "Git" then if spec.type == "Git" then
mkGitSource fetchers spec mkGitSource fetchers spec
@@ -105,8 +106,8 @@ let
mkPyPiSource fetchers spec mkPyPiSource fetchers spec
else if spec.type == "Channel" then else if spec.type == "Channel" then
mkChannelSource fetchers spec mkChannelSource fetchers spec
else if spec.type == "Tarball" then else if spec.type == "Url" || spec.type == "MutableUrl" then
mkTarballSource fetchers spec mkUrlSource fetchers spec
else if spec.type == "Container" then else if spec.type == "Container" then
mkContainerSource pkgs spec mkContainerSource pkgs spec
else else
@@ -192,16 +193,20 @@ let
sha256 = hash; sha256 = hash;
}; };
mkTarballSource = mkUrlSource =
{ fetchTarball, ... }:
{ {
url, fetchTarball,
locked_url ? url, fetchurl,
hash,
... ...
}: }:
fetchTarball { {
url = locked_url; url,
hash,
unpack,
...
}:
(if unpack then fetchTarball else fetchurl) {
inherit url;
sha256 = hash; sha256 = hash;
}; };
@@ -211,16 +216,22 @@ let
image_name, image_name,
image_tag, image_tag,
image_digest, image_digest,
hash,
... ...
}: }@args:
if pkgs == null then if pkgs == null then
builtins.throw "container sources require passing in a Nixpkgs value: https://github.com/andir/npins/blob/master/README.md#using-the-nixpkgs-fetchers" builtins.throw "container sources require passing in a Nixpkgs value: https://github.com/andir/npins/blob/master/README.md#using-the-nixpkgs-fetchers"
else else
pkgs.dockerTools.pullImage { pkgs.dockerTools.pullImage (
imageName = image_name; {
imageDigest = image_digest; imageName = image_name;
finalImageTag = image_tag; imageDigest = image_digest;
}; finalImageTag = image_tag;
hash = hash;
}
// (if args.arch or null != null then { arch = args.arch; } else { })
);
in in
mkFunctor ( mkFunctor (
{ {
@@ -231,7 +242,7 @@ mkFunctor (
if builtins.isPath input then if builtins.isPath input then
# while `readFile` will throw an error anyways if the path doesn't exist, # while `readFile` will throw an error anyways if the path doesn't exist,
# we still need to check beforehand because *our* error can be caught but not the one from the builtin # we still need to check beforehand because *our* error can be caught but not the one from the builtin
# *piegames sighs* # See: <https://git.lix.systems/lix-project/lix/issues/1098>
if builtins.pathExists input then if builtins.pathExists input then
builtins.fromJSON (builtins.readFile input) builtins.fromJSON (builtins.readFile input)
else else
@@ -242,7 +253,7 @@ mkFunctor (
throw "Unsupported input type ${builtins.typeOf input}, must be a path or an attrset"; throw "Unsupported input type ${builtins.typeOf input}, must be a path or an attrset";
version = data.version; version = data.version;
in in
if version == 7 then if version == 8 then
builtins.mapAttrs (name: spec: mkFunctor (mkSource name spec)) data.pins builtins.mapAttrs (name: spec: mkFunctor (mkSource name spec)) data.pins
else else
throw "Unsupported format version ${toString version} in sources.json. Try running `npins upgrade`" throw "Unsupported format version ${toString version} in sources.json. Try running `npins upgrade`"
+17 -3
View File
@@ -3,9 +3,23 @@
"nixpkgs": { "nixpkgs": {
"type": "Channel", "type": "Channel",
"name": "nixos-unstable", "name": "nixos-unstable",
"url": "https://releases.nixos.org/nixos/unstable/nixos-26.05pre1004030.64c08a7ca051/nixexprs.tar.xz", "artifact": "nixexprs.tar.xz",
"hash": "sha256-NpH8iEQ5JHv/BtUuzTEXUMDxPLetCDzIv4OxL8H7Kps=" "url": "https://releases.nixos.org/nixos/unstable/nixos-26.11pre1014179.9ae611a455b9/nixexprs.tar.xz",
"hash": "sha256-d34lhgOet4IqYMnCxbIvwFBMOyTV6PT4TyNEOP0/ZhU="
},
"treefmt-nix": {
"type": "Git",
"repository": {
"type": "GitHub",
"owner": "numtide",
"repo": "treefmt-nix"
},
"branch": "main",
"submodules": false,
"revision": "db947814a175b7ca6ded66e21383d938df01c227",
"url": "https://github.com/numtide/treefmt-nix/archive/db947814a175b7ca6ded66e21383d938df01c227.tar.gz",
"hash": "sha256-eynAfOmbmxJnkp7YewvCEbShNnnYJ9gLLqkzsYtBPeM="
} }
}, },
"version": 7 "version": 8
} }
+5 -2
View File
@@ -2,12 +2,15 @@
sources ? import ./npins, sources ? import ./npins,
pkgs ? import sources.nixpkgs { }, pkgs ? import sources.nixpkgs { },
}: }:
let
treefmt = pkgs.callPackage ./tools/treefmt.nix { inherit sources; };
in
pkgs.mkShellNoCC { pkgs.mkShellNoCC {
packages = [ packages = [
pkgs.npins pkgs.npins
pkgs.niks3
pkgs.nix-init pkgs.nix-init
pkgs.nixfmt-rfc-style
pkgs.nix-update pkgs.nix-update
treefmt
]; ];
} }
+22
View File
@@ -0,0 +1,22 @@
{ pkgs, sources, ... }:
let
treefmt-nix = import sources.treefmt-nix;
in
treefmt-nix.mkWrapper pkgs {
projectRootFile = ".git/config";
programs = {
nixfmt.enable = true;
deadnix.enable = true;
statix = {
enable = true;
disabled-lints = [
"manual_inherit_from"
"repeated_keys"
];
};
shellcheck.enable = true;
};
settings.global.excludes = [
"npins/default.nix"
];
}