~/bend-docscommunity

src/Merging.bend fails

raw source on the hub · import ber-core-store@0.1.2.0/src/Merging.bend as Merging

7 imports
import Base
import ./Reading.bend as Reading
import ./LogicalKey.bend as LogicalKey
import ./Comparison.bend as Comparison
import ./StateTree.bend as StateTree
import ./History.bend as History
import ./Store.bend as Store

Types

type MergeOutcome source · line 19 · raw

Data

Pure merge result: merged entries or conflicting keys.

type LawCheck source · line 24 · raw

Data

One named law verdict.

type MergeCertificate source · line 28 · raw

Data

Parents, base, result hash, strategy and checked laws.

type MergeResult source · line 32 · raw

Data

Success with commit and certificate, conflict, or unprovable.

Definitions

def merge_succeeded source · line 38 · raw

@merge_result:MergeResult -> Bool

True only for successful merges.

def conflict_key_count source · line 48 · raw

@merge_result:MergeResult -> Nat

Counts conflicting keys; zero otherwise.

def success_commit_of source · line 58 · raw

@merge_result:MergeResult -> Maybe<&2, 0x785d1b078f7f99a4ee2b9c7798398bc9/src/History.Commit>

Unwraps the resulting commit of a success.

def success_certificate_of source · line 68 · raw

@merge_result:MergeResult -> Maybe<&2, MergeCertificate>

Unwraps the certificate of a success.

def cert_first_parent source · line 78 · raw

@certificate:MergeCertificate -> String

Projects the first parent out of a certificate.

def cert_second_parent source · line 84 · raw

@certificate:MergeCertificate -> String

Projects the second parent out of a certificate.

def cert_base_commit source · line 90 · raw

@certificate:MergeCertificate -> String

Projects the base commit out of a certificate.

def cert_result_tree source · line 96 · raw

@certificate:MergeCertificate -> String

Projects the result tree out of a certificate.

def cert_strategy_name source · line 102 · raw

@certificate:MergeCertificate -> String

Projects the strategy name out of a certificate.

def cert_checked_laws source · line 108 · raw

@certificate:MergeCertificate -> List<&2, LawCheck>

Projects the checked laws out of a certificate.

def law_check_passed source · line 114 · raw

@law_check:LawCheck -> Bool

Projects the verdict out of a law check.

def merged_entries_of source · line 120 · raw

@merge_outcome:MergeOutcome -> List<&2, 0x785d1b078f7f99a4ee2b9c7798398bc9/src/Reading.ChainEntry>

Projects merged entries; conflicts project as empty.

def conflicting_keys_of source · line 128 · raw

@merge_outcome:MergeOutcome -> List<&2, 0x785d1b078f7f99a4ee2b9c7798398bc9/src/LogicalKey.LogicalKey>

Projects conflicting keys; merges project as empty.

def decide_contains_member source · line 136 · raw

@head_matches:Bool -> @recursive_result:Bool -> Bool

True short-circuits the membership scan.

def list_contains_member source · line 144 · raw

@+target_identifier:String -> @visit_list:List<&2, String> -> Bool

Scans the visit list for the identifier.

def parent_list_or_empty source · line 152 · raw

@commit_maybe:Maybe<&2, 0x785d1b078f7f99a4ee2b9c7798398bc9/src/History.Commit> -> List<&2, String>

Unknown commits contribute no parents.

def decide_queue_member source · line 160 · raw

@is_member:Bool -> @head_identifier:String -> @tail_queue:List<&2, String> -> List<&2, String>

Skips visited parents in the queue.

def filter_unvisited source · line 168 · raw

@parent_identifiers:List<&2, String> -> @+visited_accum:List<&2, String> -> List<&2, String>

Keeps only unvisited parents.

def decide_visited_member source · line 176 · raw

@already_visited:Bool -> @+head_identifier:String -> @tail_result:List<&2, String> -> List<&2, String>

Deduplicates the visited accumulator.

def collect_ancestors source · line 184 · raw

@remaining_fuel:Nat -> @visit_queue:List<&2, String> -> @+visited_accum:List<&2, String> -> 0x785d1b078f7f99a4ee2b9c7798398bc9/src/Store.Op<&2, List<&2, String>>

Breadth-first ancestor collection with fuel.

def decide_lca_found source · line 202 · raw

@is_common:Bool -> @+commit_identifier:String -> @tail_result:Maybe<&2, String> -> Maybe<&2, String>

Some on the first common commit, otherwise the tail.

def lca_fuel_left source · line 210 · raw

@is_common:Bool -> @fuel_left:Nat -> Nat

A hit ends the ascent: deeper links cannot beat the first common commit.

