From 10dee97f9958a055b8ac4f4d455cc29cef9ac3aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arma=C3=ABl=20Gu=C3=A9neau?= Date: Tue, 21 Jan 2020 10:11:15 +0100 Subject: [PATCH 1/3] Add a --download-only flag to "opam install" 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. --- src/client/opamClient.ml | 9 +++++---- src/client/opamClient.mli | 7 ++++--- src/client/opamCommands.ml | 13 +++++++++---- src/client/opamSolution.ml | 33 ++++++++++++++++++++++++++------- src/client/opamSolution.mli | 2 ++ 5 files changed, 46 insertions(+), 18 deletions(-) diff --git a/src/client/opamClient.ml b/src/client/opamClient.ml index 3c291275435..97f9f895ec5 100644 --- a/src/client/opamClient.ml +++ b/src/client/opamClient.ml @@ -1076,7 +1076,7 @@ let filter_unpinned_locally t atoms f = atoms let install_t t ?ask ?(ignore_conflicts=false) ?(depext_only=false) - atoms add_to_roots ~deps_only ~assume_built = + ?(download_only=false) atoms add_to_roots ~deps_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 @@ -1229,7 +1229,7 @@ let install_t t ?ask ?(ignore_conflicts=false) ?(depext_only=false) in let t, res = OpamSolution.apply ?ask t ~requested:names ?add_roots - ~assume_built solution in + ~download_only ~assume_built solution in t, Some (Success res) in OpamStd.Option.iter (OpamSolution.check_solution t) solution; @@ -1237,14 +1237,15 @@ let install_t t ?ask ?(ignore_conflicts=false) ?(depext_only=false) let install t ?autoupdate ?add_to_roots ?(deps_only=false) ?(ignore_conflicts=false) ?(assume_built=false) - ?(depext_only=false) names = + ?(download_only=false) ?(depext_only=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 ~ignore_conflicts ~depext_only atoms add_to_roots ~deps_only ~assume_built + install_t t atoms add_to_roots + ~ignore_conflicts ~depext_only ~deps_only ~download_only ~assume_built let remove_t ?ask ~autoremove ~force atoms t = log "REMOVE autoremove:%b %a" autoremove diff --git a/src/client/opamClient.mli b/src/client/opamClient.mli index 13f0225faeb..95856e41936 100644 --- a/src/client/opamClient.mli +++ b/src/client/opamClient.mli @@ -51,14 +51,15 @@ val reinit: val install: rw switch_state -> ?autoupdate:atom list -> ?add_to_roots:bool -> ?deps_only:bool -> - ?ignore_conflicts:bool -> ?assume_built:bool -> ?depext_only:bool -> - atom list -> + ?ignore_conflicts:bool -> ?assume_built:bool -> ?download_only:bool -> + ?depext_only: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 -> ?ignore_conflicts:bool -> ?depext_only:bool -> + rw switch_state -> + ?ask:bool -> ?ignore_conflicts:bool -> ?depext_only:bool -> ?download_only:bool -> atom list -> bool option -> deps_only:bool -> assume_built:bool -> rw switch_state diff --git a/src/client/opamCommands.ml b/src/client/opamCommands.ml index 087be516456..320251c8630 100644 --- a/src/client/opamCommands.ml +++ b/src/client/opamCommands.ml @@ -1515,6 +1515,10 @@ let install cli = mk_flag ~cli (cli_from cli2_1) ["ignore-conflicts"] "Used with $(b,--deps-only), ignores conflicts of given package" in + let download_only = + mk_flag ~cli (cli_from cli2_1) ["download-only"] + "Fetch the sources of the packages, but don't build or install anything." + in let restore = mk_flag ~cli cli_original ["restore"] "Attempt to restore packages that were marked for installation but have \ @@ -1545,7 +1549,7 @@ let install cli = let install global_options build_options add_to_roots deps_only ignore_conflicts restore destdir assume_built check recurse subpath depext_only - atoms_or_locals () = + download_only atoms_or_locals () = apply_global_options global_options; apply_build_options build_options; if atoms_or_locals = [] && not restore then @@ -1606,7 +1610,7 @@ let install cli = let st = OpamClient.install st atoms ~autoupdate:pure_atoms ?add_to_roots ~deps_only ~ignore_conflicts - ~assume_built ~depext_only + ~assume_built ~depext_only ~download_only in match destdir with | None -> `Ok () @@ -1619,7 +1623,7 @@ let install cli = Term.(const install $global_options cli $build_options cli $add_to_roots $deps_only $ignore_conflicts $restore $destdir $assume_built cli $check $recurse cli $subpath cli $depext_only - $atom_or_local_list) + $download_only $atom_or_local_list) (* REMOVE *) let remove_doc = "Remove a list of packages." @@ -2701,7 +2705,8 @@ let switch cli = if no_action || OpamFormula.satisfies_depends st.installed invariant then st else OpamClient.install_t - st ~ask:true [] None ~deps_only:false ~assume_built:false + st ~ask:true [] None + ~deps_only:false ~assume_built:false in OpamSwitchState.drop st; `Ok ()) diff --git a/src/client/opamSolution.ml b/src/client/opamSolution.ml index 9b002e84130..1a9e3088b0c 100644 --- a/src/client/opamSolution.ml +++ b/src/client/opamSolution.ml @@ -272,7 +272,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 ?(force_remove=false) +let parallel_apply t + ~requested ?add_roots ~assume_built ~download_only ?(force_remove=false) action_graph = log "parallel_apply"; @@ -418,7 +419,7 @@ let parallel_apply t ~requested ?add_roots ~assume_built ?(force_remove=false) (* 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 @@ -426,6 +427,21 @@ let parallel_apply t ~requested ?add_roots ~assume_built ?(force_remove=false) ~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 -> @@ -1099,8 +1115,8 @@ let install_depexts ?(force_depext=false) ?(confirm=true) t packages = sys_packages) (* Apply a solution *) -let apply ?ask t ~requested ?add_roots ?(assume_built=false) ?force_remove - solution = +let apply ?ask t ~requested ?add_roots ?(assume_built=false) + ?(download_only=false) ?force_remove solution = log "apply"; if OpamSolver.solution_is_empty solution then (* The current state satisfies the request contraints *) @@ -1195,7 +1211,8 @@ let apply ?ask t ~requested ?add_roots ?(assume_built=false) ?force_remove OpamStd.Sys.exit_because `Configuration_error; let t0 = t in let t, r = - parallel_apply t ~requested ?add_roots ~assume_built ?force_remove + parallel_apply t + ~requested ?add_roots ~assume_built ~download_only ?force_remove action_graph in let success = match r with | OK _ -> true | _ -> false in @@ -1235,7 +1252,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) ?force_remove request = + ?(assume_built=false) ?download_only ?force_remove request = match resolve t action ~orphans ?reinstall ~requested request with | Conflicts cs -> log "conflict!"; @@ -1245,6 +1262,8 @@ let resolve_and_apply ?ask t action ~orphans ?reinstall ~requested ?add_roots t, Conflicts cs | Success solution -> let t, res = - apply ?ask t ~requested ?add_roots ~assume_built ?force_remove solution + apply ?ask t + ~requested ?add_roots ~assume_built ?download_only ?force_remove + solution in t, Success res diff --git a/src/client/opamSolution.mli b/src/client/opamSolution.mli index d4e8ba86f0d..275b61601f4 100644 --- a/src/client/opamSolution.mli +++ b/src/client/opamSolution.mli @@ -34,6 +34,7 @@ val apply: requested:OpamPackage.Name.Set.t -> ?add_roots:OpamPackage.Name.Set.t -> ?assume_built:bool -> + ?download_only:bool -> ?force_remove:bool -> OpamSolver.solution -> rw switch_state * solution_result @@ -52,6 +53,7 @@ val resolve_and_apply: requested:OpamPackage.Name.Set.t -> ?add_roots:OpamPackage.Name.Set.t -> ?assume_built:bool -> + ?download_only:bool -> ?force_remove:bool -> atom request -> rw switch_state * (solution_result, OpamCudf.conflict) result From f0617eabb73d2a2ce6586f463f8b4c61b402face Mon Sep 17 00:00:00 2001 From: Raja Boujbel Date: Fri, 9 Oct 2020 17:45:50 +0200 Subject: [PATCH 2/3] download-only: disable confirmation message --- src/client/opamSolution.ml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/opamSolution.ml b/src/client/opamSolution.ml index 1a9e3088b0c..43c17148cbd 100644 --- a/src/client/opamSolution.ml +++ b/src/client/opamSolution.ml @@ -1163,7 +1163,7 @@ let apply ?ask t ~requested ?add_roots ?(assume_built=false) OpamConsole.msg "===== %s =====\n" (OpamSolver.string_of_stats stats); ); if not OpamClientConfig.(!r.show) && - confirmation ?ask requested action_graph + (download_only || confirmation ?ask requested action_graph) then ( let t = install_depexts t @@ OpamPackage.Set.inter From 6f509fc4d2911ca5f12bd72d792355307d17d3c9 Mon Sep 17 00:00:00 2001 From: Raja Boujbel Date: Fri, 9 Oct 2020 17:48:34 +0200 Subject: [PATCH 3/3] update changes --- master_changes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/master_changes.md b/master_changes.md index 3ff0a96ff70..07dc06dcf7f 100644 --- a/master_changes.md +++ b/master_changes.md @@ -21,6 +21,7 @@ New option/command/subcommand are prefixed with ◈. ## Install * The stdout of `pre-` and `post-session` hooks is now propagated to the user [#4382 @AltGr - fix #4359] * `post-install` hooks are allowed to modify or remove installed files, the but not add new ones. Those changes are integrated in changes file [#4388 @lefessan] + * ◈ Add `--download-only` flag [#4071 @Armael @rjbou - fix #4036] ## Remove * Fix `opam remove --autoremove ` to not autoremove unrelated packages [#4369 @AltGr - fix #4250 #4332]