diff --git a/flake.nix b/flake.nix index daf9313..8729dfa 100644 --- a/flake.nix +++ b/flake.nix @@ -63,6 +63,25 @@ }; }; } + # Native-only packages — skip on s390x cross (gitea's pnpm step and + # cgo+sqlite link don't cross-compile cleanly). + // nixpkgs.lib.optionalAttrs (sys == "x86_64-linux" || sys == "aarch64-linux") { + gitea-projects-api = + let + # Our fork's go.mod requires Go 1.26.3; nixpkgs at this pin has + # only 1.26.0 (and unstable has 1.26.2). Bump the package's src. + go = pkgs.go_1_26.overrideAttrs (_: rec { + version = "1.26.3"; + src = pkgs.fetchurl { + url = "https://go.dev/dl/go${version}.src.tar.gz"; + hash = "sha256-HGRoddCqh5kTMYTtV895/yS97+jIggRwYCqdPW2Rkrg="; + }; + }); + in + pkgs.callPackage ./packages/gitea-projects-api.nix { + buildGoModule = pkgs.buildGoModule.override { inherit go; }; + }; + } # Xontribs: pass into `programs.xonsh.extraPackages` or # `pkgs.xonsh.override { extraPackages = ps: [...]; }`. // xontribs diff --git a/packages/gitea-projects-api.nix b/packages/gitea-projects-api.nix new file mode 100644 index 0000000..e90a28c --- /dev/null +++ b/packages/gitea-projects-api.nix @@ -0,0 +1,140 @@ +{ + lib, + buildGoModule, + fetchgit, + makeWrapper, + git, + bash, + coreutils, + gzip, + nodejs, + openssh, + fetchPnpmDeps, + pnpmConfigHook, + pnpm, + stdenv, + sqliteSupport ? true, +}: + +# Custom Gitea built from oleks/gitea feat/projects-api — upstream PR #37518 +# (Projects REST API) on top of upstream main. +# +# Mirrors the structure of nixpkgs' gitea derivation (frontend pnpm sub-drv +# + buildGoModule with go:embed of public/) but with our fork as src. + +let + pname = "gitea-projects-api"; + version = "1.27.0-dev-projects-api"; + + rawSrc = fetchgit { + url = "https://git.oleks.space/oleks/gitea.git"; + rev = "20f31b8967a4556fbdd32bc72c386d5a4c89bcc5"; + hash = "sha256-Ws8I+q6Y8/X13C3uAAFLUUF+DHZRgFrsuo5XG2Cvyns="; + }; + + # Gitea's package.json requires pnpm >= 11; nixpkgs ships pnpm 10. The + # lockfile is v9 (forward-compatible), so strip the engine constraint and + # the packageManager preference before any pnpm tool sees the source. + src = stdenv.mkDerivation { + pname = "${pname}-src"; + inherit version; + src = rawSrc; + dontConfigure = true; + dontBuild = true; + installPhase = '' + cp -R . $out + chmod -R +w $out + ${nodejs}/bin/node -e ' + const fs = require("fs"); + const path = process.argv[1]; + const pkg = JSON.parse(fs.readFileSync(path, "utf8")); + if (pkg.engines) delete pkg.engines.pnpm; + delete pkg.packageManager; + fs.writeFileSync(path, JSON.stringify(pkg, null, 2) + "\n"); + ' "$out/package.json" + ''; + }; + + frontend = stdenv.mkDerivation (finalAttrs: { + pname = "${pname}-frontend"; + inherit version src; + + pnpmDeps = fetchPnpmDeps { + inherit (finalAttrs) pname version src; + fetcherVersion = 3; + hash = "sha256-Egehno2w8XyfaY+JVyVzTBlIwBpusgnMaObWNPTvh3M="; + }; + + nativeBuildInputs = [ + nodejs + pnpmConfigHook + pnpm + ]; + + buildPhase = '' + make frontend + ''; + + installPhase = '' + mkdir -p $out + cp -R public $out/ + ''; + }); +in +buildGoModule { + inherit pname version src; + + proxyVendor = true; + vendorHash = "sha256-TxLmmeMinazGmIx94iQvpsncWKXb+42ddZcxbwayVgk="; + + outputs = [ + "out" + "data" + ]; + + subPackages = [ "." ]; + + nativeBuildInputs = [ makeWrapper ]; + + tags = lib.optionals sqliteSupport [ + "sqlite" + "sqlite_unlock_notify" + ]; + + ldflags = [ + "-s" + "-w" + "-X main.Version=${version}" + "-X 'main.Tags=${lib.concatStringsSep " " (lib.optionals sqliteSupport [ "sqlite" "sqlite_unlock_notify" ])}'" + ]; + + postInstall = '' + mkdir $data + ln -s ${frontend}/public $data/public + cp -R ./{templates,options} $data + mkdir -p $out + cp -R ./options/locale $out/locale + + wrapProgram $out/bin/gitea \ + --prefix PATH : ${ + lib.makeBinPath [ + bash + coreutils + git + gzip + openssh + ] + } + ''; + + meta = { + description = "Gitea fork with Projects REST API (upstream PR #37518)"; + homepage = "https://git.oleks.space/oleks/gitea"; + license = lib.licenses.mit; + mainProgram = "gitea"; + platforms = [ + "x86_64-linux" + "aarch64-linux" + ]; + }; +}