Skip to content

Commit

Permalink
move 'targets' into 'show' command and add 'show alias'
Browse files Browse the repository at this point in the history
Signed-off-by: Ali Caglayan <alizter@gmail.com>
  • Loading branch information
Alizter committed May 22, 2023
1 parent c82105a commit 116dfde
Show file tree
Hide file tree
Showing 15 changed files with 209 additions and 71 deletions.
2 changes: 1 addition & 1 deletion bin/main.ml
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@ let all : _ Cmdliner.Cmd.t list =
; Ocaml_merlin.command
; Shutdown.command
; Diagnostics.command
; Targets_cmd.command
]
in
let groups =
Expand All @@ -37,6 +36,7 @@ let all : _ Cmdliner.Cmd.t list =
; Internal.group
; Init.group
; Promotion.group
; Show.group
]
in
terms @ groups
Expand Down
67 changes: 67 additions & 0 deletions bin/show/aliases_cmd.ml
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
open Import
open Stdune

let doc = "Print aliases in a given directory. Works similalry to ls."

let pp_aliases ~(contexts : Context.t list) path =
let dir = Path.of_string path in
let root =
match (dir : Path.t) with
| External e ->
Code_error.raise "target_hint: external path"
[ ("path", Path.External.to_dyn e) ]
| In_source_tree d -> d
| In_build_dir d -> (
match Path.Build.drop_build_context d with
| Some d -> d
| None -> Path.Source.root)
in
let open Action_builder.O in
let+ alias_targets =
let+ load_dir =
Action_builder.List.map contexts ~f:(fun ctx ->
let dir =
Path.Build.append_source
(Dune_engine.Context_name.build_dir (Context.name ctx))
root
|> Path.build
in
Action_builder.of_memo (Load_rules.load_dir ~dir))
in
List.fold_left load_dir ~init:Dune_engine.Alias.Name.Map.empty
~f:(fun acc x ->
match (x : Load_rules.Loaded.t) with
| Build build ->
Dune_engine.Alias.Name.Map.union
~f:(fun _ a _ -> Some a)
acc build.aliases
| _ -> acc)
|> Dune_engine.Alias.Name.Map.to_list_map ~f:(fun name _ ->
Dune_engine.Alias.Name.to_string name)
in
[ Pp.textf "%s:" (Path.to_string dir)
; Pp.concat_map alias_targets ~f:Pp.text ~sep:Pp.newline
]
|> Pp.concat ~sep:Pp.newline

