btrbk: add mainProgram (#356350)
[NixPkgs.git] / pkgs / by-name / fo / forgejo / generic.nix
blob756843b7d2af22465d7d628f43568ba27c127794
1 { lts ? false
2 , version
3 , rev ? "refs/tags/v${version}"
4 , hash
5 , npmDepsHash
6 , vendorHash
7 , nixUpdateExtraArgs ? [ ]
8 }:
10 { bash
11 , brotli
12 , buildGoModule
13 , forgejo
14 , git
15 , gzip
16 , lib
17 , makeWrapper
18 , nix-update-script
19 , nixosTests
20 , openssh
21 , sqliteSupport ? true
22 , xorg
23 , runCommand
24 , stdenv
25 , fetchFromGitea
26 , buildNpmPackage
29 let
30   src = fetchFromGitea {
31     domain = "codeberg.org";
32     owner = "forgejo";
33     repo = "forgejo";
34     inherit rev hash;
35   };
37   frontend = buildNpmPackage {
38     pname = "forgejo-frontend";
39     inherit src version npmDepsHash;
41     patches = [
42       ./package-json-npm-build-frontend.patch
43     ];
45     # override npmInstallHook
46     installPhase = ''
47       mkdir $out
48       cp -R ./public $out/
49     '';
50   };
52 buildGoModule rec {
53   pname = "forgejo" + lib.optionalString lts "-lts";
55   inherit
56     version
57     src
58     vendorHash
59   ;
61   subPackages = [ "." "contrib/environment-to-ini" ];
63   outputs = [ "out" "data" ];
65   nativeBuildInputs = [
66     makeWrapper
67   ];
69   nativeCheckInputs = [
70     git
71     openssh
72   ];
74   patches = [
75     ./static-root-path.patch
76   ];
78   postPatch = ''
79     substituteInPlace modules/setting/server.go --subst-var data
80   '';
82   tags = lib.optionals sqliteSupport [ "sqlite" "sqlite_unlock_notify" ];
84   ldflags = [
85     "-s"
86     "-w"
87     "-X main.Version=${version}"
88     "-X 'main.Tags=${lib.concatStringsSep " " tags}'"
89   ];
91   preConfigure = ''
92     export ldflags+=" -X main.ForgejoVersion=$(GITEA_VERSION=${version} make show-version-api)"
93   '';
95   preCheck = ''
96     # $HOME is required for ~/.ssh/authorized_keys and such
97     export HOME="$TMPDIR/home"
99     # expose and use the GO_TEST_PACKAGES var from the Makefile
100     # instead of manually copying over the entire list:
101     # https://codeberg.org/forgejo/forgejo/src/tag/v7.0.4/Makefile#L124
102     echo -e 'show-backend-tests:\n\t@echo ''${GO_TEST_PACKAGES}' >> Makefile
103     getGoDirs() {
104       make show-backend-tests
105     }
106   '';
108   checkFlags =
109     let
110       skippedTests = [
111         "Test_SSHParsePublicKey/dsa-1024/SSHKeygen" # dsa-1024 is deprecated in openssh and requires opting-in at compile time
112         "Test_calcFingerprint/dsa-1024/SSHKeygen" # dsa-1024 is deprecated in openssh and requires opting-in at compile time
113         "TestPassword" # requires network: api.pwnedpasswords.com
114         "TestCaptcha" # requires network: hcaptcha.com
115         "TestDNSUpdate" # requires network: release.forgejo.org
116         "TestMigrateWhiteBlocklist" # requires network: gitlab.com (DNS)
117       ];
118     in
119     [ "-skip=^${builtins.concatStringsSep "$|^" skippedTests}$" ];
121   postInstall = ''
122     mkdir $data
123     cp -R ./{templates,options} ${frontend}/public $data
124     mkdir -p $out
125     cp -R ./options/locale $out/locale
126     wrapProgram $out/bin/gitea \
127       --prefix PATH : ${lib.makeBinPath [ bash git gzip openssh ]}
128   '';
130   # $data is not available in goModules.drv
131   overrideModAttrs = (_: {
132     postPatch = null;
133   });
135   passthru = {
136     # allow nix-update to handle npmDepsHash
137     inherit (frontend) npmDeps;
139     data-compressed = runCommand "forgejo-data-compressed" {
140       nativeBuildInputs = [ brotli xorg.lndir ];
141     } ''
142       mkdir $out
143       lndir ${forgejo.data}/ $out/
145       # Create static gzip and brotli files
146       find -L $out -type f -regextype posix-extended -iregex '.*\.(css|html|js|svg|ttf|txt)' \
147         -exec gzip --best --keep --force {} ';' \
148         -exec brotli --best --keep --no-copy-stat {} ';'
149     '';
151     tests = if lts then nixosTests.forgejo-lts else nixosTests.forgejo;
152     updateScript = nix-update-script { extraArgs = nixUpdateExtraArgs; };
153   };
155   meta = {
156     description = "Self-hosted lightweight software forge";
157     homepage = "https://forgejo.org";
158     changelog = "https://codeberg.org/forgejo/forgejo/releases/tag/v${version}";
159     license = if lib.versionAtLeast version "9.0.0" then lib.licenses.gpl3Plus else lib.licenses.mit;
160     maintainers = with lib.maintainers; [ emilylange urandom bendlas adamcstephens marie ];
161     broken = stdenv.hostPlatform.isDarwin;
162     mainProgram = "gitea";
163   };