1{ stdenv, lib, fetchurl, unzip }: 2 3stdenv.mkDerivation rec { 4 pname = "github-copilot-intellij-agent"; 5 version = "1.2.18.2908"; 6 7 src = fetchurl { 8 name = "${pname}-${version}-plugin.zip"; 9 url = "https://plugins.jetbrains.com/plugin/download?updateId=373346"; 10 hash = "sha256-ErSj4ckPSaEkOeGTRS27yFKDlj2iZfoPdjbZleSIL1s="; 11 }; 12 13 nativeBuildInputs = [ unzip ]; 14 15 dontUnpack = true; 16 17 installPhase = '' 18 runHook preInstall 19 20 mkdir -p $out/bin 21 unzip -p $src github-copilot-intellij/copilot-agent/bin/copilot-agent-${ 22 if stdenv.isDarwin then (if stdenv.isAarch64 then "macos-arm64" else "macos") else "linux" 23 } | install -m755 /dev/stdin $out/bin/copilot-agent 24 25 runHook postInstall 26 ''; 27 28 # https://discourse.nixos.org/t/unrelatable-error-when-working-with-patchelf/12043 29 # https://github.com/NixOS/nixpkgs/blob/db0d8e10fc1dec84f1ccb111851a82645aa6a7d3/pkgs/development/web/now-cli/default.nix 30 preFixup = let 31 binaryLocation = "$out/bin/copilot-agent"; 32 libPath = lib.makeLibraryPath [ stdenv.cc.cc ]; 33 in '' 34 orig_size=$(stat --printf=%s ${binaryLocation}) 35 36 patchelf --set-interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" ${binaryLocation} 37 patchelf --set-rpath ${libPath} ${binaryLocation} 38 chmod +x ${binaryLocation} 39 40 new_size=$(stat --printf=%s ${binaryLocation}) 41 42 var_skip=20 43 var_select=22 44 shift_by=$(expr $new_size - $orig_size) 45 46 function fix_offset { 47 location=$(grep -obUam1 "$1" ${binaryLocation} | cut -d: -f1) 48 location=$(expr $location + $var_skip) 49 value=$(dd if=${binaryLocation} iflag=count_bytes,skip_bytes skip=$location \ 50 bs=1 count=$var_select status=none) 51 value=$(expr $shift_by + $value) 52 echo -n $value | dd of=${binaryLocation} bs=1 seek=$location conv=notrunc 53 } 54 55 fix_offset PAYLOAD_POSITION 56 fix_offset PRELUDE_POSITION 57 ''; 58 59 dontStrip = true; 60 61 meta = rec { 62 description = "The GitHub copilot IntelliJ plugin's native component"; 63 longDescription = '' 64 The GitHub copilot IntelliJ plugin's native component. 65 bin/copilot-agent must be symlinked into the plugin directory, replacing the existing binary. 66 67 For example: 68 69 ```shell 70 ln -fs /run/current-system/sw/bin/copilot-agent ~/.local/share/JetBrains/IntelliJIdea2022.2/github-copilot-intellij/copilot-agent/bin/copilot-agent-linux 71 ``` 72 ''; 73 homepage = "https://plugins.jetbrains.com/plugin/17718-github-copilot"; 74 downloadPage = homepage; 75 changelog = homepage; 76 license = lib.licenses.unfree; 77 maintainers = with lib.maintainers; [ hacker1024 ]; 78 mainProgram = "copilot-agent"; 79 platforms = [ "x86_64-linux" "x86_64-darwin" "aarch64-darwin" ]; 80 sourceProvenance = [ lib.sourceTypes.binaryNativeCode ]; 81 }; 82}