{ buildFHSUserEnv, writeShellScriptBin, buildBazelPackage, fetchgit, unzip }: { name ? "gerrit-${version}", version ? "3.9.1", src ? (fetchgit { url = "https://gerrit.googlesource.com/gerrit"; rev = "620a819cbf3c64fff7a66798822775ad42c91d8e"; branchName = "v${version}"; sha256 = "sha256:1mdxbgnx3mpxand4wq96ic38bb4yh45q271h40jrk7dk23sgmz02"; fetchSubmodules = true; }), bazelTargets ? [ "release" "api-skip-javadoc" ] }: let bazelRunScript = writeShellScriptBin "bazel-run" '' yarn config set cache-folder "$bazelOut/external/yarn_cache" export HOME="$bazelOut/external/home" mkdir -p "$bazelOut/external/home" exec /bin/bazel "$@" ''; bazelTop = buildFHSUserEnv { name = "bazel"; targetPkgs = pkgs: [ (pkgs.bazel_5.override { enableNixHacks = true; }) pkgs.jdk17_headless pkgs.zlib pkgs.python3 pkgs.curl pkgs.nodejs pkgs.yarn pkgs.git bazelRunScript ]; runScript = "/bin/bazel-run"; }; bazel = bazelTop // { override = x: bazelTop; }; in buildBazelPackage { inherit name version src; patches = [ ./0001-Syntax-highlight-nix.patch ./0002-Syntax-highlight-rules.pl.patch ./0003-Add-titles-to-CLs-over-HTTP.patch ]; inherit bazel bazelTargets; bazelFlags = [ "--repository_cache=" "--disk_cache=" ]; removeRulesCC = false; fetchConfigured = true; fetchAttrs = { sha256 = "sha256-rsYQR6/RO5NM3/fnB3lEmbz876B59QWxWpE3M/Z4rK4="; preBuild = '' rm .bazelversion ''; installPhase = '' runHook preInstall # Remove all built in external workspaces, Bazel will recreate them when building rm -rf $bazelOut/external/{bazel_tools,\@bazel_tools.marker} rm -rf $bazelOut/external/{embedded_jdk,\@embedded_jdk.marker} rm -rf $bazelOut/external/{local_config_cc,\@local_config_cc.marker} rm -rf $bazelOut/external/{local_*,\@local_*.marker} # Clear markers find $bazelOut/external -name '@*\.marker' -exec sh -c 'echo > {}' \; # Remove all vcs files rm -rf $(find $bazelOut/external -type d -name .git) rm -rf $(find $bazelOut/external -type d -name .svn) rm -rf $(find $bazelOut/external -type d -name .hg) # Removing top-level symlinks along with their markers. # This is needed because they sometimes point to temporary paths (?). # For example, in Tensorflow-gpu build: #sha256:06bmzbcb9717s4b016kcbn8nr9pgaz04i8bnzg7ybkbdwpl8vxvv"; platforms -> NIX_BUILD_TOP/tmp/install/35282f5123611afa742331368e9ae529/_embedded_binaries/platforms find $bazelOut/external -maxdepth 1 -type l | while read symlink; do name="$(basename "$symlink")" rm -rf "$symlink" "$bazelOut/external/@$name.marker" done # Patching symlinks to remove build directory reference find $bazelOut/external -type l | while read symlink; do new_target="$(readlink "$symlink" | sed "s,$NIX_BUILD_TOP,NIX_BUILD_TOP,")" rm "$symlink" ln -sf "$new_target" "$symlink" done echo '${bazel.name}' > $bazelOut/external/.nix-bazel-version # Gerrit fixups: # Normalize permissions on .yarn-{tarball,metadata} files test -d $bazelOut/external/yarn_cache && find $bazelOut/external/yarn_cache \( -name .yarn-tarball.tgz -or -name .yarn-metadata.json \) -exec chmod 644 {} + mkdir $bazelOut/_bits/ find . -name node_modules -prune -print | while read d; do echo "$d" "$(dirname $d)" mkdir -p $bazelOut/_bits/$(dirname $d) cp -R "$d" "$bazelOut/_bits/$(dirname $d)/node_modules" done (cd $bazelOut/ && tar czf $out --sort=name --mtime='@1' --owner=0 --group=0 --numeric-owner external/ _bits/) runHook postInstall ''; }; buildAttrs = { preConfigure = '' rm .bazelversion [ "$(ls -A $bazelOut/_bits)" ] && cp -R $bazelOut/_bits/* ./ || true ''; postPatch = '' # Disable all errorprone checks, since we might be using a different version. sed -i \ -e '/-Xep:/d' \ -e '/-XepExcludedPaths:/a "-XepDisableAllChecks",' \ tools/BUILD ''; installPhase = '' mkdir -p "$out"/webapps/ "$out"/share/api/ cp bazel-bin/release.war "$out"/webapps/gerrit-${version}.war unzip bazel-bin/api-skip-javadoc.zip -d "$out"/share/api ''; nativeBuildInputs = [ unzip ]; }; passthru = { # A list of plugins that are part of the gerrit.war file. # Use `java -jar gerrit.war ls | grep -Po '(?<=plugins/)[^.]+' | sed -e 's,^,",' -e 's,$,",' | sort` to generate that list. plugins = [ "codemirror-editor" "commit-message-length-validator" "delete-project" "download-commands" "gitiles" "hooks" "plugin-manager" "replication" "reviewnotes" "singleusergroup" "webhooks" ]; }; }