@viraatdas/rudder 3.2.0 → 3.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -9,6 +9,27 @@ export interface CheckoutSyncReport {
9
9
  dirty: boolean;
10
10
  moved: boolean;
11
11
  note: string;
12
+ work?: WorkReport;
13
+ }
14
+ export interface WorkReport {
15
+ sent?: {
16
+ head: string;
17
+ commits: number;
18
+ };
19
+ received?: {
20
+ from: string;
21
+ head: string;
22
+ outcome: "moved" | "have" | "diverged" | "failed";
23
+ note: string;
24
+ };
12
25
  }
13
26
  export declare function syncCheckout(root: string): Promise<CheckoutSyncReport>;
14
27
  export declare function describeSync(where: string, report: CheckoutSyncReport): string;
28
+ /**
29
+ * Bundle this side's unpushed work into `outFile`. A working copy with edits
30
+ * is checkpointed first (`jj new`), so later edits here land in a CHILD of the
31
+ * sent change and the other side can still fast-forward to them next time.
32
+ */
33
+ export declare function exportWork(root: string, outFile: string): Promise<WorkReport["sent"] | null>;
34
+ /** Take the other side's work from a bundle made by exportWork. */
35
+ export declare function importWork(root: string, bundle: string, head: string, from: string): Promise<NonNullable<WorkReport["received"]>>;
@@ -4,10 +4,19 @@
4
4
  // uncommitted, nothing unpushed). Anything else is reported, never forced.
5
5
  //
6
6
  // `rudder cloud sync` runs this here and asks the home machine to run the same
7
- // code (`rudder __sync-checkout --json`) in its clone of the repo.
7
+ // code (`rudder __sync-checkout`) in its clone of the repo.
8
+ //
9
+ // Work GitHub does not have yet (the jj working copy and unpushed changes below
10
+ // it) travels between the two machines directly, as a git bundle through the
11
+ // control plane, never through GitHub: jj tracks every file that is not
12
+ // gitignored, so a pushed work-in-progress branch could carry a stray secret.
13
+ // The receiving side moves onto the incoming work only when that loses
14
+ // nothing (it has no work of its own, or its work is already in the incoming
15
+ // history); otherwise both stay, the incoming one at bookmark rudder-sync/<from>.
8
16
  import fs from "node:fs";
9
17
  import path from "node:path";
10
18
  import { runCommand } from "./util.js";
19
+ import { ensureJj } from "./jj.js";
11
20
  async function run(cwd, command, args) {
12
21
  return await runCommand(command, args, { cwd, allowFailure: true });
13
22
  }
@@ -107,6 +116,132 @@ async function syncJj(root, report) {
107
116
  }
