nixpkgs mirror (for testing)
github.com/NixOS/nixpkgs
nix
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 lndir,
25 runCommand,
26 stdenv,
27 fetchFromCodeberg,
28 buildNpmPackage,
29 writableTmpDirAsHomeHook,
30}:
31
32let
33 src = fetchFromCodeberg {
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 writableTmpDirAsHomeHook
81 ];
82
83 patches = [
84 ./static-root-path.patch
85 ];
86
87 postPatch = ''
88 substituteInPlace modules/setting/server.go --subst-var data
89 '';
90
91 tags = lib.optionals sqliteSupport [
92 "sqlite"
93 "sqlite_unlock_notify"
94 ];
95
96 ldflags = [
97 "-s"
98 "-w"
99 "-X main.Version=${version}"
100 "-X 'main.Tags=${lib.concatStringsSep " " tags}'"
101 ];
102
103 preConfigure = ''
104 export ldflags+=" -X main.ForgejoVersion=$(GITEA_VERSION=${version} make show-version-api)"
105 '';
106
107 # expose and use the GO_TEST_PACKAGES var from the Makefile
108 # instead of manually copying over the entire list:
109 # https://codeberg.org/forgejo/forgejo/src/tag/v11.0.6/Makefile#L128
110 # https://codeberg.org/forgejo/forgejo/src/tag/v13.0.0/Makefile#L290
111 preCheck = ''
112 echo -e 'show-backend-tests:${lib.optionalString (lib.versionAtLeast version "13") " | compute-go-test-packages"}\n\t@echo ''${GO_TEST_PACKAGES}' >> Makefile
113 getGoDirs() {
114 make show-backend-tests
115 }
116
117 # TestRunHookPrePostReceive (cmd/hook_test.go) needs .git to pass
118 git init
119 '';
120
121 checkFlags =
122 let
123 skippedTests = [
124 "TestPassword" # requires network: api.pwnedpasswords.com
125 "TestCaptcha" # requires network: hcaptcha.com
126 "TestDNSUpdate" # requires network: release.forgejo.org
127 "TestMigrateWhiteBlocklist" # requires network: gitlab.com (DNS)
128 "TestURLAllowedSSH/Pushmirror_URL" # requires network git.gay (DNS)
129 ];
130 in
131 [ "-skip=^${builtins.concatStringsSep "$|^" skippedTests}$" ];
132
133 preInstall = ''
134 mv "$GOPATH/bin/forgejo.org" "$GOPATH/bin/forgejo"
135 '';
136
137 postInstall = ''
138 mkdir $data
139 cp -R ./{templates,options} ${frontend}/public $data
140 mkdir -p $out
141 cp -R ./options/locale $out/locale
142 wrapProgram $out/bin/forgejo \
143 --prefix PATH : ${
144 lib.makeBinPath [
145 bash
146 git
147 gzip
148 openssh
149 ]
150 }
151 '';
152
153 # $data is not available in goModules.drv
154 overrideModAttrs = (
155 _: {
156 postPatch = null;
157 }
158 );
159
160 passthru = {
161 # allow nix-update to handle npmDepsHash
162 inherit (frontend) npmDeps;
163
164 data-compressed =
165 runCommand "forgejo-data-compressed"
166 {
167 nativeBuildInputs = [
168 brotli
169 lndir
170 ];
171 }
172 ''
173 mkdir $out
174 lndir ${forgejo.data}/ $out/
175
176 # Create static gzip and brotli files
177 find -L $out -type f -regextype posix-extended -iregex '.*\.(css|html|js|svg|ttf|txt)' \
178 -exec gzip --best --keep --force {} ';' \
179 -exec brotli --best --keep --no-copy-stat {} ';'
180 '';
181
182 tests = if lts then nixosTests.forgejo-lts else nixosTests.forgejo;
183
184 updateScript = nix-update-script {
185 extraArgs = nixUpdateExtraArgs ++ [
186 "--version-regex"
187 "v(${lib.versions.major version}\\.[0-9.]+)"
188 ];
189 };
190 };
191
192 meta = {
193 description = "Self-hosted lightweight software forge";
194 homepage = "https://forgejo.org";
195 changelog = "https://codeberg.org/forgejo/forgejo/releases/tag/v${version}";
196 license = lib.licenses.gpl3Plus;
197 teams = [ lib.teams.forgejo ];
198 broken = stdenv.hostPlatform.isDarwin;
199 mainProgram = "forgejo";
200 };
201}