def find_first_common source · line 220 · raw

@+ancestor_set:List<&2, String> -> @checker_fuel:Nat -> @gated_fuel:Nat -> @+commit_identifier:String -> 0x785d1b078f7f99a4ee2b9c7798398bc9/src/Store.Op<&2, Maybe<&2, String>>

Walks the second branch for the first ancestor-set hit. checker_fuel decreases every level for the termination checker; gated_fuel carries the early stop. Callers pass the same fuel twice.

def keep_first_entry source · line 234 · raw

@+combined_key:String -> @+entry_value:String -> @tail_outcome:MergeOutcome -> MergeOutcome

Emits the first side entry.

def keep_second_entry source · line 242 · raw

@+combined_key:String -> @+entry_value:String -> @tail_outcome:MergeOutcome -> MergeOutcome

Emits the second side entry.

def raise_merge_conflict source · line 250 · raw

@+combined_key:String -> @tail_outcome:MergeOutcome -> MergeOutcome

Records the key as conflicting.

def decide_second_changed source · line 258 · raw

@second_unchanged:Bool -> @+combined_key:String -> @+first_text:String -> @+second_text:String -> @tail_outcome:MergeOutcome -> MergeOutcome

Unchanged second keeps first; changed conflicts.

def decide_divergent_base source · line 266 · raw

@first_unchanged:Bool -> @second_unchanged:Bool -> @+combined_key:String -> @+first_text:String -> @+second_text:String -> @tail_outcome:MergeOutcome -> MergeOutcome

Unchanged first keeps second; otherwise checks second.

def resolve_divergent source · line 274 · raw

@+combined_key:String -> @base_value:Maybe<&2, String> -> @+first_text:String -> @+second_text:String -> @tail_outcome:MergeOutcome -> MergeOutcome

Resolves two present values against the base.

def decide_both_equal source · line 282 · raw

@both_equal:Bool -> @+combined_key:String -> @base_value:Maybe<&2, String> -> @+first_text:String -> @+second_text:String -> @tail_outcome:MergeOutcome -> MergeOutcome

Equal sides keep the value; unequal consults the base.

def resolve_both_present source · line 290 · raw

@+combined_key:String -> @base_value:Maybe<&2, String> -> @+first_text:String -> @+second_text:String -> @tail_outcome:MergeOutcome -> MergeOutcome

Resolves two present values.

def decide_present_delete source · line 294 · raw

@first_unchanged:Bool -> @+combined_key:String -> @+first_text:String -> @tail_outcome:MergeOutcome -> MergeOutcome

Unchanged present drops; modified conflicts.

def resolve_present_vs_deleted source · line 302 · raw

@+combined_key:String -> @base_value:Maybe<&2, String> -> @+first_text:String -> @tail_outcome:MergeOutcome -> MergeOutcome

Keeps added values; checks modified-against-base.

def resolve_first_present source · line 310 · raw

@+combined_key:String -> @base_value:Maybe<&2, String> -> @+first_text:String -> @second_value:Maybe<&2, String> -> @tail_outcome:MergeOutcome -> MergeOutcome

Dispatches on the second side presence.

def decide_delete_modify source · line 318 · raw

@second_unchanged:Bool -> @+combined_key:String -> @+second_text:String -> @tail_outcome:MergeOutcome -> MergeOutcome

Unchanged second drops; modified conflicts.

def resolve_deleted_vs_present source · line 326 · raw

@+combined_key:String -> @base_value:Maybe<&2, String> -> @+second_text:String -> @tail_outcome:MergeOutcome -> MergeOutcome

Keeps added values; checks modified-against-base.

def resolve_first_absent source · line 334 · raw

@+combined_key:String -> @base_value:Maybe<&2, String> -> @second_value:Maybe<&2, String> -> @tail_outcome:MergeOutcome -> MergeOutcome

Dispatches on the second side presence.

def resolve_key_triple source · line 342 · raw

@+combined_key:String -> @base_value:Maybe<&2, String> -> @first_value:Maybe<&2, String> -> @second_value:Maybe<&2, String> -> @tail_outcome:MergeOutcome -> MergeOutcome

Decides one key from its (base, first, second) values.

def decide_unique_emit source · line 350 · raw

@is_seen:Bool -> @+head_key:String -> @tail_keys:List<&2, String> -> List<&2, String>

Emits unseen keys once.

def unique_seen_keys source · line 358 · raw

@entries:List<&2, 0x785d1b078f7f99a4ee2b9c7798398bc9/src/Reading.ChainEntry> -> @+seen_keys:List<&2, String> -> List<&2, String>

Collects candidate keys in first-seen order.

