sf-git-merge-driver 1.0.0-dev-3.14240781218-1 → 1.0.0-dev-3.14242356173-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/README.md +17 -11
- package/lib/commands/git/merge/driver/run.d.ts +6 -2
- package/lib/commands/git/merge/driver/run.js +39 -9
- package/lib/commands/git/merge/driver/run.js.map +1 -1
- package/lib/constant/conflictConstant.d.ts +5 -0
- package/lib/constant/conflictConstant.js +6 -0
- package/lib/constant/conflictConstant.js.map +1 -0
- package/lib/constant/parserConstant.d.ts +1 -0
- package/lib/constant/parserConstant.js +2 -0
- package/lib/constant/parserConstant.js.map +1 -0
- package/lib/driver/MergeDriver.js +1 -1
- package/lib/driver/MergeDriver.js.map +1 -1
- package/lib/merger/JsonMerger.d.ts +1 -1
- package/lib/merger/JsonMerger.js +75 -75
- package/lib/merger/JsonMerger.js.map +1 -1
- package/lib/merger/XmlMerger.d.ts +1 -1
- package/lib/merger/XmlMerger.js +2 -2
- package/lib/merger/XmlMerger.js.map +1 -1
- package/lib/merger/conflictMarker.d.ts +7 -1
- package/lib/merger/conflictMarker.js +30 -9
- package/lib/merger/conflictMarker.js.map +1 -1
- package/lib/merger/textAttribute.d.ts +1 -1
- package/lib/merger/textAttribute.js +25 -25
- package/lib/merger/textAttribute.js.map +1 -1
- package/lib/service/NamespaceHandler.d.ts +1 -1
- package/lib/service/NamespaceHandler.js +2 -2
- package/lib/service/NamespaceHandler.js.map +1 -1
- package/lib/service/installService.js +1 -1
- package/lib/service/installService.js.map +1 -1
- package/lib/types/conflictTypes.d.ts +6 -0
- package/lib/types/conflictTypes.js +2 -0
- package/lib/types/conflictTypes.js.map +1 -0
- package/lib/types/mergeScenario.d.ts +8 -8
- package/lib/types/mergeScenario.js +11 -11
- package/lib/types/mergeScenario.js.map +1 -1
- package/lib/utils/mergeUtils.d.ts +1 -1
- package/lib/utils/mergeUtils.js +1 -1
- package/lib/utils/mergeUtils.js.map +1 -1
- package/messages/run.md +17 -6
- package/npm-shrinkwrap.json +6 -6
- package/oclif.manifest.json +47 -11
- package/package.json +2 -2
- package/lib/constant/conflicConstant.d.ts +0 -6
- package/lib/constant/conflicConstant.js +0 -7
- package/lib/constant/conflicConstant.js.map +0 -1
package/README.md
CHANGED
|
@@ -47,7 +47,7 @@ EXAMPLES
|
|
|
47
47
|
$ sf git merge driver install
|
|
48
48
|
```
|
|
49
49
|
|
|
50
|
-
_See code: [src/commands/git/merge/driver/install.ts](https://github.com/scolladon/sf-git-merge-driver/blob/v1.0.0-dev-3.
|
|
50
|
+
_See code: [src/commands/git/merge/driver/install.ts](https://github.com/scolladon/sf-git-merge-driver/blob/v1.0.0-dev-3.14242356173-1/src/commands/git/merge/driver/install.ts)_
|
|
51
51
|
|
|
52
52
|
## `sf git merge driver run`
|
|
53
53
|
|
|
@@ -55,13 +55,18 @@ Runs the merge driver for the specified files.
|
|
|
55
55
|
|
|
56
56
|
```
|
|
57
57
|
USAGE
|
|
58
|
-
$ sf git merge driver run -
|
|
58
|
+
$ sf git merge driver run -O <value> -A <value> -B <value> -P <value> [--json] [--flags-dir <value>] [-L <value>] [-S
|
|
59
|
+
<value>] [-X <value>] [-Y <value>]
|
|
59
60
|
|
|
60
61
|
FLAGS
|
|
61
|
-
-
|
|
62
|
-
-
|
|
63
|
-
-
|
|
64
|
-
-
|
|
62
|
+
-A, --local-file=<value> (required) path to our version of the file
|
|
63
|
+
-B, --other-file=<value> (required) path to their version of the file
|
|
64
|
+
-L, --conflict-marker-size=<value> [default: 7] number of characters to show for conflict markers
|
|
65
|
+
-O, --ancestor-file=<value> (required) path to the common ancestor version of the file
|
|
66
|
+
-P, --output-file=<value> (required) path to the file where the merged content will be written
|
|
67
|
+
-S, --ancestor-conflict-marker=<value> [default: |] character used to delimit ancestor version in conflicts
|
|
68
|
+
-X, --local-conflict-marker=<value> [default: <] character used to delimit local version in conflicts
|
|
69
|
+
-Y, --other-conflict-marker=<value> [default: >] character used to delimit other version in conflicts
|
|
65
70
|
|
|
66
71
|
GLOBAL FLAGS
|
|
67
72
|
--flags-dir=<value> Import flag values from a directory.
|
|
@@ -76,16 +81,17 @@ DESCRIPTION
|
|
|
76
81
|
EXAMPLES
|
|
77
82
|
Run the merge driver for conflicting files:
|
|
78
83
|
|
|
79
|
-
$ sf git merge driver run --ancestor-file=<value> --
|
|
84
|
+
$ sf git merge driver run --ancestor-file=<value> --local-file=<value> --other-file=<value> \
|
|
85
|
+
--output-file=<value>
|
|
80
86
|
|
|
81
87
|
Where:
|
|
82
88
|
- ancestor-file is the path to the common ancestor version of the file
|
|
83
|
-
-
|
|
84
|
-
-
|
|
89
|
+
- local-file is the path to our version of the file
|
|
90
|
+
- other-file is the path to their version of the file
|
|
85
91
|
- output-file is the path to the file where the merged content will be written
|
|
86
92
|
```
|
|
87
93
|
|
|
88
|
-
_See code: [src/commands/git/merge/driver/run.ts](https://github.com/scolladon/sf-git-merge-driver/blob/v1.0.0-dev-3.
|
|
94
|
+
_See code: [src/commands/git/merge/driver/run.ts](https://github.com/scolladon/sf-git-merge-driver/blob/v1.0.0-dev-3.14242356173-1/src/commands/git/merge/driver/run.ts)_
|
|
89
95
|
|
|
90
96
|
## `sf git merge driver uninstall`
|
|
91
97
|
|
|
@@ -112,7 +118,7 @@ EXAMPLES
|
|
|
112
118
|
$ sf git merge driver uninstall
|
|
113
119
|
```
|
|
114
120
|
|
|
115
|
-
_See code: [src/commands/git/merge/driver/uninstall.ts](https://github.com/scolladon/sf-git-merge-driver/blob/v1.0.0-dev-3.
|
|
121
|
+
_See code: [src/commands/git/merge/driver/uninstall.ts](https://github.com/scolladon/sf-git-merge-driver/blob/v1.0.0-dev-3.14242356173-1/src/commands/git/merge/driver/uninstall.ts)_
|
|
116
122
|
<!-- commandsstop -->
|
|
117
123
|
|
|
118
124
|
## How It Works
|
|
@@ -5,9 +5,13 @@ export default class Run extends SfCommand<void> {
|
|
|
5
5
|
static readonly examples: string[];
|
|
6
6
|
static readonly flags: {
|
|
7
7
|
'ancestor-file': import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
8
|
-
'
|
|
9
|
-
'
|
|
8
|
+
'local-file': import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
9
|
+
'other-file': import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
10
10
|
'output-file': import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
|
+
'conflict-marker-size': import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
|
+
'ancestor-conflict-marker': import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
13
|
+
'local-conflict-marker': import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
14
|
+
'other-conflict-marker': import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
15
|
};
|
|
12
16
|
run(): Promise<void>;
|
|
13
17
|
}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { Messages } from '@salesforce/core';
|
|
2
2
|
import { Flags, SfCommand } from '@salesforce/sf-plugins-core';
|
|
3
|
+
import { DEFAULT_ANCESTOR_CONFLICT_MARKER, DEFAULT_CONFLICT_MARKER_SIZE, DEFAULT_LOCAL_CONFLICT_MARKER, DEFAULT_OTHER_CONFLICT_MARKER, } from '../../../../constant/conflictConstant.js';
|
|
3
4
|
import { MergeDriver } from '../../../../driver/MergeDriver.js';
|
|
5
|
+
import { ConflictMarker } from '../../../../merger/conflictMarker.js';
|
|
4
6
|
Messages.importMessagesDirectoryFromMetaUrl(import.meta.url);
|
|
5
7
|
const messages = Messages.loadMessages('sf-git-merge-driver', 'run');
|
|
6
8
|
export default class Run extends SfCommand {
|
|
@@ -9,34 +11,62 @@ export default class Run extends SfCommand {
|
|
|
9
11
|
static examples = messages.getMessages('examples');
|
|
10
12
|
static flags = {
|
|
11
13
|
'ancestor-file': Flags.string({
|
|
12
|
-
char: '
|
|
14
|
+
char: 'O',
|
|
13
15
|
summary: messages.getMessage('flags.ancestor-file.summary'),
|
|
14
16
|
required: true,
|
|
15
17
|
exists: true,
|
|
16
18
|
}),
|
|
17
|
-
'
|
|
18
|
-
char: '
|
|
19
|
-
summary: messages.getMessage('flags.
|
|
19
|
+
'local-file': Flags.string({
|
|
20
|
+
char: 'A',
|
|
21
|
+
summary: messages.getMessage('flags.local-file.summary'),
|
|
20
22
|
required: true,
|
|
21
23
|
exists: true,
|
|
22
24
|
}),
|
|
23
|
-
'
|
|
24
|
-
char: '
|
|
25
|
-
summary: messages.getMessage('flags.
|
|
25
|
+
'other-file': Flags.string({
|
|
26
|
+
char: 'B',
|
|
27
|
+
summary: messages.getMessage('flags.other-file.summary'),
|
|
26
28
|
required: true,
|
|
27
29
|
exists: true,
|
|
28
30
|
}),
|
|
29
31
|
'output-file': Flags.string({
|
|
30
|
-
char: '
|
|
32
|
+
char: 'P',
|
|
31
33
|
summary: messages.getMessage('flags.output-file.summary'),
|
|
32
34
|
required: true,
|
|
33
35
|
exists: true,
|
|
34
36
|
}),
|
|
37
|
+
'conflict-marker-size': Flags.integer({
|
|
38
|
+
char: 'L',
|
|
39
|
+
summary: messages.getMessage('flags.conflict-marker-size.summary'),
|
|
40
|
+
min: 1,
|
|
41
|
+
default: DEFAULT_CONFLICT_MARKER_SIZE,
|
|
42
|
+
}),
|
|
43
|
+
'ancestor-conflict-marker': Flags.string({
|
|
44
|
+
char: 'S',
|
|
45
|
+
summary: messages.getMessage('flags.ancestor-conflict-marker.summary'),
|
|
46
|
+
default: DEFAULT_ANCESTOR_CONFLICT_MARKER,
|
|
47
|
+
}),
|
|
48
|
+
'local-conflict-marker': Flags.string({
|
|
49
|
+
char: 'X',
|
|
50
|
+
summary: messages.getMessage('flags.local-conflict-marker.summary'),
|
|
51
|
+
default: DEFAULT_LOCAL_CONFLICT_MARKER,
|
|
52
|
+
}),
|
|
53
|
+
'other-conflict-marker': Flags.string({
|
|
54
|
+
char: 'Y',
|
|
55
|
+
summary: messages.getMessage('flags.other-conflict-marker.summary'),
|
|
56
|
+
default: DEFAULT_OTHER_CONFLICT_MARKER,
|
|
57
|
+
}),
|
|
35
58
|
};
|
|
36
59
|
async run() {
|
|
37
60
|
const { flags } = await this.parse(Run);
|
|
61
|
+
const conflicConfig = {
|
|
62
|
+
conflictMarkerSize: flags['conflict-marker-size'],
|
|
63
|
+
ancestorConflictMarker: flags['ancestor-conflict-marker'],
|
|
64
|
+
localConflictMarker: flags['local-conflict-marker'],
|
|
65
|
+
otherConflictMarker: flags['other-conflict-marker'],
|
|
66
|
+
};
|
|
67
|
+
ConflictMarker.setConflictConfig(conflicConfig);
|
|
38
68
|
const mergeDriver = new MergeDriver();
|
|
39
|
-
const hasConflict = await mergeDriver.mergeFiles(flags['ancestor-file'], flags['
|
|
69
|
+
const hasConflict = await mergeDriver.mergeFiles(flags['ancestor-file'], flags['local-file'], flags['other-file'], flags['output-file']);
|
|
40
70
|
if (hasConflict) {
|
|
41
71
|
this.error(messages.getMessage('result.withconflict') + ' ' + flags['output-file'], { exit: 1 });
|
|
42
72
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../../../../src/commands/git/merge/driver/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAA;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAA;
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../../../../src/commands/git/merge/driver/run.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare const DEFAULT_CONFLICT_MARKER_SIZE = 7;
|
|
2
|
+
export declare const DEFAULT_ANCESTOR_CONFLICT_MARKER = "|";
|
|
3
|
+
export declare const DEFAULT_LOCAL_CONFLICT_MARKER = "<";
|
|
4
|
+
export declare const DEFAULT_OTHER_CONFLICT_MARKER = ">";
|
|
5
|
+
export declare const SEPARATOR = "=";
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export const DEFAULT_CONFLICT_MARKER_SIZE = 7;
|
|
2
|
+
export const DEFAULT_ANCESTOR_CONFLICT_MARKER = '|';
|
|
3
|
+
export const DEFAULT_LOCAL_CONFLICT_MARKER = '<';
|
|
4
|
+
export const DEFAULT_OTHER_CONFLICT_MARKER = '>';
|
|
5
|
+
export const SEPARATOR = '=';
|
|
6
|
+
//# sourceMappingURL=conflictConstant.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conflictConstant.js","sourceRoot":"","sources":["../../src/constant/conflictConstant.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,CAAA;AAC7C,MAAM,CAAC,MAAM,gCAAgC,GAAG,GAAG,CAAA;AACnD,MAAM,CAAC,MAAM,6BAA6B,GAAG,GAAG,CAAA;AAChD,MAAM,CAAC,MAAM,6BAA6B,GAAG,GAAG,CAAA;AAChD,MAAM,CAAC,MAAM,SAAS,GAAG,GAAG,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const TEXT_TAG = "#text";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parserConstant.js","sourceRoot":"","sources":["../../src/constant/parserConstant.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,QAAQ,GAAG,OAAO,CAAA"}
|
|
@@ -9,7 +9,7 @@ export class MergeDriver {
|
|
|
9
9
|
readFile(theirFile, 'utf8'),
|
|
10
10
|
]);
|
|
11
11
|
const xmlMerger = new XmlMerger();
|
|
12
|
-
const mergedContent = xmlMerger.
|
|
12
|
+
const mergedContent = xmlMerger.mergeThreeWay(ancestorContent, ourContent, theirContent);
|
|
13
13
|
// Write the merged content to the output file
|
|
14
14
|
await writeFile(outputFile, mergedContent.output);
|
|
15
15
|
return mergedContent.hasConflict;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MergeDriver.js","sourceRoot":"","sources":["../../src/driver/MergeDriver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAElD,MAAM,OAAO,WAAW;IACtB,KAAK,CAAC,UAAU,CACd,YAAoB,EACpB,OAAe,EACf,SAAiB,EACjB,UAAkB;QAElB,0BAA0B;QAC1B,MAAM,CAAC,eAAe,EAAE,UAAU,EAAE,YAAY,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACpE,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;YAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;YACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;SAC5B,CAAC,CAAA;QAEF,MAAM,SAAS,GAAG,IAAI,SAAS,EAAE,CAAA;QAEjC,MAAM,aAAa,GAAG,SAAS,CAAC,
|
|
1
|
+
{"version":3,"file":"MergeDriver.js","sourceRoot":"","sources":["../../src/driver/MergeDriver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAElD,MAAM,OAAO,WAAW;IACtB,KAAK,CAAC,UAAU,CACd,YAAoB,EACpB,OAAe,EACf,SAAiB,EACjB,UAAkB;QAElB,0BAA0B;QAC1B,MAAM,CAAC,eAAe,EAAE,UAAU,EAAE,YAAY,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACpE,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;YAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;YACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;SAC5B,CAAC,CAAA;QAEF,MAAM,SAAS,GAAG,IAAI,SAAS,EAAE,CAAA;QAEjC,MAAM,aAAa,GAAG,SAAS,CAAC,aAAa,CAC3C,eAAe,EACf,UAAU,EACV,YAAY,CACb,CAAA;QAED,8CAA8C;QAC9C,MAAM,SAAS,CAAC,UAAU,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;QACjD,OAAO,aAAa,CAAC,WAAW,CAAA;IAClC,CAAC;CACF"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { JsonArray, JsonObject } from '../types/jsonTypes.js';
|
|
2
2
|
export declare class JsonMerger {
|
|
3
|
-
|
|
3
|
+
mergeThreeWay(ancestor: JsonObject | JsonArray, local: JsonObject | JsonArray, other: JsonObject | JsonArray): {
|
|
4
4
|
output: JsonArray;
|
|
5
5
|
hasConflict: boolean;
|
|
6
6
|
};
|
package/lib/merger/JsonMerger.js
CHANGED
|
@@ -7,28 +7,28 @@ import { ensureArray, getUniqueSortedProps, isObject, } from '../utils/mergeUtil
|
|
|
7
7
|
import { ConflictMarker } from './conflictMarker.js';
|
|
8
8
|
import { generateObj, mergeTextAttribute } from './textAttribute.js';
|
|
9
9
|
export class JsonMerger {
|
|
10
|
-
|
|
10
|
+
mergeThreeWay(ancestor, local, other) {
|
|
11
11
|
const namespaceHandler = new NamespaceHandler();
|
|
12
|
-
const namespaces = namespaceHandler.processNamespaces(ancestor,
|
|
13
|
-
const scenario = getScenario(ancestor,
|
|
12
|
+
const namespaces = namespaceHandler.processNamespaces(ancestor, local, other);
|
|
13
|
+
const scenario = getScenario(ancestor, local, other);
|
|
14
14
|
const acc = [];
|
|
15
|
-
const props = getUniqueSortedProps(ancestor,
|
|
15
|
+
const props = getUniqueSortedProps(ancestor, local, other);
|
|
16
16
|
for (const key of props) {
|
|
17
17
|
switch (scenario) {
|
|
18
18
|
case MergeScenario.ANCESTOR_ONLY:
|
|
19
19
|
break;
|
|
20
|
-
case MergeScenario.
|
|
21
|
-
acc.push(
|
|
20
|
+
case MergeScenario.LOCAL_AND_OTHER:
|
|
21
|
+
acc.push(handlelocalAndother(key, local, other));
|
|
22
22
|
break;
|
|
23
|
-
case MergeScenario.
|
|
24
|
-
acc.push(
|
|
23
|
+
case MergeScenario.ANCESTOR_AND_OTHER:
|
|
24
|
+
acc.push(handleAncestorAndother(key, ancestor, other));
|
|
25
25
|
break;
|
|
26
|
-
case MergeScenario.
|
|
27
|
-
acc.push(
|
|
26
|
+
case MergeScenario.ANCESTOR_AND_LOCAL:
|
|
27
|
+
acc.push(handleAncestorAndlocal(key, ancestor, local));
|
|
28
28
|
break;
|
|
29
29
|
default: {
|
|
30
30
|
const obj = {
|
|
31
|
-
[key]:
|
|
31
|
+
[key]: merge(ancestor[key], local[key], other[key]),
|
|
32
32
|
};
|
|
33
33
|
acc.push([obj]);
|
|
34
34
|
break;
|
|
@@ -43,24 +43,24 @@ export class JsonMerger {
|
|
|
43
43
|
};
|
|
44
44
|
}
|
|
45
45
|
}
|
|
46
|
-
function
|
|
46
|
+
function merge(ancestor, local, other) {
|
|
47
47
|
const acc = [];
|
|
48
|
-
const props = getUniqueSortedProps(ancestor,
|
|
48
|
+
const props = getUniqueSortedProps(ancestor, local, other);
|
|
49
49
|
for (const key of props) {
|
|
50
50
|
let values = [];
|
|
51
51
|
const ancestorOfKey = ancestor[key];
|
|
52
|
-
const
|
|
53
|
-
const
|
|
54
|
-
if (isObject(ancestorOfKey,
|
|
52
|
+
const localOfKey = local[key];
|
|
53
|
+
const otherOfKey = other[key];
|
|
54
|
+
if (isObject(ancestorOfKey, localOfKey, otherOfKey)) {
|
|
55
55
|
const [ancestorkey, ourkey, theirkey] = [
|
|
56
56
|
ancestorOfKey,
|
|
57
|
-
|
|
58
|
-
|
|
57
|
+
localOfKey,
|
|
58
|
+
otherOfKey,
|
|
59
59
|
].map(ensureArray);
|
|
60
60
|
values = mergeArrays(ancestorkey, ourkey, theirkey, key);
|
|
61
61
|
}
|
|
62
62
|
else {
|
|
63
|
-
values = mergeTextAttribute(ancestorOfKey,
|
|
63
|
+
values = mergeTextAttribute(ancestorOfKey, localOfKey, otherOfKey, key);
|
|
64
64
|
}
|
|
65
65
|
acc.push(values);
|
|
66
66
|
}
|
|
@@ -85,122 +85,122 @@ function toJsonArray(inputObj) {
|
|
|
85
85
|
}
|
|
86
86
|
return acc.flat();
|
|
87
87
|
}
|
|
88
|
-
const
|
|
88
|
+
const handlelocalAndother = (key, local, other) => {
|
|
89
89
|
const obj = {};
|
|
90
|
-
obj[key] = toJsonArray(
|
|
90
|
+
obj[key] = toJsonArray(local[key]);
|
|
91
91
|
const acc = [];
|
|
92
|
-
if (!deepEqual(
|
|
93
|
-
const
|
|
94
|
-
[key]: toJsonArray(
|
|
92
|
+
if (!deepEqual(local, other)) {
|
|
93
|
+
const otherProp = {
|
|
94
|
+
[key]: toJsonArray(other[key]),
|
|
95
95
|
};
|
|
96
|
-
ConflictMarker.addConflictMarkers(acc, obj, {},
|
|
96
|
+
ConflictMarker.addConflictMarkers(acc, obj, {}, otherProp);
|
|
97
97
|
}
|
|
98
98
|
else {
|
|
99
99
|
acc.push(obj);
|
|
100
100
|
}
|
|
101
101
|
return acc;
|
|
102
102
|
};
|
|
103
|
-
const
|
|
103
|
+
const handleAncestorAndother = (key, ancestor, other) => {
|
|
104
104
|
const acc = [];
|
|
105
|
-
if (!deepEqual(ancestor,
|
|
105
|
+
if (!deepEqual(ancestor, other)) {
|
|
106
106
|
const ancestorProp = {
|
|
107
107
|
[key]: toJsonArray(ancestor[key]),
|
|
108
108
|
};
|
|
109
|
-
const
|
|
110
|
-
[key]: toJsonArray(
|
|
109
|
+
const otherProp = {
|
|
110
|
+
[key]: toJsonArray(other[key]),
|
|
111
111
|
};
|
|
112
|
-
ConflictMarker.addConflictMarkers(acc, {}, ancestorProp,
|
|
112
|
+
ConflictMarker.addConflictMarkers(acc, {}, ancestorProp, otherProp);
|
|
113
113
|
}
|
|
114
114
|
return acc;
|
|
115
115
|
};
|
|
116
|
-
const
|
|
116
|
+
const handleAncestorAndlocal = (key, ancestor, local) => {
|
|
117
117
|
const acc = [];
|
|
118
|
-
if (!deepEqual(ancestor,
|
|
119
|
-
const
|
|
120
|
-
[key]: toJsonArray(
|
|
118
|
+
if (!deepEqual(ancestor, local)) {
|
|
119
|
+
const localProp = {
|
|
120
|
+
[key]: toJsonArray(local[key]),
|
|
121
121
|
};
|
|
122
122
|
const ancestorProp = {
|
|
123
123
|
[key]: toJsonArray(ancestor[key]),
|
|
124
124
|
};
|
|
125
|
-
ConflictMarker.addConflictMarkers(acc,
|
|
125
|
+
ConflictMarker.addConflictMarkers(acc, localProp, ancestorProp, {});
|
|
126
126
|
}
|
|
127
127
|
return acc;
|
|
128
128
|
};
|
|
129
|
-
const mergeArrays = (ancestor,
|
|
129
|
+
const mergeArrays = (ancestor, local, other, attribute) => {
|
|
130
130
|
const keyField = MetadataService.getKeyFieldExtractor(attribute);
|
|
131
131
|
if (!keyField) {
|
|
132
|
-
// const scenario: MergeScenario = getScenario(ancestor,
|
|
132
|
+
// const scenario: MergeScenario = getScenario(ancestor, local, other)
|
|
133
133
|
const arr = [];
|
|
134
|
-
// obj[attribute] = unionWith(
|
|
135
|
-
// obj[attribute] = mergeTextAttribute(
|
|
134
|
+
// obj[attribute] = unionWith(local, other, deepEqual)
|
|
135
|
+
// obj[attribute] = mergeTextAttribute(local, other, deepEqual, attribute)
|
|
136
136
|
// obj[attribute] = []
|
|
137
|
-
ConflictMarker.addConflictMarkers(arr, toJsonArray({ [attribute]:
|
|
137
|
+
ConflictMarker.addConflictMarkers(arr, toJsonArray({ [attribute]: local }), toJsonArray({ [attribute]: ancestor }), toJsonArray({ [attribute]: other }));
|
|
138
138
|
return arr.flat();
|
|
139
|
-
// return mergeTextAttribute(ancestor,
|
|
139
|
+
// return mergeTextAttribute(ancestor, local, other, attribute).flat()
|
|
140
140
|
}
|
|
141
|
-
const [keyedAnc,
|
|
142
|
-
return mergeByKeyField(keyedAnc,
|
|
141
|
+
const [keyedAnc, keyedlocal, keyedother] = [ancestor, local, other].map(arr => keyBy(arr, keyField));
|
|
142
|
+
return mergeByKeyField(keyedAnc, keyedlocal, keyedother, attribute);
|
|
143
143
|
};
|
|
144
|
-
const mergeByKeyField = (ancestor,
|
|
144
|
+
const mergeByKeyField = (ancestor, local, other, attribute) => {
|
|
145
145
|
const acc = [];
|
|
146
|
-
const props = getUniqueSortedProps(ancestor,
|
|
146
|
+
const props = getUniqueSortedProps(ancestor, local, other);
|
|
147
147
|
for (const key of props) {
|
|
148
148
|
const ancestorOfKey = ancestor[key];
|
|
149
|
-
const
|
|
150
|
-
const
|
|
151
|
-
const scenario = getScenario(ancestorOfKey,
|
|
149
|
+
const localOfKey = local[key];
|
|
150
|
+
const otherOfKey = other[key];
|
|
151
|
+
const scenario = getScenario(ancestorOfKey, localOfKey, otherOfKey);
|
|
152
152
|
const obj = {};
|
|
153
153
|
switch (scenario) {
|
|
154
|
-
case MergeScenario.
|
|
155
|
-
obj[attribute] =
|
|
154
|
+
case MergeScenario.OTHER_ONLY:
|
|
155
|
+
obj[attribute] = merge({}, {}, otherOfKey);
|
|
156
156
|
break;
|
|
157
|
-
case MergeScenario.
|
|
158
|
-
obj[attribute] =
|
|
157
|
+
case MergeScenario.LOCAL_ONLY:
|
|
158
|
+
obj[attribute] = merge({}, localOfKey, {});
|
|
159
159
|
break;
|
|
160
160
|
case MergeScenario.ANCESTOR_ONLY:
|
|
161
161
|
break;
|
|
162
|
-
case MergeScenario.
|
|
163
|
-
if (deepEqual(
|
|
164
|
-
obj[attribute] =
|
|
162
|
+
case MergeScenario.LOCAL_AND_OTHER:
|
|
163
|
+
if (deepEqual(localOfKey, otherOfKey)) {
|
|
164
|
+
obj[attribute] = merge({}, {}, otherOfKey);
|
|
165
165
|
}
|
|
166
166
|
else {
|
|
167
|
-
obj[attribute] =
|
|
167
|
+
obj[attribute] = merge({}, localOfKey, otherOfKey);
|
|
168
168
|
}
|
|
169
169
|
break;
|
|
170
|
-
case MergeScenario.
|
|
171
|
-
if (!deepEqual(ancestorOfKey,
|
|
170
|
+
case MergeScenario.ANCESTOR_AND_OTHER:
|
|
171
|
+
if (!deepEqual(ancestorOfKey, otherOfKey)) {
|
|
172
172
|
const ancestorProp = {
|
|
173
|
-
[attribute]:
|
|
173
|
+
[attribute]: merge({}, ancestorOfKey, {}),
|
|
174
174
|
};
|
|
175
|
-
const
|
|
176
|
-
[attribute]:
|
|
175
|
+
const otherProp = {
|
|
176
|
+
[attribute]: merge({}, {}, otherOfKey),
|
|
177
177
|
};
|
|
178
|
-
ConflictMarker.addConflictMarkers(acc, {}, ancestorProp,
|
|
178
|
+
ConflictMarker.addConflictMarkers(acc, {}, ancestorProp, otherProp);
|
|
179
179
|
}
|
|
180
180
|
break;
|
|
181
|
-
case MergeScenario.
|
|
182
|
-
if (!deepEqual(ancestorOfKey,
|
|
183
|
-
const
|
|
184
|
-
[attribute]:
|
|
181
|
+
case MergeScenario.ANCESTOR_AND_LOCAL:
|
|
182
|
+
if (!deepEqual(ancestorOfKey, localOfKey)) {
|
|
183
|
+
const localProp = {
|
|
184
|
+
[attribute]: merge({}, localOfKey, {}),
|
|
185
185
|
};
|
|
186
186
|
const ancestorProp = {
|
|
187
|
-
[attribute]:
|
|
187
|
+
[attribute]: merge({}, ancestorOfKey, {}),
|
|
188
188
|
};
|
|
189
|
-
ConflictMarker.addConflictMarkers(acc,
|
|
189
|
+
ConflictMarker.addConflictMarkers(acc, localProp, ancestorProp, {});
|
|
190
190
|
}
|
|
191
191
|
break;
|
|
192
192
|
case MergeScenario.ALL:
|
|
193
|
-
if (deepEqual(
|
|
194
|
-
obj[attribute] =
|
|
193
|
+
if (deepEqual(localOfKey, otherOfKey)) {
|
|
194
|
+
obj[attribute] = merge({}, {}, otherOfKey);
|
|
195
195
|
}
|
|
196
|
-
else if (deepEqual(ancestorOfKey,
|
|
197
|
-
obj[attribute] =
|
|
196
|
+
else if (deepEqual(ancestorOfKey, localOfKey)) {
|
|
197
|
+
obj[attribute] = merge({}, {}, otherOfKey);
|
|
198
198
|
}
|
|
199
|
-
else if (deepEqual(ancestorOfKey,
|
|
200
|
-
obj[attribute] =
|
|
199
|
+
else if (deepEqual(ancestorOfKey, otherOfKey)) {
|
|
200
|
+
obj[attribute] = merge({}, localOfKey, {});
|
|
201
201
|
}
|
|
202
202
|
else {
|
|
203
|
-
obj[attribute] =
|
|
203
|
+
obj[attribute] = merge(ancestorOfKey, localOfKey, otherOfKey);
|
|
204
204
|
}
|
|
205
205
|
break;
|
|
206
206
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JsonMerger.js","sourceRoot":"","sources":["../../src/merger/JsonMerger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAA;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAA;AAEjE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AACtE,OAAO,EACL,WAAW,EACX,oBAAoB,EACpB,QAAQ,GACT,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAEpE,MAAM,OAAO,UAAU;IACd,
|
|
1
|
+
{"version":3,"file":"JsonMerger.js","sourceRoot":"","sources":["../../src/merger/JsonMerger.ts"],"names":[],"mappings":"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"}
|
package/lib/merger/XmlMerger.js
CHANGED
|
@@ -30,14 +30,14 @@ const handleSpecialEntities = (xml) => xml
|
|
|
30
30
|
.replaceAll('<<<<<<<', '<<<<<<<')
|
|
31
31
|
.replaceAll('>>>>>>>', '>>>>>>>');
|
|
32
32
|
export class XmlMerger {
|
|
33
|
-
|
|
33
|
+
mergeThreeWay(ancestorContent, ourContent, theirContent) {
|
|
34
34
|
const parser = new XMLParser(parserOptions);
|
|
35
35
|
const ancestorObj = parser.parse(ancestorContent);
|
|
36
36
|
const ourObj = parser.parse(ourContent);
|
|
37
37
|
const theirObj = parser.parse(theirContent);
|
|
38
38
|
// Perform deep merge of XML objects
|
|
39
39
|
const jsonMerger = new JsonMerger();
|
|
40
|
-
const mergedResult = jsonMerger.
|
|
40
|
+
const mergedResult = jsonMerger.mergeThreeWay(ancestorObj, ourObj, theirObj);
|
|
41
41
|
// Convert back to XML and format
|
|
42
42
|
const builder = new XMLBuilder(builderOptions);
|
|
43
43
|
const mergedXml = builder.build(mergedResult.output);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"XmlMerger.js","sourceRoot":"","sources":["../../src/merger/XmlMerger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAE5C,MAAM,QAAQ,GAAG,0CAA0C,CAAA;AAC3D,MAAM,qBAAqB,GAAG,eAAe,CAAA;AAE7C,MAAM,WAAW,GAAG;IAClB,aAAa,EAAE,SAAS;IACxB,eAAe,EAAE,qBAAqB;IACtC,gBAAgB,EAAE,KAAK;CACxB,CAAA;AAED,MAAM,aAAa,GAAG;IACpB,GAAG,WAAW;IACd,iBAAiB,EAAE,IAAI;IACvB,kBAAkB,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE;IACvD,mBAAmB,EAAE,KAAK;IAC1B,aAAa,EAAE,KAAK;IACpB,uBAAuB;CACxB,CAAA;AAED,MAAM,cAAc,GAAG;IACrB,GAAG,WAAW;IACd,MAAM,EAAE,IAAI;IACZ,QAAQ,EAAE,MAAM;IAChB,aAAa,EAAE,IAAI;CACpB,CAAA;AAED,MAAM,eAAe,GAAG,CAAC,GAAW,EAAU,EAAE,CAC9C,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,qBAAqB,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;AAE9E,MAAM,qBAAqB,GAAG,CAAC,GAAW,EAAU,EAAE,CACpD,GAAG;KACA,OAAO,CAAC,iDAAiD,EAAE,IAAI,CAAC;KAChE,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAA;AAEpC,MAAM,qBAAqB,GAAG,CAAC,GAAW,EAAU,EAAE,CACpD,GAAG;KACA,UAAU,CAAC,YAAY,EAAE,QAAQ,CAAC;KAClC,UAAU,CAAC,8BAA8B,EAAE,SAAS,CAAC;KACrD,UAAU,CAAC,8BAA8B,EAAE,SAAS,CAAC,CAAA;AAE1D,MAAM,OAAO,SAAS;IACpB,
|
|
1
|
+
{"version":3,"file":"XmlMerger.js","sourceRoot":"","sources":["../../src/merger/XmlMerger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAE5C,MAAM,QAAQ,GAAG,0CAA0C,CAAA;AAC3D,MAAM,qBAAqB,GAAG,eAAe,CAAA;AAE7C,MAAM,WAAW,GAAG;IAClB,aAAa,EAAE,SAAS;IACxB,eAAe,EAAE,qBAAqB;IACtC,gBAAgB,EAAE,KAAK;CACxB,CAAA;AAED,MAAM,aAAa,GAAG;IACpB,GAAG,WAAW;IACd,iBAAiB,EAAE,IAAI;IACvB,kBAAkB,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE;IACvD,mBAAmB,EAAE,KAAK;IAC1B,aAAa,EAAE,KAAK;IACpB,uBAAuB;CACxB,CAAA;AAED,MAAM,cAAc,GAAG;IACrB,GAAG,WAAW;IACd,MAAM,EAAE,IAAI;IACZ,QAAQ,EAAE,MAAM;IAChB,aAAa,EAAE,IAAI;CACpB,CAAA;AAED,MAAM,eAAe,GAAG,CAAC,GAAW,EAAU,EAAE,CAC9C,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,qBAAqB,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;AAE9E,MAAM,qBAAqB,GAAG,CAAC,GAAW,EAAU,EAAE,CACpD,GAAG;KACA,OAAO,CAAC,iDAAiD,EAAE,IAAI,CAAC;KAChE,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAA;AAEpC,MAAM,qBAAqB,GAAG,CAAC,GAAW,EAAU,EAAE,CACpD,GAAG;KACA,UAAU,CAAC,YAAY,EAAE,QAAQ,CAAC;KAClC,UAAU,CAAC,8BAA8B,EAAE,SAAS,CAAC;KACrD,UAAU,CAAC,8BAA8B,EAAE,SAAS,CAAC,CAAA;AAE1D,MAAM,OAAO,SAAS;IACpB,aAAa,CACX,eAAuB,EACvB,UAAkB,EAClB,YAAoB;QAEpB,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,aAAa,CAAC,CAAA;QAE3C,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAA;QACjD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;QACvC,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;QAE3C,oCAAoC;QACpC,MAAM,UAAU,GAAG,IAAI,UAAU,EAAE,CAAA;QACnC,MAAM,YAAY,GAAG,UAAU,CAAC,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAA;QAE5E,iCAAiC;QACjC,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,cAAc,CAAC,CAAA;QAC9C,MAAM,SAAS,GAAW,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;QAC5D,OAAO;YACL,MAAM,EAAE,SAAS,CAAC,MAAM;gBACtB,CAAC,CAAC,qBAAqB,CACnB,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC,CAAC,CACnE;gBACH,CAAC,CAAC,EAAE;YACN,WAAW,EAAE,YAAY,CAAC,WAAW;SACtC,CAAA;IACH,CAAC;CACF"}
|
|
@@ -1,6 +1,12 @@
|
|
|
1
|
+
import { conflicConfig } from '../types/conflictTypes.js';
|
|
1
2
|
import type { JsonArray, JsonObject } from '../types/jsonTypes.js';
|
|
2
3
|
export declare class ConflictMarker {
|
|
3
4
|
private static hasConflict;
|
|
5
|
+
private static baseMarker;
|
|
6
|
+
private static localMarker;
|
|
7
|
+
private static otherMarker;
|
|
8
|
+
private static separatorMarker;
|
|
4
9
|
static hasConflictMarker(): boolean;
|
|
5
|
-
static addConflictMarkers(acc: JsonArray,
|
|
10
|
+
static addConflictMarkers(acc: JsonArray, local: JsonObject | JsonArray, ancestor: JsonObject | JsonArray, other: JsonObject | JsonArray): void;
|
|
11
|
+
static setConflictConfig(conflictConfig: conflicConfig): void;
|
|
6
12
|
}
|
|
@@ -1,19 +1,40 @@
|
|
|
1
|
+
import { EOL } from 'node:os';
|
|
1
2
|
import { isEmpty } from 'lodash-es';
|
|
2
|
-
import {
|
|
3
|
+
import { DEFAULT_ANCESTOR_CONFLICT_MARKER, DEFAULT_CONFLICT_MARKER_SIZE, DEFAULT_LOCAL_CONFLICT_MARKER, DEFAULT_OTHER_CONFLICT_MARKER, SEPARATOR, } from '../constant/conflictConstant.js';
|
|
4
|
+
import { TEXT_TAG } from '../constant/parserConstant.js';
|
|
5
|
+
const BASE = 'BASE';
|
|
6
|
+
const LOCAL = 'LOCAL';
|
|
7
|
+
const REMOTE = 'REMOTE';
|
|
8
|
+
const buildMarker = (marker, size, tag) => {
|
|
9
|
+
return `${marker.repeat(size)} ${tag}`;
|
|
10
|
+
};
|
|
11
|
+
const buildSeparator = (size) => {
|
|
12
|
+
return `${SEPARATOR.repeat(size)}`;
|
|
13
|
+
};
|
|
3
14
|
export class ConflictMarker {
|
|
4
15
|
static hasConflict = false;
|
|
16
|
+
static baseMarker = buildMarker(DEFAULT_ANCESTOR_CONFLICT_MARKER, DEFAULT_CONFLICT_MARKER_SIZE, BASE);
|
|
17
|
+
static localMarker = buildMarker(DEFAULT_LOCAL_CONFLICT_MARKER, DEFAULT_CONFLICT_MARKER_SIZE, LOCAL);
|
|
18
|
+
static otherMarker = buildMarker(DEFAULT_OTHER_CONFLICT_MARKER, DEFAULT_CONFLICT_MARKER_SIZE, REMOTE);
|
|
19
|
+
static separatorMarker = buildSeparator(DEFAULT_CONFLICT_MARKER_SIZE);
|
|
5
20
|
static hasConflictMarker() {
|
|
6
21
|
return ConflictMarker.hasConflict;
|
|
7
22
|
}
|
|
8
|
-
static addConflictMarkers(acc,
|
|
23
|
+
static addConflictMarkers(acc, local, ancestor, other) {
|
|
9
24
|
ConflictMarker.hasConflict = true;
|
|
10
|
-
acc.push({ [TEXT_TAG]: `${
|
|
11
|
-
acc.push(isEmpty(
|
|
12
|
-
acc.push({ [TEXT_TAG]:
|
|
13
|
-
acc.push(isEmpty(ancestor) ? { [TEXT_TAG]:
|
|
14
|
-
acc.push({ [TEXT_TAG]:
|
|
15
|
-
acc.push(isEmpty(
|
|
16
|
-
acc.push({ [TEXT_TAG]:
|
|
25
|
+
acc.push({ [TEXT_TAG]: `${EOL}${ConflictMarker.localMarker}` });
|
|
26
|
+
acc.push(isEmpty(local) ? { [TEXT_TAG]: EOL } : local);
|
|
27
|
+
acc.push({ [TEXT_TAG]: ConflictMarker.baseMarker });
|
|
28
|
+
acc.push(isEmpty(ancestor) ? { [TEXT_TAG]: EOL } : ancestor);
|
|
29
|
+
acc.push({ [TEXT_TAG]: ConflictMarker.separatorMarker });
|
|
30
|
+
acc.push(isEmpty(other) ? { [TEXT_TAG]: EOL } : other);
|
|
31
|
+
acc.push({ [TEXT_TAG]: ConflictMarker.otherMarker });
|
|
32
|
+
}
|
|
33
|
+
static setConflictConfig(conflictConfig) {
|
|
34
|
+
ConflictMarker.baseMarker = buildMarker(conflictConfig.ancestorConflictMarker, conflictConfig.conflictMarkerSize, BASE);
|
|
35
|
+
ConflictMarker.localMarker = buildMarker(conflictConfig.localConflictMarker, conflictConfig.conflictMarkerSize, LOCAL);
|
|
36
|
+
ConflictMarker.otherMarker = buildMarker(conflictConfig.otherConflictMarker, conflictConfig.conflictMarkerSize, REMOTE);
|
|
37
|
+
ConflictMarker.separatorMarker = buildSeparator(conflictConfig.conflictMarkerSize);
|
|
17
38
|
}
|
|
18
39
|
}
|
|
19
40
|
//# sourceMappingURL=conflictMarker.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conflictMarker.js","sourceRoot":"","sources":["../../src/merger/conflictMarker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EACL,IAAI,
|
|
1
|
+
{"version":3,"file":"conflictMarker.js","sourceRoot":"","sources":["../../src/merger/conflictMarker.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { JsonArray, JsonObject, JsonValue } from '../types/jsonTypes.js';
|
|
2
2
|
export declare const generateObj: (value: JsonValue | null, attrib: string) => JsonObject;
|
|
3
|
-
export declare const mergeTextAttribute: (ancestor: JsonValue | null,
|
|
3
|
+
export declare const mergeTextAttribute: (ancestor: JsonValue | null, local: JsonValue | null, other: JsonValue | null, attrib: string) => JsonArray;
|
|
@@ -1,53 +1,53 @@
|
|
|
1
1
|
import { deepEqual } from 'fast-equals';
|
|
2
2
|
import { isNil } from 'lodash-es';
|
|
3
|
-
import { TEXT_TAG } from '../constant/
|
|
3
|
+
import { TEXT_TAG } from '../constant/parserConstant.js';
|
|
4
4
|
import { MergeScenario, getScenario } from '../types/mergeScenario.js';
|
|
5
5
|
import { ConflictMarker } from './conflictMarker.js';
|
|
6
6
|
export const generateObj = (value, attrib) => {
|
|
7
7
|
return isNil(value) ? {} : { [attrib]: [{ [TEXT_TAG]: value }] };
|
|
8
8
|
};
|
|
9
|
-
export const mergeTextAttribute = (ancestor,
|
|
9
|
+
export const mergeTextAttribute = (ancestor, local, other, attrib) => {
|
|
10
10
|
const objAnc = generateObj(ancestor, attrib);
|
|
11
|
-
const
|
|
12
|
-
const
|
|
13
|
-
const scenario = getScenario(objAnc,
|
|
11
|
+
const objlocal = generateObj(local, attrib);
|
|
12
|
+
const objother = generateObj(other, attrib);
|
|
13
|
+
const scenario = getScenario(objAnc, objlocal, objother);
|
|
14
14
|
const acc = [];
|
|
15
15
|
// Early return for identical values
|
|
16
|
-
if (deepEqual(
|
|
17
|
-
(scenario === MergeScenario.
|
|
16
|
+
if (deepEqual(local, other) &&
|
|
17
|
+
(scenario === MergeScenario.LOCAL_AND_OTHER ||
|
|
18
18
|
scenario === MergeScenario.ALL)) {
|
|
19
|
-
return [
|
|
19
|
+
return [objlocal];
|
|
20
20
|
}
|
|
21
21
|
// Handle specific merge scenarios
|
|
22
22
|
switch (scenario) {
|
|
23
|
-
case MergeScenario.
|
|
24
|
-
acc.push(
|
|
23
|
+
case MergeScenario.OTHER_ONLY:
|
|
24
|
+
acc.push(objother);
|
|
25
25
|
break;
|
|
26
|
-
case MergeScenario.
|
|
27
|
-
acc.push(
|
|
26
|
+
case MergeScenario.LOCAL_ONLY:
|
|
27
|
+
acc.push(objlocal);
|
|
28
28
|
break;
|
|
29
|
-
case MergeScenario.
|
|
30
|
-
ConflictMarker.addConflictMarkers(acc,
|
|
29
|
+
case MergeScenario.LOCAL_AND_OTHER:
|
|
30
|
+
ConflictMarker.addConflictMarkers(acc, objlocal, {}, objother);
|
|
31
31
|
break;
|
|
32
|
-
case MergeScenario.
|
|
33
|
-
if (ancestor !==
|
|
34
|
-
ConflictMarker.addConflictMarkers(acc, {}, objAnc,
|
|
32
|
+
case MergeScenario.ANCESTOR_AND_OTHER:
|
|
33
|
+
if (ancestor !== other) {
|
|
34
|
+
ConflictMarker.addConflictMarkers(acc, {}, objAnc, objother);
|
|
35
35
|
}
|
|
36
36
|
break;
|
|
37
|
-
case MergeScenario.
|
|
38
|
-
if (ancestor !==
|
|
39
|
-
ConflictMarker.addConflictMarkers(acc,
|
|
37
|
+
case MergeScenario.ANCESTOR_AND_LOCAL:
|
|
38
|
+
if (ancestor !== local) {
|
|
39
|
+
ConflictMarker.addConflictMarkers(acc, objlocal, objAnc, {});
|
|
40
40
|
}
|
|
41
41
|
break;
|
|
42
42
|
case MergeScenario.ALL:
|
|
43
|
-
if (ancestor ===
|
|
44
|
-
acc.push(
|
|
43
|
+
if (ancestor === local) {
|
|
44
|
+
acc.push(objother);
|
|
45
45
|
}
|
|
46
|
-
else if (ancestor ===
|
|
47
|
-
acc.push(
|
|
46
|
+
else if (ancestor === other) {
|
|
47
|
+
acc.push(objlocal);
|
|
48
48
|
}
|
|
49
49
|
else {
|
|
50
|
-
ConflictMarker.addConflictMarkers(acc,
|
|
50
|
+
ConflictMarker.addConflictMarkers(acc, objlocal, objAnc, objother);
|
|
51
51
|
}
|
|
52
52
|
break;
|
|
53
53
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"textAttribute.js","sourceRoot":"","sources":["../../src/merger/textAttribute.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAA;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"textAttribute.js","sourceRoot":"","sources":["../../src/merger/textAttribute.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAA;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAA;AAExD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAEpD,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,KAAuB,EACvB,MAAc,EACF,EAAE;IACd,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAA;AAClE,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,QAA0B,EAC1B,KAAuB,EACvB,KAAuB,EACvB,MAAc,EACH,EAAE;IACb,MAAM,MAAM,GAAe,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;IACxD,MAAM,QAAQ,GAAe,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;IACvD,MAAM,QAAQ,GAAe,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;IACvD,MAAM,QAAQ,GAAkB,WAAW,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAA;IACvE,MAAM,GAAG,GAAc,EAAE,CAAA;IAEzB,oCAAoC;IACpC,IACE,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC;QACvB,CAAC,QAAQ,KAAK,aAAa,CAAC,eAAe;YACzC,QAAQ,KAAK,aAAa,CAAC,GAAG,CAAC,EACjC,CAAC;QACD,OAAO,CAAC,QAAQ,CAAC,CAAA;IACnB,CAAC;IAED,kCAAkC;IAClC,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,aAAa,CAAC,UAAU;YAC3B,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YAClB,MAAK;QAEP,KAAK,aAAa,CAAC,UAAU;YAC3B,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YAClB,MAAK;QAEP,KAAK,aAAa,CAAC,eAAe;YAChC,cAAc,CAAC,kBAAkB,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAA;YAC9D,MAAK;QAEP,KAAK,aAAa,CAAC,kBAAkB;YACnC,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;gBACvB,cAAc,CAAC,kBAAkB,CAAC,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAA;YAC9D,CAAC;YACD,MAAK;QAEP,KAAK,aAAa,CAAC,kBAAkB;YACnC,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;gBACvB,cAAc,CAAC,kBAAkB,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,CAAC,CAAA;YAC9D,CAAC;YACD,MAAK;QAEP,KAAK,aAAa,CAAC,GAAG;YACpB,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;gBACvB,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YACpB,CAAC;iBAAM,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;gBAC9B,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YACpB,CAAC;iBAAM,CAAC;gBACN,cAAc,CAAC,kBAAkB,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAA;YACpE,CAAC;YACD,MAAK;IACT,CAAC;IAED,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { JsonArray, JsonObject } from '../types/jsonTypes.js';
|
|
2
2
|
export declare class NamespaceHandler {
|
|
3
|
-
processNamespaces(ancestor: JsonObject | JsonArray,
|
|
3
|
+
processNamespaces(ancestor: JsonObject | JsonArray, local: JsonObject | JsonArray, other: JsonObject | JsonArray): JsonObject;
|
|
4
4
|
addNamespacesToResult(acc: JsonArray, namespaces: JsonObject): void;
|
|
5
5
|
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
const NAMESPACE_PREFIX = '@_';
|
|
2
2
|
const NAMESPACE_ROOT = ':@';
|
|
3
3
|
export class NamespaceHandler {
|
|
4
|
-
processNamespaces(ancestor,
|
|
4
|
+
processNamespaces(ancestor, local, other) {
|
|
5
5
|
const namespaces = {};
|
|
6
6
|
// Look for namespace attributes directly at the root level
|
|
7
|
-
for (const obj of [ancestor,
|
|
7
|
+
for (const obj of [ancestor, local, other]) {
|
|
8
8
|
for (const key of Object.keys(obj)) {
|
|
9
9
|
// It's an object, check for namespace attributes and remove them
|
|
10
10
|
const childObj = obj[key];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NamespaceHandler.js","sourceRoot":"","sources":["../../src/service/NamespaceHandler.ts"],"names":[],"mappings":"AAEA,MAAM,gBAAgB,GAAG,IAAI,CAAA;AAC7B,MAAM,cAAc,GAAG,IAAI,CAAA;AAE3B,MAAM,OAAO,gBAAgB;IACpB,iBAAiB,CACtB,QAAgC,EAChC,
|
|
1
|
+
{"version":3,"file":"NamespaceHandler.js","sourceRoot":"","sources":["../../src/service/NamespaceHandler.ts"],"names":[],"mappings":"AAEA,MAAM,gBAAgB,GAAG,IAAI,CAAA;AAC7B,MAAM,cAAc,GAAG,IAAI,CAAA;AAE3B,MAAM,OAAO,gBAAgB;IACpB,iBAAiB,CACtB,QAAgC,EAChC,KAA6B,EAC7B,KAA6B;QAE7B,MAAM,UAAU,GAAe,EAAE,CAAA;QAEjC,2DAA2D;QAC3D,KAAK,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC;YAC3C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBACnC,iEAAiE;gBACjE,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAe,CAAA;gBACvC,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC7C,IAAI,QAAQ,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;wBAC1C,UAAU,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAA;wBACzC,OAAO,QAAQ,CAAC,QAAQ,CAAC,CAAA,CAAC,8CAA8C;oBAC1E,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,UAAU,CAAA;IACnB,CAAC;IAEM,qBAAqB,CAAC,GAAc,EAAE,UAAsB;QACjE,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzD,iCAAiC;YACjC,MAAM,UAAU,GAAG,GAAG,CAAC,CAAC,CAAe,CAAA;YAEvC,yDAAyD;YACzD,UAAU,CAAC,cAAc,CAAC,GAAG,EAAE,CAAA;YAE/B,0DAA0D;YAC1D,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC1C,CAAC;gBAAC,UAAU,CAAC,cAAc,CAAgB,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAA;YACpE,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
|
|
@@ -6,7 +6,7 @@ export class InstallService {
|
|
|
6
6
|
async installMergeDriver() {
|
|
7
7
|
const git = simpleGit();
|
|
8
8
|
await git.addConfig(`merge.${DRIVER_NAME}.name`, 'Salesforce source merge driver');
|
|
9
|
-
await git.addConfig(`merge.${DRIVER_NAME}.driver`, `${RUN_PLUGIN_COMMAND}
|
|
9
|
+
await git.addConfig(`merge.${DRIVER_NAME}.driver`, `${RUN_PLUGIN_COMMAND} -O %O -A %A -B %B -P %P -L %L -X %X -Y %Y`);
|
|
10
10
|
await git.addConfig(`merge.${DRIVER_NAME}.recursive`, 'true');
|
|
11
11
|
// Configure merge driver for each metadata type pattern
|
|
12
12
|
const patterns = METADATA_TYPES_PATTERNS.map(pattern => `*.${pattern}.xml merge=${DRIVER_NAME}`).join('\n');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"installService.js","sourceRoot":"","sources":["../../src/service/installService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AACtC,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAA;AAC/E,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAA;AAEzE,MAAM,OAAO,cAAc;IAClB,KAAK,CAAC,kBAAkB;QAC7B,MAAM,GAAG,GAAG,SAAS,EAAE,CAAA;QACvB,MAAM,GAAG,CAAC,SAAS,CACjB,SAAS,WAAW,OAAO,EAC3B,gCAAgC,CACjC,CAAA;QACD,MAAM,GAAG,CAAC,SAAS,CACjB,SAAS,WAAW,SAAS,EAC7B,GAAG,kBAAkB,
|
|
1
|
+
{"version":3,"file":"installService.js","sourceRoot":"","sources":["../../src/service/installService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AACtC,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAA;AAC/E,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAA;AAEzE,MAAM,OAAO,cAAc;IAClB,KAAK,CAAC,kBAAkB;QAC7B,MAAM,GAAG,GAAG,SAAS,EAAE,CAAA;QACvB,MAAM,GAAG,CAAC,SAAS,CACjB,SAAS,WAAW,OAAO,EAC3B,gCAAgC,CACjC,CAAA;QACD,MAAM,GAAG,CAAC,SAAS,CACjB,SAAS,WAAW,SAAS,EAC7B,GAAG,kBAAkB,4CAA4C,CAClE,CAAA;QACD,MAAM,GAAG,CAAC,SAAS,CAAC,SAAS,WAAW,YAAY,EAAE,MAAM,CAAC,CAAA;QAE7D,wDAAwD;QACxD,MAAM,QAAQ,GAAG,uBAAuB,CAAC,GAAG,CAC1C,OAAO,CAAC,EAAE,CAAC,KAAK,OAAO,cAAc,WAAW,EAAE,CACnD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACZ,MAAM,OAAO,GAAG,GAAG,QAAQ,IAAI,CAAA;QAE/B,MAAM,UAAU,CAAC,gBAAgB,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAA;IAC5D,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conflictTypes.js","sourceRoot":"","sources":["../../src/types/conflictTypes.ts"],"names":[],"mappings":""}
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Enum representing different merge scenarios based on content presence:
|
|
3
3
|
* - First position: Ancestor content present (1) or absent (0)
|
|
4
|
-
* - Second position:
|
|
5
|
-
* - Third position:
|
|
4
|
+
* - Second position: local content present (1) or absent (0)
|
|
5
|
+
* - Third position: other content present (1) or absent (0)
|
|
6
6
|
*/
|
|
7
7
|
export declare enum MergeScenario {
|
|
8
8
|
NONE = 0,// No content in any source
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
OTHER_ONLY = 1,// Only other has content (001)
|
|
10
|
+
LOCAL_ONLY = 10,// Only local has content (010)
|
|
11
|
+
LOCAL_AND_OTHER = 11,// Both local and other have content, no ancestor (011)
|
|
12
12
|
ANCESTOR_ONLY = 100,// Only ancestor has content (100)
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
ANCESTOR_AND_OTHER = 101,// Ancestor and other have content, no local (101)
|
|
14
|
+
ANCESTOR_AND_LOCAL = 110,// Ancestor and local have content, no other (110)
|
|
15
15
|
ALL = 111
|
|
16
16
|
}
|
|
17
|
-
export declare const getScenario: (ancestor: any,
|
|
17
|
+
export declare const getScenario: (ancestor: any, local: any, other: any) => MergeScenario;
|
|
@@ -2,35 +2,35 @@ import { isEmpty } from 'lodash-es';
|
|
|
2
2
|
/**
|
|
3
3
|
* Enum representing different merge scenarios based on content presence:
|
|
4
4
|
* - First position: Ancestor content present (1) or absent (0)
|
|
5
|
-
* - Second position:
|
|
6
|
-
* - Third position:
|
|
5
|
+
* - Second position: local content present (1) or absent (0)
|
|
6
|
+
* - Third position: other content present (1) or absent (0)
|
|
7
7
|
*/
|
|
8
8
|
export var MergeScenario;
|
|
9
9
|
(function (MergeScenario) {
|
|
10
10
|
MergeScenario[MergeScenario["NONE"] = 0] = "NONE";
|
|
11
|
-
MergeScenario[MergeScenario["
|
|
12
|
-
MergeScenario[MergeScenario["
|
|
13
|
-
MergeScenario[MergeScenario["
|
|
11
|
+
MergeScenario[MergeScenario["OTHER_ONLY"] = 1] = "OTHER_ONLY";
|
|
12
|
+
MergeScenario[MergeScenario["LOCAL_ONLY"] = 10] = "LOCAL_ONLY";
|
|
13
|
+
MergeScenario[MergeScenario["LOCAL_AND_OTHER"] = 11] = "LOCAL_AND_OTHER";
|
|
14
14
|
MergeScenario[MergeScenario["ANCESTOR_ONLY"] = 100] = "ANCESTOR_ONLY";
|
|
15
|
-
MergeScenario[MergeScenario["
|
|
16
|
-
MergeScenario[MergeScenario["
|
|
15
|
+
MergeScenario[MergeScenario["ANCESTOR_AND_OTHER"] = 101] = "ANCESTOR_AND_OTHER";
|
|
16
|
+
MergeScenario[MergeScenario["ANCESTOR_AND_LOCAL"] = 110] = "ANCESTOR_AND_LOCAL";
|
|
17
17
|
MergeScenario[MergeScenario["ALL"] = 111] = "ALL";
|
|
18
18
|
})(MergeScenario || (MergeScenario = {}));
|
|
19
19
|
export const getScenario = (
|
|
20
20
|
// biome-ignore lint/suspicious/noExplicitAny: <explanation>
|
|
21
21
|
ancestor,
|
|
22
22
|
// biome-ignore lint/suspicious/noExplicitAny: <explanation>
|
|
23
|
-
|
|
23
|
+
local,
|
|
24
24
|
// biome-ignore lint/suspicious/noExplicitAny: <explanation>
|
|
25
|
-
|
|
25
|
+
other) => {
|
|
26
26
|
let scenario = MergeScenario.NONE;
|
|
27
27
|
if (!isEmpty(ancestor)) {
|
|
28
28
|
scenario += 100;
|
|
29
29
|
}
|
|
30
|
-
if (!isEmpty(
|
|
30
|
+
if (!isEmpty(local)) {
|
|
31
31
|
scenario += 10;
|
|
32
32
|
}
|
|
33
|
-
if (!isEmpty(
|
|
33
|
+
if (!isEmpty(other)) {
|
|
34
34
|
scenario += 1;
|
|
35
35
|
}
|
|
36
36
|
return scenario;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mergeScenario.js","sourceRoot":"","sources":["../../src/types/mergeScenario.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC;;;;;GAKG;AACH,MAAM,CAAN,IAAY,aASX;AATD,WAAY,aAAa;IACvB,iDAAQ,CAAA;IACR
|
|
1
|
+
{"version":3,"file":"mergeScenario.js","sourceRoot":"","sources":["../../src/types/mergeScenario.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC;;;;;GAKG;AACH,MAAM,CAAN,IAAY,aASX;AATD,WAAY,aAAa;IACvB,iDAAQ,CAAA;IACR,6DAAc,CAAA;IACd,8DAAe,CAAA;IACf,wEAAoB,CAAA;IACpB,qEAAmB,CAAA;IACnB,+EAAwB,CAAA;IACxB,+EAAwB,CAAA;IACxB,iDAAS,CAAA;AACX,CAAC,EATW,aAAa,KAAb,aAAa,QASxB;AAED,MAAM,CAAC,MAAM,WAAW,GAAG;AACzB,4DAA4D;AAC5D,QAAa;AACb,4DAA4D;AAC5D,KAAU;AACV,4DAA4D;AAC5D,KAAU,EACK,EAAE;IACjB,IAAI,QAAQ,GAAkB,aAAa,CAAC,IAAI,CAAA;IAChD,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvB,QAAQ,IAAI,GAAG,CAAA;IACjB,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACpB,QAAQ,IAAI,EAAE,CAAA;IAChB,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACpB,QAAQ,IAAI,CAAC,CAAA;IACf,CAAC;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import type { JsonArray, JsonObject, JsonValue } from '../types/jsonTypes.js';
|
|
2
|
-
export declare const isObject: (ancestor: JsonValue | undefined | null,
|
|
2
|
+
export declare const isObject: (ancestor: JsonValue | undefined | null, local: JsonValue | undefined | null, other: JsonValue | undefined | null) => boolean;
|
|
3
3
|
export declare const ensureArray: (value: JsonValue) => JsonArray;
|
|
4
4
|
export declare const getUniqueSortedProps: (...objects: (JsonObject | JsonArray)[]) => string[];
|
package/lib/utils/mergeUtils.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { castArray, isNil } from 'lodash-es';
|
|
2
|
-
export const isObject = (ancestor,
|
|
2
|
+
export const isObject = (ancestor, local, other) => typeof [ancestor, other, local].find(ele => !isNil(ele)) === 'object';
|
|
3
3
|
export const ensureArray = (value) => isNil(value) ? [] : castArray(value);
|
|
4
4
|
export const getUniqueSortedProps = (...objects) => Array.from(new Set([...objects].map(Object.keys).flat())).sort();
|
|
5
5
|
//# sourceMappingURL=mergeUtils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mergeUtils.js","sourceRoot":"","sources":["../../src/utils/mergeUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,WAAW,CAAA;AAG5C,MAAM,CAAC,MAAM,QAAQ,GAAG,CACtB,QAAsC,EACtC,
|
|
1
|
+
{"version":3,"file":"mergeUtils.js","sourceRoot":"","sources":["../../src/utils/mergeUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,WAAW,CAAA;AAG5C,MAAM,CAAC,MAAM,QAAQ,GAAG,CACtB,QAAsC,EACtC,KAAmC,EACnC,KAAmC,EAC1B,EAAE,CACX,OAAO,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,QAAQ,CAAA;AAEvE,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAgB,EAAa,EAAE,CACzD,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAE,SAAS,CAAC,KAAK,CAAe,CAAA;AAErD,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,GAAG,OAAmC,EAC5B,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA"}
|
package/messages/run.md
CHANGED
|
@@ -10,23 +10,23 @@ Runs the merge driver for the specified files, handling the merge conflict resol
|
|
|
10
10
|
|
|
11
11
|
- Run the merge driver for conflicting files:
|
|
12
12
|
|
|
13
|
-
<%= config.bin %> <%= command.id %> --ancestor-file=<value> --
|
|
13
|
+
<%= config.bin %> <%= command.id %> --ancestor-file=<value> --local-file=<value> --other-file=<value> --output-file=<value>
|
|
14
14
|
|
|
15
15
|
- Where:
|
|
16
16
|
- ancestor-file is the path to the common ancestor version of the file
|
|
17
|
-
-
|
|
18
|
-
-
|
|
17
|
+
- local-file is the path to our version of the file
|
|
18
|
+
- other-file is the path to their version of the file
|
|
19
19
|
- output-file is the path to the file where the merged content will be written
|
|
20
20
|
|
|
21
21
|
# flags.ancestor-file.summary
|
|
22
22
|
|
|
23
23
|
path to the common ancestor version of the file
|
|
24
24
|
|
|
25
|
-
# flags.
|
|
25
|
+
# flags.local-file.summary
|
|
26
26
|
|
|
27
27
|
path to our version of the file
|
|
28
28
|
|
|
29
|
-
# flags.
|
|
29
|
+
# flags.other-file.summary
|
|
30
30
|
|
|
31
31
|
path to their version of the file
|
|
32
32
|
|
|
@@ -34,6 +34,18 @@ path to their version of the file
|
|
|
34
34
|
|
|
35
35
|
path to the file where the merged content will be written
|
|
36
36
|
|
|
37
|
+
# flags.conflict-marker-size.summary
|
|
38
|
+
number of characters to show for conflict markers
|
|
39
|
+
|
|
40
|
+
# flags.ancestor-conflict-marker.summary
|
|
41
|
+
character used to delimit ancestor version in conflicts
|
|
42
|
+
|
|
43
|
+
# flags.local-conflict-marker.summary
|
|
44
|
+
character used to delimit local version in conflicts
|
|
45
|
+
|
|
46
|
+
# flags.other-conflict-marker.summary
|
|
47
|
+
character used to delimit other version in conflicts
|
|
48
|
+
|
|
37
49
|
# result.withconflict
|
|
38
50
|
|
|
39
51
|
There are conflicts for file
|
|
@@ -41,4 +53,3 @@ There are conflicts for file
|
|
|
41
53
|
# result.successful
|
|
42
54
|
|
|
43
55
|
Successfully merged file
|
|
44
|
-
|
package/npm-shrinkwrap.json
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sf-git-merge-driver",
|
|
3
|
-
"version": "1.0.0-dev-3.
|
|
3
|
+
"version": "1.0.0-dev-3.14242356173-1",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "sf-git-merge-driver",
|
|
9
|
-
"version": "1.0.0-dev-3.
|
|
9
|
+
"version": "1.0.0-dev-3.14242356173-1",
|
|
10
10
|
"license": "MIT",
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"@oclif/core": "^4.2.10",
|
|
13
13
|
"@salesforce/core": "^8.8.7",
|
|
14
14
|
"@salesforce/sf-plugins-core": "^12.2.1",
|
|
15
15
|
"fast-equals": "^5.2.2",
|
|
16
|
-
"fast-xml-parser": "^5.
|
|
16
|
+
"fast-xml-parser": "^5.2.0",
|
|
17
17
|
"lodash-es": "^4.17.21",
|
|
18
18
|
"simple-git": "^3.27.0"
|
|
19
19
|
},
|
|
@@ -6991,9 +6991,9 @@
|
|
|
6991
6991
|
"license": "BSD-3-Clause"
|
|
6992
6992
|
},
|
|
6993
6993
|
"node_modules/fast-xml-parser": {
|
|
6994
|
-
"version": "5.
|
|
6995
|
-
"resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.
|
|
6996
|
-
"integrity": "sha512-
|
|
6994
|
+
"version": "5.2.0",
|
|
6995
|
+
"resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.0.tgz",
|
|
6996
|
+
"integrity": "sha512-Uw9+Mjt4SBRud1IcaYuW/O0lW8SKKdMl5g7g24HiIuyH5fQSD+AVLybSlJtqLYEbytVFjWQa5DMGcNgeksdRBg==",
|
|
6997
6997
|
"funding": [
|
|
6998
6998
|
{
|
|
6999
6999
|
"type": "github",
|
package/oclif.manifest.json
CHANGED
|
@@ -75,8 +75,8 @@
|
|
|
75
75
|
"args": {},
|
|
76
76
|
"description": "Runs the merge driver for the specified files, handling the merge conflict resolution using Salesforce-specific merge strategies. This command is typically called automatically by Git when a merge conflict is detected.",
|
|
77
77
|
"examples": [
|
|
78
|
-
"Run the merge driver for conflicting files:\n<%= config.bin %> <%= command.id %> --ancestor-file=<value> --
|
|
79
|
-
"Where:\n- ancestor-file is the path to the common ancestor version of the file\n-
|
|
78
|
+
"Run the merge driver for conflicting files:\n<%= config.bin %> <%= command.id %> --ancestor-file=<value> --local-file=<value> --other-file=<value> --output-file=<value>",
|
|
79
|
+
"Where:\n- ancestor-file is the path to the common ancestor version of the file\n- local-file is the path to our version of the file\n- other-file is the path to their version of the file\n- output-file is the path to the file where the merged content will be written"
|
|
80
80
|
],
|
|
81
81
|
"flags": {
|
|
82
82
|
"json": {
|
|
@@ -95,7 +95,7 @@
|
|
|
95
95
|
"type": "option"
|
|
96
96
|
},
|
|
97
97
|
"ancestor-file": {
|
|
98
|
-
"char": "
|
|
98
|
+
"char": "O",
|
|
99
99
|
"name": "ancestor-file",
|
|
100
100
|
"required": true,
|
|
101
101
|
"summary": "path to the common ancestor version of the file",
|
|
@@ -103,18 +103,18 @@
|
|
|
103
103
|
"multiple": false,
|
|
104
104
|
"type": "option"
|
|
105
105
|
},
|
|
106
|
-
"
|
|
107
|
-
"char": "
|
|
108
|
-
"name": "
|
|
106
|
+
"local-file": {
|
|
107
|
+
"char": "A",
|
|
108
|
+
"name": "local-file",
|
|
109
109
|
"required": true,
|
|
110
110
|
"summary": "path to our version of the file",
|
|
111
111
|
"hasDynamicHelp": false,
|
|
112
112
|
"multiple": false,
|
|
113
113
|
"type": "option"
|
|
114
114
|
},
|
|
115
|
-
"
|
|
116
|
-
"char": "
|
|
117
|
-
"name": "
|
|
115
|
+
"other-file": {
|
|
116
|
+
"char": "B",
|
|
117
|
+
"name": "other-file",
|
|
118
118
|
"required": true,
|
|
119
119
|
"summary": "path to their version of the file",
|
|
120
120
|
"hasDynamicHelp": false,
|
|
@@ -122,13 +122,49 @@
|
|
|
122
122
|
"type": "option"
|
|
123
123
|
},
|
|
124
124
|
"output-file": {
|
|
125
|
-
"char": "
|
|
125
|
+
"char": "P",
|
|
126
126
|
"name": "output-file",
|
|
127
127
|
"required": true,
|
|
128
128
|
"summary": "path to the file where the merged content will be written",
|
|
129
129
|
"hasDynamicHelp": false,
|
|
130
130
|
"multiple": false,
|
|
131
131
|
"type": "option"
|
|
132
|
+
},
|
|
133
|
+
"conflict-marker-size": {
|
|
134
|
+
"char": "L",
|
|
135
|
+
"name": "conflict-marker-size",
|
|
136
|
+
"summary": "number of characters to show for conflict markers",
|
|
137
|
+
"default": 7,
|
|
138
|
+
"hasDynamicHelp": false,
|
|
139
|
+
"multiple": false,
|
|
140
|
+
"type": "option"
|
|
141
|
+
},
|
|
142
|
+
"ancestor-conflict-marker": {
|
|
143
|
+
"char": "S",
|
|
144
|
+
"name": "ancestor-conflict-marker",
|
|
145
|
+
"summary": "character used to delimit ancestor version in conflicts",
|
|
146
|
+
"default": "|",
|
|
147
|
+
"hasDynamicHelp": false,
|
|
148
|
+
"multiple": false,
|
|
149
|
+
"type": "option"
|
|
150
|
+
},
|
|
151
|
+
"local-conflict-marker": {
|
|
152
|
+
"char": "X",
|
|
153
|
+
"name": "local-conflict-marker",
|
|
154
|
+
"summary": "character used to delimit local version in conflicts",
|
|
155
|
+
"default": "<",
|
|
156
|
+
"hasDynamicHelp": false,
|
|
157
|
+
"multiple": false,
|
|
158
|
+
"type": "option"
|
|
159
|
+
},
|
|
160
|
+
"other-conflict-marker": {
|
|
161
|
+
"char": "Y",
|
|
162
|
+
"name": "other-conflict-marker",
|
|
163
|
+
"summary": "character used to delimit other version in conflicts",
|
|
164
|
+
"default": ">",
|
|
165
|
+
"hasDynamicHelp": false,
|
|
166
|
+
"multiple": false,
|
|
167
|
+
"type": "option"
|
|
132
168
|
}
|
|
133
169
|
},
|
|
134
170
|
"hasDynamicHelp": false,
|
|
@@ -248,5 +284,5 @@
|
|
|
248
284
|
]
|
|
249
285
|
}
|
|
250
286
|
},
|
|
251
|
-
"version": "1.0.0-dev-3.
|
|
287
|
+
"version": "1.0.0-dev-3.14242356173-1"
|
|
252
288
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sf-git-merge-driver",
|
|
3
3
|
"description": "git remote add origin git@github.com:scolladon/sf-git-merge-driver.git",
|
|
4
|
-
"version": "1.0.0-dev-3.
|
|
4
|
+
"version": "1.0.0-dev-3.14242356173-1",
|
|
5
5
|
"exports": "./lib/driver/MergeDriver.js",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"author": "Sébastien Colladon (colladonsebastien@gmail.com)",
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
"@salesforce/core": "^8.8.7",
|
|
15
15
|
"@salesforce/sf-plugins-core": "^12.2.1",
|
|
16
16
|
"fast-equals": "^5.2.2",
|
|
17
|
-
"fast-xml-parser": "^5.
|
|
17
|
+
"fast-xml-parser": "^5.2.0",
|
|
18
18
|
"lodash-es": "^4.17.21",
|
|
19
19
|
"simple-git": "^3.27.0"
|
|
20
20
|
},
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"conflicConstant.js","sourceRoot":"","sources":["../../src/constant/conflicConstant.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,IAAI,GAAG,cAAc,CAAA;AAClC,MAAM,CAAC,MAAM,KAAK,GAAG,eAAe,CAAA;AACpC,MAAM,CAAC,MAAM,OAAO,GAAG,IAAI,CAAA;AAC3B,MAAM,CAAC,MAAM,MAAM,GAAG,gBAAgB,CAAA;AACtC,MAAM,CAAC,MAAM,SAAS,GAAG,SAAS,CAAA;AAClC,MAAM,CAAC,MAAM,QAAQ,GAAG,OAAO,CAAA"}
|