From 8084b147af14b35145d4006cb2099fb18f425e52 Mon Sep 17 00:00:00 2001 From: Adam0 Date: Fri, 14 Aug 2026 19:00:44 -0400 Subject: [PATCH] Add temporary Tangled fetcher --- default.nix | 9 +- lib/fetch-from-tangled.nix | 172 +++++++++++++++++++++++++++++++++++ pkgs/tangled-mcp/default.nix | 6 +- pkgs/tg/default.nix | 6 +- 4 files changed, 185 insertions(+), 8 deletions(-) create mode 100644 lib/fetch-from-tangled.nix diff --git a/default.nix b/default.nix index cd3b98a..1eb69c2 100644 --- a/default.nix +++ b/default.nix @@ -7,8 +7,13 @@ # nix-build -A mypackage {pkgs ? import {}, ...}: let inherit (builtins) isAttrs; + + localPkgs = pkgs.extend (final: _previous: { + fetchFromTangled = final.callPackage ./lib/fetch-from-tangled.nix {}; + }); + inherit - (pkgs) + (localPkgs) # keep-sorted start callPackage lib @@ -35,7 +40,7 @@ recurseCallPackage = path: recurseIntoAttrs (callPackage path {}); discoveredPackages = filesystem.packagesFromDirectoryRecursive { - inherit (pkgs) callPackage newScope; + inherit (localPkgs) callPackage newScope; directory = ./pkgs; }; diff --git a/lib/fetch-from-tangled.nix b/lib/fetch-from-tangled.nix new file mode 100644 index 0000000..8d03aa8 --- /dev/null +++ b/lib/fetch-from-tangled.nix @@ -0,0 +1,172 @@ +{ + # keep-sorted start + fetchgit, + fetchzip, + lib, + repoRevToNameMaybe, + # keep-sorted end +}: let + inherit + (lib) + # keep-sorted start + assertMsg + attrNames + functionArgs + makeOverridable + mapAttrs + optionalAttrs + overrideExisting + revOrTag + setFunctionArgs + xor + # keep-sorted end + ; + + defaultGitArgs = { + # keep-sorted start + deepClone = false; + fetchLFS = false; + fetchSubmodules = false; + forceFetchGit = false; + leaveDotGit = null; + postCheckout = ""; + rootDir = ""; + sparseCheckout = null; + # keep-sorted end + }; + + nullableGitArgs = { + leaveDotGit = false; + sparseCheckout = []; + }; + + normalizedGitArgs = defaultGitArgs // nullableGitArgs; + + excludedGitArgNames = [ + "forceFetchGit" + ]; + + gitFunctionArgs = mapAttrs (_: _: true) defaultGitArgs; + + makeOverridableWithGitArgs = function: + makeOverridable (setFunctionArgs function (gitFunctionArgs // functionArgs function)); + + archiveFetcher = + if fetchzip ? override + then + fetchzip.override { + withUnzip = false; + } + else fetchzip; +in + makeOverridableWithGitArgs ( + { + # keep-sorted start + did, + domain ? "tangled.org", + meta ? {}, + passthru ? {}, + rev ? null, + tag ? null, + # keep-sorted end + ... # Hash agility and additional fetchgit arguments. + } @ args: + assert assertMsg (xor (tag != null) (rev != null)) + "fetchFromTangled requires exactly one of `rev` or `tag`."; let + usesFetchGit = + mapAttrs ( + name: default: + if args ? ${name} && (nullableGitArgs ? ${name} -> args.${name} != null) + then args.${name} + else default + ) + normalizedGitArgs + != normalizedGitArgs; + + passedGitArgs = overrideExisting (removeAttrs defaultGitArgs excludedGitArgNames) args; + + sourcePosition = + if args.meta.description or null != null + then builtins.unsafeGetAttrPos "description" args.meta + else if tag != null + then builtins.unsafeGetAttrPos "tag" args + else builtins.unsafeGetAttrPos "rev" args; + + baseUrl = "https://${domain}/${did}"; + + sourceMeta = + meta + // { + homepage = meta.homepage or baseUrl; + } + // optionalAttrs (sourcePosition != null) { + position = "${sourcePosition.file}:${toString sourcePosition.line}"; + }; + + forwardedArgs = removeAttrs args ( + [ + # keep-sorted start + "did" + "domain" + "fetchSubmodules" + "forceFetchGit" + "rev" + "tag" + # keep-sorted end + ] + ++ ( + if usesFetchGit + then excludedGitArgNames + else attrNames gitFunctionArgs + ) + ); + + fetcher = + if usesFetchGit + then fetchgit + else archiveFetcher; + + makeFetcherArgs = finalAttrs: + forwardedArgs + // ( + if usesFetchGit + then + passedGitArgs + // { + inherit passthru rev tag; + + url = baseUrl; + + derivationArgs = { + inherit did domain; + }; + } + else { + extension = "tar.gz"; + url = "${baseUrl}/archive/${finalAttrs.rev}"; + + derivationArgs = { + inherit did domain tag; + rev = fetchgit.getRevWithTag { + inherit (finalAttrs) tag; + rev = finalAttrs.revCustom; + }; + revCustom = rev; + }; + + passthru = + { + gitRepoUrl = baseUrl; + } + // passthru; + } + ) + // { + meta = sourceMeta; + name = + args.name + or (repoRevToNameMaybe finalAttrs.did (revOrTag finalAttrs.revCustom finalAttrs.tag) "tangled"); + }; + in + fetcher makeFetcherArgs + ) diff --git a/pkgs/tangled-mcp/default.nix b/pkgs/tangled-mcp/default.nix index 4461fd4..c1550e2 100644 --- a/pkgs/tangled-mcp/default.nix +++ b/pkgs/tangled-mcp/default.nix @@ -1,6 +1,6 @@ { # keep-sorted start - fetchgit, + fetchFromTangled, lib, python3Packages, # keep-sorted end @@ -10,8 +10,8 @@ python3Packages.buildPythonApplication rec { version = "0.0.14"; pyproject = true; - src = fetchgit { - url = "https://tangled.org/zzstoatzz.io/tangled-mcp"; + src = fetchFromTangled { + did = "did:plc:ml5ytzwznx6tjyjuanvvmctr"; tag = "v${version}"; hash = "sha256-6yXDNdnKvvJ5OiROsIEaiTWEQ+dG15AZ5WyI0cAbERQ="; }; diff --git a/pkgs/tg/default.nix b/pkgs/tg/default.nix index b18826e..ea5ba9b 100644 --- a/pkgs/tg/default.nix +++ b/pkgs/tg/default.nix @@ -1,7 +1,7 @@ { # keep-sorted start buildGo126Module, - fetchgit, + fetchFromTangled, git, installShellFiles, lib, @@ -12,8 +12,8 @@ buildGo126Module { pname = "tg"; version = "0-unstable-2026-07-31"; - src = fetchgit { - url = "https://tangled.org/aly.codes/tg"; + src = fetchFromTangled { + did = "did:plc:g5uweck3xar3m745g43giuhr"; rev = "c2391cb2f22526bcb0beb1b84c7764084436f9e7"; hash = "sha256-0R6k6X7/k2/LjAy/pwPke/ja/Lx9/MFrF/jYtAKIdqI="; }; -- 2.51.2