Skip to content

Commit 936bf1e

Browse files
authored
Use exp show data along with runner to set dvc experiment running context value (#1848)
1 parent d2b8b30 commit 936bf1e

File tree

21 files changed

+303
-97
lines changed

21 files changed

+303
-97
lines changed

extension/package.json

Lines changed: 48 additions & 48 deletions
Large diffs are not rendered by default.

extension/src/cli/runner.ts

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import { getOptions } from './options'
1010
import { Config } from '../config'
1111
import { PseudoTerminal } from '../vscode/pseudoTerminal'
1212
import { createProcess, Process } from '../processExecution'
13-
import { setContextValue } from '../vscode/context'
1413
import { StopWatch } from '../util/time'
1514
import { sendErrorTelemetryEvent, sendTelemetryEvent } from '../telemetry'
1615
import { EventName } from '../telemetry/constants'
@@ -70,7 +69,6 @@ export class CliRunner extends Disposable implements ICli {
7069
this.dispose.track(
7170
this.onDidCompleteProcess(() => {
7271
this.pseudoTerminal.setBlocked(false)
73-
CliRunner.setRunningContext(false)
7472
this.processOutput.fire(
7573
'\r\nTerminal will be reused by DVC, press any key to close it\r\n\n'
7674
)
@@ -101,9 +99,6 @@ export class CliRunner extends Disposable implements ICli {
10199
)
102100
}
103101

104-
private static setRunningContext = (isRunning: boolean) =>
105-
setContextValue('dvc.runner.running', isRunning)
106-
107102
public runExperiment(dvcRoot: string, ...args: Args) {
108103
return this.run(
109104
dvcRoot,
@@ -207,7 +202,6 @@ export class CliRunner extends Disposable implements ICli {
207202
}
208203

209204
private startProcess(cwd: string, args: Args) {
210-
CliRunner.setRunningContext(true)
211205
this.pseudoTerminal.setBlocked(true)
212206
this.processOutput.fire(`Running: dvc ${args.join(' ')}\r\n\n`)
213207
this.currentProcess = this.createProcess({

extension/src/context.ts

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import { Disposable } from './class/dispose'
2+
import { CliRunner } from './cli/runner'
3+
import { WorkspaceExperiments } from './experiments/workspace'
4+
import { setContextValue } from './vscode/context'
5+
6+
export class Context extends Disposable {
7+
private readonly experiments: WorkspaceExperiments
8+
private readonly cliRunner: CliRunner
9+
10+
constructor(experiments: WorkspaceExperiments, cliRunner: CliRunner) {
11+
super()
12+
13+
this.experiments = experiments
14+
this.cliRunner = cliRunner
15+
16+
this.dispose.track(
17+
this.cliRunner.onDidStartProcess(() => {
18+
this.setIsExperimentRunning()
19+
})
20+
)
21+
22+
this.dispose.track(
23+
this.cliRunner.onDidCompleteProcess(({ cwd }) =>
24+
this.experiments.getRepository(cwd).update()
25+
)
26+
)
27+
28+
this.dispose.track(
29+
this.experiments.onDidChangeExperiments(() => {
30+
this.setIsExperimentRunning()
31+
})
32+
)
33+
}
34+
35+
private setIsExperimentRunning() {
36+
if (this.cliRunner.isExperimentRunning()) {
37+
setContextValue('dvc.experiment.running', true)
38+
return
39+
}
40+
41+
let hasRunning = false
42+
for (const dvcRoot of this.experiments.getDvcRoots()) {
43+
if (this.experiments.getRepository(dvcRoot).hasRunningExperiment()) {
44+
hasRunning = true
45+
}
46+
}
47+
setContextValue('dvc.experiment.running', hasRunning)
48+
}
49+
}

extension/src/experiments/index.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -377,6 +377,10 @@ export class Experiments extends BaseRepository<TableData> {
377377
}
378378
}
379379

380+
public hasRunningExperiment() {
381+
return this.experiments.hasRunningExperiment()
382+
}
383+
380384
private hideTableColumn(path: string) {
381385
this.toggleColumnStatus(path)
382386
sendTelemetryEvent(
@@ -438,6 +442,7 @@ export class Experiments extends BaseRepository<TableData> {
438442
columns: this.columns.getSelected(),
439443
hasCheckpoints: this.hasCheckpoints(),
440444
hasColumns: this.columns.hasColumns(),
445+
hasRunningExperiment: this.experiments.hasRunningExperiment(),
441446
rows: this.experiments.getRowData(),
442447
sorts: this.experiments.getSorts()
443448
}

extension/src/experiments/model/accumulator.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,12 @@ export class ExperimentsAccumulator {
55
public branches: Experiment[] = []
66
public checkpointsByTip: Map<string, Experiment[]> = new Map()
77
public experimentsByBranch: Map<string, Experiment[]> = new Map()
8+
public hasRunning: boolean
89

910
constructor(workspace: Experiment | undefined) {
1011
if (workspace) {
1112
this.workspace = workspace
1213
}
14+
this.hasRunning = !!workspace?.running
1315
}
1416
}

extension/src/experiments/model/collect.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,15 @@ const transformExperimentOrCheckpointData = (
192192
}
193193
}
194194

195+
const collectHasRunningExperiment = (
196+
acc: ExperimentsAccumulator,
197+
experiment: Experiment
198+
) => {
199+
if (experiment.running) {
200+
acc.hasRunning = true
201+
}
202+
}
203+
195204
const collectExperimentOrCheckpoint = (
196205
acc: ExperimentsAccumulator,
197206
experiment: Experiment,
@@ -227,6 +236,7 @@ const collectFromExperimentsObject = (
227236
}
228237

229238
collectExperimentOrCheckpoint(acc, experiment, branchName, checkpointTipId)
239+
collectHasRunningExperiment(acc, experiment)
230240
}
231241
}
232242

@@ -248,6 +258,7 @@ const collectFromBranchesObject = (
248258

249259
if (branch) {
250260
collectFromExperimentsObject(acc, experimentsObject, sha, branch.label)
261+
collectHasRunningExperiment(acc, branch)
251262

252263
acc.branches.push(branch)
253264
}

extension/src/experiments/model/index.ts

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ export class ExperimentsModel extends ModelWithPersistence {
5656
private useFiltersForSelection = false
5757

5858
private currentSorts: SortDefinition[]
59+
private hasRunning = false
5960

6061
constructor(dvcRoot: string, workspaceState: Memento) {
6162
super(dvcRoot, workspaceState)
@@ -85,13 +86,19 @@ export class ExperimentsModel extends ModelWithPersistence {
8586
}
8687

8788
public transformAndSet(data: ExperimentsOutput) {
88-
const { workspace, branches, experimentsByBranch, checkpointsByTip } =
89-
collectExperiments(data)
89+
const {
90+
workspace,
91+
branches,
92+
experimentsByBranch,
93+
checkpointsByTip,
94+
hasRunning
95+
} = collectExperiments(data)
9096

9197
this.workspace = workspace
9298
this.branches = branches
9399
this.experimentsByBranch = experimentsByBranch
94100
this.checkpointsByTip = checkpointsByTip
101+
this.hasRunning = hasRunning
95102

96103
this.setColoredStatus()
97104
}
@@ -117,6 +124,10 @@ export class ExperimentsModel extends ModelWithPersistence {
117124
return this.coloredStatus[id]
118125
}
119126

127+
public hasRunningExperiment() {
128+
return this.hasRunning
129+
}
130+
120131
public canSelect() {
121132
return canSelect(this.coloredStatus)
122133
}

extension/src/experiments/webview/contract.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ export type TableData = {
5757
columnWidths: Record<string, number>
5858
hasCheckpoints: boolean
5959
hasColumns: boolean
60+
hasRunningExperiment: boolean
6061
rows: Row[]
6162
sorts: SortDefinition[]
6263
}

extension/src/experiments/workspace.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ export class WorkspaceExperiments extends BaseWorkspaceWebviews<
1919
new EventEmitter<void>()
2020
)
2121

22+
public readonly onDidChangeExperiments = this.experimentsChanged.event
23+
2224
public readonly columnsChanged = this.dispose.track(new EventEmitter<void>())
2325

2426
public readonly updatesPaused: EventEmitter<boolean>

extension/src/extension.ts

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import { commands, env, Event, EventEmitter, ExtensionContext } from 'vscode'
2-
import { Config } from './config'
32
import { CliExecutor } from './cli/executor'
43
import { CliRunner } from './cli/runner'
54
import { CliReader } from './cli/reader'
5+
import { Config } from './config'
6+
import { Context } from './context'
67
import { isVersionCompatible } from './cli/version'
78
import { isPythonExtensionInstalled } from './extensions/python'
89
import { WorkspaceExperiments } from './experiments/workspace'
@@ -133,11 +134,7 @@ export class Extension extends Disposable implements IExtension {
133134
new WorkspaceRepositories(this.internalCommands)
134135
)
135136

136-
this.dispose.track(
137-
this.cliRunner.onDidCompleteProcess(({ cwd }) =>
138-
this.experiments.getRepository(cwd).update()
139-
)
140-
)
137+
this.dispose.track(new Context(this.experiments, this.cliRunner))
141138

142139
this.dispose.track(
143140
new ExperimentsColumnsTree(

0 commit comments

Comments
 (0)