Clone of https://github.com/NixOS/nixpkgs.git (to stress-test knotserver)
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}