def all_candidate_entries source · line 366 · raw

@+base_entries:List<&2, 0x785d1b078f7f99a4ee2b9c7798398bc9/src/Reading.ChainEntry> -> @+first_entries:List<&2, 0x785d1b078f7f99a4ee2b9c7798398bc9/src/Reading.ChainEntry> -> @+second_entries:List<&2, 0x785d1b078f7f99a4ee2b9c7798398bc9/src/Reading.ChainEntry> -> List<&2, 0x785d1b078f7f99a4ee2b9c7798398bc9/src/Reading.ChainEntry>

Concatenates base, first and second entries.

def merge_unique_keys source · line 370 · raw

@unique_keys:List<&2, String> -> @+base_entries:List<&2, 0x785d1b078f7f99a4ee2b9c7798398bc9/src/Reading.ChainEntry> -> @+first_entries:List<&2, 0x785d1b078f7f99a4ee2b9c7798398bc9/src/Reading.ChainEntry> -> @+second_entries:List<&2, 0x785d1b078f7f99a4ee2b9c7798398bc9/src/Reading.ChainEntry> -> MergeOutcome

Merges every unique key against the three entry lists.

def sort_entries source · line 378 · raw

@unsorted_entries:List<&2, 0x785d1b078f7f99a4ee2b9c7798398bc9/src/Reading.ChainEntry> -> List<&2, 0x785d1b078f7f99a4ee2b9c7798398bc9/src/Reading.ChainEntry>

Sorts merged entries by key for canonical hashing.

def finalize_merge source · line 386 · raw

@merge_outcome:MergeOutcome -> MergeOutcome

Sorts merged entries; conflicts pass through.

def merge_entry_lists source · line 394 · raw

@+base_entries:List<&2, 0x785d1b078f7f99a4ee2b9c7798398bc9/src/Reading.ChainEntry> -> @+first_entries:List<&2, 0x785d1b078f7f99a4ee2b9c7798398bc9/src/Reading.ChainEntry> -> @+second_entries:List<&2, 0x785d1b078f7f99a4ee2b9c7798398bc9/src/Reading.ChainEntry> -> MergeOutcome

Pure three-way merge core over entry lists.

def conflict_merge_result source · line 398 · raw

@conflicting_keys:List<&2, 0x785d1b078f7f99a4ee2b9c7798398bc9/src/LogicalKey.LogicalKey> -> 0x785d1b078f7f99a4ee2b9c7798398bc9/src/Store.Op<&2, MergeResult>

Wraps conflicting keys as a Sess result.

def unprovable_merge_result source · line 403 · raw

@+reason:String -> 0x785d1b078f7f99a4ee2b9c7798398bc9/src/Store.Op<&2, MergeResult>

Wraps an unprovable reason as a Sess result.

def build_merge_certificate source · line 408 · raw

@+first_parent_commit:String -> @+second_parent_commit:String -> @+base_commit:String -> @+result_tree_hash:String -> @+strategy_name:String -> MergeCertificate

Issues the certificate with pairwise-compatibility evidence.

def persist_merged_result source · line 412 · raw

@+first_identifier:String -> @+second_identifier:String -> @+base_identifier:String -> @+merged_entries:List<&2, 0x785d1b078f7f99a4ee2b9c7798398bc9/src/Reading.ChainEntry> -> 0x785d1b078f7f99a4ee2b9c7798398bc9/src/Store.Op<&2, MergeResult>

Persists tree, commit and index for merged entries.

def persist_merge_outcome source · line 420 · raw

@merge_outcome:MergeOutcome -> @+first_identifier:String -> @+second_identifier:String -> @+base_identifier:String -> 0x785d1b078f7f99a4ee2b9c7798398bc9/src/Store.Op<&2, MergeResult>

Persists merges; conflicts become results directly.

def merge_three_way source · line 428 · raw

@+first_identifier:String -> @+second_identifier:String -> @+base_identifier:String -> 0x785d1b078f7f99a4ee2b9c7798398bc9/src/Store.Op<&2, MergeResult>

Loads the three trees and merges them.

def decide_strategy_name source · line 457 · raw

@strategy_matches:Bool -> @+first_identifier:String -> @+second_identifier:String -> 0x785d1b078f7f99a4ee2b9c7798398bc9/src/Store.Op<&2, MergeResult>

Only union-disjoint merges; anything else is unprovable.

def merge_commits source · line 465 · raw

@+first_identifier:String -> @+second_identifier:String -> @+strategy_name:String -> 0x785d1b078f7f99a4ee2b9c7798398bc9/src/Store.Op<&2, MergeResult>

Merges two commits by strategy name.