Skip to content

Commit 752856e

Browse files
committed
wip: scm
1 parent 5196a03 commit 752856e

6 files changed

Lines changed: 55 additions & 40 deletions

File tree

src/rpc/host.ts

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,16 @@
1-
import type { useHostFs } from '../fs/host'
21
import type { Connection } from '../sync/connection'
3-
import type { useHostTerminals } from '../terminal/host'
42
import type { ClientFunctions, HostFunctions } from './types'
53
import { createBirpc } from 'birpc'
64
import { deserialize, serialize } from './serialize'
75

86
export function useHostRpc(
97
connection: Connection,
10-
fs: ReturnType<typeof useHostFs>,
11-
terminals: ReturnType<typeof useHostTerminals>,
8+
functions: HostFunctions,
129
) {
1310
const [sendRpcData, recvRpcData] = connection.makeAction('rpc')
1411

1512
const rpc = createBirpc<ClientFunctions, HostFunctions>(
16-
{
17-
...fs,
18-
...terminals,
19-
},
13+
functions,
2014
{
2115
post: (data, peerId) => sendRpcData(data, peerId),
2216
on: fn => recvRpcData((data, peerId) => fn(data, peerId)),

src/rpc/types.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import type { useHostFs } from '../fs/host'
2+
import type { useHostScm } from '../scm/host'
23
import type { useHostTerminals } from '../terminal/host'
34

45
export type HostFunctions
56
= & ReturnType<typeof useHostFs>
67
& ReturnType<typeof useHostTerminals>
8+
& ReturnType<typeof useHostScm>
79

810
export interface ClientFunctions {}

src/scm/client.ts

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
import type { BirpcReturn } from 'birpc'
12
import type { SourceControlResourceGroup, SourceControlResourceState } from 'vscode'
23
import type * as Y from 'yjs'
4+
import type { ClientFunctions, HostFunctions } from '../rpc/types'
35
import type { GitExtension } from './git'
46
import type { ScmChange, ScmGroupMeta, ScmRepo } from './types'
57
import { basename } from 'pathe'
@@ -9,15 +11,10 @@ import { useShallowYArray, useShallowYMapScopes } from '../sync/doc'
911
import { lazy } from '../utils'
1012
import { Status } from './git'
1113

12-
export function useClientScm(doc: Y.Doc) {
14+
export function useClientScm(doc: Y.Doc, rpc: BirpcReturn<HostFunctions, ClientFunctions>) {
1315
const map = doc.getMap<ScmRepo>('scm')
1416

15-
useShallowYMapScopes(
16-
() => map,
17-
(id, data) => {
18-
useScmRepo(data)
19-
},
20-
)
17+
useShallowYMapScopes(() => map, useScmRepo)
2118

2219
useCommands({
2320
'p2p-live-share.scm.cleanAll': async (group: SourceControlResourceGroup) => {
@@ -57,15 +54,17 @@ export function useClientScm(doc: Y.Doc) {
5754
}
5855
}
5956
if ((await window.showWarningMessage(message, { modal: true }, action)) === action) {
60-
// await this.service.cleanResourcesAsync(
61-
// states.map(e => e.ResourceIdentity),
62-
// )
57+
await rpc.scmClean(
58+
states[0].repoUri,
59+
states[0].groupMeta.groupId,
60+
states.map(({ resourceUri }) => resourceUri.toString()),
61+
)
6362
}
6463
},
6564
})
6665
}
6766

68-
function useScmRepo(repo: ScmRepo) {
67+
function useScmRepo(uri: string, repo: ScmRepo) {
6968
const [groups, meta] = repo.toArray()
7069
const sc = useDisposable(scm.createSourceControl('p2p-live-share-scm', meta.label, Uri.parse(meta.rootUri)))
7170
sc.inputBox.visible = false
@@ -79,7 +78,7 @@ function useScmRepo(repo: ScmRepo) {
7978

8079
const states = useShallowYArray(() => changes)
8180
watchEffect(() => {
82-
group.resourceStates = states.value.map(state => createResourceState(state, meta))
81+
group.resourceStates = states.value.map(state => createResourceState(state, meta, uri))
8382
})
8483
},
8584
)
@@ -90,7 +89,7 @@ function useScmRepo(repo: ScmRepo) {
9089
// }
9190
}
9291

93-
function createResourceState({ uri, status }: ScmChange, meta: ScmGroupMeta) {
92+
function createResourceState({ uri, status }: ScmChange, meta: ScmGroupMeta, repoUri: string) {
9493
const useIcons = areGitDecorationsEnabled()
9594
return {
9695
resourceUri: Uri.parse(uri),
@@ -115,6 +114,7 @@ function createResourceState({ uri, status }: ScmChange, meta: ScmGroupMeta) {
115114
priority: getPriority(status),
116115
// resourceDecoration
117116

117+
repoUri,
118118
status,
119119
groupMeta: meta,
120120
} satisfies SourceControlResourceState & Record<string, unknown>

src/scm/host.ts

Lines changed: 31 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,12 @@ import type { API, Change, GitExtension, Repository, RepositoryState } from './g
44
import type { ScmChange, ScmGroup, ScmGroupMeta, ScmRepo, ScmRepoMeta } from './types'
55
import { basename } from 'pathe'
66
import { effectScope, getCurrentScope, useDisposable } from 'reactive-vscode'
7-
import { extensions } from 'vscode'
7+
import { extensions, Uri } from 'vscode'
88
import * as Y from 'yjs'
99
import { YTuple } from '../sync/y-tuple'
1010

1111
export function useHostScm(connection: Connection, doc: Y.Doc) {
12+
const { toHostUri } = connection
1213
const scope = getCurrentScope()!
1314
const _git = (async () => {
1415
const gitExtension = extensions.getExtension<GitExtension>('vscode.git')
@@ -18,6 +19,21 @@ export function useHostScm(connection: Connection, doc: Y.Doc) {
1819
const gitApi = gitExtension.exports.getAPI(1)
1920
return scope.run(() => useHostGitScm(gitApi, connection, doc))
2021
})()
22+
23+
return {
24+
async scmClean(repoUri: string, groupId: string, resourceUris: string[]) {
25+
const git = await _git
26+
if (!git)
27+
return
28+
const repo = git.repositories.get(repoUri)
29+
if (!repo)
30+
return
31+
await repo.repo.clean(resourceUris.map((uri_) => {
32+
const uri = toHostUri(Uri.parse(uri_))
33+
return uri.fsPath
34+
}))
35+
},
36+
}
2137
}
2238

2339
function useHostGitScm(api: API, connection: Connection, doc: Y.Doc) {
@@ -29,13 +45,19 @@ function useHostGitScm(api: API, connection: Connection, doc: Y.Doc) {
2945
// const changedInstances = new Set()
3046
// const resourceCache = new Map()
3147

32-
const repoScopes = new Map<string, EffectScope>()
48+
const repositories = new Map<string, {
49+
scope: EffectScope
50+
repo: Repository
51+
}>()
3352
const openRepository = (repo: Repository) => {
3453
const uri = toTrackUri(repo.rootUri)?.toString()
3554
if (!uri)
3655
return
3756
const scope = effectScope(true)
38-
repoScopes.set(uri, scope)
57+
repositories.set(uri, {
58+
scope,
59+
repo,
60+
})
3961
map.set(uri, scope.run(() => useScmRepo(repo, {
4062
rootUri: uri,
4163
label: 'Git',
@@ -50,26 +72,19 @@ function useHostGitScm(api: API, connection: Connection, doc: Y.Doc) {
5072
if (!uri)
5173
return
5274
map.delete(uri)
53-
const scope = repoScopes.get(uri)
54-
if (scope) {
55-
scope.stop()
56-
repoScopes.delete(uri)
75+
const repository = repositories.get(uri)
76+
if (repository) {
77+
repository.scope.stop()
78+
repositories.delete(uri)
5779
}
5880
}))
5981

6082
// const documentUriCacheCleanupTimer = setInterval(cleanupDocumentUriCache, 300000)
6183
// onScopeDispose(() => clearInterval(documentUriCacheCleanupTimer))
6284

6385
return {
64-
// getRecentVersions,
65-
// getRecentVersionsTillMergeVersion,
66-
// getCurrentVersionName,
67-
// getRemoteVersionsNames,
68-
// getMergeVersion,
69-
// getDiffsForVersion,
70-
// getDiffForResource,
71-
// getResource,
72-
// cleanResources,
86+
api,
87+
repositories,
7388
}
7489

7590
// function getInstanceId(repo: Repository) {

src/session/client.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ export async function createClientSession(config: ConnectionConfig) {
7474
const { shadowTerminals } = useClientTerminals(doc, rpc)
7575
useClientLs(connection, hostId)
7676
useClientDiagnostics(doc)
77-
useClientScm(doc)
77+
useClientScm(doc, rpc)
7878
const tunnels = useTunnels(connection, doc)
7979
useWebview().useChat(connection)
8080
useCurrentUser()

src/session/host.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,14 @@ export async function createHostSession(config: ConnectionConfig) {
3434

3535
const fs = useHostFs(connection, doc)
3636
const terminals = useHostTerminals(doc)
37-
useHostRpc(connection, fs, terminals)
37+
const scm = useHostScm(connection, doc)
38+
useHostRpc(connection, {
39+
...fs,
40+
...terminals,
41+
...scm,
42+
})
3843
useHostLs(connection)
3944
useHostDiagnostics(connection, doc)
40-
useHostScm(connection, doc)
4145
const tunnels = useTunnels(connection, doc)
4246
useWebview().useChat(connection)
4347
useCurrentUser()

0 commit comments

Comments
 (0)