package Ġtask Ċ Ċ import Ġensure Success Ċ import Ġgit Cmd Ċ import Ġorg . apache . tools . ant . util . FileUtils Ċ import Ġorg . gradle . api . Project Ċ import Ġorg . gradle . api . Task Ċ import Ġroot Project Dir Ċ import Ġtask Group Ċ import Ġtoo th pick Ċ import Ġupstream Dir Ċ import Ġup streams Ċ import ĠUp stream Ċ import Ġjava . io . File Ċ import Ġjava . nio . file . Files Ċ import Ġjava . nio . file . Path Ċ import Ġjava . nio . charset . StandardCharsets Ċ import Ġjava . util . stream . Collectors ĊĊ Ċ internal Ġfun ĠProject . create Update Upstream Task ( ĊĠĠĠ Ġreceiver : ĠTask . () Ġ-> ĠUnit Ġ= Ġ{} Ċ ): ĠTask Ġ= Ġtasks . create (" update Upstream ") Ġ{ ĊĠĠĠ Ġreceiver ( this ) ĊĠĠĠ Ġgroup Ġ= Ġtask Group ĊĠĠĠ Ġdo Last Ġ{ ĊĠĠĠĠĠĠĠ Ġensure Success ( git Cmd (" fetch ", Ġdir Ġ= Ġupstream Dir , Ġprint Out Ġ= Ġtrue )) ĊĠĠĠĠĠĠĠ Ġensure Success ( git Cmd (" reset ", Ġ"-- hard ", Ġtoo th pick . upstream Branch , Ġdir Ġ= Ġupstream Dir , Ġprint Out Ġ= Ġtrue )) ĊĠĠĠĠĠĠĠ Ġensure Success ( git Cmd (" add ", Ġtoo th pick . upstream , Ġdir Ġ= Ġroot Project Dir , Ġprint Out Ġ= Ġtrue )) ĊĠĠĠĠĠĠĠ Ġfor Ġ( upstream Ġin Ġup streams ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . out . println ( upstream . repo Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġensure Success ( git Cmd (" fetch ", Ġdir Ġ= Ġupstream . repo Path . to File (), Ġprint Out Ġ= Ġtrue )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġensure Success ( git Cmd (" reset ", Ġ"-- hard ", Ġupstream . branch , Ġdir Ġ= Ġupstream . repo Path . to File (), Ġprint Out Ġ= Ġtrue )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ensure Success ( git Cmd (" add ", Ġ" upstream /${ upstream . name }", Ġdir Ġ= Ġupstream . repo Path . to File (), Ġprint Out Ġ= Ġtrue )) Ġ// TODO ĠFIX ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġensure Success ( git Cmd (" sub module ", Ġ" update ", Ġ"-- init ", Ġ"-- recursive ", Ġdir Ġ= Ġupstream Dir , Ġprint Out Ġ= Ġtrue )) ĊĠĠĠĠĠĠĠ Ġval Ġfile Utils Ġ= ĠFileUtils . getFile Utils () ĊĠĠĠĠĠĠĠ Ġfor Ġ( upstream Ġin Ġup streams ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġserver Repo Pat ches Ġ= Ġupstream . get Repo Server Pat ches () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapi Repo Pat ches Ġ= Ġupstream . get Repo API Pat ches () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġserver Pat ches Ġ= Ġupstream . server List ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapi Pat ches Ġ= Ġupstream . api List ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . lifecycle ("> >> ĠPull ing Ġ${ upstream . name } Ġpatches ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( upstream . use Black List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( server Repo Pat ches Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Patch List Ġ= ĠPath . of ("${ upstream . patch Path }/ server "). to File (). list Files () Ġas ĠArray < File >? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtmp Folder Ġ= ĠPath . of ("${ upstream . patch Path }/ tmp / server "). to File () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtmp Folder . mkdir s () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Patch List Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( patch Ġin Ġcurrent Patch List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( patch . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Utils . copy File ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ upstream . patch Path }/ server /${ patch . name }", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ upstream . patch Path }/ tmp / server /${ patch . name }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpatch . delete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcurrent Patch List Filtered Ġ= Ġcurrent Patch List ?. toList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . stream ()?. sorted ()?. map Ġ{ Ġpatch Ġ-> Ġpatch . name . substring ( 5 , Ġpatch . name . length )} ?. collect ( Collectors . toList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( patch Ġin Ġserver Repo Pat ches ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( server Pat ches Ġ!= Ġnull Ġ&& Ġserver Pat ches . contains ( patch )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Patch ( file Utils , Ġupstream , Ġserver Repo Pat ches , Ġpatch , Ġi , Ġ" server ", Ġcurrent Patch List Filtered ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( patch Ġin Ġtmp Folder . list Files ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpatch . delete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( api Repo Pat ches Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Patch List Ġ= ĠPath . of ("${ upstream . patch Path }/ api "). to File (). list Files () Ġas ĠArray < File >? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtmp Folder Ġ= ĠPath . of ("${ upstream . patch Path }/ tmp / api "). to File () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtmp Folder . mkdir s () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Patch List Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( patch Ġin Ġcurrent Patch List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( patch . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Utils . copy File ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ upstream . patch Path }/ api /${ patch . name }", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ upstream . patch Path }/ tmp / api /${ patch . name }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpatch . delete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcurrent Patch List Filtered Ġ= Ġcurrent Patch List ?. toList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . stream ()?. sorted ()?. map Ġ{ Ġpatch Ġ-> Ġpatch . name . substring ( 5 , Ġpatch . name . length )} ?. collect ( Collectors . toList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( patch Ġin Ġapi Repo Pat ches ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( api Pat ches Ġ!= Ġnull Ġ&& Ġapi Pat ches . contains ( patch )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Patch ( file Utils , Ġupstream , Ġapi Repo Pat ches , Ġpatch , Ġi , Ġ" api ", Ġcurrent Patch List Filtered ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( patch Ġin Ġtmp Folder . list Files ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpatch . delete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( server Repo Pat ches Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcurrent Patch List Ġ= ĠPath . of ("${ upstream . patch Path }/ server "). to File (). list Files () Ġas ĠArray < File >? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtmp Folder Ġ= ĠPath . of ("${ upstream . patch Path }/ tmp / server "). to File () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtmp Folder . mkdir s () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Patch List Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( patch Ġin Ġcurrent Patch List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( patch . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Utils . copy File ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ upstream . patch Path }/ server /${ patch . name }", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ upstream . patch Path }/ tmp / server /${ patch . name }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpatch . delete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcurrent Patch List Filtered Ġ= Ġcurrent Patch List ?. toList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . stream ()?. sorted ()?. map Ġ{ Ġpatch Ġ-> Ġpatch . name . substring ( 5 , Ġpatch . name . length )} ?. collect ( Collectors . toList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( patch Ġin Ġserver Repo Pat ches ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( server Pat ches Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! server Pat ches . contains ( patch )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Patch ( file Utils , Ġupstream , Ġserver Repo Pat ches , Ġpatch , Ġi , Ġ" server ", Ġcurrent Patch List Filtered ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( patch Ġin Ġtmp Folder . list Files ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpatch . delete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( api Repo Pat ches Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcurrent Patch List Ġ= ĠPath . of ("${ upstream . patch Path }/ api "). to File (). list Files () Ġas ĠArray < File >? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtmp Folder Ġ= ĠPath . of ("${ upstream . patch Path }/ tmp / api "). to File () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtmp Folder . mkdir s () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Patch List Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( patch Ġin Ġcurrent Patch List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( patch . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Utils . copy File ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ upstream . patch Path }/ api /${ patch . name }", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ upstream . patch Path }/ tmp / api /${ patch . name }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpatch . delete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcurrent Patch List Filtered Ġ= Ġcurrent Patch List ?. toList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . stream ()?. sorted ()?. map Ġ{ Ġpatch Ġ-> Ġpatch . name . substring ( 5 , Ġpatch . name . length )} ?. collect ( Collectors . toList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( patch Ġin Ġapi Repo Pat ches ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( api Pat ches Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! api Pat ches . contains ( patch )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Patch ( file Utils , Ġupstream , Ġapi Repo Pat ches , Ġpatch , Ġi , Ġ" api ", Ġcurrent Patch List Filtered ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( patch Ġin Ġtmp Folder . list Files ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpatch . delete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupstream . update Upstream Commit Hash () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġupdate Patch ( ĊĠĠĠ Ġfile Utils : ĠFileUtils , ĊĠĠĠ Ġupstream : ĠUp stream , ĊĠĠĠ Ġserver Repo Pat ches : ĠMutable List < String >, ĊĠĠĠ Ġpatch : ĠString , ĊĠĠĠ Ġi : ĠInt , ĊĠĠĠ Ġfolder : ĠString , ĊĠĠĠ Ġcurrent Patch List Filtered : ĠMutable List < String >? Ċ ) Ġ{ ĊĠĠĠ Ġif Ġ( current Patch List Filtered Ġ== Ġnull Ġ|| Ġpatch Has Diff ( upstream , Ġserver Repo Pat ches , Ġpatch , Ġfolder , Ġcurrent Patch List Filtered )) Ġ{ ĊĠĠĠĠĠĠĠ Ġfile Utils . copy File ("${ upstream . repo Path }/ patches /$ folder /" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ String . format ("% 0 4 d ", Ġserver Repo Pat ches . indexOf ( patch ) Ġ+ Ġ 1 )} -$ patch ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ upstream . patch Path }/ $ folder /${ String . format ("% 0 4 d ", Ġi )} -$ patch " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġfile Utils . copy File ("${ upstream . patch Path }/ tmp /$ folder /" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ String . format ("% 0 4 d ", Ġcurrent Patch List Filtered . indexOf ( patch ) Ġ+ Ġ 1 )} -$ patch ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ upstream . patch Path }/ $ folder /${ String . format ("% 0 4 d ", Ġi )} -$ patch " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġpatch Has Diff ( ĊĠĠĠ Ġupstream : ĠUp stream , ĊĠĠĠ Ġserver Repo Pat ches : ĠMutable List < String >, ĊĠĠĠ Ġpatch : ĠString , ĊĠĠĠ Ġfolder : ĠString , ĊĠĠĠ Ġcurrent Patch List Filtered : ĠMutable List < String > Ċ ): ĠBoolean Ġ{ ĊĠĠĠ Ġif Ġ(! Path . of ("${ upstream . patch Path }/ tmp /$ folder /${ String . format ("% 0 4 d ", Ġcurrent Patch List Filtered . indexOf ( patch ) Ġ+ Ġ 1 )} -$ patch "). to File (). isFile ) Ġreturn Ġtrue ĊĠĠĠ Ġif Ġ(! patch Changed ( upstream , Ġserver Repo Pat ches , Ġpatch , Ġfolder )) Ġreturn Ġfalse ĊĠĠĠ Ġval Ġupstream File Ġ= ĠFiles . read All Lines ( Path . of ("${ upstream . repo Path }/ patches /$ folder /${ String . format ("% 0 4 d ", Ġserver Repo Pat ches . indexOf ( patch ) Ġ+ Ġ 1 )} -$ patch "), ĠStandard Charsets . UTF _ 8 ) ĊĠĠĠ Ġval Ġrepo File Ġ= ĠFiles . read All Lines ( Path . of ("${ upstream . patch Path }/ tmp /$ folder /${ String . format ("% 0 4 d ", Ġcurrent Patch List Filtered . indexOf ( patch ) Ġ+ Ġ 1 )} -$ patch "), ĠStandard Charsets . UTF _ 8 ) ĊĠĠĠ Ġreturn Ġupstream File . stream (). filter Ġ{ line Ġ-> Ġline . startsWith ("+ ") Ġ|| Ġline . startsWith ("- ")} ĊĠĠĠĠĠĠĠ Ġ. filter Ġ{ line Ġ-> Ġif Ġ( line . startsWith (" --- ") Ġ|| Ġline . startsWith (" +++ ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġline . substring ( 3 , Ġline . length ). trim (). isNotBlank () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġif Ġ( line . startsWith ("-- ") Ġ|| Ġline . startsWith (" ++ ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġline . substring ( 2 , Ġline . length ). trim (). isNotBlank () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġline . substring ( 1 , Ġline . length ). trim (). isNotBlank () ĊĠĠĠĠĠĠĠ Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġ. filter Ġ{ line Ġ-> Ġif Ġ( repo File . contains ( line )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepo File . remove ( line ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ filter Ġfalse ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ Ġreturn @ filter Ġtrue Ġ} Ġ}. collect ( Collectors . toList ()). isNotEmpty () Ċ } Ċ Ċ fun Ġpatch Changed ( ĊĠĠĠ Ġupstream : ĠUp stream , ĊĠĠĠ Ġserver Repo Pat ches : ĠMutable List < String >, ĊĠĠĠ Ġpatch : ĠString , ĊĠĠĠ Ġfolder : ĠString Ċ ): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġdiff Check Cmd Result Ġ= Ġupstream . project . git Cmd (" diff ", Ġ"-- name - only ", Ġupstream . upt ream Commit , Ġupstream . getCurrent Commit Hash (), Ġdir Ġ= Ġupstream . repo Path . to File () Ġ) ĊĠĠĠ Ġval Ġdiff Check Result Ġ= Ġdiff Check Cmd Result . output . toString () ĊĠĠĠ Ġif Ġ( diff Check Result . isBlank ()) Ġreturn Ġfalse ĊĠĠĠ Ġval Ġdiff Check Change Files Ġ= Ġdiff Check Result . split ("\\ n ". to Regex ()). to Typed Array (). toList () ĊĠĠĠ Ġreturn Ġdiff Check Change Files . contains (" patches /$ folder /${ String . format ("% 0 4 d ", Ġserver Repo Pat ches . indexOf ( patch ) Ġ+ Ġ 1 )} -$ patch ") Ċ }