108
117
  export function describeSync(where, report) {
109
118
  const fetch = report.fetched ? "" : ` (fetch failed: ${report.fetchError ?? "unknown error"})`;
110
- return `${where}: ${report.note}${fetch}`;
119
+ const lines = [`${where}: ${report.note}${fetch}`];
120
+ if (report.work?.received) {
121
+ lines.push(` received: ${report.work.received.note}`);
122
+ }
123
+ if (report.work?.sent) {
124
+ lines.push(` sent: ${report.work.sent.commits} change(s) not on GitHub yet`);
125
+ }
126
+ return lines.join("\n");
127
+ }
128
+ const OUT_REF = "refs/rudder-sync/out";
129
+ const SIDE_RE = /^[a-z][a-z0-9-]{0,30}$/;
130
+ async function trunkCommit(root) {
131
+ const branch = await defaultBranch(root);
132
+ const sha = await run(root, "git", ["rev-parse", "--verify", "--quiet", `refs/remotes/origin/${branch}`]);
133
+ return { branch, sha: sha.code === 0 ? sha.stdout.trim() : null };
134
+ }
135
+ async function jjOne(root, revset) {
136
+ const out = await run(root, "jj", ["--ignore-working-copy", "log", "-r", revset, "--no-graph", "-T", 'commit_id ++ "\\n"']);
137
+ return out.code === 0 ? out.stdout.trim().split("\n")[0]?.trim() ?? "" : "";
138
+ }
139
+ // Does this side hold work GitHub lacks? Returns its head: the working copy when
140
+ // it has edits, else the newest unpushed change below it.
141
+ async function workHead(root, trunk) {
142
+ await run(root, "jj", ["status"]);
143
+ const empty = (await run(root, "jj", ["--ignore-working-copy", "log", "-r", "@", "--no-graph", "-T", 'if(empty, "1", "0")'])).stdout.trim() === "1";
144
+ if (!empty) {
145
+ return { head: await jjOne(root, "@"), empty };
146
+ }
147
+ const unpushed = await jjOne(root, `(::@- ~ ::${trunk}) ~ empty()`);
148
+ return unpushed ? { head: await jjOne(root, "@-"), empty } : null;
149
+ }
150
+ /**
151
+ * Bundle this side's unpushed work into `outFile`. A working copy with edits
152
+ * is checkpointed first (`jj new`), so later edits here land in a CHILD of the
153
+ * sent change and the other side can still fast-forward to them next time.
154
+ */
155
+ export async function exportWork(root, outFile) {
156
+ if (!fs.existsSync(path.join(root, ".jj"))) {
157
+ return null;
158
+ }
159
+ const { branch, sha } = await trunkCommit(root);
160
+ const work = await workHead(root, `${branch}@origin`);
161
+ if (!work?.head) {
162
+ return null;
163
+ }
164
+ if (!work.empty) {
165
+ await run(root, "jj", ["new"]);
166
+ }
167
+ await run(root, "git", ["update-ref", OUT_REF, work.head]);
168
+ try {
169
+ const args = ["bundle", "create", outFile, OUT_REF, ...(sha ? ["--not", sha] : [])];
170
+ const bundled = await run(root, "git", args);
171
+ if (bundled.code !== 0) {
172
+ throw new Error(`git bundle failed: ${(bundled.stderr || bundled.stdout).trim().split("\n").pop()}`);
173
+ }
174
+ }
175
+ finally {
176
+ await run(root, "git", ["update-ref", "-d", OUT_REF]);
177
+ }
178
+ const counted = await run(root, "git", ["rev-list", "--count", work.head, ...(sha ? ["--not", sha] : [])]);
179
+ return { head: work.head, commits: Number(counted.stdout.trim()) || 0 };
180
+ }
181
+ // Every file the working copy changed reads the same in `head`.
182
+ async function editsContainedIn(root, head) {
183
+ const listed = await run(root, "jj", ["--ignore-working-copy", "diff", "-r", "@", "--name-only"]);
184
+ const files = listed.stdout.split("\n").map((line) => line.trim()).filter(Boolean);
185
+ if (listed.code !== 0 || files.length > 200) {
186
+ return false;
187
+ }
188
+ for (const file of files) {
189
+ const fileset = `root-file:${JSON.stringify(file)}`;
190
+ const here = await run(root, "jj", ["--ignore-working-copy", "file", "show", "-r", "@", fileset]);
191
+ const there = await run(root, "jj", ["--ignore-working-copy", "file", "show", "-r", head, fileset]);
192
+ if ((here.code === 0) !== (there.code === 0) || here.stdout !== there.stdout) {
193
+ return false;
194
+ }
195
+ }
196
+ return true;
197
+ }
198
+ /** Take the other side's work from a bundle made by exportWork. */
199
+ export async function importWork(root, bundle, head, from) {
200
+ const report = (outcome, note) => ({ from, head, outcome, note });
201
+ if (!SIDE_RE.test(from) || !/^[0-9a-f]{40}$/.test(head)) {
202
+ return report("failed", "bad sync request");
203
+ }
204
+ if (!fs.existsSync(path.join(root, ".jj"))) {
205
+ // Plain colocate: Rudder's ignore entries would be an edit of this side's own.
206
+ ensureJj();
207
+ await run(root, "jj", ["git", "init", "--colocate"]);
208
+ }
209
+ const bookmark = `rudder-sync/${from}`;
210
+ const fetched = await run(root, "git", ["fetch", "-q", bundle, `+${OUT_REF}:refs/heads/${bookmark}`]);
211
+ if (fetched.code !== 0) {
212
+ return report("failed", `could not read the work from ${from}: ${(fetched.stderr || fetched.stdout).trim().split("\n").pop()}`);
213
+ }
214
+ await run(root, "jj", ["git", "import"]);
215
+ const { branch } = await trunkCommit(root);
216
+ const trunk = `${branch}@origin`;
217
+ const drop = async () => {
218
+ await run(root, "jj", ["bookmark", "delete", bookmark]);
219
+ };
220
+ if (await jjOne(root, `${head} & ::${trunk}`)) {
221
+ await drop();
222
+ return report("have", "already on GitHub");
223
+ }
224
+ const mine = await workHead(root, trunk);
225
+ if (await jjOne(root, `${head} & ::@`)) {
226
+ await drop();
227
+ return report("have", "already here");
228
+ }
229
+ // The working copy's own edits count as work only when the incoming history
230
+ // lacks them (Rudder writing its .gitignore entries into a fresh clone does not).
231
+ const at = await jjOne(root, "@");
232
+ const parentHeld = !(await jjOne(root, `(::@- ~ ::${trunk}) ~ empty()`)) || !!(await jjOne(root, `@- & ::${head}`));
233
+ const subsumed = !!mine && !mine.empty && parentHeld && (await editsContainedIn(root, head));
234
+ if (!mine || subsumed || (await jjOne(root, `${mine.head} & ::${head}`))) {
235
+ const moved = await run(root, "jj", ["new", head]);
236
+ if (moved.code !== 0) {
237
+ return report("failed", `could not move onto it: ${(moved.stderr || moved.stdout).trim().split("\n").pop()}`);
238
+ }
239
+ if (subsumed) {
240
+ await run(root, "jj", ["abandon", at]);
241
+ }
242
+ await drop();
243
+ return report("moved", `picked up the work from ${from}`);
244
+ }
245
+ return report("diverged", `both sides have their own edits; kept both. ${from === "cloud" ? "The cloud's" : `The ${from}'s`} version is bookmark ${bookmark} (\`jj new ${bookmark}\` to switch to it, \`jj diff --from @ --to ${bookmark}\` to compare)`);
111
246
  }
112
247
  //# sourceMappingURL=checkout-sync.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"checkout-sync.js","sourceRoot":"","sources":["../src/checkout-sync.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"checkout-sync.js","sourceRoot":"","sources":["../src/checkout-sync.ts"],"names":[],"mappings":"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"}
package/dist/cloud.d.ts CHANGED
@@ -19,6 +19,7 @@ type CloudClient = {
19
19
  method: string;
20
20
  body?: JsonValue;
21
21
  }): Promise<T>;
