@lix-js/sdk 0.6.0-preview.5 → 0.6.0
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 +76 -4
- package/dist/errors.d.ts +7 -0
- package/dist/errors.js +19 -0
- package/dist/index.d.ts +4 -5
- package/dist/index.js +3 -3
- package/dist/native.d.ts +1 -0
- package/dist/native.js +47 -0
- package/dist/open-lix.d.ts +38 -207
- package/dist/open-lix.js +59 -284
- package/dist/result.d.ts +18 -0
- package/dist/result.js +48 -0
- package/dist/types.d.ts +114 -1
- package/dist/value.d.ts +28 -0
- package/dist/value.js +245 -0
- package/package.json +38 -71
- package/SKILL.md +0 -507
- package/dist/builtin-schemas.d.ts +0 -1
- package/dist/builtin-schemas.js +0 -1
- package/dist/engine-wasm/index.d.ts +0 -87
- package/dist/engine-wasm/index.js +0 -339
- package/dist/engine-wasm/wasm/lix_engine.d.ts +0 -79
- package/dist/engine-wasm/wasm/lix_engine.js +0 -833
- package/dist/engine-wasm/wasm/lix_engine.wasm +0 -0
- package/dist/engine-wasm/wasm/lix_engine.wasm.d.ts +0 -27
- package/dist/generated/builtin-schemas.d.ts +0 -427
- package/dist/generated/builtin-schemas.js +0 -643
- package/dist/sqlite/index.d.ts +0 -12
- package/dist/sqlite/index.js +0 -359
- package/dist-engine-src/README.md +0 -18
- package/dist-engine-src/src/backend/capabilities.rs +0 -67
- package/dist-engine-src/src/backend/conformance/baseline.rs +0 -1127
- package/dist-engine-src/src/backend/conformance/factory.rs +0 -93
- package/dist-engine-src/src/backend/conformance/failure_tests.rs +0 -608
- package/dist-engine-src/src/backend/conformance/fixtures.rs +0 -26
- package/dist-engine-src/src/backend/conformance/mod.rs +0 -75
- package/dist-engine-src/src/backend/conformance/model.rs +0 -28
- package/dist-engine-src/src/backend/conformance/model_based.rs +0 -257
- package/dist-engine-src/src/backend/conformance/persistence.rs +0 -204
- package/dist-engine-src/src/backend/conformance/projection.rs +0 -21
- package/dist-engine-src/src/backend/conformance/pushdown.rs +0 -24
- package/dist-engine-src/src/backend/conformance/runner.rs +0 -90
- package/dist-engine-src/src/backend/conformance/scan.rs +0 -24
- package/dist-engine-src/src/backend/conformance/write.rs +0 -16
- package/dist-engine-src/src/backend/error.rs +0 -94
- package/dist-engine-src/src/backend/in_memory.rs +0 -670
- package/dist-engine-src/src/backend/mod.rs +0 -39
- package/dist-engine-src/src/backend/predicate.rs +0 -80
- package/dist-engine-src/src/backend/traits.rs +0 -260
- package/dist-engine-src/src/backend/types.rs +0 -239
- package/dist-engine-src/src/binary_cas/chunking.rs +0 -31
- package/dist-engine-src/src/binary_cas/codec.rs +0 -346
- package/dist-engine-src/src/binary_cas/context.rs +0 -139
- package/dist-engine-src/src/binary_cas/kv.rs +0 -1038
- package/dist-engine-src/src/binary_cas/mod.rs +0 -11
- package/dist-engine-src/src/binary_cas/types.rs +0 -121
- package/dist-engine-src/src/branch/context.rs +0 -40
- package/dist-engine-src/src/branch/lifecycle.rs +0 -221
- package/dist-engine-src/src/branch/mod.rs +0 -13
- package/dist-engine-src/src/branch/refs.rs +0 -321
- package/dist-engine-src/src/branch/stage_rows.rs +0 -67
- package/dist-engine-src/src/branch/types.rs +0 -21
- package/dist-engine-src/src/catalog/context.rs +0 -412
- package/dist-engine-src/src/catalog/mod.rs +0 -10
- package/dist-engine-src/src/catalog/schema.rs +0 -4
- package/dist-engine-src/src/catalog/snapshot.rs +0 -1114
- package/dist-engine-src/src/cel/context.rs +0 -86
- package/dist-engine-src/src/cel/error.rs +0 -19
- package/dist-engine-src/src/cel/mod.rs +0 -8
- package/dist-engine-src/src/cel/provider.rs +0 -9
- package/dist-engine-src/src/cel/runtime.rs +0 -167
- package/dist-engine-src/src/cel/value.rs +0 -50
- package/dist-engine-src/src/changelog/bench_support.rs +0 -785
- package/dist-engine-src/src/changelog/change.rs +0 -1
- package/dist-engine-src/src/changelog/codec.rs +0 -497
- package/dist-engine-src/src/changelog/commit.rs +0 -1
- package/dist-engine-src/src/changelog/context.rs +0 -1614
- package/dist-engine-src/src/changelog/mod.rs +0 -29
- package/dist-engine-src/src/changelog/store.rs +0 -163
- package/dist-engine-src/src/changelog/test_support.rs +0 -54
- package/dist-engine-src/src/changelog/types.rs +0 -213
- package/dist-engine-src/src/commit_graph/context.rs +0 -944
- package/dist-engine-src/src/commit_graph/mod.rs +0 -9
- package/dist-engine-src/src/commit_graph/types.rs +0 -89
- package/dist-engine-src/src/commit_graph/walker.rs +0 -786
- package/dist-engine-src/src/common/error.rs +0 -347
- package/dist-engine-src/src/common/fingerprint.rs +0 -3
- package/dist-engine-src/src/common/fs_path.rs +0 -1336
- package/dist-engine-src/src/common/identity.rs +0 -145
- package/dist-engine-src/src/common/json_pointer.rs +0 -67
- package/dist-engine-src/src/common/metadata.rs +0 -40
- package/dist-engine-src/src/common/mod.rs +0 -23
- package/dist-engine-src/src/common/types.rs +0 -105
- package/dist-engine-src/src/common/wire.rs +0 -222
- package/dist-engine-src/src/domain.rs +0 -320
- package/dist-engine-src/src/engine.rs +0 -203
- package/dist-engine-src/src/entity_pk.rs +0 -402
- package/dist-engine-src/src/functions/context.rs +0 -296
- package/dist-engine-src/src/functions/deterministic.rs +0 -113
- package/dist-engine-src/src/functions/mod.rs +0 -18
- package/dist-engine-src/src/functions/provider.rs +0 -130
- package/dist-engine-src/src/functions/state.rs +0 -335
- package/dist-engine-src/src/functions/types.rs +0 -37
- package/dist-engine-src/src/init.rs +0 -692
- package/dist-engine-src/src/json_store/compression.rs +0 -77
- package/dist-engine-src/src/json_store/context.rs +0 -172
- package/dist-engine-src/src/json_store/encoded.rs +0 -15
- package/dist-engine-src/src/json_store/mod.rs +0 -38
- package/dist-engine-src/src/json_store/store.rs +0 -494
- package/dist-engine-src/src/json_store/types.rs +0 -212
- package/dist-engine-src/src/lib.rs +0 -92
- package/dist-engine-src/src/live_state/context.rs +0 -1883
- package/dist-engine-src/src/live_state/mod.rs +0 -21
- package/dist-engine-src/src/live_state/overlay.rs +0 -75
- package/dist-engine-src/src/live_state/reader.rs +0 -23
- package/dist-engine-src/src/live_state/types.rs +0 -231
- package/dist-engine-src/src/live_state/visibility.rs +0 -666
- package/dist-engine-src/src/plugin/archive.rs +0 -438
- package/dist-engine-src/src/plugin/component.rs +0 -183
- package/dist-engine-src/src/plugin/install.rs +0 -619
- package/dist-engine-src/src/plugin/manifest.rs +0 -516
- package/dist-engine-src/src/plugin/materializer.rs +0 -202
- package/dist-engine-src/src/plugin/mod.rs +0 -33
- package/dist-engine-src/src/plugin/plugin_manifest.json +0 -119
- package/dist-engine-src/src/plugin/storage.rs +0 -74
- package/dist-engine-src/src/schema/annotations/defaults.rs +0 -275
- package/dist-engine-src/src/schema/annotations/mod.rs +0 -1
- package/dist-engine-src/src/schema/builtin/lix_account.json +0 -21
- package/dist-engine-src/src/schema/builtin/lix_active_account.json +0 -29
- package/dist-engine-src/src/schema/builtin/lix_binary_blob_ref.json +0 -29
- package/dist-engine-src/src/schema/builtin/lix_branch_descriptor.json +0 -34
- package/dist-engine-src/src/schema/builtin/lix_branch_ref.json +0 -48
- package/dist-engine-src/src/schema/builtin/lix_change.json +0 -63
- package/dist-engine-src/src/schema/builtin/lix_change_author.json +0 -45
- package/dist-engine-src/src/schema/builtin/lix_commit.json +0 -24
- package/dist-engine-src/src/schema/builtin/lix_commit_edge.json +0 -53
- package/dist-engine-src/src/schema/builtin/lix_directory_descriptor.json +0 -52
- package/dist-engine-src/src/schema/builtin/lix_file_descriptor.json +0 -52
- package/dist-engine-src/src/schema/builtin/lix_key_value.json +0 -40
- package/dist-engine-src/src/schema/builtin/lix_label.json +0 -29
- package/dist-engine-src/src/schema/builtin/lix_label_assignment.json +0 -74
- package/dist-engine-src/src/schema/builtin/lix_registered_schema.json +0 -25
- package/dist-engine-src/src/schema/builtin/mod.rs +0 -220
- package/dist-engine-src/src/schema/compatibility.rs +0 -787
- package/dist-engine-src/src/schema/definition.json +0 -187
- package/dist-engine-src/src/schema/definition.rs +0 -742
- package/dist-engine-src/src/schema/key.rs +0 -138
- package/dist-engine-src/src/schema/mod.rs +0 -20
- package/dist-engine-src/src/schema/seed.rs +0 -14
- package/dist-engine-src/src/schema/tests.rs +0 -780
- package/dist-engine-src/src/session/context.rs +0 -1059
- package/dist-engine-src/src/session/create_branch.rs +0 -94
- package/dist-engine-src/src/session/execute.rs +0 -681
- package/dist-engine-src/src/session/merge/analysis.rs +0 -108
- package/dist-engine-src/src/session/merge/branch.rs +0 -417
- package/dist-engine-src/src/session/merge/conflicts.rs +0 -63
- package/dist-engine-src/src/session/merge/mod.rs +0 -10
- package/dist-engine-src/src/session/merge/stats.rs +0 -61
- package/dist-engine-src/src/session/mod.rs +0 -30
- package/dist-engine-src/src/session/switch_branch.rs +0 -113
- package/dist-engine-src/src/session/transaction.rs +0 -557
- package/dist-engine-src/src/sql2/bind/classify.rs +0 -102
- package/dist-engine-src/src/sql2/bind/error.rs +0 -5
- package/dist-engine-src/src/sql2/bind/expr.rs +0 -29
- package/dist-engine-src/src/sql2/bind/mod.rs +0 -12
- package/dist-engine-src/src/sql2/bind/public_udf.rs +0 -306
- package/dist-engine-src/src/sql2/bind/read.rs +0 -65
- package/dist-engine-src/src/sql2/bind/statement.rs +0 -2236
- package/dist-engine-src/src/sql2/bind/table.rs +0 -273
- package/dist-engine-src/src/sql2/bind/write.rs +0 -86
- package/dist-engine-src/src/sql2/branch_scope.rs +0 -436
- package/dist-engine-src/src/sql2/catalog/capability.rs +0 -20
- package/dist-engine-src/src/sql2/catalog/entity_surface.rs +0 -296
- package/dist-engine-src/src/sql2/catalog/mod.rs +0 -15
- package/dist-engine-src/src/sql2/catalog/registry.rs +0 -556
- package/dist-engine-src/src/sql2/catalog/schema.rs +0 -88
- package/dist-engine-src/src/sql2/catalog/surface.rs +0 -41
- package/dist-engine-src/src/sql2/change_materialization.rs +0 -122
- package/dist-engine-src/src/sql2/context.rs +0 -317
- package/dist-engine-src/src/sql2/dml.rs +0 -148
- package/dist-engine-src/src/sql2/error.rs +0 -215
- package/dist-engine-src/src/sql2/exec/bound_public_write.rs +0 -1593
- package/dist-engine-src/src/sql2/exec/datafusion.rs +0 -5266
- package/dist-engine-src/src/sql2/exec/fast_write.rs +0 -82
- package/dist-engine-src/src/sql2/exec/mod.rs +0 -24
- package/dist-engine-src/src/sql2/exec/write.rs +0 -661
- package/dist-engine-src/src/sql2/filesystem_planner.rs +0 -1485
- package/dist-engine-src/src/sql2/filesystem_predicates.rs +0 -159
- package/dist-engine-src/src/sql2/filesystem_visibility.rs +0 -383
- package/dist-engine-src/src/sql2/history_projection.rs +0 -56
- package/dist-engine-src/src/sql2/history_route.rs +0 -661
- package/dist-engine-src/src/sql2/mod.rs +0 -52
- package/dist-engine-src/src/sql2/optimize/datafusion.rs +0 -1
- package/dist-engine-src/src/sql2/optimize/mod.rs +0 -2
- package/dist-engine-src/src/sql2/optimize/simple_write.rs +0 -116
- package/dist-engine-src/src/sql2/parse/mod.rs +0 -69
- package/dist-engine-src/src/sql2/parse/normalize.rs +0 -1
- package/dist-engine-src/src/sql2/plan/branch_scope.rs +0 -24
- package/dist-engine-src/src/sql2/plan/mod.rs +0 -5
- package/dist-engine-src/src/sql2/plan/predicate.rs +0 -22
- package/dist-engine-src/src/sql2/plan/write.rs +0 -147
- package/dist-engine-src/src/sql2/predicate_typecheck.rs +0 -504
- package/dist-engine-src/src/sql2/providers/branch.rs +0 -1206
- package/dist-engine-src/src/sql2/providers/change.rs +0 -445
- package/dist-engine-src/src/sql2/providers/directory.rs +0 -2422
- package/dist-engine-src/src/sql2/providers/directory_history.rs +0 -645
- package/dist-engine-src/src/sql2/providers/entity.rs +0 -1484
- package/dist-engine-src/src/sql2/providers/entity_history.rs +0 -452
- package/dist-engine-src/src/sql2/providers/file.rs +0 -3686
- package/dist-engine-src/src/sql2/providers/file_history.rs +0 -924
- package/dist-engine-src/src/sql2/providers/history.rs +0 -426
- package/dist-engine-src/src/sql2/providers/lix_state.rs +0 -2542
- package/dist-engine-src/src/sql2/providers/mod.rs +0 -508
- package/dist-engine-src/src/sql2/read_only.rs +0 -63
- package/dist-engine-src/src/sql2/record_batch.rs +0 -17
- package/dist-engine-src/src/sql2/result_metadata.rs +0 -29
- package/dist-engine-src/src/sql2/runtime.rs +0 -60
- package/dist-engine-src/src/sql2/session.rs +0 -83
- package/dist-engine-src/src/sql2/storage/constraints.rs +0 -1
- package/dist-engine-src/src/sql2/storage/mod.rs +0 -1
- package/dist-engine-src/src/sql2/test_support/differential.rs +0 -712
- package/dist-engine-src/src/sql2/test_support/generators.rs +0 -354
- package/dist-engine-src/src/sql2/test_support/mod.rs +0 -2
- package/dist-engine-src/src/sql2/udfs/common.rs +0 -295
- package/dist-engine-src/src/sql2/udfs/lix_active_branch_commit_id.rs +0 -53
- package/dist-engine-src/src/sql2/udfs/lix_empty_blob.rs +0 -47
- package/dist-engine-src/src/sql2/udfs/lix_json.rs +0 -100
- package/dist-engine-src/src/sql2/udfs/lix_json_get.rs +0 -99
- package/dist-engine-src/src/sql2/udfs/lix_json_get_text.rs +0 -99
- package/dist-engine-src/src/sql2/udfs/lix_text_decode.rs +0 -82
- package/dist-engine-src/src/sql2/udfs/lix_text_encode.rs +0 -85
- package/dist-engine-src/src/sql2/udfs/lix_timestamp.rs +0 -76
- package/dist-engine-src/src/sql2/udfs/lix_uuid_v7.rs +0 -76
- package/dist-engine-src/src/sql2/udfs/mod.rs +0 -86
- package/dist-engine-src/src/sql2/write_normalization.rs +0 -368
- package/dist-engine-src/src/storage/conformance.rs +0 -399
- package/dist-engine-src/src/storage/context.rs +0 -620
- package/dist-engine-src/src/storage/mod.rs +0 -52
- package/dist-engine-src/src/storage/point.rs +0 -440
- package/dist-engine-src/src/storage/read_scope.rs +0 -67
- package/dist-engine-src/src/storage/reader.rs +0 -867
- package/dist-engine-src/src/storage/scan.rs +0 -784
- package/dist-engine-src/src/storage/spaces.rs +0 -236
- package/dist-engine-src/src/storage/stats.rs +0 -80
- package/dist-engine-src/src/storage/write_set.rs +0 -962
- package/dist-engine-src/src/storage_bench.rs +0 -171
- package/dist-engine-src/src/test_support.rs +0 -450
- package/dist-engine-src/src/tracked_state/bench_support.rs +0 -394
- package/dist-engine-src/src/tracked_state/codec.rs +0 -1183
- package/dist-engine-src/src/tracked_state/commit_root_rebuild.rs +0 -358
- package/dist-engine-src/src/tracked_state/context.rs +0 -2801
- package/dist-engine-src/src/tracked_state/diff.rs +0 -2140
- package/dist-engine-src/src/tracked_state/merge.rs +0 -478
- package/dist-engine-src/src/tracked_state/mod.rs +0 -35
- package/dist-engine-src/src/tracked_state/row_materialization.rs +0 -275
- package/dist-engine-src/src/tracked_state/storage.rs +0 -427
- package/dist-engine-src/src/tracked_state/tree.rs +0 -3063
- package/dist-engine-src/src/tracked_state/types.rs +0 -238
- package/dist-engine-src/src/transaction/bench_support.rs +0 -407
- package/dist-engine-src/src/transaction/commit.rs +0 -1592
- package/dist-engine-src/src/transaction/context.rs +0 -1653
- package/dist-engine-src/src/transaction/mod.rs +0 -24
- package/dist-engine-src/src/transaction/normalization.rs +0 -877
- package/dist-engine-src/src/transaction/prep.rs +0 -37
- package/dist-engine-src/src/transaction/schema_resolver.rs +0 -163
- package/dist-engine-src/src/transaction/staging.rs +0 -1525
- package/dist-engine-src/src/transaction/types.rs +0 -403
- package/dist-engine-src/src/transaction/validation.rs +0 -5766
- package/dist-engine-src/src/untracked_state/codec.rs +0 -615
- package/dist-engine-src/src/untracked_state/context.rs +0 -98
- package/dist-engine-src/src/untracked_state/materialization.rs +0 -63
- package/dist-engine-src/src/untracked_state/mod.rs +0 -15
- package/dist-engine-src/src/untracked_state/storage.rs +0 -898
- package/dist-engine-src/src/untracked_state/types.rs +0 -146
- package/dist-engine-src/src/wasm/mod.rs +0 -60
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
use crate::storage::StorageRead;
|
|
2
|
-
use crate::tracked_state::{
|
|
3
|
-
plan_merge, TrackedStateDiff, TrackedStateDiffRequest, TrackedStateMergePlan,
|
|
4
|
-
TrackedStateStoreReader,
|
|
5
|
-
};
|
|
6
|
-
use crate::LixError;
|
|
7
|
-
|
|
8
|
-
use super::conflicts::{conflicts_from_plan, MergeConflict};
|
|
9
|
-
use super::stats::{stats_from_diff, stats_from_plan, MergeStats};
|
|
10
|
-
|
|
11
|
-
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
|
12
|
-
pub(crate) enum MergeOutcome {
|
|
13
|
-
AlreadyUpToDate,
|
|
14
|
-
FastForward,
|
|
15
|
-
MergeCommitted,
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
19
|
-
pub(crate) struct MergeCommits {
|
|
20
|
-
pub(crate) base_commit_id: String,
|
|
21
|
-
pub(crate) target_commit_id: String,
|
|
22
|
-
pub(crate) source_commit_id: String,
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
26
|
-
pub(crate) struct MergeAnalysis {
|
|
27
|
-
pub(crate) outcome: MergeOutcome,
|
|
28
|
-
pub(crate) commits: MergeCommits,
|
|
29
|
-
pub(crate) source_diff: TrackedStateDiff,
|
|
30
|
-
pub(crate) target_diff: TrackedStateDiff,
|
|
31
|
-
pub(crate) stats: MergeStats,
|
|
32
|
-
pub(crate) conflicts: Vec<MergeConflict>,
|
|
33
|
-
pub(crate) merge_plan: Option<TrackedStateMergePlan>,
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
impl MergeAnalysis {
|
|
37
|
-
pub(crate) fn merge_plan(&self) -> Option<&TrackedStateMergePlan> {
|
|
38
|
-
self.merge_plan.as_ref()
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
pub(crate) async fn analyze<S>(
|
|
43
|
-
reader: &mut TrackedStateStoreReader<S>,
|
|
44
|
-
commits: MergeCommits,
|
|
45
|
-
) -> Result<MergeAnalysis, LixError>
|
|
46
|
-
where
|
|
47
|
-
S: StorageRead + Send + Sync,
|
|
48
|
-
{
|
|
49
|
-
let request = TrackedStateDiffRequest::default();
|
|
50
|
-
let source_diff = reader
|
|
51
|
-
.diff_commits(&commits.base_commit_id, &commits.source_commit_id, &request)
|
|
52
|
-
.await?;
|
|
53
|
-
let target_diff = if commits.base_commit_id == commits.source_commit_id
|
|
54
|
-
|| commits.base_commit_id == commits.target_commit_id
|
|
55
|
-
{
|
|
56
|
-
TrackedStateDiff::default()
|
|
57
|
-
} else {
|
|
58
|
-
reader
|
|
59
|
-
.diff_commits_with_validation(
|
|
60
|
-
&commits.base_commit_id,
|
|
61
|
-
&commits.target_commit_id,
|
|
62
|
-
&request,
|
|
63
|
-
false,
|
|
64
|
-
true,
|
|
65
|
-
)
|
|
66
|
-
.await?
|
|
67
|
-
};
|
|
68
|
-
|
|
69
|
-
let outcome = if commits.base_commit_id == commits.source_commit_id {
|
|
70
|
-
MergeOutcome::AlreadyUpToDate
|
|
71
|
-
} else if commits.base_commit_id == commits.target_commit_id {
|
|
72
|
-
MergeOutcome::FastForward
|
|
73
|
-
} else {
|
|
74
|
-
MergeOutcome::MergeCommitted
|
|
75
|
-
};
|
|
76
|
-
|
|
77
|
-
let merge_plan = if outcome == MergeOutcome::MergeCommitted {
|
|
78
|
-
Some(plan_merge(&target_diff, &source_diff)?)
|
|
79
|
-
} else {
|
|
80
|
-
None
|
|
81
|
-
};
|
|
82
|
-
|
|
83
|
-
let stats = match outcome {
|
|
84
|
-
MergeOutcome::AlreadyUpToDate => MergeStats::default(),
|
|
85
|
-
MergeOutcome::FastForward => stats_from_diff(&source_diff),
|
|
86
|
-
MergeOutcome::MergeCommitted => merge_plan
|
|
87
|
-
.as_ref()
|
|
88
|
-
.map(|plan| stats_from_plan(plan, &source_diff))
|
|
89
|
-
.transpose()?
|
|
90
|
-
.unwrap_or_default(),
|
|
91
|
-
};
|
|
92
|
-
|
|
93
|
-
let conflicts = merge_plan
|
|
94
|
-
.as_ref()
|
|
95
|
-
.map(conflicts_from_plan)
|
|
96
|
-
.transpose()?
|
|
97
|
-
.unwrap_or_default();
|
|
98
|
-
|
|
99
|
-
Ok(MergeAnalysis {
|
|
100
|
-
outcome,
|
|
101
|
-
commits,
|
|
102
|
-
source_diff,
|
|
103
|
-
target_diff,
|
|
104
|
-
stats,
|
|
105
|
-
conflicts,
|
|
106
|
-
merge_plan,
|
|
107
|
-
})
|
|
108
|
-
}
|
|
@@ -1,417 +0,0 @@
|
|
|
1
|
-
use serde_json::{json, Value as JsonValue};
|
|
2
|
-
|
|
3
|
-
use crate::branch::{BranchLifecycle, BranchOperation, BranchReferenceRole};
|
|
4
|
-
use crate::storage::StorageBackend;
|
|
5
|
-
use crate::LixError;
|
|
6
|
-
|
|
7
|
-
use super::analysis::{analyze, MergeCommits, MergeOutcome};
|
|
8
|
-
use super::conflicts::{
|
|
9
|
-
MergeConflict as AnalysisMergeConflict,
|
|
10
|
-
MergeConflictChangeKind as AnalysisMergeConflictChangeKind,
|
|
11
|
-
MergeConflictKind as AnalysisMergeConflictKind, MergeConflictSide as AnalysisMergeConflictSide,
|
|
12
|
-
};
|
|
13
|
-
use super::stats::MergeStats;
|
|
14
|
-
use crate::session::context::SessionContext;
|
|
15
|
-
use crate::tracked_state::TrackedStateMergePick;
|
|
16
|
-
use crate::transaction::types::StagedCommitChangeRef;
|
|
17
|
-
|
|
18
|
-
/// Options for merging another branch into this session's active branch.
|
|
19
|
-
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
20
|
-
pub struct MergeBranchOptions {
|
|
21
|
-
/// Branch whose changes should be merged into the active session branch.
|
|
22
|
-
pub source_branch_id: String,
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
/// Options for previewing a merge from another branch into this session's
|
|
26
|
-
/// active branch.
|
|
27
|
-
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
28
|
-
pub struct MergeBranchPreviewOptions {
|
|
29
|
-
/// Branch whose changes would be merged into the active session branch.
|
|
30
|
-
pub source_branch_id: String,
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/// Receipt returned after merging a branch.
|
|
34
|
-
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
35
|
-
pub struct MergeBranchReceipt {
|
|
36
|
-
pub outcome: MergeBranchOutcome,
|
|
37
|
-
pub target_branch_id: String,
|
|
38
|
-
pub source_branch_id: String,
|
|
39
|
-
pub base_commit_id: String,
|
|
40
|
-
pub target_head_before_commit_id: String,
|
|
41
|
-
pub source_head_before_commit_id: String,
|
|
42
|
-
pub target_head_after_commit_id: String,
|
|
43
|
-
pub created_merge_commit_id: Option<String>,
|
|
44
|
-
pub change_stats: MergeChangeStats,
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
#[derive(Debug, Clone, PartialEq, Eq, Default)]
|
|
48
|
-
pub struct MergeChangeStats {
|
|
49
|
-
pub total: usize,
|
|
50
|
-
pub added: usize,
|
|
51
|
-
pub modified: usize,
|
|
52
|
-
pub removed: usize,
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
56
|
-
pub struct MergeBranchPreview {
|
|
57
|
-
pub outcome: MergeBranchOutcome,
|
|
58
|
-
pub target_branch_id: String,
|
|
59
|
-
pub source_branch_id: String,
|
|
60
|
-
pub base_commit_id: String,
|
|
61
|
-
pub target_head_commit_id: String,
|
|
62
|
-
pub source_head_commit_id: String,
|
|
63
|
-
pub change_stats: MergeChangeStats,
|
|
64
|
-
pub conflicts: Vec<MergeConflict>,
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
68
|
-
pub struct MergeConflict {
|
|
69
|
-
pub kind: MergeConflictKind,
|
|
70
|
-
pub schema_key: String,
|
|
71
|
-
pub entity_pk: JsonValue,
|
|
72
|
-
pub file_id: Option<String>,
|
|
73
|
-
pub target: MergeConflictSide,
|
|
74
|
-
pub source: MergeConflictSide,
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
|
78
|
-
pub enum MergeConflictKind {
|
|
79
|
-
SameEntityChanged,
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
83
|
-
pub struct MergeConflictSide {
|
|
84
|
-
pub kind: MergeConflictChangeKind,
|
|
85
|
-
pub before_change_id: Option<String>,
|
|
86
|
-
pub after_change_id: Option<String>,
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
|
90
|
-
pub enum MergeConflictChangeKind {
|
|
91
|
-
Added,
|
|
92
|
-
Modified,
|
|
93
|
-
Removed,
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
|
97
|
-
pub enum MergeBranchOutcome {
|
|
98
|
-
AlreadyUpToDate,
|
|
99
|
-
FastForward,
|
|
100
|
-
MergeCommitted,
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
impl<B> SessionContext<B>
|
|
104
|
-
where
|
|
105
|
-
B: StorageBackend + Clone + Send + Sync + 'static,
|
|
106
|
-
for<'backend> B::Read<'backend>: Clone + Send + Sync + 'static,
|
|
107
|
-
for<'backend> B::Write<'backend>: Send,
|
|
108
|
-
{
|
|
109
|
-
/// Previews merging `source_branch_id` into this session's active branch
|
|
110
|
-
/// without advancing refs, staging changes, or creating commits.
|
|
111
|
-
pub async fn merge_branch_preview(
|
|
112
|
-
&self,
|
|
113
|
-
options: MergeBranchPreviewOptions,
|
|
114
|
-
) -> Result<MergeBranchPreview, LixError> {
|
|
115
|
-
let source_branch_id = options.source_branch_id;
|
|
116
|
-
|
|
117
|
-
self.with_write_transaction(|transaction| {
|
|
118
|
-
Box::pin(async move {
|
|
119
|
-
let active_branch_id = transaction.active_branch_id().to_string();
|
|
120
|
-
if source_branch_id == active_branch_id {
|
|
121
|
-
return Err(LixError::invalid_self_merge(active_branch_id));
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
let (target_head, source_head) = {
|
|
125
|
-
let reader = transaction.branch_ref_reader();
|
|
126
|
-
let lifecycle = BranchLifecycle::new(&reader);
|
|
127
|
-
let target_head = lifecycle
|
|
128
|
-
.require_existing_commit_id(
|
|
129
|
-
&active_branch_id,
|
|
130
|
-
BranchOperation::MergeBranchPreview,
|
|
131
|
-
BranchReferenceRole::Target,
|
|
132
|
-
)
|
|
133
|
-
.await?;
|
|
134
|
-
let source_head = lifecycle
|
|
135
|
-
.require_existing_commit_id(
|
|
136
|
-
&source_branch_id,
|
|
137
|
-
BranchOperation::MergeBranchPreview,
|
|
138
|
-
BranchReferenceRole::Source,
|
|
139
|
-
)
|
|
140
|
-
.await?;
|
|
141
|
-
(target_head, source_head)
|
|
142
|
-
};
|
|
143
|
-
|
|
144
|
-
let merge_base = {
|
|
145
|
-
let mut reader = transaction.commit_graph_reader();
|
|
146
|
-
reader.merge_base(&target_head, &source_head).await?
|
|
147
|
-
};
|
|
148
|
-
|
|
149
|
-
let analysis = {
|
|
150
|
-
let mut reader = transaction.tracked_state_reader();
|
|
151
|
-
analyze(
|
|
152
|
-
&mut reader,
|
|
153
|
-
MergeCommits {
|
|
154
|
-
base_commit_id: merge_base.commit_id,
|
|
155
|
-
target_commit_id: target_head,
|
|
156
|
-
source_commit_id: source_head,
|
|
157
|
-
},
|
|
158
|
-
)
|
|
159
|
-
.await?
|
|
160
|
-
};
|
|
161
|
-
|
|
162
|
-
Ok(preview_from_analysis(
|
|
163
|
-
&active_branch_id,
|
|
164
|
-
&source_branch_id,
|
|
165
|
-
&analysis,
|
|
166
|
-
))
|
|
167
|
-
})
|
|
168
|
-
})
|
|
169
|
-
.await
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
/// Merges `source_branch_id` into this session's active branch.
|
|
173
|
-
///
|
|
174
|
-
/// The generated target commit keeps the previous target head as its first
|
|
175
|
-
/// parent and records the source head as an additional parent, so the
|
|
176
|
-
/// commit graph preserves branch ancestry while tracked-state storage
|
|
177
|
-
/// selects the planned source changes into the new target root.
|
|
178
|
-
pub async fn merge_branch(
|
|
179
|
-
&self,
|
|
180
|
-
options: MergeBranchOptions,
|
|
181
|
-
) -> Result<MergeBranchReceipt, LixError> {
|
|
182
|
-
let source_branch_id = options.source_branch_id;
|
|
183
|
-
|
|
184
|
-
self.with_write_transaction(|transaction| {
|
|
185
|
-
Box::pin(async move {
|
|
186
|
-
let active_branch_id = transaction.active_branch_id().to_string();
|
|
187
|
-
if source_branch_id == active_branch_id {
|
|
188
|
-
return Err(LixError::invalid_self_merge(active_branch_id));
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
let (target_head, source_head) = {
|
|
192
|
-
let reader = transaction.branch_ref_reader();
|
|
193
|
-
let lifecycle = BranchLifecycle::new(&reader);
|
|
194
|
-
let target_head = lifecycle
|
|
195
|
-
.require_existing_commit_id(
|
|
196
|
-
&active_branch_id,
|
|
197
|
-
BranchOperation::MergeBranch,
|
|
198
|
-
BranchReferenceRole::Target,
|
|
199
|
-
)
|
|
200
|
-
.await?;
|
|
201
|
-
let source_head = lifecycle
|
|
202
|
-
.require_existing_commit_id(
|
|
203
|
-
&source_branch_id,
|
|
204
|
-
BranchOperation::MergeBranch,
|
|
205
|
-
BranchReferenceRole::Source,
|
|
206
|
-
)
|
|
207
|
-
.await?;
|
|
208
|
-
(target_head, source_head)
|
|
209
|
-
};
|
|
210
|
-
|
|
211
|
-
let merge_base = {
|
|
212
|
-
let mut reader = transaction.commit_graph_reader();
|
|
213
|
-
reader.merge_base(&target_head, &source_head).await?
|
|
214
|
-
};
|
|
215
|
-
let base_commit_id = merge_base.commit_id;
|
|
216
|
-
|
|
217
|
-
let analysis = {
|
|
218
|
-
let mut reader = transaction.tracked_state_reader();
|
|
219
|
-
analyze(
|
|
220
|
-
&mut reader,
|
|
221
|
-
MergeCommits {
|
|
222
|
-
base_commit_id,
|
|
223
|
-
target_commit_id: target_head,
|
|
224
|
-
source_commit_id: source_head,
|
|
225
|
-
},
|
|
226
|
-
)
|
|
227
|
-
.await?
|
|
228
|
-
};
|
|
229
|
-
|
|
230
|
-
if analysis.outcome == MergeOutcome::AlreadyUpToDate {
|
|
231
|
-
return Ok(MergeBranchReceipt {
|
|
232
|
-
outcome: MergeBranchOutcome::AlreadyUpToDate,
|
|
233
|
-
target_branch_id: active_branch_id,
|
|
234
|
-
source_branch_id,
|
|
235
|
-
base_commit_id: analysis.commits.base_commit_id,
|
|
236
|
-
target_head_after_commit_id: analysis.commits.target_commit_id.clone(),
|
|
237
|
-
target_head_before_commit_id: analysis.commits.target_commit_id,
|
|
238
|
-
source_head_before_commit_id: analysis.commits.source_commit_id,
|
|
239
|
-
created_merge_commit_id: None,
|
|
240
|
-
change_stats: merge_change_stats_from_analysis(&analysis.stats),
|
|
241
|
-
});
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
if analysis.outcome == MergeOutcome::FastForward {
|
|
245
|
-
transaction
|
|
246
|
-
.advance_branch_ref(&active_branch_id, &analysis.commits.source_commit_id)
|
|
247
|
-
.await?;
|
|
248
|
-
|
|
249
|
-
return Ok(MergeBranchReceipt {
|
|
250
|
-
outcome: MergeBranchOutcome::FastForward,
|
|
251
|
-
target_branch_id: active_branch_id,
|
|
252
|
-
source_branch_id,
|
|
253
|
-
base_commit_id: analysis.commits.base_commit_id,
|
|
254
|
-
target_head_before_commit_id: analysis.commits.target_commit_id,
|
|
255
|
-
source_head_before_commit_id: analysis.commits.source_commit_id.clone(),
|
|
256
|
-
target_head_after_commit_id: analysis.commits.source_commit_id,
|
|
257
|
-
created_merge_commit_id: None,
|
|
258
|
-
change_stats: merge_change_stats_from_analysis(&analysis.stats),
|
|
259
|
-
});
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
let merge_plan = analysis
|
|
263
|
-
.merge_plan()
|
|
264
|
-
.expect("merge analysis should include a plan for mergeCommitted");
|
|
265
|
-
|
|
266
|
-
if !analysis.conflicts.is_empty() {
|
|
267
|
-
return Err(merge_conflict_error(
|
|
268
|
-
&analysis
|
|
269
|
-
.conflicts
|
|
270
|
-
.iter()
|
|
271
|
-
.map(merge_conflict_from_analysis)
|
|
272
|
-
.collect::<Vec<_>>(),
|
|
273
|
-
)?);
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
let selected_changes = merge_plan
|
|
277
|
-
.picks
|
|
278
|
-
.iter()
|
|
279
|
-
.map(selected_change_from_merge_pick)
|
|
280
|
-
.collect::<Vec<_>>();
|
|
281
|
-
let created_merge_commit_id = transaction.stage_merge_commit(
|
|
282
|
-
active_branch_id.clone(),
|
|
283
|
-
analysis.commits.source_commit_id.clone(),
|
|
284
|
-
selected_changes,
|
|
285
|
-
)?;
|
|
286
|
-
return Ok(MergeBranchReceipt {
|
|
287
|
-
outcome: MergeBranchOutcome::MergeCommitted,
|
|
288
|
-
target_branch_id: active_branch_id,
|
|
289
|
-
source_branch_id,
|
|
290
|
-
base_commit_id: analysis.commits.base_commit_id,
|
|
291
|
-
target_head_after_commit_id: created_merge_commit_id.clone(),
|
|
292
|
-
target_head_before_commit_id: analysis.commits.target_commit_id,
|
|
293
|
-
source_head_before_commit_id: analysis.commits.source_commit_id,
|
|
294
|
-
created_merge_commit_id: Some(created_merge_commit_id),
|
|
295
|
-
change_stats: merge_change_stats_from_analysis(&analysis.stats),
|
|
296
|
-
});
|
|
297
|
-
})
|
|
298
|
-
})
|
|
299
|
-
.await
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
fn selected_change_from_merge_pick(pick: &TrackedStateMergePick) -> StagedCommitChangeRef {
|
|
304
|
-
StagedCommitChangeRef {
|
|
305
|
-
schema_key: pick.selected_row.schema_key.clone(),
|
|
306
|
-
file_id: pick.selected_row.file_id.clone(),
|
|
307
|
-
entity_pk: pick.selected_row.entity_pk.clone(),
|
|
308
|
-
change_id: pick.change_id.clone(),
|
|
309
|
-
snapshot_ref: pick.selected_row.snapshot_ref,
|
|
310
|
-
metadata_ref: pick.selected_row.metadata_ref,
|
|
311
|
-
deleted: pick.selected_row.deleted,
|
|
312
|
-
created_at: pick.selected_row.created_at.clone(),
|
|
313
|
-
updated_at: pick.selected_row.updated_at.clone(),
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
fn preview_from_analysis(
|
|
318
|
-
target_branch_id: &str,
|
|
319
|
-
source_branch_id: &str,
|
|
320
|
-
analysis: &super::analysis::MergeAnalysis,
|
|
321
|
-
) -> MergeBranchPreview {
|
|
322
|
-
MergeBranchPreview {
|
|
323
|
-
outcome: merge_branch_outcome_from_analysis(analysis.outcome),
|
|
324
|
-
target_branch_id: target_branch_id.to_string(),
|
|
325
|
-
source_branch_id: source_branch_id.to_string(),
|
|
326
|
-
base_commit_id: analysis.commits.base_commit_id.clone(),
|
|
327
|
-
target_head_commit_id: analysis.commits.target_commit_id.clone(),
|
|
328
|
-
source_head_commit_id: analysis.commits.source_commit_id.clone(),
|
|
329
|
-
change_stats: merge_change_stats_from_analysis(&analysis.stats),
|
|
330
|
-
conflicts: analysis
|
|
331
|
-
.conflicts
|
|
332
|
-
.iter()
|
|
333
|
-
.map(merge_conflict_from_analysis)
|
|
334
|
-
.collect(),
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
|
|
338
|
-
fn merge_branch_outcome_from_analysis(outcome: MergeOutcome) -> MergeBranchOutcome {
|
|
339
|
-
match outcome {
|
|
340
|
-
MergeOutcome::AlreadyUpToDate => MergeBranchOutcome::AlreadyUpToDate,
|
|
341
|
-
MergeOutcome::FastForward => MergeBranchOutcome::FastForward,
|
|
342
|
-
MergeOutcome::MergeCommitted => MergeBranchOutcome::MergeCommitted,
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
fn merge_change_stats_from_analysis(stats: &MergeStats) -> MergeChangeStats {
|
|
347
|
-
MergeChangeStats {
|
|
348
|
-
total: stats.total,
|
|
349
|
-
added: stats.added,
|
|
350
|
-
modified: stats.modified,
|
|
351
|
-
removed: stats.removed,
|
|
352
|
-
}
|
|
353
|
-
}
|
|
354
|
-
|
|
355
|
-
fn merge_conflict_from_analysis(conflict: &AnalysisMergeConflict) -> MergeConflict {
|
|
356
|
-
MergeConflict {
|
|
357
|
-
kind: match conflict.kind {
|
|
358
|
-
AnalysisMergeConflictKind::SameEntityChanged => MergeConflictKind::SameEntityChanged,
|
|
359
|
-
},
|
|
360
|
-
schema_key: conflict.schema_key.clone(),
|
|
361
|
-
entity_pk: conflict.entity_pk.clone(),
|
|
362
|
-
file_id: conflict.file_id.clone(),
|
|
363
|
-
target: merge_conflict_side_from_analysis(&conflict.target),
|
|
364
|
-
source: merge_conflict_side_from_analysis(&conflict.source),
|
|
365
|
-
}
|
|
366
|
-
}
|
|
367
|
-
|
|
368
|
-
fn merge_conflict_side_from_analysis(side: &AnalysisMergeConflictSide) -> MergeConflictSide {
|
|
369
|
-
MergeConflictSide {
|
|
370
|
-
kind: match side.kind {
|
|
371
|
-
AnalysisMergeConflictChangeKind::Added => MergeConflictChangeKind::Added,
|
|
372
|
-
AnalysisMergeConflictChangeKind::Modified => MergeConflictChangeKind::Modified,
|
|
373
|
-
AnalysisMergeConflictChangeKind::Removed => MergeConflictChangeKind::Removed,
|
|
374
|
-
},
|
|
375
|
-
before_change_id: side.before_change_id.clone(),
|
|
376
|
-
after_change_id: side.after_change_id.clone(),
|
|
377
|
-
}
|
|
378
|
-
}
|
|
379
|
-
|
|
380
|
-
fn merge_conflict_error(conflicts: &[MergeConflict]) -> Result<LixError, LixError> {
|
|
381
|
-
let conflict_count = conflicts.len();
|
|
382
|
-
Ok(LixError::new(
|
|
383
|
-
LixError::CODE_MERGE_CONFLICT,
|
|
384
|
-
format!("merge_branch found {conflict_count} tracked-state conflict(s)"),
|
|
385
|
-
)
|
|
386
|
-
.with_hint("Resolve the conflicting entities in the target branch, then retry the merge.")
|
|
387
|
-
.with_details(json!({
|
|
388
|
-
"conflicts": conflicts.iter()
|
|
389
|
-
.map(merge_conflict_details)
|
|
390
|
-
.collect::<Vec<_>>(),
|
|
391
|
-
})))
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
fn merge_conflict_details(conflict: &MergeConflict) -> serde_json::Value {
|
|
395
|
-
json!({
|
|
396
|
-
"kind": match conflict.kind {
|
|
397
|
-
MergeConflictKind::SameEntityChanged => "sameEntityChanged",
|
|
398
|
-
},
|
|
399
|
-
"schemaKey": conflict.schema_key,
|
|
400
|
-
"entityPk": conflict.entity_pk,
|
|
401
|
-
"fileId": conflict.file_id,
|
|
402
|
-
"target": merge_conflict_side_details(&conflict.target),
|
|
403
|
-
"source": merge_conflict_side_details(&conflict.source),
|
|
404
|
-
})
|
|
405
|
-
}
|
|
406
|
-
|
|
407
|
-
fn merge_conflict_side_details(side: &MergeConflictSide) -> serde_json::Value {
|
|
408
|
-
json!({
|
|
409
|
-
"kind": match side.kind {
|
|
410
|
-
MergeConflictChangeKind::Added => "added",
|
|
411
|
-
MergeConflictChangeKind::Modified => "modified",
|
|
412
|
-
MergeConflictChangeKind::Removed => "removed",
|
|
413
|
-
},
|
|
414
|
-
"beforeChangeId": side.before_change_id,
|
|
415
|
-
"afterChangeId": side.after_change_id,
|
|
416
|
-
})
|
|
417
|
-
}
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
use crate::tracked_state::{
|
|
2
|
-
TrackedStateDiffEntry, TrackedStateDiffKind, TrackedStateMergeConflict, TrackedStateMergePlan,
|
|
3
|
-
};
|
|
4
|
-
use crate::LixError;
|
|
5
|
-
use serde_json::Value as JsonValue;
|
|
6
|
-
|
|
7
|
-
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
8
|
-
pub(crate) struct MergeConflict {
|
|
9
|
-
pub(crate) kind: MergeConflictKind,
|
|
10
|
-
pub(crate) schema_key: String,
|
|
11
|
-
pub(crate) entity_pk: JsonValue,
|
|
12
|
-
pub(crate) file_id: Option<String>,
|
|
13
|
-
pub(crate) target: MergeConflictSide,
|
|
14
|
-
pub(crate) source: MergeConflictSide,
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
|
18
|
-
pub(crate) enum MergeConflictKind {
|
|
19
|
-
SameEntityChanged,
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
23
|
-
pub(crate) struct MergeConflictSide {
|
|
24
|
-
pub(crate) kind: MergeConflictChangeKind,
|
|
25
|
-
pub(crate) before_change_id: Option<String>,
|
|
26
|
-
pub(crate) after_change_id: Option<String>,
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
|
30
|
-
pub(crate) enum MergeConflictChangeKind {
|
|
31
|
-
Added,
|
|
32
|
-
Modified,
|
|
33
|
-
Removed,
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
pub(crate) fn conflicts_from_plan(
|
|
37
|
-
plan: &TrackedStateMergePlan,
|
|
38
|
-
) -> Result<Vec<MergeConflict>, LixError> {
|
|
39
|
-
plan.conflicts.iter().map(conflict_from_tracked).collect()
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
fn conflict_from_tracked(conflict: &TrackedStateMergeConflict) -> Result<MergeConflict, LixError> {
|
|
43
|
-
Ok(MergeConflict {
|
|
44
|
-
kind: MergeConflictKind::SameEntityChanged,
|
|
45
|
-
schema_key: conflict.identity.schema_key.clone(),
|
|
46
|
-
entity_pk: conflict.identity.entity_pk.as_json_array_value()?,
|
|
47
|
-
file_id: conflict.identity.file_id.clone(),
|
|
48
|
-
target: conflict_side_from_diff_entry(&conflict.target),
|
|
49
|
-
source: conflict_side_from_diff_entry(&conflict.source),
|
|
50
|
-
})
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
fn conflict_side_from_diff_entry(entry: &TrackedStateDiffEntry) -> MergeConflictSide {
|
|
54
|
-
MergeConflictSide {
|
|
55
|
-
kind: match entry.kind {
|
|
56
|
-
TrackedStateDiffKind::Added => MergeConflictChangeKind::Added,
|
|
57
|
-
TrackedStateDiffKind::Modified => MergeConflictChangeKind::Modified,
|
|
58
|
-
TrackedStateDiffKind::Removed => MergeConflictChangeKind::Removed,
|
|
59
|
-
},
|
|
60
|
-
before_change_id: entry.before.as_ref().map(|row| row.change_id.clone()),
|
|
61
|
-
after_change_id: entry.after.as_ref().map(|row| row.change_id.clone()),
|
|
62
|
-
}
|
|
63
|
-
}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
mod analysis;
|
|
2
|
-
mod branch;
|
|
3
|
-
mod conflicts;
|
|
4
|
-
mod stats;
|
|
5
|
-
|
|
6
|
-
pub use branch::{
|
|
7
|
-
MergeBranchOptions, MergeBranchOutcome, MergeBranchPreview, MergeBranchPreviewOptions,
|
|
8
|
-
MergeBranchReceipt, MergeChangeStats, MergeConflict, MergeConflictChangeKind,
|
|
9
|
-
MergeConflictKind, MergeConflictSide,
|
|
10
|
-
};
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
use crate::tracked_state::{
|
|
2
|
-
TrackedStateDiff, TrackedStateDiffKind, TrackedStateMergePick, TrackedStateMergePlan,
|
|
3
|
-
};
|
|
4
|
-
use crate::LixError;
|
|
5
|
-
|
|
6
|
-
#[derive(Debug, Clone, PartialEq, Eq, Default)]
|
|
7
|
-
pub(crate) struct MergeStats {
|
|
8
|
-
pub(crate) total: usize,
|
|
9
|
-
pub(crate) added: usize,
|
|
10
|
-
pub(crate) modified: usize,
|
|
11
|
-
pub(crate) removed: usize,
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
pub(crate) fn stats_from_diff(diff: &TrackedStateDiff) -> MergeStats {
|
|
15
|
-
let mut stats = MergeStats::default();
|
|
16
|
-
for entry in &diff.entries {
|
|
17
|
-
stats.add(entry.kind);
|
|
18
|
-
}
|
|
19
|
-
stats
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
pub(crate) fn stats_from_plan(
|
|
23
|
-
plan: &TrackedStateMergePlan,
|
|
24
|
-
source_diff: &TrackedStateDiff,
|
|
25
|
-
) -> Result<MergeStats, LixError> {
|
|
26
|
-
let mut stats = MergeStats::default();
|
|
27
|
-
for pick in &plan.picks {
|
|
28
|
-
let identity = pick_identity(pick);
|
|
29
|
-
let Some(entry) = source_diff
|
|
30
|
-
.entries
|
|
31
|
-
.iter()
|
|
32
|
-
.find(|entry| &entry.identity == identity)
|
|
33
|
-
else {
|
|
34
|
-
return Err(LixError::new(
|
|
35
|
-
"LIX_ERROR_UNKNOWN",
|
|
36
|
-
format!(
|
|
37
|
-
"merge analysis could not find source diff entry for source schema '{}' entity '{}'",
|
|
38
|
-
identity.schema_key,
|
|
39
|
-
identity.entity_pk.as_json_array_text()?
|
|
40
|
-
),
|
|
41
|
-
));
|
|
42
|
-
};
|
|
43
|
-
stats.add(entry.kind);
|
|
44
|
-
}
|
|
45
|
-
Ok(stats)
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
impl MergeStats {
|
|
49
|
-
fn add(&mut self, kind: TrackedStateDiffKind) {
|
|
50
|
-
self.total += 1;
|
|
51
|
-
match kind {
|
|
52
|
-
TrackedStateDiffKind::Added => self.added += 1,
|
|
53
|
-
TrackedStateDiffKind::Modified => self.modified += 1,
|
|
54
|
-
TrackedStateDiffKind::Removed => self.removed += 1,
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
fn pick_identity(pick: &TrackedStateMergePick) -> &crate::tracked_state::TrackedStateDiffIdentity {
|
|
60
|
-
&pick.identity
|
|
61
|
-
}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
//! Engine session boundary.
|
|
2
|
-
//!
|
|
3
|
-
//! Transaction invariant: a session has one execution lease. Parent-handle
|
|
4
|
-
//! calls use it for implicit single-statement execution; explicit transactions
|
|
5
|
-
//! hold it until commit or rollback. Session feature submodules should enter
|
|
6
|
-
//! write flows through the centralized session helpers rather than opening
|
|
7
|
-
//! `Transaction` directly or using session-level read helpers inside writes.
|
|
8
|
-
//!
|
|
9
|
-
//! MVP boundary: session close can cancel queued or pre-boundary writes until
|
|
10
|
-
//! the durable commit point-of-no-return. After that point, close waits for
|
|
11
|
-
//! commit completion. Durability itself is the backend's responsibility.
|
|
12
|
-
|
|
13
|
-
mod context;
|
|
14
|
-
mod create_branch;
|
|
15
|
-
mod execute;
|
|
16
|
-
mod merge;
|
|
17
|
-
mod switch_branch;
|
|
18
|
-
mod transaction;
|
|
19
|
-
|
|
20
|
-
pub use context::SessionContext;
|
|
21
|
-
pub(crate) use context::{SessionMode, WORKSPACE_BRANCH_KEY};
|
|
22
|
-
pub use create_branch::{CreateBranchOptions, CreateBranchReceipt};
|
|
23
|
-
pub use execute::{ExecuteResult, Row, RowRef, TryFromValue};
|
|
24
|
-
pub use merge::{
|
|
25
|
-
MergeBranchOptions, MergeBranchOutcome, MergeBranchPreview, MergeBranchPreviewOptions,
|
|
26
|
-
MergeBranchReceipt, MergeChangeStats, MergeConflict, MergeConflictChangeKind,
|
|
27
|
-
MergeConflictKind, MergeConflictSide,
|
|
28
|
-
};
|
|
29
|
-
pub use switch_branch::{SwitchBranchOptions, SwitchBranchReceipt};
|
|
30
|
-
pub use transaction::SessionTransaction;
|