ghostrail 0.20.0 → 0.20.1
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.
- package/dist/backend/attach.d.ts +49 -0
- package/dist/backend/attach.d.ts.map +1 -0
- package/dist/backend/attach.js +66 -0
- package/dist/backend/attach.js.map +1 -0
- package/dist/backend/container.d.ts.map +1 -1
- package/dist/backend/container.js +20 -30
- package/dist/backend/container.js.map +1 -1
- package/dist/backend/local-worktree.d.ts.map +1 -1
- package/dist/backend/local-worktree.js +6 -4
- package/dist/backend/local-worktree.js.map +1 -1
- package/dist/board/page.d.ts.map +1 -1
- package/dist/board/page.js +38 -1
- package/dist/board/page.js.map +1 -1
- package/dist/dashboard/page.d.ts.map +1 -1
- package/dist/dashboard/page.js +33 -1
- package/dist/dashboard/page.js.map +1 -1
- package/dist/store/events.d.ts +18 -0
- package/dist/store/events.d.ts.map +1 -1
- package/dist/store/events.js +19 -4
- package/dist/store/events.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { ExecResult } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Checking out an existing branch in a fresh clone.
|
|
4
|
+
*
|
|
5
|
+
* `git clone <local-path>` copies the source's `refs/heads/*` and nothing else:
|
|
6
|
+
* a branch the source knows only as `refs/remotes/origin/<branch>` is simply
|
|
7
|
+
* absent from the clone, so `git checkout <branch>` fails with "pathspec ...
|
|
8
|
+
* did not match any file(s) known to git". That is every factory PR branch on
|
|
9
|
+
* a machine that did not open it, which is the common case as soon as more
|
|
10
|
+
* than one clone or machine is involved (TJ-1675).
|
|
11
|
+
*
|
|
12
|
+
* The fix is to fetch the branch from the real remote before checking it out,
|
|
13
|
+
* rather than hoping a local ref survived the clone. Pure arg builders here so
|
|
14
|
+
* the sequence is testable without a repo, a network, or a container.
|
|
15
|
+
*/
|
|
16
|
+
/** Read the origin URL of the repo being cloned from. */
|
|
17
|
+
export declare function originUrlArgs(repoPath: string): string[];
|
|
18
|
+
/** Point a clone's `origin` at `url`. */
|
|
19
|
+
export declare function setOriginArgs(dir: string, url: string): string[];
|
|
20
|
+
/**
|
|
21
|
+
* Fetch one branch from `origin` into `FETCH_HEAD`.
|
|
22
|
+
*
|
|
23
|
+
* A single named branch rather than a full fetch: the pass needs exactly one,
|
|
24
|
+
* and a factory repo can carry hundreds of stale branches.
|
|
25
|
+
*/
|
|
26
|
+
export declare function fetchBranchArgs(dir: string, branch: string): string[];
|
|
27
|
+
/**
|
|
28
|
+
* Check out the branch just fetched. `-B` from `FETCH_HEAD` rather than a bare
|
|
29
|
+
* checkout, so it works whether or not a local ref of that name survived the
|
|
30
|
+
* clone, and so the working tree matches the remote rather than a stale local
|
|
31
|
+
* copy of it.
|
|
32
|
+
*/
|
|
33
|
+
export declare function checkoutFetchedArgs(dir: string, branch: string): string[];
|
|
34
|
+
/** Check out an existing local branch, the fallback when no remote has it. */
|
|
35
|
+
export declare function checkoutLocalArgs(dir: string, branch: string): string[];
|
|
36
|
+
/**
|
|
37
|
+
* Check out an existing branch in a fresh clone: fetch it from `origin` first,
|
|
38
|
+
* because a clone of a local path carries only that path's local heads, so a
|
|
39
|
+
* branch it knows only as `origin/<branch>` is absent here (TJ-1675).
|
|
40
|
+
*
|
|
41
|
+
* Falls back to a plain checkout when the fetch fails, which covers an offline
|
|
42
|
+
* host and a repo whose origin is unreachable or absent: if a local ref did
|
|
43
|
+
* survive the clone, that still works, and if it did not, the checkout's own
|
|
44
|
+
* error is the one worth reporting.
|
|
45
|
+
*/
|
|
46
|
+
export declare function attachToBranch(dir: string, branch: string): Promise<ExecResult>;
|
|
47
|
+
/** Create `branch` off `baseBranch`, for `mode: "create"`. */
|
|
48
|
+
export declare function checkoutNewArgs(dir: string, branch: string, baseBranch: string): string[];
|
|
49
|
+
//# sourceMappingURL=attach.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attach.d.ts","sourceRoot":"","sources":["../../src/backend/attach.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C;;;;;;;;;;;;;GAaG;AAEH,yDAAyD;AACzD,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAExD;AAED,yCAAyC;AACzC,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAEhE;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAErE;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAEzE;AAED,8EAA8E;AAC9E,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAEvE;AAED;;;;;;;;;GASG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAKrF;AAED,8DAA8D;AAC9D,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAEzF"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { spawnCollect } from "./proc.js";
|
|
2
|
+
/**
|
|
3
|
+
* Checking out an existing branch in a fresh clone.
|
|
4
|
+
*
|
|
5
|
+
* `git clone <local-path>` copies the source's `refs/heads/*` and nothing else:
|
|
6
|
+
* a branch the source knows only as `refs/remotes/origin/<branch>` is simply
|
|
7
|
+
* absent from the clone, so `git checkout <branch>` fails with "pathspec ...
|
|
8
|
+
* did not match any file(s) known to git". That is every factory PR branch on
|
|
9
|
+
* a machine that did not open it, which is the common case as soon as more
|
|
10
|
+
* than one clone or machine is involved (TJ-1675).
|
|
11
|
+
*
|
|
12
|
+
* The fix is to fetch the branch from the real remote before checking it out,
|
|
13
|
+
* rather than hoping a local ref survived the clone. Pure arg builders here so
|
|
14
|
+
* the sequence is testable without a repo, a network, or a container.
|
|
15
|
+
*/
|
|
16
|
+
/** Read the origin URL of the repo being cloned from. */
|
|
17
|
+
export function originUrlArgs(repoPath) {
|
|
18
|
+
return ["git", "-C", repoPath, "remote", "get-url", "origin"];
|
|
19
|
+
}
|
|
20
|
+
/** Point a clone's `origin` at `url`. */
|
|
21
|
+
export function setOriginArgs(dir, url) {
|
|
22
|
+
return ["git", "-C", dir, "remote", "set-url", "origin", url];
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Fetch one branch from `origin` into `FETCH_HEAD`.
|
|
26
|
+
*
|
|
27
|
+
* A single named branch rather than a full fetch: the pass needs exactly one,
|
|
28
|
+
* and a factory repo can carry hundreds of stale branches.
|
|
29
|
+
*/
|
|
30
|
+
export function fetchBranchArgs(dir, branch) {
|
|
31
|
+
return ["git", "-C", dir, "fetch", "--quiet", "origin", branch];
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Check out the branch just fetched. `-B` from `FETCH_HEAD` rather than a bare
|
|
35
|
+
* checkout, so it works whether or not a local ref of that name survived the
|
|
36
|
+
* clone, and so the working tree matches the remote rather than a stale local
|
|
37
|
+
* copy of it.
|
|
38
|
+
*/
|
|
39
|
+
export function checkoutFetchedArgs(dir, branch) {
|
|
40
|
+
return ["git", "-C", dir, "checkout", "-B", branch, "FETCH_HEAD"];
|
|
41
|
+
}
|
|
42
|
+
/** Check out an existing local branch, the fallback when no remote has it. */
|
|
43
|
+
export function checkoutLocalArgs(dir, branch) {
|
|
44
|
+
return ["git", "-C", dir, "checkout", branch];
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Check out an existing branch in a fresh clone: fetch it from `origin` first,
|
|
48
|
+
* because a clone of a local path carries only that path's local heads, so a
|
|
49
|
+
* branch it knows only as `origin/<branch>` is absent here (TJ-1675).
|
|
50
|
+
*
|
|
51
|
+
* Falls back to a plain checkout when the fetch fails, which covers an offline
|
|
52
|
+
* host and a repo whose origin is unreachable or absent: if a local ref did
|
|
53
|
+
* survive the clone, that still works, and if it did not, the checkout's own
|
|
54
|
+
* error is the one worth reporting.
|
|
55
|
+
*/
|
|
56
|
+
export async function attachToBranch(dir, branch) {
|
|
57
|
+
const fetched = await spawnCollect(fetchBranchArgs(dir, branch));
|
|
58
|
+
return fetched.exitCode === 0
|
|
59
|
+
? await spawnCollect(checkoutFetchedArgs(dir, branch))
|
|
60
|
+
: await spawnCollect(checkoutLocalArgs(dir, branch));
|
|
61
|
+
}
|
|
62
|
+
/** Create `branch` off `baseBranch`, for `mode: "create"`. */
|
|
63
|
+
export function checkoutNewArgs(dir, branch, baseBranch) {
|
|
64
|
+
return ["git", "-C", dir, "checkout", "-B", branch, baseBranch];
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=attach.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attach.js","sourceRoot":"","sources":["../../src/backend/attach.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAGzC;;;;;;;;;;;;;GAaG;AAEH,yDAAyD;AACzD,MAAM,UAAU,aAAa,CAAC,QAAgB;IAC5C,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AAChE,CAAC;AAED,yCAAyC;AACzC,MAAM,UAAU,aAAa,CAAC,GAAW,EAAE,GAAW;IACpD,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;AAChE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,GAAW,EAAE,MAAc;IACzD,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;AAClE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAW,EAAE,MAAc;IAC7D,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;AACpE,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,iBAAiB,CAAC,GAAW,EAAE,MAAc;IAC3D,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;AAChD,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAW,EAAE,MAAc;IAC9D,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC;IACjE,OAAO,OAAO,CAAC,QAAQ,KAAK,CAAC;QAC3B,CAAC,CAAC,MAAM,YAAY,CAAC,mBAAmB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACtD,CAAC,CAAC,MAAM,YAAY,CAAC,iBAAiB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,eAAe,CAAC,GAAW,EAAE,MAAc,EAAE,UAAkB;IAC7E,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;AAClE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../src/backend/container.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../src/backend/container.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EACV,OAAO,EACP,WAAW,EACX,UAAU,EACV,OAAO,EACP,aAAa,EACb,SAAS,EACV,MAAM,YAAY,CAAC;AAQpB;;;;;;GAMG;AACH,MAAM,WAAW,uBAAuB;IACtC;;;;;OAKG;IACH,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,uEAAuE;IACvE,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;CAC1C;AAED,qBAAa,gBAAiB,YAAW,OAAO;IAC9C,QAAQ,CAAC,IAAI,eAAQ;IACrB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoB;IAC/C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAqC;gBAE7C,OAAO,GAAE,uBAA4B;IAKjD,wEAAwE;IACxE,OAAO,CAAC,YAAY;IASpB,yDAAyD;IACzD,OAAO,CAAC,gBAAgB;IAMxB,uDAAuD;WAC1C,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAKtC,SAAS,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC;IAqIxD,IAAI,CACF,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,UAAU,CAAC;IAKtB,MAAM,CACJ,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,KAAK,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,EAC9B,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,UAAU,CAAC;IAShB,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;CAGpD"}
|
|
@@ -3,6 +3,7 @@ import { mkdir, rm } from "node:fs/promises";
|
|
|
3
3
|
import { tmpdir } from "node:os";
|
|
4
4
|
import { join } from "node:path";
|
|
5
5
|
import process from "node:process";
|
|
6
|
+
import { attachToBranch, checkoutNewArgs, originUrlArgs, setOriginArgs } from "./attach.js";
|
|
6
7
|
import { CONTAINER_GIT_IDENTITY, CONTAINER_PROFILE_DIR, CONTAINER_WORKDIR, DEFAULT_CONTAINER_IMAGE, dockerCpArgs, dockerExecArgs, dockerRmArgs, dockerRunArgs, } from "./docker.js";
|
|
7
8
|
import { CLONE_TOKEN_ENV, cloneCredentialArgs } from "./git-credentials.js";
|
|
8
9
|
import { spawnCollect } from "./proc.js";
|
|
@@ -53,42 +54,31 @@ export class ContainerBackend {
|
|
|
53
54
|
const clone = await spawnCollect(["git", ...credArgs, "clone", "--quiet", spec.repoPath, hostClone], cloneOpts);
|
|
54
55
|
if (clone.exitCode !== 0)
|
|
55
56
|
throw new Error(`git clone failed: ${clone.stderr.trim()}`);
|
|
56
|
-
//
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
//
|
|
64
|
-
//
|
|
65
|
-
|
|
66
|
-
// origin over instead; the image's gh credential helper authenticates it
|
|
67
|
-
// from the forwarded token. When `repoPath` is already a URL this `git -C`
|
|
68
|
-
// fails and the clone's origin is left exactly as it is.
|
|
69
|
-
const sourceOrigin = await spawnCollect([
|
|
70
|
-
"git",
|
|
71
|
-
"-C",
|
|
72
|
-
spec.repoPath,
|
|
73
|
-
"remote",
|
|
74
|
-
"get-url",
|
|
75
|
-
"origin",
|
|
76
|
-
]);
|
|
57
|
+
// Repoint `origin` before the checkout, not after: attach mode fetches
|
|
58
|
+
// the branch from it, and cloning from a local path leaves origin on that
|
|
59
|
+
// path, which has the branch only as a remote-tracking ref (if at all).
|
|
60
|
+
//
|
|
61
|
+
// It has to happen regardless, because that path does not exist inside
|
|
62
|
+
// the container, so the publish step's push would die with "does not
|
|
63
|
+
// appear to be a git repository". The image's gh credential helper
|
|
64
|
+
// authenticates the real URL from the forwarded token. When `repoPath` is
|
|
65
|
+
// already a URL this `git -C` fails and origin is left exactly as it is.
|
|
66
|
+
const sourceOrigin = await spawnCollect(originUrlArgs(spec.repoPath));
|
|
77
67
|
const originUrl = sourceOrigin.exitCode === 0 ? sourceOrigin.stdout.trim() : "";
|
|
78
68
|
if (originUrl !== "" && originUrl !== spec.repoPath) {
|
|
79
|
-
const setUrl = await spawnCollect(
|
|
80
|
-
"git",
|
|
81
|
-
"-C",
|
|
82
|
-
hostClone,
|
|
83
|
-
"remote",
|
|
84
|
-
"set-url",
|
|
85
|
-
"origin",
|
|
86
|
-
originUrl,
|
|
87
|
-
]);
|
|
69
|
+
const setUrl = await spawnCollect(setOriginArgs(hostClone, originUrl));
|
|
88
70
|
if (setUrl.exitCode !== 0) {
|
|
89
71
|
throw new Error(`git remote set-url origin failed: ${setUrl.stderr.trim()}`);
|
|
90
72
|
}
|
|
91
73
|
}
|
|
74
|
+
// "create" makes a new branch off the base; "attach" checks out one that
|
|
75
|
+
// already exists, which means fetching it (see ./attach.ts for why a bare
|
|
76
|
+
// checkout is not enough).
|
|
77
|
+
const branch = spec.mode === "attach"
|
|
78
|
+
? await attachToBranch(hostClone, spec.branch)
|
|
79
|
+
: await spawnCollect(checkoutNewArgs(hostClone, spec.branch, spec.baseBranch));
|
|
80
|
+
if (branch.exitCode !== 0)
|
|
81
|
+
throw new Error(`git checkout failed: ${branch.stderr.trim()}`);
|
|
92
82
|
const run = await docker(dockerRunArgs(name, image));
|
|
93
83
|
if (run.exitCode !== 0)
|
|
94
84
|
throw new Error(`docker run failed: ${run.stderr.trim()}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"container.js","sourceRoot":"","sources":["../../src/backend/container.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"container.js","sourceRoot":"","sources":["../../src/backend/container.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-worktree.d.ts","sourceRoot":"","sources":["../../src/backend/local-worktree.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"local-worktree.d.ts","sourceRoot":"","sources":["../../src/backend/local-worktree.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,OAAO,EACP,WAAW,EACX,UAAU,EACV,OAAO,EACP,aAAa,EACb,SAAS,EACV,MAAM,YAAY,CAAC;AAIpB;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,GACzB,MAAM,EAAE,CAIV;AAED;;;;GAIG;AACH,qBAAa,oBAAqB,YAAW,OAAO;IAClD,QAAQ,CAAC,IAAI,oBAAQ;IACrB,4EAA4E;IAC5E,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA6B;IAEvD,SAAS,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC;IA6DxD,IAAI,CACF,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,UAAU,CAAC;IAItB,MAAM,CACJ,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,KAAK,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,EAC9B,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,UAAU,CAAC;IAIhB,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAUnD,OAAO,CAAC,WAAW;CAIpB"}
|
|
@@ -3,6 +3,7 @@ import { mkdir, rm } from "node:fs/promises";
|
|
|
3
3
|
import { tmpdir } from "node:os";
|
|
4
4
|
import { join } from "node:path";
|
|
5
5
|
import process from "node:process";
|
|
6
|
+
import { attachToBranch, checkoutNewArgs } from "./attach.js";
|
|
6
7
|
import { CLONE_TOKEN_ENV, cloneCredentialArgs } from "./git-credentials.js";
|
|
7
8
|
import { spawnCollect } from "./proc.js";
|
|
8
9
|
const KIND = "local-worktree";
|
|
@@ -59,10 +60,11 @@ export class LocalWorktreeBackend {
|
|
|
59
60
|
if (clone.exitCode !== 0) {
|
|
60
61
|
throw new Error(`local-clone provision failed: ${clone.stderr.trim() || clone.stdout.trim()}`);
|
|
61
62
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
63
|
+
// Attach fetches the branch rather than assuming a local ref survived the
|
|
64
|
+
// clone; see ./attach.ts and TJ-1675.
|
|
65
|
+
const checkout = spec.mode === "attach"
|
|
66
|
+
? await attachToBranch(dir, spec.branch)
|
|
67
|
+
: await spawnCollect(checkoutNewArgs(dir, spec.branch, spec.baseBranch));
|
|
66
68
|
if (checkout.exitCode !== 0) {
|
|
67
69
|
await rm(dir, { recursive: true, force: true });
|
|
68
70
|
throw new Error(`local-clone checkout failed: ${checkout.stderr.trim()}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-worktree.js","sourceRoot":"","sources":["../../src/backend/local-worktree.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,OAAO,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAUzC,MAAM,IAAI,GAAG,gBAAgB,CAAC;AAE9B;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,UAAU,eAAe,CAC7B,GAAW,EACX,MAAc,EACd,UAAkB,EAClB,IAA0B;IAE1B,OAAO,IAAI,KAAK,QAAQ;QACtB,CAAC,CAAC,CAAC,UAAU,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,CAAC;QAClC,CAAC,CAAC,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC;AACzD,CAAC;AAED;;;;GAIG;AACH,MAAM,OAAO,oBAAoB;IACtB,IAAI,GAAG,IAAI,CAAC;IACrB,4EAA4E;IAC3D,eAAe,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE7D,KAAK,CAAC,SAAS,CAAC,IAAmB;QACjC,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;QACxB,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,cAAc,EAAE,EAAE,CAAC,CAAC;QAC/C,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,cAAc,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAEjE,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YACxB,+EAA+E;YAC/E,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;YAC/D,MAAM,QAAQ,GAAG,mBAAmB,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC;YACzE,MAAM,SAAS,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;YACnF,MAAM,KAAK,GAAG,MAAM,YAAY,CAC9B,CAAC,KAAK,EAAE,GAAG,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,EAC5D,SAAS,CACV,CAAC;YACF,IAAI,KAAK,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;gBACzB,MAAM,IAAI,KAAK,CACb,iCAAiC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAC9E,CAAC;YACJ,CAAC;YACD,MAAM,
|
|
1
|
+
{"version":3,"file":"local-worktree.js","sourceRoot":"","sources":["../../src/backend/local-worktree.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,OAAO,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAUzC,MAAM,IAAI,GAAG,gBAAgB,CAAC;AAE9B;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,UAAU,eAAe,CAC7B,GAAW,EACX,MAAc,EACd,UAAkB,EAClB,IAA0B;IAE1B,OAAO,IAAI,KAAK,QAAQ;QACtB,CAAC,CAAC,CAAC,UAAU,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,CAAC;QAClC,CAAC,CAAC,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC;AACzD,CAAC;AAED;;;;GAIG;AACH,MAAM,OAAO,oBAAoB;IACtB,IAAI,GAAG,IAAI,CAAC;IACrB,4EAA4E;IAC3D,eAAe,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE7D,KAAK,CAAC,SAAS,CAAC,IAAmB;QACjC,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;QACxB,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,cAAc,EAAE,EAAE,CAAC,CAAC;QAC/C,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,cAAc,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAEjE,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YACxB,+EAA+E;YAC/E,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;YAC/D,MAAM,QAAQ,GAAG,mBAAmB,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC;YACzE,MAAM,SAAS,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;YACnF,MAAM,KAAK,GAAG,MAAM,YAAY,CAC9B,CAAC,KAAK,EAAE,GAAG,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,EAC5D,SAAS,CACV,CAAC;YACF,IAAI,KAAK,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;gBACzB,MAAM,IAAI,KAAK,CACb,iCAAiC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAC9E,CAAC;YACJ,CAAC;YACD,0EAA0E;YAC1E,sCAAsC;YACtC,MAAM,QAAQ,GACZ,IAAI,CAAC,IAAI,KAAK,QAAQ;gBACpB,CAAC,CAAC,MAAM,cAAc,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC;gBACxC,CAAC,CAAC,MAAM,YAAY,CAAC,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;YAC7E,IAAI,QAAQ,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;gBAC5B,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;gBAChD,MAAM,IAAI,KAAK,CAAC,gCAAgC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC5E,CAAC;YACD,OAAO;gBACL,EAAE;gBACF,OAAO,EAAE,IAAI;gBACb,GAAG,EAAE,GAAG;gBACR,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,GAAG,CAAC,IAAI,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;aAC3E,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;YAChC,KAAK;YACL,IAAI;YACJ,IAAI,CAAC,QAAQ;YACb,GAAG,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC;SACjE,CAAC,CAAC;QACH,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CACb,oCAAoC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CACnF,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC5C,6EAA6E;QAC7E,OAAO;YACL,EAAE;YACF,OAAO,EAAE,IAAI;YACb,GAAG,EAAE,GAAG;YACR,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,GAAG,CAAC,IAAI,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;SAC3E,CAAC;IACJ,CAAC;IAED,IAAI,CACF,SAAoB,EACpB,OAA0B,EAC1B,UAAuB,EAAE;QAEzB,OAAO,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,CACJ,SAAoB,EACpB,OAA0B,EAC1B,KAA8B,EAC9B,UAAuB,EAAE;QAEzB,OAAO,YAAY,CAAC,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IACnF,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,SAAoB;QACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACxD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,MAAM,YAAY,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC5F,MAAM,YAAY,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;YACjE,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAC5C,CAAC;QACD,MAAM,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,CAAC;IAEO,WAAW,CAAC,SAAoB,EAAE,OAAoB;QAC5D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC;QACzF,OAAO,EAAE,GAAG,OAAO,EAAE,GAAG,EAAE,CAAC;IAC7B,CAAC;CACF"}
|
package/dist/board/page.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../src/board/page.ts"],"names":[],"mappings":"AAEA,kFAAkF;AAClF,eAAO,MAAM,SAAS,
|
|
1
|
+
{"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../src/board/page.ts"],"names":[],"mappings":"AAEA,kFAAkF;AAClF,eAAO,MAAM,SAAS,QAkTd,CAAC"}
|
package/dist/board/page.js
CHANGED
|
@@ -16,6 +16,8 @@ export const PAGE_HTML = `<!doctype html>
|
|
|
16
16
|
table { border-collapse: collapse; width: 100%; }
|
|
17
17
|
th, td { text-align: left; padding: .4rem .6rem; border-bottom: 1px solid #8883; }
|
|
18
18
|
.state { font-weight: 600; }
|
|
19
|
+
.hist-entry { margin: 6px 0 0 0; padding-left: 8px; border-left: 2px solid #ddd; }
|
|
20
|
+
.row-err { font-size: 12px; color: #b3261e; margin-top: 2px; overflow-wrap: anywhere; }
|
|
19
21
|
.done, .merged, .responded { color: #2a9d3a; } .failed { color: #d33; } .blocked, .abandoned { color: #d90; }
|
|
20
22
|
.noop, .skipped, .closed { opacity: .6; } .muted { opacity: .6; }
|
|
21
23
|
a { color: inherit; }
|
|
@@ -98,6 +100,27 @@ function prStatusHtml(status) {
|
|
|
98
100
|
return parts.join("");
|
|
99
101
|
}
|
|
100
102
|
|
|
103
|
+
/**
|
|
104
|
+
* What earlier passes said, once a later one has superseded them. The row's own
|
|
105
|
+
* Error and Comment above are always the latest pass's; this is the record of
|
|
106
|
+
* the ones before it, so a comment posted on the PR two passes ago is still
|
|
107
|
+
* readable here (TJ-1676).
|
|
108
|
+
*/
|
|
109
|
+
function outcomeHistoryHtml(row) {
|
|
110
|
+
const all = row.outcomes || [];
|
|
111
|
+
if (all.length < 2) return "";
|
|
112
|
+
const earlier = all.slice(0, -1).reverse();
|
|
113
|
+
const items = earlier.map((o) => {
|
|
114
|
+
const said = o.error || o.summary || "";
|
|
115
|
+
return "<div class=hist-entry>" +
|
|
116
|
+
"<span class='state " + esc(o.state) + "'>" + esc(o.state) + "</span> " +
|
|
117
|
+
"<span class=muted>" + esc(fmtWhen(o.ts)) + "</span>" +
|
|
118
|
+
(said ? "<pre>" + esc(said) + "</pre>" : "") +
|
|
119
|
+
"</div>";
|
|
120
|
+
}).join("");
|
|
121
|
+
return "<div><b>Earlier passes</b>" + items + "</div>";
|
|
122
|
+
}
|
|
123
|
+
|
|
101
124
|
function detailBodyHtml(row) {
|
|
102
125
|
const parts = [];
|
|
103
126
|
const itemLabel = esc(row.itemId || "");
|
|
@@ -113,6 +136,7 @@ function detailBodyHtml(row) {
|
|
|
113
136
|
parts.push("<div><b>Gate</b>" + gateStepsHtml(row.gate) + "</div>");
|
|
114
137
|
if (row.error) parts.push("<div><b>Error</b><pre class=failed>" + esc(row.error) + "</pre></div>");
|
|
115
138
|
if (row.summary) parts.push("<div><b>Comment</b><pre>" + esc(row.summary) + "</pre></div>");
|
|
139
|
+
parts.push(outcomeHistoryHtml(row));
|
|
116
140
|
if (row.prUrl) {
|
|
117
141
|
parts.push("<div><b>PR</b> " + link(row.prUrl, esc(row.prUrl)) + "</div>");
|
|
118
142
|
}
|
|
@@ -190,13 +214,26 @@ function toggle(runId) {
|
|
|
190
214
|
if (expanded.has(runId)) paintDetail(runId);
|
|
191
215
|
}
|
|
192
216
|
|
|
217
|
+
/**
|
|
218
|
+
* A failed row's reason, on the summary line. It used to live only in the
|
|
219
|
+
* detail panel, so a row read "failed" with nothing to say why and the reason
|
|
220
|
+
* was one click away on a page nobody thinks to click (TJ-1676). Truncated
|
|
221
|
+
* here, in full on hover.
|
|
222
|
+
*/
|
|
223
|
+
function errLine(r) {
|
|
224
|
+
if (!r.error) return "";
|
|
225
|
+
const oneLine = String(r.error).replace(/\\s+/g, " ").trim();
|
|
226
|
+
const short = oneLine.length > 120 ? oneLine.slice(0, 119) + "…" : oneLine;
|
|
227
|
+
return "<div class='row-err' title='" + esc(oneLine) + "'>" + esc(short) + "</div>";
|
|
228
|
+
}
|
|
229
|
+
|
|
193
230
|
function rowHtml(r) {
|
|
194
231
|
const isOpen = expanded.has(r.runId);
|
|
195
232
|
const gate = (r.gate || []).map((s) => (s.exitCode === 0 ? "✓" : "✗")).join("");
|
|
196
233
|
const pr = r.prUrl ? link(r.prUrl, "#" + esc(r.prNumber)) : "";
|
|
197
234
|
const when = fmtWhen(r.startedAt);
|
|
198
235
|
const itemLabel = esc(r.title || r.itemId || "");
|
|
199
|
-
const item = r.url ? link(r.url, itemLabel) : itemLabel;
|
|
236
|
+
const item = (r.url ? link(r.url, itemLabel) : itemLabel) + errLine(r);
|
|
200
237
|
const state = esc(mainLineState(r));
|
|
201
238
|
const main = "<tr class=run-row>" +
|
|
202
239
|
"<td><button class='twirl" + (isOpen ? " open" : "") + "' data-run-id='" + esc(r.runId) + "'>▶</button></td>" +
|
package/dist/board/page.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"page.js","sourceRoot":"","sources":["../../src/board/page.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,kFAAkF;AAClF,MAAM,CAAC,MAAM,SAAS,GAAG
|
|
1
|
+
{"version":3,"file":"page.js","sourceRoot":"","sources":["../../src/board/page.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,kFAAkF;AAClF,MAAM,CAAC,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBAgMH,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAkH/C,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../src/dashboard/page.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,mBAAmB,
|
|
1
|
+
{"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../src/dashboard/page.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,mBAAmB,QAwU/B,CAAC"}
|
package/dist/dashboard/page.js
CHANGED
|
@@ -34,6 +34,8 @@ export const DASHBOARD_PAGE_HTML = `<!doctype html>
|
|
|
34
34
|
table.runs th { font-weight: 600; opacity: .7; font-size: .85em; }
|
|
35
35
|
a { color: inherit; }
|
|
36
36
|
.state { font-weight: 600; }
|
|
37
|
+
.hist-entry { margin: 6px 0 0 0; padding-left: 8px; border-left: 2px solid #ddd; }
|
|
38
|
+
.row-err { font-size: 12px; color: #b3261e; margin-top: 2px; overflow-wrap: anywhere; }
|
|
37
39
|
.done { color: #2a9d3a; } .failed { color: #d33; } .blocked, .abandoned { color: #d90; }
|
|
38
40
|
.noop, .skipped { opacity: .6; } .muted { opacity: .6; }
|
|
39
41
|
.twirl {
|
|
@@ -135,6 +137,27 @@ function mergeButtonHtml(path, r) {
|
|
|
135
137
|
"<span class='merge-status'></span></div>";
|
|
136
138
|
}
|
|
137
139
|
|
|
140
|
+
/**
|
|
141
|
+
* What earlier passes said, once a later one has superseded them. The row's own
|
|
142
|
+
* Error and Comment above are always the latest pass's; this is the record of
|
|
143
|
+
* the ones before it, so a comment posted on the PR two passes ago is still
|
|
144
|
+
* readable here (TJ-1676).
|
|
145
|
+
*/
|
|
146
|
+
function outcomeHistoryHtml(row) {
|
|
147
|
+
const all = row.outcomes || [];
|
|
148
|
+
if (all.length < 2) return "";
|
|
149
|
+
const earlier = all.slice(0, -1).reverse();
|
|
150
|
+
const items = earlier.map((o) => {
|
|
151
|
+
const said = o.error || o.summary || "";
|
|
152
|
+
return "<div class=hist-entry>" +
|
|
153
|
+
"<span class='state " + esc(o.state) + "'>" + esc(o.state) + "</span> " +
|
|
154
|
+
"<span class=muted>" + esc(fmtWhen(o.ts)) + "</span>" +
|
|
155
|
+
(said ? "<pre>" + esc(said) + "</pre>" : "") +
|
|
156
|
+
"</div>";
|
|
157
|
+
}).join("");
|
|
158
|
+
return "<div><b>Earlier passes</b>" + items + "</div>";
|
|
159
|
+
}
|
|
160
|
+
|
|
138
161
|
function detailHtml(path, r) {
|
|
139
162
|
const parts = [];
|
|
140
163
|
parts.push(
|
|
@@ -152,6 +175,7 @@ function detailHtml(path, r) {
|
|
|
152
175
|
parts.push("<div><b>Gate</b>" + gateStepsHtml(r.gate) + "</div>");
|
|
153
176
|
if (r.error) parts.push("<div><b>Error</b><pre class=failed>" + esc(r.error) + "</pre></div>");
|
|
154
177
|
if (r.summary) parts.push("<div><b>Comment</b><pre>" + esc(r.summary) + "</pre></div>");
|
|
178
|
+
parts.push(outcomeHistoryHtml(r));
|
|
155
179
|
if (r.prUrl) {
|
|
156
180
|
parts.push(
|
|
157
181
|
"<div><b>PR</b> <a href='" + esc(r.prUrl) + "'" + NEWTAB + ">" + esc(r.prUrl) + "</a></div>",
|
|
@@ -168,6 +192,14 @@ function detailHtml(path, r) {
|
|
|
168
192
|
return parts.join("");
|
|
169
193
|
}
|
|
170
194
|
|
|
195
|
+
/** A failed row's reason on the summary line, truncated, full text on hover (TJ-1676). */
|
|
196
|
+
function errLine(r) {
|
|
197
|
+
if (!r.error) return "";
|
|
198
|
+
const oneLine = String(r.error).replace(/\\s+/g, " ").trim();
|
|
199
|
+
const short = oneLine.length > 120 ? oneLine.slice(0, 119) + "…" : oneLine;
|
|
200
|
+
return "<div class='row-err' title='" + esc(oneLine) + "'>" + esc(short) + "</div>";
|
|
201
|
+
}
|
|
202
|
+
|
|
171
203
|
function runsHtml(g, gi) {
|
|
172
204
|
if (!g.runs.length) {
|
|
173
205
|
return "<p class='none'>" + (g.health === "ok" ? "no runs yet" : esc(g.health)) + "</p>";
|
|
@@ -184,7 +216,7 @@ function runsHtml(g, gi) {
|
|
|
184
216
|
" aria-expanded='" + open + "' data-path='" + esc(g.path) + "' data-run='" + esc(r.runId) + "'" +
|
|
185
217
|
" title='show detail'>▶</button></td>" +
|
|
186
218
|
"<td class=muted>" + esc(r.runId.slice(0, 8)) + "</td>" +
|
|
187
|
-
"<td>" + itemLink(r, r.title || r.itemId || "") + "</td>" +
|
|
219
|
+
"<td>" + itemLink(r, r.title || r.itemId || "") + errLine(r) + "</td>" +
|
|
188
220
|
"<td class='state " + state + "'>" + state + "</td>" +
|
|
189
221
|
"<td>" + esc(r.backend || "") + "</td>" +
|
|
190
222
|
"<td>" + gate + "</td>" +
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"page.js","sourceRoot":"","sources":["../../src/dashboard/page.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG
|
|
1
|
+
{"version":3,"file":"page.js","sourceRoot":"","sources":["../../src/dashboard/page.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mCAqMA,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmInE,CAAC"}
|
package/dist/store/events.d.ts
CHANGED
|
@@ -77,6 +77,19 @@ export interface EventSink {
|
|
|
77
77
|
* a result.
|
|
78
78
|
*/
|
|
79
79
|
export declare function emitEvent(sink: EventSink | undefined, event: RunEvent): Promise<void>;
|
|
80
|
+
/**
|
|
81
|
+
* One pass's completed account of itself, kept after a later pass supersedes
|
|
82
|
+
* it. The row's `state`, `summary`, and `error` are always the newest pass's;
|
|
83
|
+
* this is what the earlier ones said, so answering review feedback three times
|
|
84
|
+
* reads as one item with a history rather than losing everything but the last
|
|
85
|
+
* word (TJ-1676).
|
|
86
|
+
*/
|
|
87
|
+
export interface OutcomeEntry {
|
|
88
|
+
ts: number;
|
|
89
|
+
state: string;
|
|
90
|
+
summary?: string;
|
|
91
|
+
error?: string;
|
|
92
|
+
}
|
|
80
93
|
export interface GateStepRow {
|
|
81
94
|
name: string;
|
|
82
95
|
exitCode: number;
|
|
@@ -112,6 +125,11 @@ export interface RunRow {
|
|
|
112
125
|
summary?: string;
|
|
113
126
|
/** Set only when `state` is "failed"; see {@link FailureKind}. */
|
|
114
127
|
failureKind?: FailureKind;
|
|
128
|
+
/**
|
|
129
|
+
* Every outcome this row has seen, oldest first, including the current one.
|
|
130
|
+
* Optional because rows written before this existed do not carry it.
|
|
131
|
+
*/
|
|
132
|
+
outcomes?: OutcomeEntry[];
|
|
115
133
|
artifacts: ArtifactRef[];
|
|
116
134
|
/** Epoch millis of the first and last events seen. */
|
|
117
135
|
startedAt?: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/store/events.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/store/events.ts"],"names":[],"mappings":"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"}
|
package/dist/store/events.js
CHANGED
|
@@ -85,11 +85,26 @@ export function applyEvent(row, event) {
|
|
|
85
85
|
next.artifacts.push({ name: event.name, hash: event.hash });
|
|
86
86
|
break;
|
|
87
87
|
case "outcome":
|
|
88
|
+
// The row's state, summary, and error are always the newest pass's, so a
|
|
89
|
+
// later outcome replaces them rather than layering onto them: leaving the
|
|
90
|
+
// previous pass's success summary beside a new failure's error made the
|
|
91
|
+
// row claim both at once (TJ-1676).
|
|
92
|
+
//
|
|
93
|
+
// Replaced, not discarded. What each pass said is kept in `outcomes`, so
|
|
94
|
+
// a row a later pass continues (TJ-1665) still carries the comment the
|
|
95
|
+
// earlier pass posted on the PR.
|
|
96
|
+
next.outcomes = [
|
|
97
|
+
...(row.outcomes ?? []),
|
|
98
|
+
{
|
|
99
|
+
ts: event.ts,
|
|
100
|
+
state: event.state,
|
|
101
|
+
...(event.summary === undefined ? {} : { summary: event.summary }),
|
|
102
|
+
...(event.error === undefined ? {} : { error: event.error }),
|
|
103
|
+
},
|
|
104
|
+
];
|
|
88
105
|
next.state = event.state;
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
if (event.summary !== undefined)
|
|
92
|
-
next.summary = event.summary;
|
|
106
|
+
next.summary = event.summary;
|
|
107
|
+
next.error = event.error;
|
|
93
108
|
if (event.failureKind !== undefined)
|
|
94
109
|
next.failureKind = event.failureKind;
|
|
95
110
|
break;
|
package/dist/store/events.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/store/events.ts"],"names":[],"mappings":"AA8DA;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAA2B,EAAE,KAAe;IAC1E,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO;IAC/B,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,2BAA2B;IAC7B,CAAC;AACH,CAAC;
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/store/events.ts"],"names":[],"mappings":"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"}
|