diff options
Diffstat (limited to 'nixpkgs/pkgs/development/tools/devpod/default.nix')
-rw-r--r-- | nixpkgs/pkgs/development/tools/devpod/default.nix | 186 |
1 files changed, 186 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/development/tools/devpod/default.nix b/nixpkgs/pkgs/development/tools/devpod/default.nix new file mode 100644 index 000000000000..e4991f04e8ea --- /dev/null +++ b/nixpkgs/pkgs/development/tools/devpod/default.nix @@ -0,0 +1,186 @@ +{ lib +, buildGoModule +, copyDesktopItems +, darwin +, desktopToDarwinBundle +, fetchFromGitHub +, fetchYarnDeps +, gtk3 +, installShellFiles +, jq +, libayatana-appindicator +, libsoup +, makeDesktopItem +, mkYarnPackage +, openssl +, pkg-config +, rust +, rustPlatform +, stdenv +, testers +, webkitgtk +}: + +let + pname = "devpod"; + version = "0.4.2"; + + src = fetchFromGitHub { + owner = "loft-sh"; + repo = pname; + rev = "v${version}"; + sha256 = "sha256-e9sa9LniG5fj3S+x9T91v6ILPI0CD2y3QnZxXcKy6Ik="; + }; + + meta = with lib; { + description = "Codespaces but open-source, client-only and unopinionated: Works with any IDE and lets you use any cloud, kubernetes or just localhost docker"; + homepage = "https://devpod.sh"; + license = licenses.mpl20; + maintainers = with maintainers; [ maxbrunet ]; + }; +in +rec { + devpod = buildGoModule { + inherit version src pname meta; + + vendorHash = null; + + CGO_ENABLED = 0; + + ldflags = [ + "-X github.com/loft-sh/devpod/pkg/version.version=v${version}" + ]; + + excludedPackages = [ "./e2e" ]; + + nativeBuildInputs = [ installShellFiles ]; + + postInstall = '' + $out/bin/devpod completion bash >devpod.bash + $out/bin/devpod completion fish >devpod.fish + $out/bin/devpod completion zsh >devpod.zsh + installShellCompletion devpod.{bash,fish,zsh} + ''; + + passthru.tests.version = testers.testVersion { + package = devpod; + command = "devpod version"; + version = "v${version}"; + }; + }; + + devpod-desktop = + let + frontend-build = mkYarnPackage { + inherit version; + pname = "devpod-frontend"; + + src = "${src}/desktop"; + + offlineCache = fetchYarnDeps { + yarnLock = "${src}/desktop/yarn.lock"; + sha256 = "sha256-Nezh2nGhrxmNLLqZVugJqr895CIa2QWE3CNLjkjrEEs="; + }; + + packageJSON = ./package.json; + + buildPhase = '' + export HOME=$(mktemp -d) + yarn --offline run build + + cp -r deps/devpod/dist $out + ''; + + doDist = false; + dontInstall = true; + }; + + rustTargetPlatformSpec = rust.toRustTargetSpec stdenv.hostPlatform; + in + rustPlatform.buildRustPackage { + inherit version src; + pname = "devpod-desktop"; + + sourceRoot = "${src.name}/desktop/src-tauri"; + + cargoLock = { + lockFile = ./Cargo.lock; + outputHashes = { + "tauri-plugin-log-0.1.0" = "sha256-Ei0j7UNzsK45c8fEV8Yw3pyf4oSG5EYgLB4BRfafq6A="; + }; + }; + + # Workaround: + # The `tauri` dependency features on the `Cargo.toml` file does not match the allowlist defined under `tauri.conf.json`. + # Please run `tauri dev` or `tauri build` or add the `updater` feature. + # Upstream is not interested in fixing that: https://github.com/loft-sh/devpod/pull/648 + patches = [ ./add-tauri-updater-feature.patch ]; + + postPatch = '' + ln -s ${devpod}/bin/devpod bin/devpod-cli-${rustTargetPlatformSpec} + cp -r ${frontend-build} frontend-build + + substituteInPlace tauri.conf.json --replace '"distDir": "../dist",' '"distDir": "frontend-build",' + '' + lib.optionalString stdenv.isLinux '' + substituteInPlace $cargoDepsCopy/libappindicator-sys-*/src/lib.rs \ + --replace "libayatana-appindicator3.so.1" "${libayatana-appindicator}/lib/libayatana-appindicator3.so.1" + + # Since `cargo build` is used instead of `tauri build`, configs are merged manually. + jq --slurp '.[0] * .[1]' tauri.conf.json tauri-linux.conf.json >tauri.conf.json.merged + mv tauri.conf.json.merged tauri.conf.json + ''; + + nativeBuildInputs = [ + copyDesktopItems + pkg-config + ] ++ lib.optionals stdenv.isLinux [ + jq + ] ++ lib.optionals stdenv.isDarwin [ + desktopToDarwinBundle + ]; + + buildInputs = [ + libsoup + openssl + ] ++ lib.optionals stdenv.isLinux [ + gtk3 + libayatana-appindicator + webkitgtk + ] ++ lib.optionals stdenv.isDarwin [ + darwin.apple_sdk.frameworks.Carbon + darwin.apple_sdk.frameworks.Cocoa + darwin.apple_sdk.frameworks.WebKit + ]; + + desktopItems = [ + (makeDesktopItem { + name = "DevPod"; + categories = [ "Development" ]; + comment = "Spin up dev environments in any infra"; + desktopName = "DevPod"; + exec = "DevPod %U"; + icon = "DevPod"; + terminal = false; + type = "Application"; + mimeTypes = [ "x-scheme-handler/devpod" ]; + }) + ]; + + postInstall = '' + ln -sf ${devpod}/bin/devpod $out/bin/devpod-cli + mv $out/bin/devpod-desktop $out/bin/DevPod + + mkdir -p $out/share/icons/hicolor/{256x256@2,128x128,32x32}/apps + cp icons/128x128@2x.png $out/share/icons/hicolor/256x256@2/apps/DevPod.png + cp icons/128x128.png $out/share/icons/hicolor/128x128/apps/DevPod.png + cp icons/32x32.png $out/share/icons/hicolor/32x32/apps/DevPod.png + ''; + + meta = meta // { + mainProgram = "DevPod"; + # darwin does not build + # https://github.com/h4llow3En/mac-notification-sys/issues/28 + platforms = lib.platforms.linux; + }; + }; +} |