Skip to content

Commit c1ec693

Browse files
merge editor support (#198)
1 parent 6004314 commit c1ec693

File tree

4 files changed

+86
-9
lines changed

4 files changed

+86
-9
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# Change Log
22

3+
## [1.7.0] 2023-10-25
4+
5+
### Added
6+
7+
- merge editor support
8+
39
## [1.6.10] 2023-10-10
410

511
### Fixed

client/src/commands/registry.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ export const AbapFsCommands = {
4444
changequickdiff: "abapfs.changequickdiff",
4545
remotediff: "abapfs.remotediff",
4646
comparediff: "abapfs.comparediff",
47+
mergeEditor: "abapfs.openMergeEditor",
4748
// transports
4849
transportObjectDiff: "abapfs.transportObjectDiff",
4950
openTransportObject: "abapfs.openTransportObject",

client/src/scm/abaprevisions/commands.ts

Lines changed: 73 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,25 +22,43 @@ const revItems = (revisions: Revision[]): RevisionItem[] =>
2222
revision: r
2323
}))
2424

25+
const loadRevisions = async (uri: Uri, withRefresh = true) => {
26+
const service = AbapRevisionService.get(uri.authority)
27+
const revisions = await service.uriRevisions(uri, withRefresh)
28+
return revisions || []
29+
}
30+
31+
const pickRevision = async (revisions: Revision[], title = "Select version") => {
32+
if (!revisions.length) return
33+
if (revisions.length === 1) return revisions[0]
34+
const selected = await window.showQuickPick(revItems(revisions), { placeHolder: title })
35+
return selected?.revision || false
36+
}
37+
2538
const selectRevision = async (
2639
uri: Uri,
2740
title = "Select version",
2841
withRefresh = true
2942
) => {
30-
const service = AbapRevisionService.get(uri.authority)
31-
const revisions = await service.uriRevisions(uri, false)
32-
if (!revisions?.length) return
33-
if (revisions.length === 1) return revisions[0]
34-
const selected = await window.showQuickPick(revItems(revisions), {
35-
placeHolder: title
36-
})
37-
return selected?.revision || false
43+
const revisions = await loadRevisions(uri, withRefresh)
44+
return pickRevision(revisions, title)
3845
}
3946
const CURRENTREV = "current"
4047

4148
const diffTitle = (uri: Uri, lvers: string, rvers: string) =>
4249
`${uri.path.split("/").pop() || uri.toString()} ${lvers}->${rvers}`
4350

51+
const pickCommonAncestor = (locals: Revision[], localVer: Revision, remotes: Revision[], remoteVer: Revision) => {
52+
const localTime = new Date(localVer.date).getTime()
53+
const possibleLocals = locals.filter(l => new Date(l.date).getTime() < localTime)
54+
const remoteTime = new Date(remoteVer.date).getTime()
55+
const possibleRemotes = remotes.filter(l => new Date(l.date).getTime() < remoteTime)
56+
for (const l of possibleLocals)
57+
if (possibleRemotes.find(r => r.version && r.version === l.version)) return l
58+
return pickRevision(possibleLocals, "Unable to determine common ancestor, please select base for comparison")
59+
}
60+
61+
4462
export const displayRevDiff = (
4563
rightRev: Revision | undefined,
4664
leftRev: Revision | undefined,
@@ -116,6 +134,52 @@ export class AbapRevisionCommands {
116134
if (!rightRev) return
117135
displayRevDiff(rightRev, leftRev, uri)
118136
}
137+
138+
@command(AbapFsCommands.mergeEditor)
139+
private static async mergeConflicts(uri: Uri) {
140+
if (!abapUri(uri)) return
141+
try {
142+
const file = uriRoot(uri).getNode(uri.path)
143+
if (!isAbapFile(file)) return
144+
const { remote, userCancel } = await RemoteManager.get().selectConnection(
145+
undefined,
146+
r => r.name.toLowerCase() !== uri.authority
147+
)
148+
if (!remote)
149+
if (userCancel) return
150+
else throw Error("No remote system available in configuration")
151+
152+
const remoteRoot = await getOrCreateRoot(formatKey(remote.name))
153+
if (!remoteRoot) throw Error(`Faild to connect to server ${remote.name}`)
154+
155+
const path = await remoteRoot.findByAdtUri(file.object.path)
156+
if (!path) throw Error(`Object not found in remote ${remote.name}`)
157+
158+
const remoteUri = uri.with({ authority: remoteRoot.connId, path: path.path })
159+
160+
const remotes = await loadRevisions(remoteUri, true)
161+
const remoteVer = await pickRevision(remotes, "Remote version")
162+
if (!remoteVer) return
163+
const locals = await loadRevisions(uri, true)
164+
const localVer = await pickRevision(locals, "Local version")
165+
if (!localVer) return
166+
const baseVer = await pickCommonAncestor(locals, localVer, remotes, remoteVer)
167+
if (!baseVer) return
168+
const base = revisionUri(uri, baseVer)
169+
170+
const description = uri.path.replace(/.*\//, "")
171+
172+
const options = {
173+
base,
174+
input1: { uri: revisionUri(uri, localVer), title: uri.authority, description, detail: localVer.version },
175+
input2: { uri: revisionUri(remoteUri, remoteVer), title: remoteUri.authority, description, detail: remoteVer.version },
176+
output: uri
177+
}
178+
return commands.executeCommand<void>("_open.mergeEditor", options)
179+
} catch (e) {
180+
window.showErrorMessage(caughtToString(e))
181+
}
182+
}
119183
@command(AbapFsCommands.clearScmGroup)
120184
private static clearGroup(group: AGroup) {
121185
group.resourceStates = []
@@ -149,3 +213,4 @@ export class AbapRevisionCommands {
149213
})
150214
}
151215
}
216+

client/src/scm/abaprevisions/lenses.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,12 @@ export class AbapRevisionLens implements CodeLensProvider {
6060
arguments: [doc.uri]
6161
})
6262

63-
return [quickDiff, compareDiff, remoteDiff]
63+
const merge = new CodeLens(rng, {
64+
command: AbapFsCommands.mergeEditor,
65+
title: "merge conflicts with remote",
66+
arguments: [doc.uri]
67+
})
68+
return [quickDiff, compareDiff, remoteDiff, merge]
6469
}
6570
private emitter = new EventEmitter<void>()
6671
private static instance?: AbapRevisionLens

0 commit comments

Comments
 (0)