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.
MergedEntries@merged_entries:List<&2, 0x785d1b078f7f99a4ee2b9c7798398bc9/src/Reading.ChainEntry> -> MergeOutcome
ConflictingKeys@conflicting_keys:List<&2, 0x785d1b078f7f99a4ee2b9c7798398bc9/src/LogicalKey.LogicalKey> -> MergeOutcome
type LawCheck source · line 24 · raw
Data
One named law verdict.
Check@check_name:String -> @check_passed:Bool -> LawCheck
type MergeCertificate source · line 28 · raw
Data
Parents, base, result hash, strategy and checked laws.
Make@first_parent_commit:String -> @second_parent_commit:String -> @base_commit:String -> @result_tree_hash:String -> @strategy_name:String -> @checked_laws:List<&2, LawCheck> -> MergeCertificate
type MergeResult source · line 32 · raw
Data
Success with commit and certificate, conflict, or unprovable.
MergeSuccess@resulting_commit:0x785d1b078f7f99a4ee2b9c7798398bc9/src/History.Commit -> @certificate:MergeCertificate -> MergeResult
MergeConflict@conflicting_keys:List<&2, 0x785d1b078f7f99a4ee2b9c7798398bc9/src/LogicalKey.LogicalKey> -> MergeResult
MergeUnprovable@reason:String -> MergeResult
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 branch_lca_search source · line 441 · raw
@lca_maybe:Maybe<&2, String> -> @+first_identifier:String -> @+second_identifier:String -> 0x785d1b078f7f99a4ee2b9c7798398bc9/src/Store.Op<&2, MergeResult>
Merges on the ancestor; missing ancestors are unprovable.
def merge_with_ancestor_search source · line 449 · raw
@+first_identifier:String -> @+second_identifier:String -> 0x785d1b078f7f99a4ee2b9c7798398bc9/src/Store.Op<&2, MergeResult>
Finds the lowest common ancestor, then merges.
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.