Skip to content

Commit e557145

Browse files
authored
Add created branch (from dvc exp branch) to the experiments table (#4857)
1 parent 500ca54 commit e557145

File tree

5 files changed

+86
-13
lines changed

5 files changed

+86
-13
lines changed

extension/src/experiments/commands/index.ts

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,21 @@ import { RegisteredCommands } from '../../commands/external'
1414

1515
export const getBranchExperimentCommand =
1616
(experiments: WorkspaceExperiments) =>
17-
(cwd: string, name: string, input: string) =>
18-
experiments.runCommand(AvailableCommands.EXP_BRANCH, cwd, name, input)
17+
async (cwd: string, name: string, input: string) => {
18+
const output = await experiments.runCommand(
19+
AvailableCommands.EXP_BRANCH,
20+
cwd,
21+
name,
22+
input
23+
)
24+
25+
if (!output) {
26+
return
27+
}
28+
29+
const repository = experiments.getRepository(cwd)
30+
return repository.addBranch(input)
31+
}
1932

2033
export const getRenameExperimentCommand =
2134
(experiments: WorkspaceExperiments) =>

extension/src/experiments/index.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -613,6 +613,11 @@ export class Experiments extends BaseRepository<TableData> {
613613
return this.experiments.getAvailableBranchesToSelect()
614614
}
615615

616+
public addBranch(branch: string) {
617+
this.experiments.addBranch(branch)
618+
return this.refresh()
619+
}
620+
616621
public refresh() {
617622
return this.data.update()
618623
}

extension/src/experiments/model/index.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -585,6 +585,13 @@ export class ExperimentsModel extends ModelWithPersistence {
585585
return this.availableBranchesToSelect
586586
}
587587

588+
public addBranch(branch: string) {
589+
const selectedBranches: string[] = this.getSelectedBranches()
590+
const branchesWithNewBranch = [...selectedBranches, branch].sort()
591+
592+
this.setSelectedBranches(branchesWithNewBranch)
593+
}
594+
588595
public setStudioData(
589596
live: { baselineSha: string; name: string }[],
590597
pushed: string[]

extension/src/test/suite/experiments/index.test.ts

Lines changed: 56 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -534,31 +534,77 @@ suite('Experiments Test Suite', () => {
534534
}).timeout(WEBVIEW_TEST_TIMEOUT)
535535

536536
it('should be able to handle a message to create a branch from an experiment', async () => {
537-
const { mockMessageReceived } =
538-
await stubWorkspaceGettersWebview(disposable)
539-
540-
const mockBranch = 'mock-branch-input'
541-
const inputEvent = getInputBoxEvent(mockBranch)
537+
const {
538+
mockMessageReceived,
539+
experimentsModel,
540+
mockUpdateExperimentsData
541+
} = await stubWorkspaceGettersWebview(disposable)
542542

543-
const mockExperimentBranch = stub(
544-
DvcExecutor.prototype,
545-
'expBranch'
546-
).resolves('undefined')
543+
stub(Setup.prototype, 'getCliVersion').resolves('3.22.0')
547544

548545
const mockExperimentId = 'exp-e7a67'
546+
const mockBranch = 'mock-branch-input'
547+
const mockExperimentBranch = stub(DvcExecutor.prototype, 'expBranch')
548+
const mockSetSelectedBranches = stub(
549+
experimentsModel,
550+
'setSelectedBranches'
551+
)
552+
stub(window, 'showInputBox').resolves(mockBranch)
553+
554+
const failedExperimentBranchEvent = new Promise(resolve =>
555+
mockExperimentBranch.onFirstCall().callsFake(() => {
556+
resolve(undefined)
557+
return Promise.resolve('')
558+
})
559+
)
549560

550561
mockMessageReceived.fire({
551562
payload: mockExperimentId,
552563
type: MessageFromWebviewType.CREATE_BRANCH_FROM_EXPERIMENT
553564
})
554565

555-
await inputEvent
566+
await failedExperimentBranchEvent
567+
556568
expect(mockExperimentBranch).to.be.calledOnce
557569
expect(mockExperimentBranch).to.be.calledWithExactly(
558570
dvcDemoPath,
559571
mockExperimentId,
560572
mockBranch
561573
)
574+
expect(mockSetSelectedBranches).not.to.be.called
575+
expect(mockUpdateExperimentsData).not.to.be.called
576+
577+
const selectedBranches = ['main', 'other']
578+
const selectedBranchesWithNewBranch = [
579+
'main',
580+
'mock-branch-input',
581+
'other'
582+
]
583+
mockExperimentBranch.onSecondCall().resolves('branch created')
584+
stub(experimentsModel, 'getSelectedBranches')
585+
.onFirstCall()
586+
.returns(selectedBranches)
587+
const waitForBranchesToBeSelected = new Promise(resolve =>
588+
mockSetSelectedBranches.callsFake(() => resolve(undefined))
589+
)
590+
591+
mockMessageReceived.fire({
592+
payload: mockExperimentId,
593+
type: MessageFromWebviewType.CREATE_BRANCH_FROM_EXPERIMENT
594+
})
595+
596+
await waitForBranchesToBeSelected
597+
598+
expect(mockExperimentBranch).to.be.calledTwice
599+
expect(mockExperimentBranch).to.be.calledWithExactly(
600+
dvcDemoPath,
601+
mockExperimentId,
602+
mockBranch
603+
)
604+
expect(mockSetSelectedBranches).to.be.calledWithExactly(
605+
selectedBranchesWithNewBranch
606+
)
607+
expect(mockUpdateExperimentsData).to.be.calledOnce
562608
}).timeout(WEBVIEW_TEST_TIMEOUT)
563609

564610
it('should be able to handle a message to rename an experiment', async () => {

extension/src/test/suite/experiments/util.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -387,7 +387,8 @@ export const stubWorkspaceGettersWebview = async (
387387
experimentsModel,
388388
messageSpy,
389389
mockMessageReceived,
390-
webview
390+
webview,
391+
mockUpdateExperimentsData
391392
} = await buildExperimentsWebview({ disposer })
392393

393394
return {
@@ -399,6 +400,7 @@ export const stubWorkspaceGettersWebview = async (
399400
messageSpy,
400401
...stubWorkspaceExperiments(dvcRoot, experiments),
401402
mockMessageReceived,
403+
mockUpdateExperimentsData,
402404
webview
403405
}
404406
}

0 commit comments

Comments
 (0)