Unverified Commit d9672e67 authored by Peder Bergebakken Sundt's avatar Peder Bergebakken Sundt Committed by GitHub
Browse files

Merge pull request #251858 from maxbrunet/feat/devpod

devpod: init at 0.4.1
parents a19e8471 4f2a7929
Loading
Loading
Loading
Loading
+4518 −0

File added.

Preview size limit exceeded, changes collapsed.

+13 −0
Original line number Diff line number Diff line
diff --git a/Cargo.toml b/Cargo.toml
index 03f64e53..9e2ddcb6 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -15,6 +15,7 @@ serde_json = "1.0"
 serde = { version = "1.0", features = ["derive"] }
 # Tauri
 tauri = { version = "1.2.4", features = [
+        "updater",
         "process-relaunch",
         "window-close",
         "notification-all",
+185 −0
Original line number Diff line number Diff line
{ 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.1";

  src = fetchFromGitHub {
    owner = "loft-sh";
    repo = pname;
    rev = "v${version}";
    sha256 = "sha256-8ED74Cqq2fw+TpkJyipxlBpKq60ScZinlPj0hEX13/0=";
  };

  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 = pname;
      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;
      };
    };
}
+63 −0
Original line number Diff line number Diff line
{
  "name": "devpod",
  "private": true,
  "version": "0.0.0",
  "type": "module",
  "scripts": {
    "dev": "vite",
    "build": "tsc && vite build",
    "preview": "vite preview",
    "tauri": "tauri",
    "desktop:dev": "tauri dev --config src-tauri/tauri-dev.conf.json",
    "desktop:dev:debug": "export DEBUG=true; yarn desktop:dev",
    "desktop:build:dev": "DEBUG=true tauri build --config src-tauri/tauri-dev.conf.json",
    "desktop:build:debug": "tauri build --debug",
    "desktop:build": "tauri build --features enable-updater",
    "format:check": "prettier --check .",
    "format:fix": "prettier --write .",
    "types:check": "tsc -p ./tsconfig.json --noEmit"
  },
  "dependencies": {
    "@chakra-ui/icons": "2.1.1",
    "@chakra-ui/react": "2.8.1",
    "@emotion/react": "11.11.1",
    "@emotion/styled": "11.11.0",
    "@headlessui/react": "1.7.17",
    "@tanstack/react-query": "4.36.1",
    "@tanstack/react-query-devtools": "4.36.1",
    "@tanstack/react-table": "8.10.7",
    "@tauri-apps/api": "1.5.0",
    "dayjs": "1.11.10",
    "framer-motion": "10.16.4",
    "markdown-to-jsx": "7.3.2",
    "react": "18.2.0",
    "react-dom": "18.2.0",
    "react-hook-form": "7.47.0",
    "react-icons": "4.11.0",
    "react-router": "6.16.0",
    "react-router-dom": "6.16.0",
    "tauri-plugin-store-api": "https://github.com/tauri-apps/tauri-plugin-store",
    "uuid": "9.0.1",
    "xterm": "5.3.0",
    "xterm-addon-fit": "0.7.0"
  },
  "devDependencies": {
    "@tanstack/eslint-plugin-query": "4.36.1",
    "@tauri-apps/cli": "1.5.2",
    "@types/node": "18.15.3",
    "@types/react": "18.2.28",
    "@types/react-dom": "18.2.13",
    "@types/uuid": "9.0.5",
    "@typescript-eslint/eslint-plugin": "5.59.11",
    "@typescript-eslint/parser": "5.59.11",
    "@vitejs/plugin-react": "4.1.0",
    "eslint": "8.44.0",
    "eslint-config-prettier": "8.8.0",
    "eslint-config-react-app": "7.0.1",
    "eslint-plugin-react": "7.32.2",
    "eslint-plugin-react-hooks": "4.6.0",
    "prettier": "3.0.3",
    "typescript": "5.0.4",
    "vite": "4.4.9"
  }
}
+2 −0
Original line number Diff line number Diff line
@@ -31101,6 +31101,8 @@ with pkgs;
  denaro = callPackage ../applications/finance/denaro { };
  inherit (callPackage ../development/tools/devpod { }) devpod devpod-desktop;
  dfasma = libsForQt5.callPackage ../applications/audio/dfasma { };
  dfilemanager = libsForQt5.callPackage ../applications/file-managers/dfilemanager { };