Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Source file package.ml
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136(*
* Copyright (c) 2013-2020 Thomas Gazagnaire <thomas@gazagnaire.org>
* Copyright (c) 2013-2020 Anil Madhavapeddy <anil@recoil.org>
* Copyright (c) 2015-2020 Gabriel Radanne <drupyog@zoho.com>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*)openAstringtypescope=[`Switch|`Monorepo]typet={name:string;pin:(string*string)option;(** [name_version * url] *)scope:scope;build:bool;libs:String.Set.t;min:String.Set.t;max:String.Set.t;}letnamet=t.nameletkeyt=matcht.scopewith|`Switch->"switch-"^t.name|`Monorepo->"monorepo-"^t.nameletpint=t.pinletbuild_dependencyt=t.buildletscopet=t.scopeletlibrariest=String.Set.elementst.libsletmin_versionst=String.Set.elementst.minletmax_versionst=String.Set.elementst.maxletmergeab=ifa.name<>b.namethenNoneelseifa.scope<>b.scopethenNoneelseletname=a.nameinletlibs=String.Set.uniona.libsb.libsandmin=String.Set.uniona.minb.minandmax=String.Set.uniona.maxb.maxandpin=match(a.pin,b.pin)with|None,None->None|None,Somea|Somea,None->Somea|Some(an,au),Some(bn,bu)whenString.equalanau&&String.equalbnbu->a.pin|_->invalid_arg("conflicting pin depends for "^name)andbuild=a.build||b.buildandscope=a.scopeinmatchpinwith|None->Some{name;build;scope;libs;min;max;pin}|Some_->(* pin wins over min and max *)letempty=String.Set.emptyinSome{name;build;scope;libs;min=empty;max=empty;pin}letpackage_name_is_validname=lethas_letter=String.existsChar.Ascii.is_letternameinletonly_allowed_chars=String.for_all(function|'a'..'z'|'A'..'Z'|'0'..'9'|'_'|'-'->true|_->false)nameinonly_allowed_chars&&has_letterletv?(scope=`Monorepo)?(build=false)?sublibs?libs?min?max?pin?(pin_version="dev")name=ifnot(package_name_is_validname)thenFmt.invalid_arg"package name %S is invalid"name;letlibs=match(sublibs,libs)with|None,None->[name]|Somexs,None->List.map(funx->ifx=""thennameelsename^"."^x)xs|None,Somea->a|Some_,Some_->Fmt.invalid_arg"dependent package %s may either specify ~sublibs or ~ocamlfind"nameinletlibs=String.Set.of_listlibsinletto_set=function|None->String.Set.empty|Somem->String.Set.singletonminletmin=to_setminandmax=to_setmaxandpin=matchpinwithSomep->Some(name^"."^pin_version,p)|None->Nonein{name;build;scope;libs;min;max;pin}letwith_scope~scopet={twithscope}letexts_to_stringppf(min,max,build,scope)=letbuild_strs=ifbuildthen["build"]else[]inletesc_prefixprefixe=Fmt.str"%s %S"prefixeinletmin_strs=List.map(esc_prefix">=")(String.Set.elementsmin)andmax_strs=List.map(esc_prefix"<")(String.Set.elementsmax)inletconstr_list=build_strs@min_strs@max_strsinletconstr_list=matchscopewith|`Monorepo->"?monorepo"::constr_list|`Switch->constr_listinifList.lengthconstr_list>0thenFmt.pfppf" { %s }"(String.concat~sep:" & "constr_list)letpp?(surround="")ppfp=Fmt.pfppf"%s%s%s%a"surroundp.namesurroundexts_to_string(p.min,p.max,p.build,p.scope)moduleSet=structtypeelt=ttypet=eltString.Map.tletof_listx=String.Map.of_list(List.map(funp->(namep,p))x)letto_listx=String.Map.fold(fun_vacc->v::acc)x[]|>List.revletunionxy=String.Map.union(fun_->merge)xyletempty=String.Map.emptyend