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)