diff --git a/bin/commandInstall.ml b/bin/commandInstall.ml index 3a9d105..d2c80a4 100644 --- a/bin/commandInstall.ml +++ b/bin/commandInstall.ml @@ -13,7 +13,7 @@ let transitive_closure map = | None -> visited | Some cur -> match Map.find map cur with - | None -> failwithf "Packages %s is not found\n" cur (); + | None -> failwithf "Library %s is not found\n" cur (); | Some nexts -> let visited = StringSet.add visited cur in let queue = StringSet.union (StringSet.remove queue cur) (StringSet.diff nexts visited) in @@ -22,98 +22,98 @@ let transitive_closure map = (* TODO Install transitive dependencies *) -let get_packages ~reg ~reg_opam ~packages = - let dist_package_dir = SatysfiDirs.satysfi_dist_dir () in - Printf.printf "Reading runtime dist: %s\n" dist_package_dir; - let dist_package = Package.read_dir dist_package_dir in - let user_packages = Registry.list reg +let get_libraries ~reg ~reg_opam ~libraries = + let dist_library_dir = SatysfiDirs.satysfi_dist_dir () in + Printf.printf "Reading runtime dist: %s\n" dist_library_dir; + let dist_library = Library.read_dir dist_library_dir in + let user_libraries = Registry.list reg |> StringSet.of_list |> StringSet.to_map ~f:(Registry.directory reg) in - Printf.printf "Read user packages: %s\n" (user_packages |> Map.keys |> [%sexp_of: string list] |> Sexp.to_string_hum); - let opam_packages = match reg_opam with + Printf.printf "Read user libraries: %s\n" (user_libraries |> Map.keys |> [%sexp_of: string list] |> Sexp.to_string_hum); + let opam_libraries = match reg_opam with | None -> StringSet.to_map StringSet.empty ~f:ident | Some reg_opam -> SatysfiRegistry.list reg_opam |> StringSet.of_list |> StringSet.to_map ~f:(SatysfiRegistry.directory reg_opam) in - Printf.printf "Reading opam packages: %s\n" (opam_packages |> Map.keys |> [%sexp_of: string list] |> Sexp.to_string_hum); - let all_packages = - Map.merge opam_packages user_packages ~f:(fun ~key -> function - | `Left x -> Package.read_dir x |> Some - | `Right x -> Package.read_dir x |> Some + Printf.printf "Reading opam libraries: %s\n" (opam_libraries |> Map.keys |> [%sexp_of: string list] |> Sexp.to_string_hum); + let all_libraries = + Map.merge opam_libraries user_libraries ~f:(fun ~key -> function + | `Left x -> Library.read_dir x |> Some + | `Right x -> Library.read_dir x |> Some | `Both (_, x) -> - Printf.printf "Package %s is provided by both the user local and opam repositories\n" key; - Package.read_dir x |> Some) in - let required_packages = match packages with - | None -> all_packages - | Some packages -> let package_dependency = - Map.map all_packages ~f:(fun p -> p.Package.dependencies) in - let packages_to_install = transitive_closure package_dependency (StringSet.of_list packages) in - Map.filter_keys all_packages ~f:(StringSet.mem packages_to_install) + Printf.printf "Library %s is provided by both the user local and opam repositories\n" key; + Library.read_dir x |> Some) in + let required_libraries = match libraries with + | None -> all_libraries + | Some libraries -> let library_dependency = + Map.map all_libraries ~f:(fun p -> p.Library.dependencies) in + let libraries_to_install = transitive_closure library_dependency (StringSet.of_list libraries) in + Map.filter_keys all_libraries ~f:(StringSet.mem libraries_to_install) in - match Map.add required_packages ~key:"dist" ~data:dist_package with + match Map.add required_libraries ~key:"dist" ~data:dist_library with | `Ok result -> result | `Duplicate -> Printf.printf "Overriding dist with user installed one"; - required_packages + required_libraries -let install d ~system_font_prefix ~packages ~verbose ~copy () = +let install d ~system_font_prefix ~libraries ~verbose ~copy () = (* TODO build all *) - Printf.printf "Updating packages\n"; + Printf.printf "Updating libraries\n"; begin match Repository.update_all repo with - | Some updated_packages -> begin - Printf.printf "Updated packages: "; - [%derive.show: string list] updated_packages |> print_endline + | Some updated_libraries -> begin + Printf.printf "Updated libraries: "; + [%derive.show: string list] updated_libraries |> print_endline end | None -> - Printf.printf "No packages updated\n" + Printf.printf "No libraries updated\n" end; - Printf.printf "Building updated packages\n"; + Printf.printf "Building updated libraries\n"; begin match Registry.update_all reg with - | Some updated_packages -> begin - Printf.printf "Built packages: "; - [%derive.show: string list] updated_packages |> print_endline + | Some updated_libraries -> begin + Printf.printf "Built libraries: "; + [%derive.show: string list] updated_libraries |> print_endline end | None -> - Printf.printf "No packages built\n" + Printf.printf "No libraries built\n" end; - let package_map = get_packages ~reg ~reg_opam ~packages in - let packages = package_map |> Map.data in - Printf.printf "Installing packages: "; - Map.keys package_map |> [%sexp_of: string list] |> Sexp.to_string_hum |> print_endline; - let packages = match system_font_prefix with - | None -> Printf.printf "Not gathering system fonts\n"; packages + let library_map = get_libraries ~reg ~reg_opam ~libraries in + let libraries = library_map |> Map.data in + Printf.printf "Installing libraries: "; + Map.keys library_map |> [%sexp_of: string list] |> Sexp.to_string_hum |> print_endline; + let libraries = match system_font_prefix with + | None -> Printf.printf "Not gathering system fonts\n"; libraries | Some(prefix) -> Printf.printf "Gathering system fonts with prefix %s\n" prefix; - let systemFontPackage = SystemFontPackage.get_package prefix () in - List.cons systemFontPackage packages + let systemFontLibrary = SystemFontLibrary.get_library prefix () in + List.cons systemFontLibrary libraries in - let merged = packages - |> List.fold_left ~f:Package.union ~init:Package.empty + let merged = libraries + |> List.fold_left ~f:Library.union ~init:Library.empty in - match FileUtil.test FileUtil.Is_dir d, Package.is_managed_dir d with + match FileUtil.test FileUtil.Is_dir d, Library.is_managed_dir d with | true, false -> Printf.printf "Directory %s is not managed by Satyrographos.\n" d; Printf.printf "Please remove %s first.\n" d | _, _ -> Printf.printf "Removing destination %s\n" d; FileUtil.(rm ~force:Force ~recurse:true [d]); - Package.mark_managed_dir d; + Library.mark_managed_dir d; if verbose then begin - Printf.printf "Loaded packages\n"; - [%sexp_of: Package.t list] packages + Printf.printf "Loaded libraries\n"; + [%sexp_of: Library.t list] libraries |> Sexp.to_string_hum |> print_endline; Printf.printf "Installing %s\n" d; - [%sexp_of: Package.t] merged + [%sexp_of: Library.t] merged |> Sexp.to_string_hum |> print_endline end; - Package.write_dir ~symlink:(not copy) d merged; - List.iter ~f:(Printf.printf "WARNING: %s") (Package.validate merged); + Library.write_dir ~symlink:(not copy) d merged; + List.iter ~f:(Printf.printf "WARNING: %s") (Library.validate merged); Printf.printf "Installation completed!\n" let install_command = @@ -126,14 +126,14 @@ let install_command = ~readme [%map_open let system_font_prefix = flag "system-font-prefix" (optional string) ~doc:"FONT_NAME_PREFIX Installing system fonts with names with the given prefix" - and package_list = flag "package" (listed string) ~doc:"PACKAGE Package" + and library_list = flag "library" (listed string) ~doc:"LIBRARY Library" and target_dir = anon (maybe_with_default default_target_dir ("DIR" %: string)) and verbose = flag "verbose" no_arg ~doc:"Make verbose" and copy = flag "copy" no_arg ~doc:"Copy files instead of making symlinks" in fun () -> - let packages = match package_list with + let libraries = match library_list with | [] -> None | xs -> Some xs in - install target_dir ~system_font_prefix ~packages ~verbose ~copy () + install target_dir ~system_font_prefix ~libraries ~verbose ~copy () ] diff --git a/bin/commandLibrary.ml b/bin/commandLibrary.ml new file mode 100644 index 0000000..c8eae61 --- /dev/null +++ b/bin/commandLibrary.ml @@ -0,0 +1,75 @@ +open Satyrographos +open Core + +open Setup + + +let library_show_command_g p_show = + let open Command.Let_syntax in + Command.basic + ~summary:"Show library information (experimental)" + [%map_open + let p = anon ("LIBRARY" %: string) + in + fun () -> + p_show p () + ] +let library_list_command_g p_list = + let open Command.Let_syntax in + Command.basic + ~summary:"Show list of libraries installed (experimental)" + [%map_open + let _ = args (* ToDo: Remove this *) + in + fun () -> + p_list () + ] + +let library_list () = + Compatibility.optin (); + [%derive.show: string list] (Registry.list reg) |> print_endline +let library_list_command = + library_list_command_g library_list + +let library_show p () = + Compatibility.optin (); + Registry.directory reg p + |> Library.read_dir + |> [%sexp_of: Library.t] + |> Sexp.to_string_hum + |> print_endline +let library_show_command = + library_show_command_g library_show + +let library_command = + Command.group ~summary:"Install libraries (experimental)" + [ "list", library_list_command; (* ToDo: use this default*) + "show", library_show_command; + ] + + +let library_opam_list () = + Compatibility.optin (); + Option.iter reg_opam ~f:(fun reg_opam -> + [%derive.show: string list] (SatysfiRegistry.list reg_opam) |> print_endline + ) +let library_opam_list_command = + library_list_command_g library_opam_list + +let library_opam_show p () = + Compatibility.optin (); + Option.iter reg_opam ~f:(fun reg_opam -> + SatysfiRegistry.directory reg_opam p + |> Library.read_dir + |> [%sexp_of: Library.t] + |> Sexp.to_string_hum + |> print_endline + ) +let library_opam_show_command = + library_show_command_g library_opam_show + +let library_opam_command = + Command.group ~summary:"Inspect libraries installed in the OPAM managed directory (experimental)" + [ "list", library_opam_list_command; (* ToDo: use this default*) + "show", library_opam_show_command; + ] diff --git a/bin/commandOpam.ml b/bin/commandOpam.ml index db55e51..6b7f100 100644 --- a/bin/commandOpam.ml +++ b/bin/commandOpam.ml @@ -4,19 +4,19 @@ open Core module StringMap = Map.Make(String) -let package_dir prefix buildscript = +let library_dir prefix buildscript = let libdir = Filename.concat prefix "share/satysfi" in Filename.concat libdir buildscript.BuildScript.name let install_opam ~verbose ~prefix ~build_module ~buildscript_path = let src_dir = Filename.dirname buildscript_path in - let p = BuildScript.read_package ~src_dir build_module in - if verbose then [%sexp_of: Package.t] p |> Sexp.to_string_hum |> Printf.printf "Read package:\n%s\n"; - let dir = package_dir prefix build_module in - Package.write_dir ~verbose ~symlink:false dir p + let p = BuildScript.read_library ~src_dir build_module in + if verbose then [%sexp_of: Library.t] p |> Sexp.to_string_hum |> Printf.printf "Read library:\n%s\n"; + let dir = library_dir prefix build_module in + Library.write_dir ~verbose ~symlink:false dir p let uninstall_opam ~verbose:_ ~prefix ~build_module ~buildscript_path:_ = - let dir = package_dir prefix build_module in + let dir = library_dir prefix build_module in FileUtil.(rm ~force:Force ~recurse:true [dir]) let default_script_path () = diff --git a/bin/commandPackage.ml b/bin/commandPackage.ml deleted file mode 100644 index 55ce60d..0000000 --- a/bin/commandPackage.ml +++ /dev/null @@ -1,75 +0,0 @@ -open Satyrographos -open Core - -open Setup - - -let package_show_command_g p_show = - let open Command.Let_syntax in - Command.basic - ~summary:"Show package information (experimental)" - [%map_open - let p = anon ("PACKAGE" %: string) - in - fun () -> - p_show p () - ] -let package_list_command_g p_list = - let open Command.Let_syntax in - Command.basic - ~summary:"Show list of packages installed (experimental)" - [%map_open - let _ = args (* ToDo: Remove this *) - in - fun () -> - p_list () - ] - -let package_list () = - Compatibility.optin (); - [%derive.show: string list] (Registry.list reg) |> print_endline -let package_list_command = - package_list_command_g package_list - -let package_show p () = - Compatibility.optin (); - Registry.directory reg p - |> Package.read_dir - |> [%sexp_of: Package.t] - |> Sexp.to_string_hum - |> print_endline -let package_show_command = - package_show_command_g package_show - -let package_command = - Command.group ~summary:"Install packages (experimental)" - [ "list", package_list_command; (* ToDo: use this default*) - "show", package_show_command; - ] - - -let package_opam_list () = - Compatibility.optin (); - Option.iter reg_opam ~f:(fun reg_opam -> - [%derive.show: string list] (SatysfiRegistry.list reg_opam) |> print_endline - ) -let package_opam_list_command = - package_list_command_g package_opam_list - -let package_opam_show p () = - Compatibility.optin (); - Option.iter reg_opam ~f:(fun reg_opam -> - SatysfiRegistry.directory reg_opam p - |> Package.read_dir - |> [%sexp_of: Package.t] - |> Sexp.to_string_hum - |> print_endline - ) -let package_opam_show_command = - package_show_command_g package_opam_show - -let package_opam_command = - Command.group ~summary:"Inspect packages installed in the OPAM managed directory (experimental)" - [ "list", package_opam_list_command; (* ToDo: use this default*) - "show", package_opam_show_command; - ] diff --git a/bin/commandPin.ml b/bin/commandPin.ml index d2bc201..3221395 100644 --- a/bin/commandPin.ml +++ b/bin/commandPin.ml @@ -9,7 +9,7 @@ let pin_list () = let pin_list_command = let open Command.Let_syntax in Command.basic - ~summary:"List installed packages (experimental)" + ~summary:"List installed libraries (experimental)" [%map_open let _ = args (* ToDo: Remove this *) in @@ -23,9 +23,9 @@ let pin_dir p () = let pin_dir_command = let open Command.Let_syntax in Command.basic - ~summary:"Get directory where package PACKAGE is stored (experimental)" + ~summary:"Get directory where library LIBRARY is stored (experimental)" [%map_open - let p = anon ("PACKAGE" %: string) + let p = anon ("LIBRARY" %: string) in fun () -> pin_dir p () @@ -34,20 +34,20 @@ let pin_dir_command = let pin_add p url () = Compatibility.optin (); Printf.printf "Compatibility warning: Although currently Satyrographos simply copies the given directory,\n"; - Printf.printf "it will have a build script to control package installation, which is a breaking change."; + Printf.printf "it will have a build script to control library installation, which is a breaking change."; Uri.of_string url |> Repository.add repo p |> ignore; Printf.printf "Added %s (%s)\n" p url; Registry.update_all reg |> [%derive.show: string list option] - |> Printf.printf "Built packages: %s\n" + |> Printf.printf "Built libraries: %s\n" let pin_add_command = let open Command.Let_syntax in Command.basic - ~summary:"Add package with name PACKAGE copying from URL (experimental)" + ~summary:"Add library with name LIBRARY copying from URL (experimental)" [%map_open - let p = anon ("PACKAGE" %: string) + let p = anon ("LIBRARY" %: string) and url = anon ("URL" %: string) (* TODO define Url.t Arg_type.t *) in fun () -> @@ -56,22 +56,22 @@ let pin_add_command = let pin_remove p () = Compatibility.optin (); - (* TODO remove the package *) + (* TODO remove the library *) Repository.remove repo p; Printf.printf "Removed %s\n" p let pin_remove_command = let open Command.Let_syntax in Command.basic - ~summary:"Remove package (experimental)" + ~summary:"Remove library (experimental)" [%map_open - let p = anon ("PACKAGE" %: string) (* ToDo: Remove this *) + let p = anon ("LIBRARY" %: string) (* ToDo: Remove this *) in fun () -> pin_remove p () ] let pin_command = - Command.group ~summary:"Manipulate packages (experimental)" + Command.group ~summary:"Manipulate libraries (experimental)" [ "list", pin_list_command; (* ToDo: use this default*) "dir", pin_dir_command; "add", pin_add_command; diff --git a/bin/commandStatus.ml b/bin/commandStatus.ml index 3a24271..54d1ce4 100644 --- a/bin/commandStatus.ml +++ b/bin/commandStatus.ml @@ -9,7 +9,7 @@ let status () = [%derive.show: int option] current_scheme_version |> print_endline; printf "Source repository: "; [%derive.show: string list] (Repository.list repo) |> print_endline; - printf "Built package registry: "; + printf "Built library registry: "; [%derive.show: string list] (Registry.list reg) |> print_endline; printf "SATySFi runtime directories: "; [%derive.show: string list] (SatysfiDirs.runtime_dirs ()) |> print_endline; diff --git a/bin/dune b/bin/dune index 03c9251..2758faf 100644 --- a/bin/dune +++ b/bin/dune @@ -3,4 +3,4 @@ (public_name satyrographos) (preprocess (pps ppx_deriving.std ppx_jane)) (libraries core satyrographos uri) - (modules setup compatibility commandInstall commandOpam commandPackage commandPin commandStatus main)) + (modules setup compatibility commandInstall commandLibrary commandOpam commandPin commandStatus main)) diff --git a/bin/main.ml b/bin/main.ml index 0d75a66..34b4a99 100644 --- a/bin/main.ml +++ b/bin/main.ml @@ -5,8 +5,8 @@ let total_command = Command.group ~summary:"Simple SATySFi Package Manager" [ "opam", CommandOpam.opam_command; - "package", CommandPackage.package_command; - "package-opam", CommandPackage.package_opam_command; + "library", CommandLibrary.library_command; + "library-opam", CommandLibrary.library_opam_command; "status", CommandStatus.status_command; "pin", CommandPin.pin_command; "install", CommandInstall.install_command; diff --git a/bin/setup.ml b/bin/setup.ml index a179f61..0592079 100644 --- a/bin/setup.ml +++ b/bin/setup.ml @@ -10,18 +10,18 @@ let prefix = match SatysfiDirs.home_dir () with let target_dist_dir = Filename.concat prefix ".satysfi" let root_dir = Filename.concat prefix ".satyrographos" let repository_dir = SatyrographosDirs.repository_dir root_dir -let package_dir = SatyrographosDirs.package_dir root_dir +let library_dir = SatyrographosDirs.library_dir root_dir let metadata_file = SatyrographosDirs.metadata_file root_dir -let current_scheme_version = Version.get_version root_dir +let current_scheme_version = SatyrographosDirs.get_scheme_version root_dir (* TODO Move this to a new module *) let initialize () = match current_scheme_version with | None -> Repository.initialize repository_dir metadata_file; - Registry.initialize package_dir metadata_file; - Version.mark_version root_dir scheme_version + Registry.initialize library_dir metadata_file; + SatyrographosDirs.mark_scheme_version root_dir scheme_version | Some 0 -> Printf.sprintf "Semantics of `pin add` has been changed.\nPlease remove %s to continue." root_dir |> failwith | Some 1 -> () | Some v -> Printf.sprintf "Unknown scheme version %d" v |> failwith @@ -32,11 +32,11 @@ let () = (* Source repository *) let repo = Repository.read repository_dir metadata_file (* Binary registry *) -let reg = Registry.read package_dir repo metadata_file +let reg = Registry.read library_dir repo metadata_file let reg_opam = SatysfiDirs.opam_share_dir () |> Option.map ~f:(fun opam_share_dir -> - {SatysfiRegistry.package_dir=Filename.concat opam_share_dir "satysfi"}) + SatysfiRegistry.read (Filename.concat opam_share_dir "satysfi")) let default_target_dir = Sys.getenv "SATYSFI_RUNTIME" diff --git a/src/SatyrographosDirs.ml b/src/SatyrographosDirs.ml deleted file mode 100644 index 5a86195..0000000 --- a/src/SatyrographosDirs.ml +++ /dev/null @@ -1,7 +0,0 @@ -open Core - -let repository_dir sg_dir = Filename.concat sg_dir "repo" -let package_dir sg_dir = Filename.concat sg_dir "packages" -let metadata_file sg_dir = Filename.concat sg_dir "metadata" - -let current_scheme_version sg_dir = Version.get_version sg_dir diff --git a/src/buildScript.ml b/src/buildScript.ml index 727c5fe..9fff3bd 100644 --- a/src/buildScript.ml +++ b/src/buildScript.ml @@ -57,10 +57,10 @@ type package = { name: string; opam: string; sources: sources [@sexp.omit_nil]; - dependencies: Package.Dependency.t [@sexp.omit_nil]; + dependencies: Library.Dependency.t [@sexp.omit_nil]; } [@@deriving sexp] -type section = Package of { +type section = Library of { name: string; opam: string; sources: source list @@ -82,14 +82,14 @@ let input ch = let sexp = Sexp.input_sexps ch in let modules = sexp |> List.concat_map ~f:(fun sexp -> match [%of_sexp: section] sexp with - | Package {name; opam; sources; dependencies} -> + | Library {name; opam; sources; dependencies} -> let sources = List.fold_left ~init:empty_sources ~f:begin fun acc -> function | File (dst, src) -> add_files dst src acc | Font (dst, src) -> add_fonts dst src acc | Hash (dst, src) -> add_hashes dst src acc | Package (dst, src) -> add_packages dst src acc end sources in - let dependencies = List.map dependencies ~f:fst |> Package.Dependency.of_list in + let dependencies = List.map dependencies ~f:fst |> Library.Dependency.of_list in [{name; opam; sources; dependencies}] ) in List.map ~f:(fun m -> m.name, m) modules @@ -112,18 +112,18 @@ let export_opam_package p = let export_opam bs = StringMap.iter bs ~f:export_opam_package -let read_package p ~src_dir = +let read_library p ~src_dir = let map_file dst_dir = List.map ~f:(fun (dst, src) -> (Filename.concat dst_dir dst, Filename.concat src_dir src)) in let other_files = map_file "" p.sources.files in let hashes = map_file "hash" p.sources.hashes - |> List.fold ~init:Package.empty ~f:(fun a (dst, src) -> Package.add_hash dst src a) + |> List.fold ~init:Library.empty ~f:(fun a (dst, src) -> Library.add_hash dst src a) in let fonts = map_file (Filename.concat "fonts" p.name) p.sources.fonts in let packages = map_file (Filename.concat "packages" p.name) p.sources.packages in - Package.{ - files=List.concat [other_files; fonts; packages] |> Package.PackageFiles.of_alist_exn; - hashes=PackageFiles.empty; + Library.{ + files=List.concat [other_files; fonts; packages] |> Library.LibraryFiles.of_alist_exn; + hashes=LibraryFiles.empty; dependencies=p.dependencies; } - |> Package.union hashes + |> Library.union hashes diff --git a/src/package.ml b/src/library.ml similarity index 89% rename from src/package.ml rename to src/library.ml index ac255c5..8e410d8 100644 --- a/src/package.ml +++ b/src/library.ml @@ -1,6 +1,6 @@ open Core -module PackageFiles = struct +module LibraryFiles = struct include Map.Make(String) let union f = merge ~f:(fun ~key:key -> function @@ -23,15 +23,15 @@ module StringMap = Map.Make(String) module JsonSet = Set.Make(Json) type t = { - hashes: (string list * Json.t) PackageFiles.t; - files: string PackageFiles.t; + hashes: (string list * Json.t) LibraryFiles.t; + files: string LibraryFiles.t; dependencies: Dependency.t; } [@@deriving sexp, compare] let empty = { - hashes = PackageFiles.empty; - files = PackageFiles.empty; + hashes = LibraryFiles.empty; + files = LibraryFiles.empty; dependencies = Dependency.empty; } @@ -70,9 +70,9 @@ let validate_hash f abs_fs = function | _ -> [f ^ " is not an object. Originally from " ^ show_file_list abs_fs] let validate p = - PackageFiles.mapi p.hashes + LibraryFiles.mapi p.hashes ~f:(fun ~key:f ~data:(abs_fs, h) -> validate_hash f abs_fs h) - |> PackageFiles.data + |> LibraryFiles.data |> List.concat let normalize_hash = function @@ -90,7 +90,7 @@ let normalize_hash = function j let normalize p = { - hashes = PackageFiles.map p.hashes ~f:(fun (paths, json) -> paths, normalize_hash json); + hashes = LibraryFiles.map p.hashes ~f:(fun (paths, json) -> paths, normalize_hash json); files = p.files; dependencies = p.dependencies; } @@ -98,11 +98,11 @@ let normalize p = { let add_file f absolute_path p = if FilePath.is_relative absolute_path then failwith ("BUG: FilePath must be absolute but got " ^ absolute_path) - else { p with files = PackageFiles.add_exn ~key:f ~data:absolute_path p.files } + else { p with files = LibraryFiles.add_exn ~key:f ~data:absolute_path p.files } let add_hash f abs_f p = let json = Json.from_file abs_f in - { p with hashes = PackageFiles.add_exn ~key:f ~data:([abs_f], json) p.hashes } + { p with hashes = LibraryFiles.add_exn ~key:f ~data:([abs_f], json) p.hashes } let union p1 p2 = let handle_file_conflict f f1 f2 = match FileUtil.cmp f1 f2 with @@ -114,8 +114,8 @@ let union p1 p2 = | `Assoc a1, `Assoc a2 -> Some(List.append f1 f2, `Assoc (List.append a1 a2)) (* TODO: Handle conflicting cases*) | _, _ -> failwith ("Conflicting file " ^ f ^ "\n " ^ show_file_list f1 ^ "\n and \n " ^ show_file_list f2) in - { hashes = PackageFiles.union handle_hash_conflict p1.hashes p2.hashes; - files = PackageFiles.union handle_file_conflict p1.files p2.files; + { hashes = LibraryFiles.union handle_hash_conflict p1.hashes p2.hashes; + files = LibraryFiles.union handle_file_conflict p1.files p2.files; dependencies = Dependency.union p1.dependencies p2.dependencies } @@ -160,12 +160,12 @@ let read_dir d = in if FileUtil.test FileUtil.Is_dir d then FileUtil.(find ~follow:Follow Is_file d add empty) - else failwith (d ^ " is not a package directory") + else failwith (d ^ " is not a library directory") let write_dir ?(verbose=false) ?(symlink=false) d p = let p = normalize p in FileUtil.mkdir ~parent:true d; - PackageFiles.iteri ~f:(fun ~key:path ~data:fullpath -> + LibraryFiles.iteri ~f:(fun ~key:path ~data:fullpath -> let file_dst = FilePath.concat d path in let action = if symlink then "Linking" @@ -185,7 +185,7 @@ let write_dir ?(verbose=false) ?(symlink=false) d p = UnixLabels.symlink ~to_dir:false ~src:fullpath ~dst:file_dst else FileUtil.cp [fullpath] file_dst ) p.files; - PackageFiles.iteri ~f:(fun ~key:path ~data:(_, h) -> + LibraryFiles.iteri ~f:(fun ~key:path ~data:(_, h) -> let file_dst = FilePath.concat d path in begin if verbose then Printf.printf "Generating %s\n" file_dst diff --git a/src/metadata.ml b/src/metadata.ml index eabe9cd..027b67f 100644 --- a/src/metadata.ml +++ b/src/metadata.ml @@ -7,22 +7,22 @@ module Uri_sexp = struct let compare = Uri.compare end -type package_name = string -exception RegisteredAlready of package_name +type library_name = string +exception RegisteredAlready of library_name -module Packages = String.Map +module Libraries = String.Map type entry = { url: Uri_sexp.t; } [@@deriving sexp] type t = { - packages: entry Packages.t; + libraries: entry Libraries.t; } [@@deriving sexp] type store = string let empty = { - packages = Packages.empty; + libraries = Libraries.empty; } let initialize file = @@ -42,15 +42,15 @@ let with_modifying_file file ~f = |> [%sexp_of: t] |> Sexp.save_hum file -let list reg = with_reading_file reg ~f:(fun m -> Packages.keys m.packages) -let find reg name = with_reading_file reg ~f:(fun m -> Packages.find m.packages name) -let mem reg name = with_reading_file reg ~f:(fun m -> Packages.mem m.packages name) -let remove reg name = with_modifying_file reg ~f:(fun m -> {packages = Packages.remove m.packages name}) +let list reg = with_reading_file reg ~f:(fun m -> Libraries.keys m.libraries) +let find reg name = with_reading_file reg ~f:(fun m -> Libraries.find m.libraries name) +let mem reg name = with_reading_file reg ~f:(fun m -> Libraries.mem m.libraries name) +let remove reg name = with_modifying_file reg ~f:(fun m -> {libraries = Libraries.remove m.libraries name}) let remove_multiple reg names = let name_set = String.Set.of_list names in with_modifying_file reg ~f:(fun m -> - {packages = Packages.filter_keys ~f:(Fn.compose (not) (String.Set.mem name_set)) m.packages} + {libraries = Libraries.filter_keys ~f:(Fn.compose (not) (String.Set.mem name_set)) m.libraries} ) -let add reg name ent = with_modifying_file reg ~f:(fun m -> {packages = Packages.add_exn m.packages ~key:name ~data:ent}) +let add reg name ent = with_modifying_file reg ~f:(fun m -> {libraries = Libraries.add_exn m.libraries ~key:name ~data:ent}) (* Tests *) diff --git a/src/registry.ml b/src/registry.ml index dff0f8d..dfd2930 100644 --- a/src/registry.ml +++ b/src/registry.ml @@ -1,7 +1,7 @@ open Core -type package_name = string -exception RegisteredAlready of package_name +type library_name = string +exception RegisteredAlready of library_name module StringSet = Set.Make(String) @@ -23,37 +23,37 @@ let remove_multiple reg names = let remove reg name = remove_multiple reg [name] -let build_package reg name = +let build_library reg name = match Metadata.mem reg.metadata name with - | false -> failwith (Printf.sprintf "Package %s is not found" name) + | false -> failwith (Printf.sprintf "Library %s is not found" name) | true -> - (* TODO properly build the package *) + (* TODO properly build the library *) let dir = Repository.directory reg.repository name in - let package = Package.read_dir dir in - Package.to_string package |> print_endline; + let library = Library.read_dir dir in + Library.to_string library |> print_endline; Store.remove reg.registry name; - Store.add_package reg.registry name package + Store.add_library reg.registry name library -(* TODO build only obsoleted packages *) +(* TODO build only obsoleted libraries *) let update_all reg = - let updated_packages = list reg in - List.iter ~f:(build_package reg) updated_packages; - Some updated_packages + let updated_libraries = list reg in + List.iter ~f:(build_library reg) updated_libraries; + Some updated_libraries (* Advanced operations *) let gc reg = - let current_packages = list reg |> StringSet.of_list in - let valid_packages = Metadata.list reg.metadata |> StringSet.of_list in - let broken_packages = StringSet.diff current_packages valid_packages in - StringSet.to_list broken_packages + let current_libraries = list reg |> StringSet.of_list in + let valid_libraries = Metadata.list reg.metadata |> StringSet.of_list in + let broken_libraries = StringSet.diff current_libraries valid_libraries in + StringSet.to_list broken_libraries |> remove_multiple reg -let initialize packages_dir metadata_file = - Store.initialize packages_dir; +let initialize libraries_dir metadata_file = + Store.initialize libraries_dir; Metadata.initialize metadata_file -let read package_dir repository metadata_file = { - registry = Store.read package_dir; +let read library_dir repository metadata_file = { + registry = Store.read library_dir; repository = repository; metadata = metadata_file; } diff --git a/src/repository.ml b/src/repository.ml index db4e446..8433542 100644 --- a/src/repository.ml +++ b/src/repository.ml @@ -1,7 +1,7 @@ open Core -type package_name = string -exception RegisteredAlready of package_name +type library_name = string +exception RegisteredAlready of library_name module StringSet = Set.Make(String) @@ -32,25 +32,25 @@ let add_dir reg name dir = let update reg name = match Metadata.find reg.metadata name with - | None -> failwith (Printf.sprintf "Package %s is not found" name) + | None -> failwith (Printf.sprintf "Library %s is not found" name) | Some metadata -> begin match Uri.scheme metadata.url with | Some "file" -> let dir = Uri.path metadata.url in - let package = Package.read_dir dir in - Package.to_string package |> print_endline; + let library = Library.read_dir dir in + Library.to_string library |> print_endline; Store.remove reg.cache name; - Store.add_package reg.cache name package + Store.add_library reg.cache name library | None -> - failwith (Printf.sprintf "BUG: URL scheme of package %s is unknown." name) + failwith (Printf.sprintf "BUG: URL scheme of library %s is unknown." name) | Some s -> failwith (Printf.sprintf "Unknown scheme %s." s) end -(* TODO build only obsoleted packages *) +(* TODO build only obsoleted libraries *) let update_all reg = - let updated_packages = list reg in - List.iter ~f:(update reg) updated_packages; - Some updated_packages + let updated_libraries = list reg in + List.iter ~f:(update reg) updated_libraries; + Some updated_libraries (* Advanced operations *) (* TODO Implement lock *) @@ -68,18 +68,18 @@ let add reg name uri = update_all reg let gc reg = - let current_packages = list reg |> StringSet.of_list in - let valid_packages = Metadata.list reg.metadata |> StringSet.of_list in - let broken_packages = StringSet.diff current_packages valid_packages in - StringSet.to_list broken_packages + let current_libraries = list reg |> StringSet.of_list in + let valid_libraries = Metadata.list reg.metadata |> StringSet.of_list in + let broken_libraries = StringSet.diff current_libraries valid_libraries in + StringSet.to_list broken_libraries |> remove_multiple reg -let initialize packages_dir metadata_file = - Store.initialize packages_dir; +let initialize libraries_dir metadata_file = + Store.initialize libraries_dir; Metadata.initialize metadata_file -let read package_dir metadata_file = { - cache = Store.read package_dir; +let read library_dir metadata_file = { + cache = Store.read library_dir; metadata = metadata_file; } diff --git a/src/version.ml b/src/satyrographosDirs.ml similarity index 52% rename from src/version.ml rename to src/satyrographosDirs.ml index 9c4fd61..d990f27 100644 --- a/src/version.ml +++ b/src/satyrographosDirs.ml @@ -1,27 +1,26 @@ open Core -let version_filepath d = - FilePath.concat d "version" +let repository_dir sg_dir = Filename.concat sg_dir "repo" +let library_dir sg_dir = Filename.concat sg_dir "libraries" +let metadata_file sg_dir = Filename.concat sg_dir "metadata" +let version_file sg_dir = FilePath.concat sg_dir "version" -let packages_dirpath d = - FilePath.concat d "packages" - -let mark_version d version = - let file = version_filepath d in +let mark_scheme_version d version = + let file = version_file d in let write_version ch = Out_channel.output_string ch (string_of_int version) in Out_channel.with_file file ~append:false ~f:write_version -let get_version d = - let file = version_filepath d in +let get_scheme_version d = + let file = version_file d in let read_version ch = let line = In_channel.input_line ch in Option.value_exn line |> int_of_string in - match FileUtil.test FileUtil.Is_file file, FileUtil.test FileUtil.Is_dir (packages_dirpath d) with - | true, _ -> Some (In_channel.with_file file ~f:read_version) - | false, true -> Some 0 + match FileUtil.test FileUtil.Is_file file, FileUtil.test FileUtil.Is_dir (library_dir d) with | false, false -> None - + | false, true -> Some 0 + | true, false -> Some 0 + | true, _ -> Some (In_channel.with_file file ~f:read_version) diff --git a/src/satysfiRegistry.ml b/src/satysfiRegistry.ml index 91fd28a..1b5c7a4 100644 --- a/src/satysfiRegistry.ml +++ b/src/satysfiRegistry.ml @@ -1,9 +1,10 @@ -type package_name = string - type t = { - package_dir: string; + registy_dir: string; } -let list reg = FileUtil.ls reg.package_dir |> List.map FilePath.basename -let directory reg name = Filename.concat reg.package_dir name +let read registy_dir = { + registy_dir +} +let list reg = FileUtil.ls reg.registy_dir |> List.map FilePath.basename +let directory reg name = Filename.concat reg.registy_dir name let mem reg name = directory reg name |> FileUtil.test FileUtil.Is_dir diff --git a/src/store.ml b/src/store.ml index dc21a4c..bef6e1d 100644 --- a/src/store.ml +++ b/src/store.ml @@ -1,15 +1,15 @@ open Core -type package_name = string -exception RegisteredAlready of package_name +type library_name = string +exception RegisteredAlready of library_name type store = { - package_dir: string; + library_dir: string; } (* Basic operations *) -let list reg = FileUtil.ls reg.package_dir |> List.map ~f:FilePath.basename |> List.sort ~compare:String.compare -let directory reg name = Filename.concat reg.package_dir name +let list reg = FileUtil.ls reg.library_dir |> List.map ~f:FilePath.basename |> List.sort ~compare:String.compare +let directory reg name = Filename.concat reg.library_dir name let mem reg name = directory reg name |> FileUtil.test FileUtil.Is_dir let remove_multiple reg names = List.map ~f:(directory reg) names |> FileUtil.rm ~force:Force ~recurse:true @@ -23,31 +23,31 @@ let add_dir reg name dir = | false, true -> add_dir reg name dir (* | false, false -> FileUtil.cp ~recurse:true [dir] (directory reg name) *) -let add_package reg name package = +let add_library reg name library = if mem reg name then failwith (Printf.sprintf "%s is already registered. Please remove it first." name) - else Package.write_dir (directory reg name) package + else Library.write_dir (directory reg name) library -let initialize packages_dir = - FileUtil.mkdir ~parent:true packages_dir +let initialize libraries_dir = + FileUtil.mkdir ~parent:true libraries_dir -let read package_dir = { - package_dir = package_dir; +let read library_dir = { + library_dir = library_dir; } (* Tests *) open Core let create_new_reg dir = - let packages_dir = Filename.concat dir "packages" in - initialize packages_dir; - read packages_dir + let registry_dir = Filename.concat dir "registry" in + initialize registry_dir; + read registry_dir let with_new_reg f = let dir = Filename.temp_dir "Satyrographos" "Store" in protect ~f:(fun () -> create_new_reg dir |> f) ~finally:(fun () -> FileUtil.rm ~force:Force ~recurse:true [dir]) -let test_package_list ~expect reg = +let test_library_list ~expect reg = [%test_result: string list] ~expect (list reg) -let test_package_content ~expect reg p = +let test_library_content ~expect reg p = [%test_result: string list] ~expect begin let target_dir = directory reg p in target_dir |> FileUtil.ls |> List.map ~f:(FilePath.make_relative target_dir) @@ -58,62 +58,62 @@ let%test "store: list: empty" = with_new_reg begin fun reg -> list reg = [] end let%test_unit "store: add empty dir" = with_new_reg begin fun reg -> - let dir = Filename.temp_dir "Satyrographos" "Package" in + let dir = Filename.temp_dir "Satyrographos" "Library" in add_dir reg "a" dir; - test_package_list ~expect:["a"] reg; + test_library_list ~expect:["a"] reg; [%test_result: bool] ~expect:true (mem reg "a"); [%test_result: bool] ~expect:false (mem reg "b"); [%test_result: bool] ~expect:true (directory reg "a" |> FileUtil.(test Is_dir )) end let%test_unit "store: add nonempty dir" = with_new_reg begin fun reg -> - let dir = Filename.temp_dir "Satyrographos" "Package" in + let dir = Filename.temp_dir "Satyrographos" "Library" in FilePath.concat dir "c" |> FileUtil.touch; add_dir reg "a" dir; - test_package_list ~expect:["a"] reg; + test_library_list ~expect:["a"] reg; [%test_result: bool] ~expect:true (mem reg "a"); [%test_result: bool] ~expect:false (mem reg "b"); [%test_result: bool] ~expect:true (directory reg "a" |> FileUtil.(test Is_dir)); - test_package_content ~expect:["c"] reg "a" + test_library_content ~expect:["c"] reg "a" end let%test_unit "store: add nonempty dir twice" = with_new_reg begin fun reg -> - let dir1 = Filename.temp_dir "Satyrographos" "Package" in + let dir1 = Filename.temp_dir "Satyrographos" "Library" in FilePath.concat dir1 "c" |> FileUtil.touch; add_dir reg "a" dir1; - test_package_list ~expect:["a"] reg; - test_package_content ~expect:["c"] reg "a"; - let dir2 = Filename.temp_dir "Satyrographos" "Package" in + test_library_list ~expect:["a"] reg; + test_library_content ~expect:["c"] reg "a"; + let dir2 = Filename.temp_dir "Satyrographos" "Library" in FilePath.concat dir2 "d" |> FileUtil.touch; add_dir reg "a" dir2; - test_package_list ~expect:["a"] reg; - test_package_content ~expect:["d"] reg "a" + test_library_list ~expect:["a"] reg; + test_library_content ~expect:["d"] reg "a" end let%test_unit "store: added dir must be copied" = with_new_reg begin fun reg -> - let dir = Filename.temp_dir "Satyrographos" "Package" in + let dir = Filename.temp_dir "Satyrographos" "Library" in FilePath.concat dir "c" |> FileUtil.touch; add_dir reg "a" dir; - test_package_list ~expect:["a"] reg; - test_package_content ~expect:["c"] reg "a"; + test_library_list ~expect:["a"] reg; + test_library_content ~expect:["c"] reg "a"; FilePath.concat dir "d" |> FileUtil.touch; - test_package_list ~expect:["a"] reg; - test_package_content ~expect:["c"] reg "a"; + test_library_list ~expect:["a"] reg; + test_library_content ~expect:["c"] reg "a"; FileUtil.rm [FilePath.concat dir "c"]; - test_package_list ~expect:["a"] reg; - test_package_content ~expect:["c"] reg "a"; + test_library_list ~expect:["a"] reg; + test_library_content ~expect:["c"] reg "a"; end let%test_unit "store: add the same directory twice with different contents" = with_new_reg begin fun reg -> - let dir = Filename.temp_dir "Satyrographos" "Package" in + let dir = Filename.temp_dir "Satyrographos" "Library" in FilePath.concat dir "c" |> FileUtil.touch; add_dir reg "a" dir; - test_package_list ~expect:["a"] reg; - test_package_content ~expect:["c"] reg "a"; + test_library_list ~expect:["a"] reg; + test_library_content ~expect:["c"] reg "a"; FilePath.concat dir "d" |> FileUtil.touch; FileUtil.rm [FilePath.concat dir "c"]; add_dir reg "b" dir; - test_package_list ~expect:["a"; "b"] reg; - test_package_content ~expect:["c"] reg "a"; - test_package_content ~expect:["d"] reg "b"; + test_library_list ~expect:["a"; "b"] reg; + test_library_content ~expect:["c"] reg "a"; + test_library_content ~expect:["d"] reg "b"; end diff --git a/src/systemFontPackage.ml b/src/systemFontLibrary.ml similarity index 90% rename from src/systemFontPackage.ml rename to src/systemFontLibrary.ml index 755d088..8f4f39f 100644 --- a/src/systemFontPackage.ml +++ b/src/systemFontLibrary.ml @@ -91,9 +91,9 @@ let font_to_json_and_hash prefix f = (name f, `Variant ("Collection", Some value)), (filepath f, f.file) ) -let fonts_to_package prefix fonts = +let fonts_to_library prefix fonts = let add_variant = function - | [] -> failwith "BUG: fonts_to_package" + | [] -> failwith "BUG: fonts_to_library" | [f] -> `Single f | fs -> `Collection fs in @@ -107,16 +107,16 @@ let fonts_to_package prefix fonts = in let hash_filename_fonts = "hash/fonts.satysfi-hash" in let hash_path_fonts = "#Automatically generated from the system fonts#" in - Package.{ - hashes = PackageFiles.singleton hash_filename_fonts ([hash_path_fonts], `Assoc hash); - files = PackageFiles.of_alist_reduce files ~f:(fun f1 f2 -> + Library.{ + hashes = LibraryFiles.singleton hash_filename_fonts ([hash_path_fonts], `Assoc hash); + files = LibraryFiles.of_alist_reduce files ~f:(fun f1 f2 -> begin if not (String.equal f1 f2) then Printf.printf "WARNING: %s and %s have conflicting filename.\n" f1 f2 end; f1 ); - dependencies = Package.Dependency.empty; + dependencies = Library.Dependency.empty; } -let get_package prefix () = - font_list () |> fonts_to_package prefix +let get_library prefix () = + font_list () |> fonts_to_library prefix