123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180(**************************************************************************)(* *)(* Copyright 2015 OCamlPro *)(* *)(* All rights reserved. This file is distributed under the terms of the *)(* GNU Lesser General Public License version 2.1, with the special *)(* exception on linking described in the file LICENSE. *)(* *)(**************************************************************************)typet={print_stats:bool;pin_kind_auto:bool;autoremove:bool;editor:string;keep_build_dir:bool;reuse_build_dir:bool;inplace_build:bool;working_dir:bool;ignore_pin_depends:bool;show:bool;fake:bool;skip_dev_update:bool;json_out:stringoption;root_is_ok:bool;no_auto_upgrade:bool;}letdefault={print_stats=false;pin_kind_auto=true;autoremove=false;editor="nano";keep_build_dir=false;reuse_build_dir=false;inplace_build=false;working_dir=false;ignore_pin_depends=false;show=false;fake=false;skip_dev_update=false;json_out=None;root_is_ok=false;no_auto_upgrade=false;}type'aoptions_fun=?print_stats:bool->?pin_kind_auto:bool->?autoremove:bool->?editor:string->?keep_build_dir:bool->?reuse_build_dir:bool->?inplace_build:bool->?working_dir:bool->?ignore_pin_depends:bool->?show:bool->?fake:bool->?skip_dev_update:bool->?json_out:stringoption->?root_is_ok:bool->?no_auto_upgrade:bool->'aletsetkkt?print_stats?pin_kind_auto?autoremove?editor?keep_build_dir?reuse_build_dir?inplace_build?working_dir?ignore_pin_depends?show?fake?skip_dev_update?json_out?root_is_ok?no_auto_upgrade=let(+)xopt=matchoptwithSomex->x|None->xink{print_stats=t.print_stats+print_stats;pin_kind_auto=t.pin_kind_auto+pin_kind_auto;autoremove=t.autoremove+autoremove;editor=t.editor+editor;keep_build_dir=t.keep_build_dir+keep_build_dir;reuse_build_dir=t.reuse_build_dir+reuse_build_dir;inplace_build=t.inplace_build+inplace_build;working_dir=t.working_dir+working_dir;ignore_pin_depends=t.ignore_pin_depends+ignore_pin_depends;show=t.show+show;fake=t.fake+fake;skip_dev_update=t.skip_dev_update+skip_dev_update;json_out=t.json_out+json_out;root_is_ok=t.root_is_ok+root_is_ok;no_auto_upgrade=t.no_auto_upgrade+no_auto_upgrade;}letsett=setk(funx()->x)tletr=refdefaultletupdate?noop:_=setk(funcfg()->r:=cfg)!rletinitkk=letopenOpamStd.ConfiginletopenOpamStd.Option.Opinleteditor=env_string"EDITOR"++OpamStd.Env.(getopt"VISUAL"++getopt"EDITOR")insetk(setk(func->r:=c;k))!r?print_stats:(env_bool"STATS")?pin_kind_auto:(env_bool"PINKINDAUTO")?autoremove:(env_bool"AUTOREMOVE")?editor?keep_build_dir:(env_bool"KEEPBUILDDIR")?reuse_build_dir:(env_bool"REUSEBUILDDIR")?inplace_build:(env_bool"INPLACEBUILD")?working_dir:(env_bool"WORKINGDIR")?ignore_pin_depends:(env_bool"IGNOREPINDEPENDS")?show:(env_bool"SHOW")?fake:(env_bool"FAKE")?skip_dev_update:(env_bool"SKIPUPDATE")?json_out:(env_string"JSON">>|function""->None|s->Somes)?root_is_ok:(env_bool"ROOTISOK")?no_auto_upgrade:(env_bool"NOAUTOUPGRADE")letinit?noop:_=initk(fun()->())letsearch_files=["findlib"]openOpamStd.Opletopam_init?root_dir?strict=letopenOpamStd.Option.Opin(* (i) get root dir *)letroot=OpamStateConfig.opamroot?root_dir()in(* (ii) load conf file and set defaults *)(* the init for OpamFormat is done in advance since (a) it has an effect on
loading the global config (b) the global config has no effect on it *)OpamFormatConfig.initk?strict@@fun?log_dir->letconfig=OpamStateConfig.load_defaultsrootinletinitialised=config<>Nonein(* !X fixme: don't drop the loaded config file to reload it afterwards (when
loading the global_state) like that... *)beginmatchconfigwith|None->()|Someconf->letcriteriakind=letc=OpamFile.Config.criteriaconfintrySome(List.assockindc)withNot_found->NoneinOpamSolverConfig.update?solver:(OpamFile.Config.solverconf>>|funs->lazy(OpamCudfSolver.custom_solvers))?solver_preferences_default:(criteria`Default>>|funs->lazy(Somes))?solver_preferences_upgrade:(criteria`Upgrade>>|funs->lazy(Somes))?solver_preferences_fixup:(criteria`Fixup>>|funs->lazy(Somes))?solver_preferences_best_effort_prefix:(OpamFile.Config.best_effort_prefixconf>>|funs->lazy(Somes))()end;(* (iii) load from env and options using OpamXxxConfig.init *)letlog_dir=iflog_dir=None&&initialisedthenSomeOpamFilename.(Dir.to_string(OpamPath.logroot))elseNonein(fun()->())|>OpamStd.Config.initk?log_dir|>OpamRepositoryConfig.initk|>OpamSolverConfig.initk|>OpamStateConfig.initk~root_dir:root|>initk