/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 9 ĠHERE ĠEurope ĠB . V . Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 9 ĠVer ifa ĠO y . Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 9 ĠB os ch ĠSoftware ĠIn nov ations ĠGmbH Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttps :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ* Ċ Ġ* ĠSPDX - License - Identifier : ĠApache - 2 . 0 Ċ Ġ* ĠLicense - Filename : ĠLICENSE Ċ Ġ*/ Ċ Ċ package Ġorg . oss review toolkit . analyzer . managers Ċ Ċ import Ġcom . fasterxml . jackson . databind . JsonNode Ċ Ċ import Ġcom . vd urm ont . semver 4 j . Requirement Ċ Ċ import Ġjava . io . File Ċ import Ġjava . util . Sorted Set Ċ import Ġjava . util . Stack Ċ Ċ import Ġorg . oss review toolkit . analyzer . Abstract PackageManager Factory Ċ import Ġorg . oss review toolkit . analyzer . PackageManager Ċ import Ġorg . oss review toolkit . analyzer . parse Author String Ċ import Ġorg . oss review toolkit . downloader . Version Control System Ċ import Ġorg . oss review toolkit . model . Identifier Ċ import Ġorg . oss review toolkit . model . Package Ċ import Ġorg . oss review toolkit . model . Package Reference Ċ import Ġorg . oss review toolkit . model . Project Ċ import Ġorg . oss review toolkit . model . Project Analyzer Result Ċ import Ġorg . oss review toolkit . model . Remote Artifact Ċ import Ġorg . oss review toolkit . model . Scope Ċ import Ġorg . oss review toolkit . model . V cs Info Ċ import Ġorg . oss review toolkit . model . V cs Type Ċ import Ġorg . oss review toolkit . model . config . Analyzer Configuration Ċ import Ġorg . oss review toolkit . model . config . Repository Configuration Ċ import Ġorg . oss review toolkit . model . json Mapper Ċ import Ġorg . oss review toolkit . utils . CommandLine Tool Ċ import Ġorg . oss review toolkit . utils . Os Ċ import Ġorg . oss review toolkit . utils . Process Capture Ċ import Ġorg . oss review toolkit . utils . log Ċ import Ġorg . oss review toolkit . utils . stash Directories Ċ import Ġorg . oss review toolkit . utils . text Value OrEmpty Ċ Ċ /** Ċ Ġ* ĠThe Ġ[ Con an ]( https :// conan . io /) Ġpackage Ġmanager Ġfor ĠC Ġ/ ĠC ++. Ċ Ġ* Ċ Ġ* ĠTODO : ĠAdd Ġsupport Ġfor Ġ` python _ requires `. Ċ Ġ*/ Ċ @ Suppress (" Too Many Functions ") Ċ class ĠCon an ( ĊĠĠĠ Ġname : ĠString , ĊĠĠĠ Ġanalysis Root : ĠFile , ĊĠĠĠ Ġanalyzer Config : ĠAnalyzer Configuration , ĊĠĠĠ Ġrepo Config : ĠRepository Configuration Ċ ) Ġ: ĠPackage Manager ( name , Ġanalysis Root , Ġanalyzer Config , Ġrepo Config ), ĠCommandLine Tool Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSCO PE _ NAME _ DEPEND ENCI ES Ġ= Ġ" requires " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSCO PE _ NAME _ DEV _ DEPEND ENCI ES Ġ= Ġ" build _ requires " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠFactory Ġ: ĠAbstract PackageManager Factory < Con an >(" Con an ") Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġglob s For Definition Files Ġ= ĠlistOf (" conan file . txt ", Ġ" conan file . py ") ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcreate ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanalysis Root : ĠFile , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanalyzer Config : ĠAnalyzer Configuration , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepo Config : ĠRepository Configuration ĊĠĠĠĠĠĠĠ Ġ) Ġ= ĠCon an ( manager Name , Ġanalysis Root , Ġanalyzer Config , Ġrepo Config ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcommand ( working Dir : ĠFile ?) Ġ= Ġ" conan " ĊĊĠĠĠ Ġ// ĠTODO : ĠAdd Ġsupport Ġfor ĠCon an Ġlock Ġfiles . ĊĠĠĠ Ġ// Ġprotected Ġopen Ġfun Ġhas Lock File ( project Dir : ĠFile ) Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun Ġtransform Version ( output : ĠString ) Ġ= ĊĠĠĠĠĠĠĠ Ġ// ĠCon an Ġcould Ġreport Ġversion Ġstrings Ġlike : ĊĠĠĠĠĠĠĠ Ġ// ĠCon an Ġversion Ġ 1 . 1 8 . 0 ĊĠĠĠĠĠĠĠ Ġoutput . remove Prefix (" Con an Ġversion Ġ") ĊĊĠĠĠ Ġoverride Ġfun Ġget Version Requirement (): ĠRequirement Ġ= ĠRequirement . build I vy ("[ 1 . 1 8 . 0 , )") ĊĊĠĠĠ Ġoverride Ġfun Ġbefore Resolution ( definition Files : ĠList < File >) Ġ= Ġcheck Version ( analyzer Config . ignore Tool Versions ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPrimary Ġmethod Ġfor Ġresolving Ġdependencies Ġfrom Ġ[ definition File ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġresolve Dependencies ( definition File : ĠFile ): ĠList < Project Analyzer Result > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcon an Home Ġ= ĠOs . user Home Directory . resolve (". conan ") ĊĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġis Ġwhere ĠCon an Ġcaches Ġdownloaded Ġpackages Ġ[ 1 ]. ĠNote Ġthat Ġthe Ġpackage Ġcache Ġis Ġnot Ġconcurrent , Ġand Ġits ĊĠĠĠĠĠĠĠ Ġ// Ġlayout Ġdoes Ġnot Ġsupport Ġpackages Ġfrom Ġdifferent Ġrem otes Ġthat Ġare Ġnamed Ġ( and Ġversion ed ) Ġthe Ġsame . ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠConsider Ġusing Ġthe Ġexperimental Ġ( and Ġby Ġdefault Ġdisabled ) Ġdownload Ġcache Ġ[ 2 ] Ġto Ġlift Ġthese Ġlimitations . ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// Ġ[ 1 ]: Ġhttps :// docs . conan . io / en / latest / reference / config _ files / conan . conf . html # storage ĊĠĠĠĠĠĠĠ Ġ// Ġ[ 2 ]: Ġhttps :// docs . conan . io / en / latest / configuration / download _ cache . html # download - cache ĊĠĠĠĠĠĠĠ Ġval Ġcon an Storage Path Ġ= Ġcon an Home . resolve (" data ") ĊĊĠĠĠĠĠĠĠ Ġval Ġworking Dir Ġ= Ġdefinition File . parent File ĊĠĠĠĠĠĠĠ Ġval Ġcon an Config Ġ= ĠlistOf ( working Dir , Ġanalysis Root ). map Ġ{ Ġit . resolve (" conan _ config ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. find Ġ{ Ġit . isDirectory Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġdirectory To St ash Ġ= Ġcon an Config ?. let Ġ{ Ġcon an Home Ġ} Ġ?: Ġcon an Storage Path ĊĊĠĠĠĠĠĠĠ Ġst ash Directories ( directory To St ash ). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcon an Config ?. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun (" config ", Ġ" install ", Ġit . absolute Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġinstall Dependencies ( working Dir ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdependencies Json Ġ= Ġrun ( working Dir , Ġ" info ", Ġ".", Ġ"- j "). stdout ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroot Node Ġ= Ġjson Mapper . read Tree ( dependencies Json ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpackage List Ġ= Ġremove Project Package ( root Node , Ġdefinition File ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpackages Ġ= Ġextract Packages ( package List , Ġworking Dir ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdependencies Scope Ġ= ĠScope ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= ĠSCO PE _ NAME _ DEPEND ENCI ES , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdependencies Ġ= Ġextract Dependencies ( root Node , ĠSCO PE _ NAME _ DEPEND ENCI ES , Ġworking Dir ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdev Dependencies Scope Ġ= ĠScope ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= ĠSCO PE _ NAME _ DEV _ DEPEND ENCI ES , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdependencies Ġ= Ġextract Dependencies ( root Node , ĠSCO PE _ NAME _ DEV _ DEPEND ENCI ES , Ġworking Dir ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproject Package Ġ= Ġextract Project Package ( root Node , Ġdefinition File , Ġworking Dir ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProject Analyzer Result ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject Ġ= ĠProject ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġproject Package . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefinition FilePath Ġ= ĠVersion Control System . getPath Info ( definition File ). path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauthors Ġ= Ġproject Package . authors , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeclared License s Ġ= Ġproject Package . declared License s , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv cs Ġ= Ġproject Package . vcs , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv cs Processed Ġ= Ġprocess Project V cs ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġworking Dir , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject Package . vcs , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject Package . homepage Url ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhomepage Url Ġ= Ġproject Package . homepage Url , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscope Dependencies Ġ= Ġsorted Set Of ( dependencies Scope , Ġdev Dependencies Scope ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpackages Ġ= Ġpackages . values . to Sorted Set () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturn Ġthe Ġdependency Ġtree Ġstarting Ġfrom Ġa Ġ[ root Node ] Ġfor Ġgiven Ġ[ scope Name ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġextract Dependency Tree ( ĊĠĠĠĠĠĠĠ Ġroot Node : ĠJsonNode , ĊĠĠĠĠĠĠĠ Ġworking Dir : ĠFile , ĊĠĠĠĠĠĠĠ Ġpkg : ĠJsonNode , ĊĠĠĠĠĠĠĠ Ġscope Name : ĠString ĊĠĠĠ Ġ): ĠSorted Set < Package Reference > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġmutable Set Of < Package Reference >() ĊĊĠĠĠĠĠĠĠ Ġpkg [ scope Name ]?. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Ref Ġ= Ġit . text Value OrEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot Node . iterator (). forEach Ġ{ Ġchild Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( child [" reference "]. text Value OrEmpty () Ġ== Ġchild Ref ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug Ġ{ Ġ" Found Ġchild Ġ'$ child Ref '. " Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpackage Reference Ġ= ĠPackage Reference ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġextract Package Id ( child , Ġworking Dir ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdependencies Ġ= Ġextract Dependency Tree ( root Node , Ġworking Dir , Ġchild , ĠSCO PE _ NAME _ DEPEND ENCI ES ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ+= Ġpackage Reference ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpackage Dev Reference Ġ= ĠPackage Reference ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġextract Package Id ( child , Ġworking Dir ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdependencies Ġ= Ġextract Dependency Tree ( root Node , Ġworking Dir , Ġchild , ĠSCO PE _ NAME _ DEV _ DEPEND ENCI ES ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ+= Ġpackage Dev Reference ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresult . to Sorted Set () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRun Ġthrough Ġeach Ġpackage Ġand Ġextract Ġlist Ġof Ġits Ġdependencies Ġ( also Ġtrans itive Ġones ). ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġextract Dependencies ( ĊĠĠĠĠĠĠĠ Ġroot Node : ĠJsonNode , ĊĠĠĠĠĠĠĠ Ġscope Name : ĠString , ĊĠĠĠĠĠĠĠ Ġworking Dir : ĠFile ĊĠĠĠ Ġ): ĠSorted Set < Package Reference > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstack Ġ= ĠStack < JsonNode >(). apply Ġ{ Ġadd All ( root Node ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġdependencies Ġ= Ġmutable Set Of < Package Reference >() ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ(! stack . empty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpkg Ġ= Ġstack . pop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġextract Dependency Tree ( root Node , Ġworking Dir , Ġpkg , Ġscope Name ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdependencies Ġ+= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġdependencies . to Sorted Set () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturn Ġthe Ġmap Ġof Ġpackages Ġand Ġtheir Ġidentifiers Ġwhich Ġare Ġcontained Ġin Ġ[ node ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġextract Packages ( node : ĠList < JsonNode >, Ġworking Dir : ĠFile ): ĠMap < String , ĠPackage > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġmutable Map Of < String , ĠPackage >() ĊĠĠĠĠĠĠĠ Ġval Ġstack Ġ= ĠStack < JsonNode >(). apply Ġ{ Ġadd All ( node ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ(! stack . empty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠcurrentNode Ġ= Ġstack . pop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpkg Ġ= Ġextract Package ( currentNode , Ġworking Dir ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult [" ${ pkg . id . name }:${ pkg . id . version } "] Ġ= Ġpkg ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturn Ġthe Ġ[ Package ] Ġextracted Ġfrom Ġgiven Ġ[ node ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġextract Package ( node : ĠJsonNode , Ġworking Dir : ĠFile ) Ġ= ĊĠĠĠĠĠĠĠ ĠPackage ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġextract Package Id ( node , Ġworking Dir ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġauthors Ġ= Ġparse Authors ( node ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeclared License s Ġ= Ġextract Declared License s ( node ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġextract Package Field ( node , Ġworking Dir , Ġ" description "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhomepage Url Ġ= Ġnode [" homepage "]. text Value OrEmpty (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinary Artifact Ġ= ĠRemote Artifact . EMPTY , Ġ// ĠTODO : Ġimplement Ġme ! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource Artifact Ġ= ĠRemote Artifact . EMPTY , Ġ// ĠTODO : Ġimplement Ġme ! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv cs Ġ= Ġextract V cs Info ( node ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturn Ġthe Ġvalue Ġ` conan Ġinspect ` Ġreports Ġfor Ġthe Ġgiven Ġ[ field ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġrun Inspect Raw Field ( pkg Name : ĠString , Ġworking Dir : ĠFile , Ġfield : ĠString ): ĠString Ġ= ĊĠĠĠĠĠĠĠ Ġrun ( working Dir , Ġ" inspect ", Ġpkg Name , Ġ"-- raw ", Ġfield ). stdout ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturn Ġthe Ġfull Ġlist Ġof Ġpackages , Ġexcluding Ġthe Ġproject Ġlevel Ġinformation . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġremove Project Package ( root Node : ĠJsonNode , Ġdefinition File : ĠFile ): ĠList < JsonNode > Ġ= ĊĠĠĠĠĠĠĠ Ġroot Node . find Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠContains Ġbecause Ġcon an file . py 's Ġreference Ġstring Ġoften Ġincludes Ġother Ġdata . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit [" reference "]. text Value OrEmpty (). contains ( definition File . name ) ĊĠĠĠĠĠĠĠ Ġ} ?. let Ġ{ Ġproject Package Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot Node . minus Element ( project Package ) ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġroot Node . toList < JsonNode >() ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturn Ġthe Ġset Ġof Ġdeclared Ġlicenses Ġcontained Ġin Ġ[ node ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġextract Declared License s ( node : ĠJsonNode ): ĠSorted Set < String > Ġ= ĊĠĠĠĠĠĠĠ Ġsorted Set Of < String >(). also Ġ{ Ġlicenses Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode [" license "] ?. map NotNull To ( licenses ) Ġ{ Ġit . text Value () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturn Ġthe Ġ[ Identifier ] Ġfor Ġthe Ġpackage Ġcontained Ġin Ġ[ node ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġextract Package Id ( node : ĠJsonNode , Ġworking Dir : ĠFile ) Ġ= ĊĠĠĠĠĠĠĠ ĠIdentifier ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġ" Con an ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnamespace Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġextract Package Field ( node , Ġworking Dir , Ġ" name "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġversion Ġ= Ġextract Package Field ( node , Ġworking Dir , Ġ" version ") ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturn Ġthe Ġ[ V cs Info ] Ġcontained Ġin Ġ[ node ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġextract V cs Info ( node : ĠJsonNode ) Ġ= ĊĠĠĠĠĠĠĠ ĠV cs Info ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠV cs Type . GIT , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġurl Ġ= Ġnode [" url "]. text Value OrEmpty (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrevision Ġ= Ġnode [" revision "]. text Value OrEmpty (). take Unless Ġ{ Ġit Ġ== Ġ" 0 " Ġ}. or Empty () ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturn Ġthe Ġvalue Ġof Ġ[ field ] Ġfrom Ġthe Ġoutput Ġof Ġ` conan Ġinspect Ġ-- raw ` Ġfor Ġthe Ġpackage Ġin Ġ[ node ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġextract Package Field ( node : ĠJsonNode , Ġworking Dir : ĠFile , Ġfield : ĠString ): ĠString Ġ= ĊĠĠĠĠĠĠĠ Ġrun Inspect Raw Field ( node [" display _ name "]. text Value (), Ġworking Dir , Ġfield ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturn Ġa Ġ[ Package ] Ġcontaining Ġproject - level Ġinformation Ġdepending Ġon Ġwhich Ġ[ definition File ] Ġwas Ġfound : ĊĠĠĠĠ Ġ* Ġ- Ġcon an file . txt : Ġ` conan Ġinspect Ġcon an file . txt ` Ġis Ġnot Ġsupported . ĊĠĠĠĠ Ġ* Ġ- Ġcon an file . py : Ġ` conan Ġinspect Ġcon an file . py ` Ġis Ġsupported Ġand Ġmore Ġuseful Ġproject Ġmetadata Ġis Ġextracted . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠTODO : ĠThe Ġformat Ġof Ġ` conan Ġinfo ` Ġoutput Ġfor Ġa Ġcon an file . txt Ġfile Ġmay Ġbe Ġsuch Ġthat Ġwe Ġcan Ġget Ġproject Ġmetadata ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠ Ġfrom Ġthe Ġ` requires ` Ġfield . ĠNeed Ġto Ġinvestigate Ġwhether Ġthis Ġis Ġa Ġsure Ġthing Ġbefore Ġimplementing . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġextract Project Package ( root Node : ĠJsonNode , Ġdefinition File : ĠFile , Ġworking Dir : ĠFile ): ĠPackage Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġproject Package Json Ġ= Ġrequire NotNull ( root Node . find Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit [" reference "]. text Value (). contains ( definition File . name ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( definition File . name Ġ== Ġ" conan file . py ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Project Package From Con an file Py ( project Package Json , Ġdefinition File , Ġworking Dir ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Project Package From Con an file Txt ( project Package Json ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturn Ġa Ġ[ Package ] Ġcontaining Ġproject - level Ġinformation Ġextracted Ġfrom Ġ[ node ] Ġand Ġ[ definition File ] Ġusing Ġthe ĊĠĠĠĠ Ġ* Ġ` conan Ġinspect ` Ġcommand . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġgenerate Project Package From Con an file Py ( node : ĠJsonNode , Ġdefinition File : ĠFile , Ġworking Dir : ĠFile ): ĠPackage Ġ= ĊĠĠĠĠĠĠĠ ĠPackage ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= ĠIdentifier ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġmanager Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnamespace Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġrun Inspect Raw Field ( definition File . name , Ġworking Dir , Ġ" name "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġversion Ġ= Ġrun Inspect Raw Field ( definition File . name , Ġworking Dir , Ġ" version ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġauthors Ġ= Ġparse Authors ( node ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeclared License s Ġ= Ġextract Declared License s ( node ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġrun Inspect Raw Field ( definition File . name , Ġworking Dir , Ġ" description "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhomepage Url Ġ= Ġnode [" homepage "]. text Value OrEmpty (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinary Artifact Ġ= ĠRemote Artifact . EMPTY , Ġ// ĠTODO : Ġimplement Ġme ! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource Artifact Ġ= ĠRemote Artifact . EMPTY , Ġ// ĠTODO : Ġimplement Ġme ! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv cs Ġ= Ġextract V cs Info ( node ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturn Ġa Ġ[ Package ] Ġcontaining Ġproject - level Ġinformation Ġextracted Ġfrom Ġ[ node ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġgenerate Project Package From Con an file Txt ( node : ĠJsonNode ): ĠPackage Ġ= ĊĠĠĠĠĠĠĠ ĠPackage ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= ĠIdentifier ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġmanager Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnamespace Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġnode [" reference "]. text Value OrEmpty (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġversion Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġauthors Ġ= Ġparse Authors ( node ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeclared License s Ġ= Ġextract Declared License s ( node ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhomepage Url Ġ= Ġnode [" homepage "]. text Value OrEmpty (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinary Artifact Ġ= ĠRemote Artifact . EMPTY , Ġ// ĠTODO : Ġimplement Ġme ! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource Artifact Ġ= ĠRemote Artifact . EMPTY , Ġ// ĠTODO : Ġimplement Ġme ! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv cs Ġ= Ġextract V cs Info ( node ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRun Ġ` conan Ġinstall Ġ. ` Ġto Ġinstall Ġpackages Ġin Ġ[ working Dir ]. ĠThe Ġ` conan Ġinstall Ġ. ` Ġcommand Ġlooks Ġfor Ġthe Ġpackage ĊĠĠĠĠ Ġ* Ġin Ġthe Ġremote Ġrepository Ġthat Ġis Ġbuilt Ġfor Ġthe Ġsame Ġarchitecture Ġas Ġthe Ġhost Ġthat Ġruns Ġthis Ġcommand . ĠThat Ġpackage ĊĠĠĠĠ Ġ* Ġmay Ġnot Ġexist Ġin Ġthe Ġremote Ġand Ġin Ġthat Ġcase Ġthe Ġcommand Ġwill Ġfail . ĠAs Ġthis Ġis Ġacceptable Ġsince Ġpackage ĊĠĠĠĠ Ġ* Ġmetadata Ġis Ġfetched Ġanyway , Ġignore Ġthe Ġexit Ġcode Ġby Ġnot Ġusing Ġ[ run ] Ġbut Ġ[ Process Capture ] Ġdirectly . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġinstall Dependencies ( working Dir : ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠ ĠProcess Capture ( working Dir , Ġ" conan ", Ġ" install ", Ġ". ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠParse Ġinformation Ġabout Ġthe Ġpackage Ġauthor Ġfrom Ġthe Ġgiven ĠJSON Ġ[ node ]. ĠIf Ġpresent , Ġreturn Ġa Ġset Ġcontaining Ġthe ĊĠĠĠĠ Ġ* Ġauthor Ġname ; Ġotherwise , Ġreturn Ġan Ġempty Ġset . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġparse Authors ( node : ĠJsonNode ): ĠSorted Set < String > Ġ= ĊĠĠĠĠĠĠĠ Ġparse Author String ( node [" author "] ?. text Value (), Ġ'<', Ġ'(' )?. let Ġ{ Ġsorted Set Of ( it ) Ġ} Ġ?: Ġsorted Set Of () Ċ } Ċ