Skip to content

Commit

Permalink
Add an admin command to compare 2 package versions
Browse files Browse the repository at this point in the history
This is meant for quick sanity checks for example.

- Added some basic tests to cover the command.

Signed-off-by: Mathieu Barbin <[email protected]>
  • Loading branch information
mbarbin committed Sep 14, 2024
1 parent 291c276 commit 4ab0e1d
Show file tree
Hide file tree
Showing 5 changed files with 113 additions and 0 deletions.
11 changes: 11 additions & 0 deletions doc/man/opam-admin-topics.inc
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,16 @@
(diff opam-admin-list.err %{dep:opam-admin-list.0})))
(package opam))

(rule
(with-stdout-to opam-admin-compare-versions.0 (echo "")))
(rule
(targets opam-admin-compare-versions.1 opam-admin-compare-versions.err)
(deps using-built-opam)
(action (progn (with-stderr-to opam-admin-compare-versions.err
(with-stdout-to opam-admin-compare-versions.1 (run %{bin:opam} admin compare-versions --help=groff)))
(diff opam-admin-compare-versions.err %{dep:opam-admin-compare-versions.0})))
(package opam))

(rule
(with-stdout-to opam-admin-check.0 (echo "")))
(rule
Expand Down Expand Up @@ -130,6 +140,7 @@
opam-admin-add-constraint.1
opam-admin-filter.1
opam-admin-list.1
opam-admin-compare-versions.1
opam-admin-check.1
opam-admin-lint.1
opam-admin-upgrade.1
Expand Down
1 change: 1 addition & 0 deletions master_changes.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ users)
* Bump opam-root-version to 2.2 [#5980 @kit-ty-kate]

## Global CLI
* ◈ Add `opam admin compare-versions` to compare package versions for sanity checks [#6197 @mbarbin]
* Add cli version 2.3 [#6045 #6151 @rjbou]

## Plugins
Expand Down
62 changes: 62 additions & 0 deletions src/client/opamAdminCommand.ml
Original file line number Diff line number Diff line change
Expand Up @@ -830,6 +830,67 @@ let check_command cli =
Term.(const cmd $ global_options cli $ ignore_test_arg $ print_short_arg
$ installability_arg $ cycles_arg $ obsolete_arg)

let compare_versions_command_doc = "Compare 2 package versions"
let compare_versions_command cli =
let operator : OpamFormula.relop option Term.t =
(let open Cmdliner.Term.Syntax in
let+ lt = Arg.(value & flag (Arg.info ~doc:"assert V0 < V1" [ "lt" ]))
and+ le = Arg.(value & flag (Arg.info ~doc:"assert V0 <= V1" [ "le" ]))
and+ eq = Arg.(value & flag (Arg.info ~doc:"assert V0 = V1" [ "eq" ])) in
match List.filter fst [ lt, `Lt ; le, `Leq ; eq, `Eq ] with
| [] -> Ok None
| [ (_, op) ] -> Ok (Some op)
| _::_::_ -> Error ("At most one operator may be specified"))
|> Term.cli_parse_result'
in
let version_arg n =
let doc =
Arg.info
~docv:(Printf.sprintf "V%d" n)
~doc:"Package version to compare" []
in
Arg.(required & pos n (some OpamArg.package_version) None & doc)
in
let command = "compare-versions" in
let doc = compare_versions_command_doc in
let man = [
`S Manpage.s_description;
`P "This command compares 2 package versions. By default it outputs 'V0 OP V1' \
to the console with OP in {<,>,=} such that the equation holds. When an operator \
is supplied, the output is suppressed and the result of the comparison is checked \
againts the provided operator: the command exits 0 if the comparison holds, and 1 \
otherwise. For example:";
`Pre "\n\
\\$ opam admin compare-versions 0.0.9 0.0.10\n\
0.0.9 < 0.0.10\n\
\n\
\\$ opam admin compare-versions 0.0.9 --lt 0.0.10\n\
[0]\n\
\n\
\\$ opam admin compare-versions 0.0.9 --eq 0.0.10\n\
[1]";
`S Manpage.s_arguments;
`S Manpage.s_options;
]
in
let cmd global_options v0 v1 operator () =
OpamArg.apply_global_options cli global_options;
match operator with
| None ->
let result = OpamPackage.Version.compare v0 v1 in
OpamConsole.formatted_msg "%s %s %s\n"
(OpamPackage.Version.to_string v0)
(if result < 0 then "<" else if result = 0 then "=" else ">")
(OpamPackage.Version.to_string v1)
| Some operator ->
OpamStd.Sys.exit_because
(if OpamFormula.eval_relop operator v0 v1
then `Success
else `False)
in
OpamArg.mk_command ~cli OpamArg.cli_original command ~doc ~man
Term.(const cmd $ global_options cli $ version_arg 0 $ version_arg 1 $ operator)

let pattern_list_arg =
OpamArg.arg_list "PATTERNS"
"Package patterns with globs. matching against $(b,NAME) or \
Expand Down Expand Up @@ -1227,6 +1288,7 @@ let admin_subcommands cli =
upgrade_command cli;
lint_command cli;
check_command cli;
compare_versions_command cli;
list_command cli;
filter_command cli;
add_constraint_command cli;
Expand Down
21 changes: 21 additions & 0 deletions tests/reftests/compare-versions.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
N0REP0
### opam admin compare-versions 0.0.9 0.0.10
0.0.9 < 0.0.10
### opam admin compare-versions 1.2.3 1.2.3~preview
1.2.3 > 1.2.3~preview
### opam admin compare-versions 1.2.3 1.2.3-option
1.2.3 < 1.2.3-option
### opam admin compare-versions 0.1.0 0.01.0
0.1.0 = 0.01.0
### opam admin compare-versions 0.2.2 0.2.0
0.2.2 > 0.2.0
### opam admin compare-versions 0.0.9 --lt 0.0.10
### opam admin compare-versions 1.2.3 --lt 1.2.3~preview
# Return code 1 #
### opam admin compare-versions 0.1.0 --eq 0.01.0
### opam admin compare-versions 0.0.9 --eq 0.0.10
# Return code 1 #
### opam admin compare-versions 0.1.0 --le 0.1.0
### opam admin compare-versions 0.0.9 --le 0.0.10
### opam admin compare-versions 0.2.2 --le 0.2.1
# Return code 1 #
18 changes: 18 additions & 0 deletions tests/reftests/dune.inc
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,24 @@
%{targets}
(run ./run.exe %{exe:../../src/client/opamMain.exe.exe} %{dep:cli-versioning.test} %{read-lines:testing-env}))))

(rule
(alias reftest-compare-versions)
(action
(diff compare-versions.test compare-versions.out)))

(alias
(name reftest)
(deps (alias reftest-compare-versions)))

(rule
(targets compare-versions.out)
(deps root-N0REP0)
(package opam)
(action
(with-stdout-to
%{targets}
(run ./run.exe %{exe:../../src/client/opamMain.exe.exe} %{dep:compare-versions.test} %{read-lines:testing-env}))))

(rule
(alias reftest-config)
(enabled_if (and (or (<> %{env:TESTALL=1} 0) (= %{env:TESTN0REP0=0} 1))))
Expand Down

0 comments on commit 4ab0e1d

Please sign in to comment.