From 147fe172d93333b14816aa9cd6b307dc0d146cf6 Mon Sep 17 00:00:00 2001 From: stuebinm Date: Thu, 16 May 2024 19:06:15 +0200 Subject: [PATCH] bundle forgejo @ v7.0.2 this bundles the current package recipe of forgejo in nixpkgs-unstable. Implies updating forgejo, since nixpkgs-stable is still on 1.20.6 (v6 in the new version scheme). This'll mean we have to manually update it same as with mattermost, and can potentially also help with upstream changes. If we get tired of that, we can always decide to just use the nixpkgs-unstable version directly. --- pkgs/default.nix | 4 + pkgs/forgejo/default.nix | 131 ++++++++++++++++++ .../package-json-npm-build-frontend.patch | 14 ++ pkgs/forgejo/static-root-path.patch | 13 ++ 4 files changed, 162 insertions(+) create mode 100644 pkgs/forgejo/default.nix create mode 100644 pkgs/forgejo/package-json-npm-build-frontend.patch create mode 100644 pkgs/forgejo/static-root-path.patch diff --git a/pkgs/default.nix b/pkgs/default.nix index 7969daf..415aa00 100644 --- a/pkgs/default.nix +++ b/pkgs/default.nix @@ -13,6 +13,10 @@ let buildGoModule = unstable.buildGo122Module; }; + forgejo = callPackage ./forgejo { + buildGoModule = unstable.buildGo122Module; + }; + tracktrain = import sources.tracktrain { nixpkgs = pkgs; compiler = "default"; diff --git a/pkgs/forgejo/default.nix b/pkgs/forgejo/default.nix new file mode 100644 index 0000000..93fea61 --- /dev/null +++ b/pkgs/forgejo/default.nix @@ -0,0 +1,131 @@ +{ bash +, brotli +, buildGoModule +, forgejo +, git +, gzip +, lib +, makeWrapper +, nix-update-script +, nixosTests +, openssh +, pam +, pamSupport ? true +, sqliteSupport ? true +, xorg +, runCommand +, stdenv +, fetchFromGitea +, buildNpmPackage +}: + +let + frontend = buildNpmPackage { + pname = "forgejo-frontend"; + inherit (forgejo) src version; + + npmDepsHash = "sha256-BffoEbIzTU61bw3ECEm5eDHcav4S27MB5jQKsMprkcw="; + + patches = [ + ./package-json-npm-build-frontend.patch + ]; + + # override npmInstallHook + installPhase = '' + mkdir $out + cp -R ./public $out/ + ''; + }; +in +buildGoModule rec { + pname = "forgejo"; + version = "7.0.2"; + + src = fetchFromGitea { + domain = "codeberg.org"; + owner = "forgejo"; + repo = "forgejo"; + rev = "v${version}"; + hash = "sha256-YY5dHXWMqlCIPfqsDtHZLHjEdYmrFnh4yc0hfTUESww="; + }; + + vendorHash = "sha256-UcjaMi/4XYLdaJhi2j3UWqHqkpTbZBo6EwNXxdRIKLw="; + + subPackages = [ "." ]; + + outputs = [ "out" "data" ]; + + nativeBuildInputs = [ makeWrapper ]; + buildInputs = lib.optional pamSupport pam; + + patches = [ + ./static-root-path.patch + ]; + + postPatch = '' + substituteInPlace modules/setting/server.go --subst-var data + ''; + + tags = lib.optional pamSupport "pam" + ++ lib.optionals sqliteSupport [ "sqlite" "sqlite_unlock_notify" ]; + + ldflags = [ + "-s" + "-w" + "-X main.Version=${version}" + "-X 'main.Tags=${lib.concatStringsSep " " tags}'" + ]; + + preConfigure = '' + export ldflags+=" -X main.ForgejoVersion=$(GITEA_VERSION=${version} make show-version-api)" + ''; + + preBuild = '' + go run build/merge-forgejo-locales.go + ''; + + postInstall = '' + mkdir $data + cp -R ./{templates,options} ${frontend}/public $data + mkdir -p $out + cp -R ./options/locale $out/locale + wrapProgram $out/bin/gitea \ + --prefix PATH : ${lib.makeBinPath [ bash git gzip openssh ]} + ''; + + # $data is not available in goModules.drv and preBuild isn't needed + overrideModAttrs = (_: { + postPatch = null; + preBuild = null; + }); + + passthru = { + # allow nix-update to handle npmDepsHash + inherit (frontend) npmDeps; + + data-compressed = runCommand "forgejo-data-compressed" { + nativeBuildInputs = [ brotli xorg.lndir ]; + } '' + mkdir $out + lndir ${forgejo.data}/ $out/ + + # Create static gzip and brotli files + find -L $out -type f -regextype posix-extended -iregex '.*\.(css|html|js|svg|ttf|txt)' \ + -exec gzip --best --keep --force {} ';' \ + -exec brotli --best --keep --no-copy-stat {} ';' + ''; + + tests = nixosTests.forgejo; + updateScript = nix-update-script { }; + }; + + meta = { + description = "A self-hosted lightweight software forge"; + homepage = "https://forgejo.org"; + changelog = "https://codeberg.org/forgejo/forgejo/releases/tag/${src.rev}"; + license = lib.licenses.mit; + maintainers = with lib.maintainers; [ emilylange urandom bendlas adamcstephens ]; + broken = stdenv.isDarwin; + mainProgram = "gitea"; + }; +} diff --git a/pkgs/forgejo/package-json-npm-build-frontend.patch b/pkgs/forgejo/package-json-npm-build-frontend.patch new file mode 100644 index 0000000..f7567da --- /dev/null +++ b/pkgs/forgejo/package-json-npm-build-frontend.patch @@ -0,0 +1,14 @@ +diff --git a/package.json b/package.json +index b50c52cf43..d6aafb8775 100644 +--- a/package.json ++++ b/package.json +@@ -98,5 +98,8 @@ + }, + "browserslist": [ + "defaults" +- ] ++ ], ++ "scripts": { ++ "build": "node_modules/.bin/webpack" ++ } + } diff --git a/pkgs/forgejo/static-root-path.patch b/pkgs/forgejo/static-root-path.patch new file mode 100644 index 0000000..598c3a8 --- /dev/null +++ b/pkgs/forgejo/static-root-path.patch @@ -0,0 +1,13 @@ +diff --git a/modules/setting/server.go b/modules/setting/server.go +index c20dd1949d..c9bcdce99a 100644 +--- a/modules/setting/server.go ++++ b/modules/setting/server.go +@@ -317,7 +317,7 @@ func loadServerFrom(rootCfg ConfigProvider) { + RedirectorUseProxyProtocol = sec.Key("REDIRECTOR_USE_PROXY_PROTOCOL").MustBool(UseProxyProtocol) + OfflineMode = sec.Key("OFFLINE_MODE").MustBool(true) + if len(StaticRootPath) == 0 { +- StaticRootPath = AppWorkPath ++ StaticRootPath = "@data@" + } + StaticRootPath = sec.Key("STATIC_ROOT_PATH").MustString(StaticRootPath) + StaticCacheTime = sec.Key("STATIC_CACHE_TIME").MustDuration(6 * time.Hour)