Skip to content

Commit

Permalink
Add a --download-only flag to "opam install"
Browse files Browse the repository at this point in the history
When this flag is enabled, sources are fetched but no other actions
are executed. This is useful to fill the download cache for a future
request in advance, for instance.
  • Loading branch information
Armael committed Jan 21, 2020
1 parent 64d7799 commit 4d442b8
Show file tree
Hide file tree
Showing 5 changed files with 46 additions and 18 deletions.
9 changes: 5 additions & 4 deletions src/client/opamClient.ml
Original file line number Diff line number Diff line change
Expand Up @@ -981,7 +981,8 @@ let filter_unpinned_locally t atoms f =
None))
atoms

let install_t t ?ask atoms add_to_roots ~deps_only ~assume_built =
let install_t t ?ask atoms add_to_roots ~deps_only ~download_only
~assume_built =
log "INSTALL %a" (slog OpamFormula.string_of_atoms) atoms;
let names = OpamPackage.Name.Set.of_list (List.rev_map fst atoms) in

Expand Down Expand Up @@ -1116,21 +1117,21 @@ let install_t t ?ask atoms add_to_roots ~deps_only ~assume_built =
in
let t, res =
OpamSolution.apply ?ask t ~requested:names ?add_roots
~assume_built solution in
~download_only ~assume_built solution in
t, Success res
in
OpamSolution.check_solution t solution;
t

let install t ?autoupdate ?add_to_roots
?(deps_only=false) ?(assume_built=false) names =
?(deps_only=false) ?(download_only=false) ?(assume_built=false) names =
let atoms = OpamSolution.sanitize_atom_list ~permissive:true t names in
let autoupdate_atoms = match autoupdate with
| None -> atoms
| Some a -> OpamSolution.sanitize_atom_list ~permissive:true t a
in
let t = update_dev_packages_t autoupdate_atoms t in
install_t t atoms add_to_roots ~deps_only ~assume_built
install_t t atoms add_to_roots ~deps_only ~download_only ~assume_built

let check_installed t atoms =
let available = (Lazy.force t.available_packages) in
Expand Down
6 changes: 3 additions & 3 deletions src/client/opamClient.mli
Original file line number Diff line number Diff line change
Expand Up @@ -50,14 +50,14 @@ val reinit:
val install:
rw switch_state ->
?autoupdate:atom list -> ?add_to_roots:bool -> ?deps_only:bool ->
?assume_built:bool -> atom list -> rw switch_state
?download_only:bool -> ?assume_built:bool -> atom list -> rw switch_state

(** Low-level version of [reinstall], bypassing the package name sanitization
and dev package update, and offering more control *)
val install_t:
rw switch_state -> ?ask:bool ->
atom list -> bool option -> deps_only:bool -> assume_built:bool ->
rw switch_state
atom list -> bool option -> deps_only:bool -> download_only:bool ->
assume_built:bool -> rw switch_state

(** Check that the given list of packages [atoms] have their dependencies
satisfied, without calling the solver. *)
Expand Down
15 changes: 10 additions & 5 deletions src/client/opamCommands.ml
Original file line number Diff line number Diff line change
Expand Up @@ -1245,6 +1245,10 @@ let install =
mk_flag ["deps-only"]
"Install all its dependencies, but don't actually install the package."
in
let download_only =
mk_flag ["download-only"]
"Fetch the sources of the packages, but don't build or install anything."
in
let restore =
mk_flag ["restore"]
"Attempt to restore packages that were marked for installation but have \
Expand All @@ -1267,8 +1271,8 @@ let install =
$(i,PACKAGES) with option $(b,deps-only) enabled."
in
let install
global_options build_options add_to_roots deps_only restore destdir
assume_built check atoms_or_locals =
global_options build_options add_to_roots deps_only download_only restore
destdir assume_built check atoms_or_locals =
apply_global_options global_options;
apply_build_options build_options;
if atoms_or_locals = [] && not restore then
Expand Down Expand Up @@ -1319,7 +1323,8 @@ let install =
OpamStd.Sys.exit_because `False));
let st =
OpamClient.install st atoms
~autoupdate:pure_atoms ?add_to_roots ~deps_only ~assume_built
~autoupdate:pure_atoms ?add_to_roots ~deps_only ~download_only
~assume_built
in
match destdir with
| None -> `Ok ()
Expand All @@ -1330,8 +1335,8 @@ let install =
in
Term.ret
Term.(const install $global_options $build_options
$add_to_roots $deps_only $restore $destdir $assume_built $check
$atom_or_local_list),
$add_to_roots $deps_only $download_only $restore $destdir
$assume_built $check $atom_or_local_list),
term_info "install" ~doc ~man

