1{
2 lts ? false,
3 version,
4 rev ? "refs/tags/v${version}",
5 hash,
6 npmDepsHash,
7 vendorHash,
8 nixUpdateExtraArgs ? [ ],
9}:
10
11{
12 bash,
13 brotli,
14 buildGoModule,
15 forgejo,
16 git,
17 gzip,
18 lib,
19 makeWrapper,
20 nix-update-script,
21 nixosTests,
22 openssh,
23 sqliteSupport ? true,
24 xorg,
25 runCommand,
26 stdenv,
27 fetchFromGitea,
28 buildNpmPackage,
29}:
30
31let
32 src = fetchFromGitea {
33 domain = "codeberg.org";
34 owner = "forgejo";
35 repo = "forgejo";
36 inherit rev hash;
37 };
38
39 frontend = buildNpmPackage {
40 pname = "forgejo-frontend";
41 inherit src version npmDepsHash;
42
43 buildPhase = ''
44 ./node_modules/.bin/webpack
45 '';
46
47 # override npmInstallHook
48 installPhase = ''
49 mkdir $out
50 cp -R ./public $out/
51 '';
52 };
53in
54buildGoModule rec {
55 pname = "forgejo" + lib.optionalString lts "-lts";
56
57 inherit
58 version
59 src
60 vendorHash
61 ;
62
63 subPackages = [
64 "."
65 "contrib/environment-to-ini"
66 ];
67
68 outputs = [
69 "out"
70 "data"
71 ];
72
73 nativeBuildInputs = [
74 makeWrapper
75 ];
76
77 nativeCheckInputs = [
78 git
79 openssh
80 ];
81
82 patches = [
83 ./static-root-path.patch
84 ];
85
86 postPatch = ''
87 substituteInPlace modules/setting/server.go --subst-var data
88 '';
89
90 tags = lib.optionals sqliteSupport [
91 "sqlite"
92 "sqlite_unlock_notify"
93 ];
94
95 ldflags = [
96 "-s"
97 "-w"
98 "-X main.Version=${version}"
99 "-X 'main.Tags=${lib.concatStringsSep " " tags}'"
100 ];
101
102 preConfigure = ''
103 export ldflags+=" -X main.ForgejoVersion=$(GITEA_VERSION=${version} make show-version-api)"
104 '';
105
106 preCheck = ''
107 # $HOME is required for ~/.ssh/authorized_keys and such
108 export HOME="$TMPDIR/home"
109
110 # expose and use the GO_TEST_PACKAGES var from the Makefile
111 # instead of manually copying over the entire list:
112 # https://codeberg.org/forgejo/forgejo/src/tag/v7.0.4/Makefile#L124
113 echo -e 'show-backend-tests:\n\t@echo ''${GO_TEST_PACKAGES}' >> Makefile
114 getGoDirs() {
115 make show-backend-tests
116 }
117 '';
118
119 checkFlags =
120 let
121 skippedTests = [
122 "TestPassword" # requires network: api.pwnedpasswords.com
123 "TestCaptcha" # requires network: hcaptcha.com
124 "TestDNSUpdate" # requires network: release.forgejo.org
125 "TestMigrateWhiteBlocklist" # requires network: gitlab.com (DNS)
126 "TestURLAllowedSSH/Pushmirror_URL" # requires network git.gay (DNS)
127 ];
128 in
129 [ "-skip=^${builtins.concatStringsSep "$|^" skippedTests}$" ];
130
131 preInstall = ''
132 mv "$GOPATH/bin/forgejo.org" "$GOPATH/bin/gitea"
133 '';
134
135 postInstall = ''
136 mkdir $data
137 cp -R ./{templates,options} ${frontend}/public $data
138 mkdir -p $out
139 cp -R ./options/locale $out/locale
140 wrapProgram $out/bin/gitea \
141 --prefix PATH : ${
142 lib.makeBinPath [
143 bash
144 git
145 gzip
146 openssh
147 ]
148 }
149 '';
150
151 # $data is not available in goModules.drv
152 overrideModAttrs = (
153 _: {
154 postPatch = null;
155 }
156 );
157
158 passthru = {
159 # allow nix-update to handle npmDepsHash
160 inherit (frontend) npmDeps;
161
162 data-compressed =
163 runCommand "forgejo-data-compressed"
164 {
165 nativeBuildInputs = [
166 brotli
167 xorg.lndir
168 ];
169 }
170 ''
171 mkdir $out
172 lndir ${forgejo.data}/ $out/
173
174 # Create static gzip and brotli files
175 find -L $out -type f -regextype posix-extended -iregex '.*\.(css|html|js|svg|ttf|txt)' \
176 -exec gzip --best --keep --force {} ';' \
177 -exec brotli --best --keep --no-copy-stat {} ';'
178 '';
179
180 tests = if lts then nixosTests.forgejo-lts else nixosTests.forgejo;
181
182 updateScript = nix-update-script {
183 extraArgs = nixUpdateExtraArgs ++ [
184 "--version-regex"
185 "v(${lib.versions.major version}\\.[0-9.]+)"
186 ];
187 };
188 };
189
190 meta = {
191 description = "Self-hosted lightweight software forge";
192 homepage = "https://forgejo.org";
193 changelog = "https://codeberg.org/forgejo/forgejo/releases/tag/v${version}";
194 license = lib.licenses.gpl3Plus;
195 maintainers = with lib.maintainers; [
196 emilylange
197 urandom
198 bendlas
199 adamcstephens
200 marie
201 pyrox0
202 ];
203 broken = stdenv.hostPlatform.isDarwin;
204 mainProgram = "gitea";
205 };
206}