src/Merging.bend fails
raw source on the hub · import ber-core-store@0.1.1.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, 0xf481b310e24036f2ebffda42e94b3b4c/src/Reading.ChainEntry> -> MergeOutcome
ConflictingKeys@conflicting_keys:List<&2, 0xf481b310e24036f2ebffda42e94b3b4c/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:0xf481b310e24036f2ebffda42e94b3b4c/src/History.Commit -> @certificate:MergeCertificate -> MergeResult
MergeConflict@conflicting_keys:List<&2, 0xf481b310e24036f2ebffda42e94b3b4c/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, 0xf481b310e24036f2ebffda42e94b3b4c/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, 0xf481b310e24036f2ebffda42e94b3b4c/src/Reading.ChainEntry>
Projects merged entries; conflicts project as empty.
def conflicting_keys_of source · line 128 · raw
@merge_outcome:MergeOutcome -> List<&2, 0xf481b310e24036f2ebffda42e94b3b4c/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, 0xf481b310e24036f2ebffda42e94b3b4c/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> -> 0xf481b310e24036f2ebffda42e94b3b4c/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 find_first_common source · line 210 · raw
@+ancestor_set:List<&2, String> -> @remaining_fuel:Nat -> @+commit_identifier:String -> 0xf481b310e24036f2ebffda42e94b3b4c/src/Store.Op<&2, Maybe<&2, String>>
Walks the second branch for the first ancestor-set hit.
def keep_first_entry source · line 221 · raw
@+combined_key:String -> @+entry_value:String -> @tail_outcome:MergeOutcome -> MergeOutcome
Emits the first side entry.
def keep_second_entry source · line 229 · raw
@+combined_key:String -> @+entry_value:String -> @tail_outcome:MergeOutcome -> MergeOutcome
Emits the second side entry.
def raise_merge_conflict source · line 237 · raw
@+combined_key:String -> @tail_outcome:MergeOutcome -> MergeOutcome
Records the key as conflicting.
def decide_second_changed source · line 245 · 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 253 · 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 261 · 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 269 · 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 277 · 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 281 · 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 289 · 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 297 · 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 305 · 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 313 · 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 321 · 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 329 · 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 337 · 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 345 · raw
@entries:List<&2, 0xf481b310e24036f2ebffda42e94b3b4c/src/Reading.ChainEntry> -> @+seen_keys:List<&2, String> -> List<&2, String>
Collects candidate keys in first-seen order.
def all_candidate_entries source · line 353 · raw
@+base_entries:List<&2, 0xf481b310e24036f2ebffda42e94b3b4c/src/Reading.ChainEntry> -> @+first_entries:List<&2, 0xf481b310e24036f2ebffda42e94b3b4c/src/Reading.ChainEntry> -> @+second_entries:List<&2, 0xf481b310e24036f2ebffda42e94b3b4c/src/Reading.ChainEntry> -> List<&2, 0xf481b310e24036f2ebffda42e94b3b4c/src/Reading.ChainEntry>
Concatenates base, first and second entries.
def merge_unique_keys source · line 357 · raw
@unique_keys:List<&2, String> -> @+base_entries:List<&2, 0xf481b310e24036f2ebffda42e94b3b4c/src/Reading.ChainEntry> -> @+first_entries:List<&2, 0xf481b310e24036f2ebffda42e94b3b4c/src/Reading.ChainEntry> -> @+second_entries:List<&2, 0xf481b310e24036f2ebffda42e94b3b4c/src/Reading.ChainEntry> -> MergeOutcome
Merges every unique key against the three entry lists.
def sort_entries source · line 365 · raw
@unsorted_entries:List<&2, 0xf481b310e24036f2ebffda42e94b3b4c/src/Reading.ChainEntry> -> List<&2, 0xf481b310e24036f2ebffda42e94b3b4c/src/Reading.ChainEntry>
Sorts merged entries by key for canonical hashing.
def finalize_merge source · line 373 · raw
@merge_outcome:MergeOutcome -> MergeOutcome
Sorts merged entries; conflicts pass through.
def merge_entry_lists source · line 381 · raw
@+base_entries:List<&2, 0xf481b310e24036f2ebffda42e94b3b4c/src/Reading.ChainEntry> -> @+first_entries:List<&2, 0xf481b310e24036f2ebffda42e94b3b4c/src/Reading.ChainEntry> -> @+second_entries:List<&2, 0xf481b310e24036f2ebffda42e94b3b4c/src/Reading.ChainEntry> -> MergeOutcome
Pure three-way merge core over entry lists.
def conflict_merge_result source · line 385 · raw
@conflicting_keys:List<&2, 0xf481b310e24036f2ebffda42e94b3b4c/src/LogicalKey.LogicalKey> -> 0xf481b310e24036f2ebffda42e94b3b4c/src/Store.Op<&2, MergeResult>
Wraps conflicting keys as a Sess result.
def unprovable_merge_result source · line 390 · raw
@+reason:String -> 0xf481b310e24036f2ebffda42e94b3b4c/src/Store.Op<&2, MergeResult>
Wraps an unprovable reason as a Sess result.
def build_merge_certificate source · line 395 · 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 399 · raw
@+first_identifier:String -> @+second_identifier:String -> @+base_identifier:String -> @+merged_entries:List<&2, 0xf481b310e24036f2ebffda42e94b3b4c/src/Reading.ChainEntry> -> 0xf481b310e24036f2ebffda42e94b3b4c/src/Store.Op<&2, MergeResult>
Persists tree, commit and index for merged entries.
def persist_merge_outcome source · line 407 · raw
@merge_outcome:MergeOutcome -> @+first_identifier:String -> @+second_identifier:String -> @+base_identifier:String -> 0xf481b310e24036f2ebffda42e94b3b4c/src/Store.Op<&2, MergeResult>
Persists merges; conflicts become results directly.
def merge_three_way source · line 415 · raw
@+first_identifier:String -> @+second_identifier:String -> @+base_identifier:String -> 0xf481b310e24036f2ebffda42e94b3b4c/src/Store.Op<&2, MergeResult>
Loads the three trees and merges them.
def branch_lca_search source · line 428 · raw
@lca_maybe:Maybe<&2, String> -> @+first_identifier:String -> @+second_identifier:String -> 0xf481b310e24036f2ebffda42e94b3b4c/src/Store.Op<&2, MergeResult>
Merges on the ancestor; missing ancestors are unprovable.
def merge_with_ancestor_search source · line 436 · raw
@+first_identifier:String -> @+second_identifier:String -> 0xf481b310e24036f2ebffda42e94b3b4c/src/Store.Op<&2, MergeResult>
Finds the lowest common ancestor, then merges.
def decide_strategy_name source · line 444 · raw
@strategy_matches:Bool -> @+first_identifier:String -> @+second_identifier:String -> 0xf481b310e24036f2ebffda42e94b3b4c/src/Store.Op<&2, MergeResult>
Only union-disjoint merges; anything else is unprovable.
def merge_commits source · line 452 · raw
@+first_identifier:String -> @+second_identifier:String -> @+strategy_name:String -> 0xf481b310e24036f2ebffda42e94b3b4c/src/Store.Op<&2, MergeResult>
Merges two commits by strategy name.