/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 9 Ġby ĠDel ph ix . ĠAll Ġrights Ġreserved . Ċ Ġ*/ Ċ Ċ package Ġio . tit and ata . tit an . providers . generic Ċ Ċ import Ġio . tit and ata . client . apis . Rem otes Api Ċ import Ġio . tit and ata . client . apis . Repositories Api Ċ import Ġio . tit and ata . models . Commit Ċ import Ġio . tit and ata . models . Repository Ċ import Ġio . tit and ata . serialization . Remote Util Ċ import Ġio . tit and ata . tit an . clients . Docker Ċ import Ġio . tit and ata . tit an . exceptions . Command Exception Ċ import Ġio . tit and ata . tit an . providers . Metadata Ċ import Ġio . tit and ata . tit an . utils . Command Executor Ċ import Ġjava . net . URI Ċ import Ġkotlin . system . exit Process Ċ import Ġokhttp 3 . Http Url Ċ Ċ class ĠClone ( ĊĠĠĠ Ġprivate Ġval Ġremote Add : Ġ( container : ĠString , Ġuri : ĠString , Ġremote Name : ĠString ?, Ġparams : ĠMap < String , ĠString >) Ġ-> ĠUnit , ĊĠĠĠ Ġprivate Ġval Ġpull : Ġ( container : ĠString , Ġcommit : ĠString ?, Ġremote Name : ĠString ?, Ġtags : ĠList < String >, Ġmetadata Only : ĠBoolean ) Ġ-> ĠUnit , ĊĠĠĠ Ġprivate Ġval Ġcheckout : Ġ( container : ĠString , Ġhash : ĠString ?, Ġtags : ĠList < String >) Ġ-> ĠUnit , ĊĠĠĠ Ġprivate Ġval Ġrun : Ġ( container : ĠString , Ġrepository : ĠString ?, Ġenvironments : ĠList < String >, Ġarguments : ĠList < String >, Ġdisable Port Mapping : ĠBoolean , Ġcreate Repo : ĠBoolean ) Ġ-> ĠUnit , ĊĠĠĠ Ġprivate Ġval Ġremove : Ġ( container : ĠString , Ġforce : ĠBoolean ) Ġ-> ĠUnit , ĊĠĠĠ Ġprivate Ġval Ġcommand Executor : ĠCommand Executor Ġ= ĠCommand Executor (), ĊĠĠĠ Ġprivate Ġval Ġdocker : ĠDocker Ġ= ĠDocker ( command Executor ), ĊĠĠĠ Ġprivate Ġval Ġrem otes Api : ĠRem otes Api Ġ= ĠRem otes Api (), ĊĠĠĠ Ġprivate Ġval Ġrepositories Api : ĠRe positories Api Ġ= ĠRe positories Api (), ĊĠĠĠ Ġprivate Ġval Ġremote Util : ĠRemote Util Ġ= ĠRemote Util () Ċ ) Ġ{ ĊĠĠĠ Ġfun Ġclone ( ĊĠĠĠĠĠĠĠ Ġuri : ĠString , ĊĠĠĠĠĠĠĠ Ġcontainer : ĠString ?, ĊĠĠĠĠĠĠĠ Ġguid : ĠString ?, ĊĠĠĠĠĠĠĠ Ġparams : ĠMap < String , ĠString >, ĊĠĠĠĠĠĠĠ Ġarguments : ĠList < String >, ĊĠĠĠĠĠĠĠ Ġdisable Port Mapping : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġtags : ĠList < String > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparsed Uri Ġ= ĠURI ( uri ) ĊĠĠĠĠĠĠĠ Ġval Ġrepo Name Ġ= Ġwhen Ġ( container ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġparsed Uri . path . split ("/ "). last () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġcontainer ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġcommit Id Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġguid . isNull OrEmpty () Ġ&& Ġparsed Uri . fragment Ġ!= Ġnull Ġ-> Ġparsed Uri . fragment ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġguid ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġrepository Ġ= ĠRepository ( repo Name , Ġempty Map ()) ĊĠĠĠĠĠĠĠ Ġval Ġplain Uri Ġ= Ġ"${ parsed Uri . scheme } ://${ parsed Uri . authority }${ parsed Uri . path }" ĊĠĠĠĠĠĠĠ Ġval Ġall Tags Ġ= Ġtags . to Mutable List () ĊĠĠĠĠĠĠĠ Ġif Ġ( parsed Uri . query Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġall Tags . addAll ( Http Url . parse (" http :// host ? ${ parsed Uri . query }") ?. query Parameter Values (" tag ") Ġ?: Ġempty List ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġcleanup Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepositories Api . create Repository ( repository ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcleanup Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremote Add ( repo Name , Ġplain Uri , Ġnull , Ġparams ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġremote Ġ= Ġrem otes Api . get Remote ( repo Name , Ġ" origin ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcommit Ġ= ĠCommit (" id ", Ġempty Map ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( commit Id . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġremote Commits Ġ= Ġrem otes Api . list Remote Commits ( repo Name , Ġremote . name , Ġremote Util . getParameters ( remote ), Ġall Tags ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( remote Commits . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" unable Ġto Ġfind Ġany Ġmatching Ġcommits Ġin Ġremote Ġrepository ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommit Ġ= Ġremote Commits . first () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! tags . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" tags Ġcannot Ġbe Ġspecified Ġwith Ġcommit ĠID ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommit Ġ= Ġrem otes Api . get Remote Commit ( repo Name , Ġremote . name , Ġcommit Id , Ġremote Util . getParameters ( remote )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmetadata Ġ= ĠMetadata . load ( commit . properties ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdocker . inspect Image ( metadata . image . digest ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠCommand Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdocker . pull ( metadata . image . digest ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠCommand Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠCommand Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Unable Ġto Ġfind Ġimage Ġ${ metadata . image . digest } Ġfor Ġ${ metadata . image . image }", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . exit Code , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . output ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdocker . pull ( metadata . image . digest ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun ( metadata . image . digest , Ġrepo Name , Ġmetadata . environment , Ġarguments , Ġdisable Port Mapping , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpull ( repo Name , Ġcommit . id , Ġnull , ĠlistOf (), Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheckout ( repo Name , Ġcommit . id , ĠlistOf ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcleanup Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġexplicitly Ġhandle Ġthe Ġexception Ġso Ġthat Ġthe Ġerror Ġmessage Ġappears Ġbefore Ġthe Ġremove Ġmessages ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( t . message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( t Ġis ĠCommand Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( t . output ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cleanup ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove ( repository . name , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIgnore ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexit Process ( 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