151 lines · 3.9 KB · Text
RawDownload
#!/usr/bin/env node const HELP = `USAGE  zed-local  [options]  [zed args] SUMMARY  Runs 1-6 instances of Zed using a locally-running collaboration server.  Each instance of Zed will be signed in as a different user specified in  either \`.admins.json\` or \`.admins.default.json\`. OPTIONS  --help           Print this help message  --release        Build Zed in release mode  -2, -3, -4, ...  Spawn multiple Zed instances, with their windows tiled.  --top            Arrange the Zed windows so they take up the top half of the screen.`.trim(); const { spawn, execFileSync } = require("child_process");const assert = require("assert"); const defaultUsers = require("../crates/collab/.admins.default.json");let users = defaultUsers;try {  const customUsers = require("../crates/collab/.admins.json");  assert(customUsers.length > 0);  assert(customUsers.every((user) => typeof user === "string"));  users = customUsers.concat(    defaultUsers.filter((user) => !customUsers.includes(user)),  );} catch (_) {} const RESOLUTION_REGEX = /(\d+) x (\d+)/;const DIGIT_FLAG_REGEX = /^--?(\d+)$/; let instanceCount = 1;let isReleaseMode = false;let isTop = false; const args = process.argv.slice(2);while (args.length > 0) {  const arg = args[0];   const digitMatch = arg.match(DIGIT_FLAG_REGEX);  if (digitMatch) {    instanceCount = parseInt(digitMatch[1]);  } else if (arg === "--release") {    isReleaseMode = true;  } else if (arg === "--top") {    isTop = true;  } else if (arg === "--help") {    console.log(HELP);    process.exit(0);  } else {    break;  }   args.shift();} // Parse the resolution of the main screenconst displayInfo = JSON.parse(  execFileSync("system_profiler", ["SPDisplaysDataType", "-json"], {    encoding: "utf8",  }),);const mainDisplayResolution =  displayInfo?.SPDisplaysDataType[0]?.spdisplays_ndrvs    ?.find((entry) => entry.spdisplays_main === "spdisplays_yes")    ?._spdisplays_resolution?.match(RESOLUTION_REGEX);if (!mainDisplayResolution) {  throw new Error("Could not parse screen resolution");}const titleBarHeight = 24;const screenWidth = parseInt(mainDisplayResolution[1]);let screenHeight = parseInt(mainDisplayResolution[2]) - titleBarHeight; if (isTop) {  screenHeight = Math.floor(screenHeight / 2);} // Determine the window size for each instancelet rows;let columns;switch (instanceCount) {  case 1:    [rows, columns] = [1, 1];    break;  case 2:    [rows, columns] = [1, 2];    break;  case 3:  case 4:    [rows, columns] = [2, 2];    break;  case 5:  case 6:    [rows, columns] = [2, 3];    break;} const instanceWidth = Math.floor(screenWidth / columns);const instanceHeight = Math.floor(screenHeight / rows); // If a user is specified, make sure it's first in the listconst user = process.env.ZED_IMPERSONATE;if (user) {  users = [user].concat(users.filter((u) => u !== user));} let buildArgs = ["build"];let zedBinary = "target/debug/Zed";if (isReleaseMode) {  buildArgs.push("--release");  zedBinary = "target/release/Zed";} try {  execFileSync("cargo", buildArgs, { stdio: "inherit" });} catch (e) {  process.exit(0);} setTimeout(() => {  for (let i = 0; i < instanceCount; i++) {    const row = Math.floor(i / columns);    const column = i % columns;    const position = [      column * instanceWidth,      row * instanceHeight + titleBarHeight,    ].join(",");    const size = [instanceWidth, instanceHeight].join(",");     spawn(zedBinary, i == 0 ? args : [], {      stdio: "inherit",      env: {        ZED_IMPERSONATE: users[i],        ZED_WINDOW_POSITION: position,        ZED_STATELESS: "1",        ZED_ALWAYS_ACTIVE: "1",        ZED_SERVER_URL: "http://localhost:3000",        ZED_RPC_URL: "http://localhost:8080/rpc",        ZED_ADMIN_API_TOKEN: "secret",        ZED_WINDOW_SIZE: size,        ZED_CLIENT_CHECKSUM_SEED: "development-checksum-seed",        PATH: process.env.PATH,        RUST_LOG: process.env.RUST_LOG || "info",      },    });  }}, 0.1);