package b0

  1. Overview
  2. Docs
Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source

Source file b0_cmd_unit.ml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
(*---------------------------------------------------------------------------
   Copyright (c) 2020 The b0 programmers. All rights reserved.
   SPDX-License-Identifier: ISC
  ---------------------------------------------------------------------------*)

open B0_std
open Result.Syntax

let output_dirs ~units conf =
  Log.if_error ~use:Os.Exit.no_such_name @@
  (* XXX Eventually we should use B0_env here. *)
  let* units = B0_unit.get_list_or_hint ~all_if_empty:true units in
  let b0_dir = B0_driver.Conf.b0_dir conf in
  let build_dir =
    B0_build.B0_dir.build_dir ~b0_dir ~variant:"user" (* FIXME *)
  in
  let unit_dir unit =
    Fpath.strip_trailing_dir_sep @@
    B0_build.B0_dir.unit_build_dir ~build_dir ~name:(B0_unit.name unit)
  in
  let dirs = List.map unit_dir units in
  Fmt.pr "@[<v>%a@]@." (Fmt.list Fpath.pp) dirs;
  Ok Os.Exit.ok

let edit ~units conf =
  B0_tool.Def.edit (module B0_unit) conf units

let get ~output_details ~key ~units conf =
  B0_tool.Def.get_meta_key (module B0_unit) conf output_details key units

let list ~output_details ~units conf =
  B0_tool.Def.list (module B0_unit) conf output_details units

let info ~output_details ~units conf =
  let output_details =
    if output_details = `Normal then `Long else output_details
  in
  B0_tool.Def.list (module B0_unit) conf output_details units

(* Command line interface *)

open Cmdliner
open Cmdliner.Term.Syntax

let build_dir_cmd =
  let doc = "Output build directories of units" in
  let descr =
    `P "$(cmd) outputs build directories of given build units. The paths may \
        not exist. See also $(tool) $(b,dir)."
  in
  B0_tool_cli.cmd_with_b0_file "dir" ~doc ~descr @@
  let+ units = B0_cli.act_on_units_pos0 in
  output_dirs ~units

let edit_cmd =
  let doc = "Edit build units" in
  let descr =
    `P "$(cmd) opens in your editor the b0 files in which given build units \
        are defined."
  in
  B0_tool_cli.cmd_with_b0_file "edit" ~doc ~descr @@
  let+ units = B0_cli.act_on_units_pos0 in
  edit ~units

let get_cmd =
  let doc = "Get build unit metadata" in
  let descr =
    `P "$(cmd) outputs the value of metadata $(i,KEY) of given build units."
  in
  B0_tool_cli.cmd_with_b0_file "get" ~doc ~descr @@
  let+ output_details = B0_cli.output_details
  and+ key = B0_cli.required_metadata_key_pos0
  and+ units = B0_cli.act_on_units_pos1 in
  get ~output_details ~key ~units

let list_cmd =
  let doc = "List build units" in
  let descr = `P "$(cmd) lists given build units." in
  B0_tool_cli.cmd_with_b0_file "list" ~doc ~descr @@
  let+ output_details = B0_cli.output_details
  and+ units = B0_cli.act_on_units_pos0 in
  list ~output_details ~units

let info_cmd =
  let doc = "Output build unit metadata" in
  let descr =
    `P "$(cmd) is $(b,list -l), it outputs metadata of given build units."
  in
  B0_tool_cli.cmd_with_b0_file "info" ~doc ~descr @@
  let+ output_details = B0_cli.output_details
  and+ units = B0_cli.act_on_units_pos1 in
  info ~output_details ~units

let cmd =
  let doc = "Operate on build units" in
  let descr = `P "$(cmd) operates on build units." in
  B0_tool_cli.cmd_group "unit" ~doc ~descr @@
  [build_dir_cmd; edit_cmd; get_cmd; list_cmd; info_cmd]