aboutsummaryrefslogtreecommitdiffstats
path: root/lib/management/branch.ml
diff options
context:
space:
mode:
authorMarcos Magueta <maguetamarcos@gmail.com>2026-04-03 16:17:38 -0300
committerMarcos Magueta <maguetamarcos@gmail.com>2026-04-03 16:17:38 -0300
commit63ae3c930de89af6f85229a467caa3f53cb844a2 (patch)
treecda4d513672f9fefa09c3a1dff69d8443890e224 /lib/management/branch.ml
parentc5bc3a4992b4968780c286a084ad7c02b2b58f1e (diff)
downloadSakura-63ae3c930de89af6f85229a467caa3f53cb844a2.tar.gz
Sakura-63ae3c930de89af6f85229a467caa3f53cb844a2.zip
format
Diffstat (limited to '')
-rw-r--r--lib/management/branch.ml99
1 files changed, 47 insertions, 52 deletions
diff --git a/lib/management/branch.ml b/lib/management/branch.ml
index 70dfd85..ea15311 100644
--- a/lib/management/branch.ml
+++ b/lib/management/branch.ml
@@ -4,13 +4,8 @@
- "branch_names" → serialized string list (index for enumeration)
- "head" → branch name as raw bytes *)
-type t = {
- name : string;
- tip : Conventions.Hash.t;
-}
-
+type t = { name : string; tip : Conventions.Hash.t }
type head = string
-
type error = string
let branch_key name = "branch:" ^ name
@@ -18,7 +13,6 @@ let head_key = "head"
let names_key = "branch_names"
module Make (Storage : Physical.S with type error = string) = struct
-
let load_names storage =
match Storage.load_raw storage names_key with
| Ok (Some bytes) -> (Marshal.from_bytes bytes 0 : string list)
@@ -31,13 +25,12 @@ module Make (Storage : Physical.S with type error = string) = struct
let create storage ~name ~tip =
let record = { name; tip } in
let bytes = Marshal.to_bytes record [] in
- (match Storage.store_raw storage (branch_key name) bytes with
- | Error e -> Error e
- | Ok () ->
- let names = load_names storage in
- if not (List.mem name names) then
- store_names storage (name :: names);
- Ok ())
+ match Storage.store_raw storage (branch_key name) bytes with
+ | Error e -> Error e
+ | Ok () ->
+ let names = load_names storage in
+ if not (List.mem name names) then store_names storage (name :: names);
+ Ok ()
let checkout storage branch_name =
let bytes = Bytes.of_string branch_name in
@@ -52,27 +45,30 @@ module Make (Storage : Physical.S with type error = string) = struct
let get_tip storage name =
match Storage.load_raw storage (branch_key name) with
| Ok (Some bytes) ->
- let record : t = Marshal.from_bytes bytes 0 in
- Ok (Some record.tip)
+ let record : t = Marshal.from_bytes bytes 0 in
+ Ok (Some record.tip)
| Ok None -> Ok None
| Error e -> Error e
let update_tip storage ~name ~tip =
match Storage.load_raw storage (branch_key name) with
| Ok (Some _) ->
- let record = { name; tip } in
- let bytes = Marshal.to_bytes record [] in
- Storage.store_raw storage (branch_key name) bytes
+ let record = { name; tip } in
+ let bytes = Marshal.to_bytes record [] in
+ Storage.store_raw storage (branch_key name) bytes
| Ok None -> Error ("Branch not found: " ^ name)
| Error e -> Error e
let list storage =
let names = load_names storage in
- let branches = List.filter_map (fun name ->
- match get_tip storage name with
- | Ok (Some tip) -> Some (name, tip)
- | _ -> None
- ) names in
+ let branches =
+ List.filter_map
+ (fun name ->
+ match get_tip storage name with
+ | Ok (Some tip) -> Some (name, tip)
+ | _ -> None)
+ names
+ in
Ok branches
let branch_relation storage : Relation.t =
@@ -83,23 +79,22 @@ module Make (Storage : Physical.S with type error = string) = struct
let rec generator position =
match position with
| None -> Generator.Error "random access not supported for sakura:branch"
- | Some pos ->
- (match list storage with
- | Error _ -> Generator.Done
- | Ok branches ->
- if pos >= List.length branches then Generator.Done
- else
- let (name, tip) = List.nth branches pos in
- let short = String.sub tip 0 (min 8 (String.length tip)) in
- let attributes =
- Tuple.AttributeMap.of_list
- [ ("name", mk name)
- ; ("hash", mk short)
- ]
- in
- Generator.Value
- ( Tuple.make_materialized ~relation:Prelude.Catalog.branch_rel_name ~attributes
- , generator ))
+ | Some pos -> (
+ match list storage with
+ | Error _ -> Generator.Done
+ | Ok branches ->
+ if pos >= List.length branches then Generator.Done
+ else
+ let name, tip = List.nth branches pos in
+ let short = String.sub tip 0 (min 8 (String.length tip)) in
+ let attributes =
+ Tuple.AttributeMap.of_list
+ [ ("name", mk name); ("hash", mk short) ]
+ in
+ Generator.Value
+ ( Tuple.make_materialized
+ ~relation:Prelude.Catalog.branch_rel_name ~attributes,
+ generator ))
in
Relation.make ~hash:None ~name:Prelude.Catalog.branch_rel_name ~schema
~tree:None ~constraints:None
@@ -115,16 +110,17 @@ module Make (Storage : Physical.S with type error = string) = struct
let generator position =
match position with
| None -> Generator.Error "random access not supported for sakura:head"
- | Some 0 ->
- (match get_head storage with
- | Ok None | Error _ -> Generator.Done
- | Ok (Some branch_name) ->
- let attributes =
- Tuple.AttributeMap.of_list [ ("branch", mk branch_name) ]
- in
- Generator.Value
- ( Tuple.make_materialized ~relation:Prelude.Catalog.head_rel_name ~attributes
- , fun _ -> Generator.Done ))
+ | Some 0 -> (
+ match get_head storage with
+ | Ok None | Error _ -> Generator.Done
+ | Ok (Some branch_name) ->
+ let attributes =
+ Tuple.AttributeMap.of_list [ ("branch", mk branch_name) ]
+ in
+ Generator.Value
+ ( Tuple.make_materialized
+ ~relation:Prelude.Catalog.head_rel_name ~attributes,
+ fun _ -> Generator.Done ))
| Some _ -> Generator.Done
in
Relation.make ~hash:None ~name:Prelude.Catalog.head_rel_name ~schema
@@ -134,5 +130,4 @@ module Make (Storage : Physical.S with type error = string) = struct
~membership_criteria:(fun _ -> true)
~provenance:(Relation.Provenance.Base Prelude.Catalog.head_rel_name)
~lineage:(Relation.Lineage.Base Prelude.Catalog.head_rel_name)
-
end