22
+ download(pathname: string): Promise<Buffer>;
22
23
  };
23
24
  export declare function runCloudCommand(command: string, args: string[], options?: CloudCommandOptions): Promise<void>;
24
25
  /**
package/dist/cloud.js CHANGED
@@ -9,7 +9,7 @@ import { currentBranch, currentCommit, findRepoRoot } from "./git.js";
9
9
  import { applyDefaultDecisions, buildFreshHandoffPrompt, cloudWorkspaceAbsolutePath, findMigrationCandidates, formatCandidateReason, migrationSummary, summaryAsJson, } from "./migration.js";
10
10
  import { buildMoveBundle, findMoveCandidates, markRunsMovedHome } from "./move-home.js";
11
11
  import { cloudAuthPath } from "./state.js";
12
- import { describeSync, syncCheckout } from "./checkout-sync.js";
12
+ import { describeSync, exportWork, importWork, syncCheckout } from "./checkout-sync.js";
13
13
  import { ensureDir, commandExists, expandHome, isTty, newRunId, nowIso, pathExists, promptConfirm, promptText, promptSelect, promptSecret, readJson, runCommand, shortenHome, shellQuote, writeJson, } from "./util.js";
14
14
  const DEFAULT_LOGIN_INTERVAL_MS = 2000;
15
15
  const DEFAULT_LOGIN_TIMEOUT_MS = 5 * 60 * 1000;
@@ -1137,6 +1137,14 @@ async function cloudClient(options) {
1137
1137
  }
1138
1138
  return parsed;
1139
1139
  },
1140
+ async download(pathname) {
1141
+ const response = await fetch(new URL(pathname, `${baseUrl}/`).toString(), { headers: token ? { Authorization: `Bearer ${token}` } : {} });
1142
+ if (!response.ok) {
1143
+ const text = await response.text();
1144
+ throw new Error(`Rudder Cloud request failed: ${responseErrorMessage(text ? parseJson(text) : null) || `${response.status} ${response.statusText}`}`);
1145
+ }
1146
+ return Buffer.from(await response.arrayBuffer());
1147
+ },
1140
1148
  };
1141
1149
  }
1142
1150
  function normalizeCloudUrl(raw) {
@@ -4148,13 +4156,25 @@ async function reportCredentialParity(client, { problemsOnly }) {
4148
4156
  async function cloudSync(args, options) {
4149
4157
  const client = await cloudClient({ requireToken: true });
4150
4158
  const all = args.includes("--all");
4151
- const root = findRepoRoot();
4159
+ const named = args.find((arg) => !arg.startsWith("-"));
4160
+ const root = named ? await localCheckoutFor(client, named, options) : findRepoRoot();
4152
4161
  const slug = await githubSlugFromOrigin(root);
4153
4162
  const lines = [];
4154
4163
  let local = null;
4164
+ let work;
4165
+ const scratch = await fsp.mkdtemp(path.join(os.tmpdir(), "rudder-sync-"));
4155
4166
  if (slug) {
4156
4167
  local = await syncCheckout(root);
4157
- lines.push(describeSync(`this laptop (${slug})`, local));
4168
+ lines.push("");
4169
+ // This laptop's work GitHub lacks goes to the cloud machine directly.
4170
+ const sent = await exportWork(root, path.join(scratch, "out.bundle")).catch((error) => {
4171
+ lines.push(`work: could not bundle this laptop's work (${error instanceof Error ? error.message : String(error)})`);
4172
+ return null;
4173
+ });
4174
+ if (sent) {
4175
+ local.work = { sent };
4176
+ work = { bundle: (await fsp.readFile(path.join(scratch, "out.bundle"))).toString("base64"), head: sent.head };
4177
+ }
4158
4178
  }
4159
4179
  else if (!all) {
4160
4180
  throw new Error("This repo has no GitHub origin, so there is nothing on the home machine to sync it with. `rudder cloud sync --all` syncs every repo there.");
@@ -4167,9 +4187,44 @@ async function cloudSync(args, options) {
4167
4187
  }
4168
4188
  const cloud = await client.request("/api/rudder/home/sync", {
4169
4189
  method: "POST",
4170
- body: all || !slug ? {} : { repos: [slug] },
4171
- });
4190
+ body: all || !slug ? {} : { repos: [slug], ...(work ? { work } : {}) },
4191
+ }).catch((error) => {
4192
+ const message = error instanceof Error ? error.message : String(error);
4193
+ throw new Error(message === "fetch failed" ? "the cloud machine did not answer in time (it may be restarting); run /sync again in a minute" : message);
4194
+ }).finally(() => fsp.rm(scratch, { recursive: true, force: true }).catch(() => undefined));
4172
4195
  const results = cloud.results ?? [];
4196
+ // And the cloud's work comes back here.
4197
+ const mine = slug ? results.find((result) => result.repo.toLowerCase() === slug.toLowerCase()) : undefined;
4198
+ const incoming = mine?.report?.work?.sent;
4199
+ if (local && incoming?.download) {
4200
+ const dir = await fsp.mkdtemp(path.join(os.tmpdir(), "rudder-sync-in-"));
4201
+ try {
4202
+ const file = path.join(dir, "in.bundle");
4203
+ await fsp.writeFile(file, await client.download(incoming.download));
4204
+ local.work = { ...local.work, received: await importWork(root, file, incoming.head, "cloud") };
4205
+ }
4206
+ catch (error) {
4207
+ local.work = { ...local.work, received: { from: "cloud", head: incoming.head, outcome: "failed", note: `could not take the cloud's work (${error instanceof Error ? error.message : String(error)})` } };
4208
+ }
4209
+ finally {
4210
+ await fsp.rm(dir, { recursive: true, force: true }).catch(() => undefined);
4211
+ }
4212
+ }
4213
+ // Work the other side already had was not news: report only what moved.
4214
+ if (local?.work?.sent && mine?.report?.work?.received?.outcome === "have") {
4215
+ delete local.work.sent;
4216
+ }
4217
+ if (mine?.report?.work?.sent && local?.work?.received?.outcome === "have") {
4218
+ delete mine.report.work.sent;
4219
+ }
4220
+ for (const side of [local?.work, mine?.report?.work]) {
4221
+ if (side?.received?.outcome === "have") {
4222
+ delete side.received;
4223
+ }
4224
+ }
4225
+ if (local) {
4226
+ lines[0] = describeSync(`this laptop (${slug})`, local);
4227
+ }
4173
4228
  if (options.json) {
4174
4229
  printJson({ local, cloud: results });
4175
4230
  return;
@@ -4196,11 +4251,39 @@ async function cloudSync(args, options) {
4196
4251
  lines.push(`${running.length} agent(s) still running on this laptop: ${running.slice(0, 4).map((run) => `"${(run.taskSummary || run.task).slice(0, 50)}"`).join(", ")}${running.length > 4 ? ", ..." : ""}. They stop when the laptop sleeps; \`/sync move\` (or H) moves them to the cloud machine.`);
4197
4252
  }
4198
4253
  }
4199
- const unpushed = [local, ...results.map((result) => result.report)].filter((report) => !!report && report.ahead > 0);
4200
- if (unpushed.length > 0) {
4201
- lines.push("Unpushed work stays where it is: push it (or merge its PR) and run /sync again to bring the other side up.");
4254
+ console.log(lines.filter(Boolean).join("\n"));
4255
+ }
4256
+ // `rudder cloud sync <name>`: the laptop's clone of a repo open on the cloud
4257
+ // machine, cloned from GitHub into ~/code/<name> the first time.
4258
+ async function localCheckoutFor(client, name, options) {
4259
+ const view = await client.request("/api/rudder/home", { method: "GET" });
4260
+ const wanted = name.replace(/\.git$/, "").toLowerCase();
4261
+ const slug = (view.projects ?? []).map((project) => project.repo ?? "").find((repo) => repo.toLowerCase() === wanted || repo.split("/").pop()?.toLowerCase() === wanted);
4262
+ if (!slug) {
4263
+ throw new Error(`${name} is not open on the cloud machine.`);
4264
+ }
4265
+ const dir = path.join(os.homedir(), "code", slug.split("/").pop());
4266
+ if (await pathExists(path.join(dir, ".git"))) {
4267
+ const existing = await githubSlugFromOrigin(dir);
4268
+ if (existing?.toLowerCase() !== slug.toLowerCase()) {
4269
+ throw new Error(`${shortenHome(dir)} already exists and is not a clone of ${slug}.`);
4270
+ }
4271
+ return dir;
4272
+ }
4273
+ if (await pathExists(dir)) {
4274
+ throw new Error(`${shortenHome(dir)} already exists and is not a git checkout.`);
4202
4275
  }
4203
- console.log(lines.join("\n"));
4276
+ if (!options.json) {
4277
+ process.stderr.write(`Cloning ${slug} into ${shortenHome(dir)}...\n`);
4278
+ }
4279
+ await fsp.mkdir(path.dirname(dir), { recursive: true });
4280
+ const cloned = commandExists("gh")
4281
+ ? await runCommand("gh", ["repo", "clone", slug, dir], { allowFailure: true })
4282
+ : await runCommand("git", ["clone", `https://github.com/${slug}.git`, dir], { allowFailure: true });
4283
+ if (cloned.code !== 0) {
4284
+ throw new Error(`could not clone ${slug}: ${(cloned.stderr || cloned.stdout).trim().split("\n").pop()}`);
4285
+ }
4286
+ return dir;
4204
4287
  }
4205
4288
  function describeCloudAgents(repo, agents) {
4206
4289
  const live = agents.filter((agent) => !["merged", "stopped", "deleted"].includes(String(agent.status)));