let term =
let+ common = Common.term
and+ paths = Arg.(value & pos_all string [ "." ] & info [] ~docv:"DIR") in
let config = Common.init common in
let request (setup : Dune_rules.Main.build_system) =
let open Action_builder.O in
let+ paragraphs =
Action_builder.List.map paths ~f:(pp_aliases ~contexts:setup.contexts)
in
paragraphs
|> Pp.concat ~sep:(Pp.seq Pp.newline Pp.newline)
|> List.singleton |> User_message.make |> User_message.print
in
Scheduler.go ~common ~config @@ fun () ->
let open Fiber.O in
let+ res = Build_cmd.run_build_system ~common ~request in
match res with
| Error `Already_reported -> raise Dune_util.Report_error.Already_reported
| Ok () -> ()

let command = Cmd.v (Cmd.info "aliases" ~doc ~envs:Common.envs) term
5 changes: 5 additions & 0 deletions bin/show/aliases_cmd.mli
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
open Import

(** The aliases command lists all the aliases available in the given directory,
defaulting to the current working direcctory. *)
val command : unit Cmd.t
6 changes: 6 additions & 0 deletions bin/show/show.ml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
open Import

let doc = "Command group for showing information about the workspace"

let group =
Cmd.group (Cmd.info ~doc "show") [ Targets_cmd.command; Aliases_cmd.command ]
4 changes: 4 additions & 0 deletions bin/show/show.mli
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
open Import

(** The dune show command group *)
val group : unit Cmd.t
44 changes: 5 additions & 39 deletions bin/targets_cmd.ml → bin/show/targets_cmd.ml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ open Stdune

let doc = "Print available targets in a given directory. Works similalry to ls."

let pp_all_direct_targets ~(contexts : Context.t list) ~show_aliases path =
let pp_all_direct_targets path =
let dir = Path.of_string path in
let root =
match (dir : Path.t) with
Expand All @@ -17,7 +17,7 @@ let pp_all_direct_targets ~(contexts : Context.t list) ~show_aliases path =
| None -> Path.Source.root)
in
let open Action_builder.O in
let* targets =
let+ targets =
let open Memo.O in
Action_builder.of_memo
(Target.all_direct_targets (Some root) >>| Path.Build.Map.to_list)
Expand All @@ -43,52 +43,18 @@ let pp_all_direct_targets ~(contexts : Context.t list) ~show_aliases path =
| Directory -> Path.basename path ^ Filename.dir_sep)
else None)
in
let+ alias_targets =
let+ load_dir =
Action_builder.all
@@ List.map contexts ~f:(fun ctx ->
let dir =
Path.build
@@ Path.Build.append_source
(Dune_engine.Context_name.build_dir (Context.name ctx))
root
in
Action_builder.of_memo @@ Load_rules.load_dir ~dir)
in
List.fold_left load_dir ~init:Dune_engine.Alias.Name.Map.empty
~f:(fun acc x ->
match (x : Load_rules.Loaded.t) with
| Build build ->
Dune_engine.Alias.Name.Map.union
~f:(fun _ a _ -> Some a)
acc build.aliases
| _ -> acc)
|> Dune_engine.Alias.Name.Map.to_list_map ~f:(fun name _ ->
Dune_engine.Alias.Name.to_string name)
in
[ Pp.textf "%s:" (Path.to_string dir)
; Pp.concat_map targets ~f:Pp.text ~sep:Pp.newline
; (if show_aliases then
Pp.concat_map alias_targets
~f:(fun alias -> Pp.text ("@" ^ alias))
~sep:Pp.newline
else Pp.nop)
]
|> Pp.concat ~sep:Pp.newline

let term =
let+ common = Common.term
and+ paths = Arg.(value & pos_all string [ "." ] & info [] ~docv:"DIR")
and+ show_aliases =
Arg.(value & flag & info [ "aliases" ] ~doc:"Show aliases")
in
and+ paths = Arg.(value & pos_all string [ "." ] & info [] ~docv:"DIR") in
let config = Common.init common in
let request (setup : Dune_rules.Main.build_system) =
let request _ =
let open Action_builder.O in
let+ paragraphs =
Action_builder.List.map paths
~f:(pp_all_direct_targets ~contexts:setup.contexts ~show_aliases)
in
let+ paragraphs = Action_builder.List.map paths ~f:pp_all_direct_targets in
paragraphs
|> Pp.concat ~sep:(Pp.seq Pp.newline Pp.newline)
|> List.singleton |> User_message.make |> User_message.print
Expand Down
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
(lang dune 3.8)
113 changes: 113 additions & 0 deletions test/blackbox-tests/test-cases/show/dune-aliases.t/run.t
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
Testing the "dune show aliases" command. This command shows the aliases in the
current directory. It acts similarly to ls. It will not show aliases that appear
in subdirectories although this could be changed in the future.

In an empty dune project, the following aliases are available.

$ dune show aliases
.:
all
default
fmt

User defined aliases can be added to a dune file. These should be picked up by
the command.

$ cat > dune << EOF
> (alias
> (name foo))
> EOF

$ dune show aliases
.:
all
default
fmt
foo

Aliases in subdirectories should not be picked up.

$ mkdir subdir
$ cat > subdir/dune << EOF
> (alias
> (name bar))
> EOF

$ dune show aliases
.:
all
default
fmt
foo

But checking the subdirectory it should be available.

$ dune show aliases subdir
subdir:
all
bar
default
fmt

Adding an OCaml library will introduce OCaml specific aliases:

$ cat > dune << EOF
> (library
> (name foo))
> EOF

$ dune show aliases
.:
all
check
default
doc-private
fmt

Adding a cram test will introduce an alias with the name of the test and also
introduce the runtest alias:
bbb
$ rm dune
$ cat > mytest.t

$ dune show aliases
.:
all
default
fmt
mytest
runtest

We can also show aliases in multiple directories at once:

$ dune show aliases . subdir
.:
all
default
fmt
mytest
runtest

subdir:
all
bar
default
fmt

Including those in the _build/ directory:

$ dune build
$ dune show aliases . _build/default
.:
all
default
fmt
mytest
runtest

_build/default:
all
default
fmt
mytest
runtest
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
Testing the "dune targets" command in a simple OCaml project with an additional
directory target to see the behaviour there.
Testing the "dune show targets" command in a simple OCaml project with an
additional directory target to see the behaviour there.

We have two libraries with one in a subdirectory. We also have a directory
target d to see how the command will behave.

With no directory provided to the command, it should default to the current
working directory.

$ dune targets
$ dune show targets
.:
a.ml
d/
Expand All @@ -18,12 +18,11 @@ working directory.
simple.cmxa
simple.cmxs
simple.ml-gen


Multiple directories can be provided to the command. Also subdirectories may be
used, and only the targets available in that directory will be displayed.

$ dune targets . b/
$ dune show targets . b/
.:
a.ml
d/
Expand All @@ -35,7 +34,6 @@ used, and only the targets available in that directory will be displayed.
simple.cmxs
simple.ml-gen


b:
c.ml
dune
Expand All @@ -44,11 +42,10 @@ used, and only the targets available in that directory will be displayed.
simple2.cmxa
simple2.cmxs
simple2.ml-gen


The command also works with files in the _build directory.

$ dune targets _build/default/
$ dune show targets _build/default/
_build/default:
a.ml
d/
Expand All @@ -59,9 +56,8 @@ The command also works with files in the _build directory.
simple.cmxa
simple.cmxs
simple.ml-gen


$ dune targets _build/default/b
$ dune show targets _build/default/b
_build/default/b:
c.ml
dune
Expand All @@ -70,28 +66,8 @@ The command also works with files in the _build directory.
simple2.cmxa
simple2.cmxs
simple2.ml-gen

We cannot see inside directory targets

$ dune targets d
$ dune show targets d
d:


Testing the --aliases command too:

$ dune targets --aliases
.:
a.ml
d/
dune
dune-project
simple.a
simple.cma
simple.cmxa
simple.cmxs
simple.ml-gen
@all
@check
@default
@doc-private
@fmt

0 comments on commit 116dfde

Please sign in to comment.