(* REMOVE *)
Expand Down
32 changes: 26 additions & 6 deletions src/client/opamSolution.ml
Original file line number Diff line number Diff line change
Expand Up @@ -262,7 +262,8 @@ end

(* Process the atomic actions in a graph in parallel, respecting graph order,
and report to user. Takes a graph of atomic actions *)
let parallel_apply t ~requested ?add_roots ~assume_built action_graph =
let parallel_apply t ~requested ?add_roots ~assume_built ~download_only
action_graph =
log "parallel_apply";

let remove_action_packages =
Expand Down Expand Up @@ -336,14 +337,29 @@ let parallel_apply t ~requested ?add_roots ~assume_built action_graph =

(* 1/ process the package actions (fetch, build, installations and removals) *)

let action_graph = (* Add build actions *)
let action_graph = (* Add build and fetch actions *)
let noop_remove nv =
OpamAction.noop_remove_package t nv in
PackageActionGraph.explicit
~noop_remove
~sources_needed:(fun p -> OpamPackage.Set.mem p sources_needed)
action_graph
in
let action_graph =
if download_only then
(* remove actions other than fetches *)
let g = PackageActionGraph.copy action_graph in
PackageActionGraph.iter_vertex (fun v ->
match v with
| `Fetch _ -> ()
| `Install _ | `Reinstall _ | `Change _
| `Remove _ | `Build _ ->
PackageActionGraph.remove_vertex g v
) action_graph;
g
else action_graph
in

(match OpamSolverConfig.(!r.cudf_file) with
| None -> ()
| Some f ->
Expand Down Expand Up @@ -826,7 +842,8 @@ let run_hook_job t name ?(local=[]) w =
Done true

(* Apply a solution *)
let apply ?ask t ~requested ?add_roots ?(assume_built=false) solution =
let apply ?ask t ~requested ?add_roots ?(assume_built=false)
?(download_only=false) solution =
log "apply";
if OpamSolver.solution_is_empty solution then
(* The current state satisfies the request contraints *)
Expand Down Expand Up @@ -914,7 +931,8 @@ let apply ?ask t ~requested ?add_roots ?(assume_built=false) solution =
OpamStd.Sys.exit_because `Configuration_error;
let t0 = t in
let t, r =
parallel_apply t ~requested ?add_roots ~assume_built action_graph
parallel_apply t ~requested ?add_roots ~assume_built ~download_only
action_graph
in
let success = match r with | OK _ -> true | _ -> false in
let post_session =
Expand Down Expand Up @@ -955,7 +973,7 @@ let resolve t action ~orphans ?reinstall ~requested request =
r

let resolve_and_apply ?ask t action ~orphans ?reinstall ~requested ?add_roots
?(assume_built=false) request =
?(assume_built=false) ?download_only request =
match resolve t action ~orphans ?reinstall ~requested request with
| Conflicts cs ->
log "conflict!";
Expand All @@ -964,5 +982,7 @@ let resolve_and_apply ?ask t action ~orphans ?reinstall ~requested ?add_roots
(OpamSwitchState.unavailable_reason t) cs);
t, Conflicts cs
| Success solution ->
let t, res = apply ?ask t ~requested ?add_roots ~assume_built solution in
let t, res =
apply ?ask t ~requested ?add_roots ~assume_built ?download_only solution
in
t, Success res
2 changes: 2 additions & 0 deletions src/client/opamSolution.mli
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ val apply:
requested:OpamPackage.Name.Set.t ->
?add_roots:OpamPackage.Name.Set.t ->
?assume_built:bool ->
?download_only:bool ->
OpamSolver.solution ->
rw switch_state * solution_result

Expand All @@ -50,6 +51,7 @@ val resolve_and_apply:
requested:OpamPackage.Name.Set.t ->
?add_roots:OpamPackage.Name.Set.t ->
?assume_built:bool ->
?download_only:bool ->
atom request ->
rw switch_state * (solution_result, OpamCudf.conflict) result

Expand Down

0 comments on commit 4d442b8

Please sign in to comment.