{ lib, stdenv, buildPackages, copyDesktopItems, fetchzip, makeDesktopItem, makeWrapper, adwaita-icon-theme, alsa-lib, at-spi2-atk, at-spi2-core, atk, cacert, cairo, cups, curlWithGnuTls, dbus, e2fsprogs, expat, fontconfig, freetype, gdk-pixbuf, git, glib, gtk3, krb5, libGL, libx11, libxscrnsaver, libxcomposite, libxcursor, libxdamage, libxext, libxfixes, libxi, libxrandr, libxrender, libxtst, libdrm, libgbm, libgnome-keyring, libuuid, libxcb, libxkbcommon, libxkbfile, libxshmfence, nspr, nss, openssl, pango, udev, unzip, zlib, }: let pname = "gitkraken"; version = "12.4.0"; throwSystem = throw "Unsupported system: ${stdenv.hostPlatform.system}"; srcs = { x86_64-linux = fetchzip { url = "https://api.gitkraken.dev/releases/production/linux/x64/${version}/gitkraken-amd64.tar.gz"; hash = "sha256-G7ZKY3ViTGgQy9iiprMgr5p442sauI4eeV2RnCmTLDQ="; }; aarch64-darwin = fetchzip { url = "https://api.gitkraken.dev/releases/production/darwin/arm64/${version}/GitKraken-v${version}.zip"; hash = "sha256-AbT9kx/NOBCSd5HWodqYDH3MzfFoGwOVC/Uqel2BeRM="; }; }; src = srcs.${stdenv.hostPlatform.system} or throwSystem; meta = { homepage = "https://www.gitkraken.com/git-client"; description = "Simplifying Git for any OS"; sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ]; license = lib.licenses.unfree; platforms = builtins.attrNames srcs; maintainers = with lib.maintainers; [ nicolas-goudry Rishik-Y TurnrDev ]; mainProgram = "gitkraken"; }; passthru.updateScript = ./update.sh; linux = stdenv.mkDerivation rec { inherit pname version src meta passthru ; dontBuild = true; dontConfigure = true; libPath = lib.makeLibraryPath [ stdenv.cc.cc curlWithGnuTls udev libx11 libxext libxcursor libxi libxcb glib libxscrnsaver libxkbfile libxtst nss nspr cups alsa-lib expat gdk-pixbuf dbus libxdamage libxrandr atk pango cairo freetype fontconfig libxcomposite libxfixes libxrender gtk3 libgnome-keyring openssl at-spi2-atk at-spi2-core libuuid e2fsprogs krb5 libdrm libgbm libxshmfence libxkbcommon libGL zlib ]; desktopItems = [ (makeDesktopItem { name = "gitkraken"; exec = "gitkraken"; icon = "gitkraken"; desktopName = "GitKraken Desktop"; genericName = "Git Client"; startupWMClass = "GitKraken"; categories = [ "Development" ]; comment = "Unleash your repo"; }) ]; nativeBuildInputs = [ copyDesktopItems # override doesn't preserve splicing https://github.com/NixOS/nixpkgs/issues/132651 # Has to use `makeShellWrapper` from `buildPackages` even though `makeShellWrapper` from the inputs is spliced because `propagatedBuildInputs` would pick the wrong one because of a different offset. (buildPackages.wrapGAppsHook3.override { makeWrapper = buildPackages.makeShellWrapper; }) ]; buildInputs = [ gtk3 adwaita-icon-theme ]; # avoid double-wrapping dontWrapGApps = true; installPhase = '' runHook preInstall mkdir -p $out/share/${pname}/ cp -R $src/* $out/share/${pname} install -Dm444 gitkraken.png $out/share/icons/hicolor/512x512/apps/gitkraken.png runHook postInstall ''; preFixup = '' gappsWrapperArgs+=(--add-flags "\''${NIXOS_OZONE_WL:+\''${WAYLAND_DISPLAY:+--ozone-platform-hint=auto --enable-features=WaylandWindowDecorations --enable-wayland-ime=true}}") ''; postFixup = '' pushd $out/share/${pname} for file in gitkraken chrome-sandbox chrome_crashpad_handler; do patchelf --set-interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" $file done for file in $(find . -type f \( -name \*.node -o -name gitkraken -o -name git -o -name git-\* -o -name scalar -o -name \*.so\* \) ); do patchelf --set-rpath ${libPath}:$out/share/${pname} $file || true done popd # SSL and permissions fix for bundled nodegit pushd $out/share/${pname}/resources/app.asar.unpacked/node_modules/@axosoft/nodegit/build/Release mv nodegit-x64-ubuntu-20.node nodegit-x64-ubuntu-20-ssl-1.1.1.node mv nodegit-x64-ubuntu-20-ssl-static.node nodegit-x64-ubuntu-20.node chmod 755 nodegit-x64-ubuntu-20.node popd # Devendor bundled git rm -rf $out/share/${pname}/resources/app.asar.unpacked/git ln -s ${git} $out/share/${pname}/resources/app.asar.unpacked/git # GitKraken expects the CA bundle to be located in the bundled git directory. Since we replace it with # the one from nixpkgs, which doesn't provide a CA bundle, we need to explicitly set its location at runtime makeWrapper $out/share/${pname}/gitkraken $out/bin/gitkraken \ --set GIT_SSL_CAINFO "${cacert}/etc/ssl/certs/ca-bundle.crt" \ "''${gappsWrapperArgs[@]}" ''; }; darwin = stdenv.mkDerivation { inherit pname version src meta passthru ; nativeBuildInputs = [ unzip makeWrapper ]; installPhase = '' runHook preInstall mkdir -p $out/Applications/GitKraken.app $out/bin cp -R . $out/Applications/GitKraken.app makeWrapper $out/Applications/GitKraken.app/Contents/MacOS/GitKraken $out/bin/gitkraken runHook postInstall ''; dontFixup = true; }; in if stdenv.hostPlatform.isDarwin then darwin else linux